• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _TCUPLATFORM_HPP
2 #define _TCUPLATFORM_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Tester Core
5  * ----------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Platform (OS) specific services.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuDefs.hpp"
27 
28 #include <cstdint>
29 
30 namespace glu
31 {
32 class Platform;
33 }
34 
35 namespace eglu
36 {
37 class Platform;
38 }
39 
40 namespace vk
41 {
42 class Platform;
43 }
44 
45 namespace tcu
46 {
47 
48 class CommandLine;
49 class FunctionLibrary;
50 
51 struct PlatformMemoryLimits
52 {
53 	// System memory properties
54 	size_t			totalSystemMemory;					// #bytes of system memory (heap + HOST_LOCAL) tests must not exceed
55 
56 	// Device memory properties
57 	std::uint64_t	totalDeviceLocalMemory;				// #bytes of total DEVICE_LOCAL memory tests must not exceed or 0 if DEVICE_LOCAL counts against system memory
58 	std::uint64_t	deviceMemoryAllocationGranularity;	// VkDeviceMemory allocation granularity (typically page size)
59 
60 	// Device memory page table geometry
61 	std::uint64_t	devicePageSize;						// Page size on device (must be rounded up to the nearest POT)
62 	std::uint64_t	devicePageTableEntrySize;			// Number of bytes per page table size
63 	size_t			devicePageTableHierarchyLevels;		// Number of levels in device page table hierarchy
64 
PlatformMemoryLimitstcu::PlatformMemoryLimits65 	PlatformMemoryLimits (void)
66 		: totalSystemMemory					(0)
67 		, totalDeviceLocalMemory			(0)
68 		, deviceMemoryAllocationGranularity	(0)
69 		, devicePageSize					(0)
70 		, devicePageTableEntrySize			(0)
71 		, devicePageTableHierarchyLevels	(0)
72 	{}
73 };
74 
75 /*--------------------------------------------------------------------*//*!
76  * \brief Base class for platform implementation.
77  *
78  * This class represents the minimum set of functionality for a platform
79  * port.
80  *
81  * In addition to implementing Platform class, main entry point must be
82  * created that takes care of parsing command line, creating log and
83  * executing tcu::App. See tcuMain.cpp for reference on implementing
84  * application stub.
85  *
86  * If the platform uses standard posix-style main() for application entry
87  * point, tcuMain.cpp can be used as is. In that case you only have to
88  * implement createPlatform().
89  *
90  * API-specific platform interfaces (glu::Platform, eglu::Platform and vk::Platform)
91  * can be provided by implementing get<API>Platform() functions.
92  *//*--------------------------------------------------------------------*/
93 class Platform
94 {
95 public:
96 									Platform			(void);
97 	virtual							~Platform			(void);
98 
99 	/*--------------------------------------------------------------------*//*!
100 	 * \brief Process platform-specific events.
101 	 *
102 	 * Test framework will call this function between test cases and test case
103 	 * iterations. Any event handling that must be done periodically should be
104 	 * done here.
105 	 *
106 	 * Test framework will decide whether to continue test execution based on
107 	 * return code. For instance if the application receives close event from OS,
108 	 * it should communicate that to framework by returning false.
109 	 *
110 	 * \note Do not do rendering buffer swaps here.
111 	 *       Do it in RenderContext::postIterate() instead.
112 	 * \return true if test execution should continue, false otherwise.
113 	 *//*--------------------------------------------------------------------*/
114 	virtual bool					processEvents		(void);
115 
116 	/*--------------------------------------------------------------------*//*!
117 	 * \brief Get GL platform interface
118 	 *
119 	 * GL-specific platform interface is defined by glu::Platform. If your
120 	 * platform port supports OpenGL (ES), you should implement this function.
121 	 *
122 	 * Default implementation throws tcu::NotSupportedError exception.
123 	 *
124 	 * \return Reference to GL platform interface.
125 	 *//*--------------------------------------------------------------------*/
126 	virtual const glu::Platform&	getGLPlatform		(void) const;
127 
128 	/*--------------------------------------------------------------------*//*!
129 	 * \brief Get EGL platform interface
130 	 *
131 	 * EGL-specific platform interface is defined by eglu::Platform. If your
132 	 * platform port supports EGL, you should implement this function.
133 	 *
134 	 * Default implementation throws tcu::NotSupportedError exception.
135 	 *
136 	 * \return Reference to EGL platform interface.
137 	 *//*--------------------------------------------------------------------*/
138 	virtual const eglu::Platform&	getEGLPlatform		(void) const;
139 
140 	virtual const vk::Platform&		getVulkanPlatform	(void) const;
141 
142 	virtual void					getMemoryLimits		(PlatformMemoryLimits& limits) const;
143 };
144 
getMemoryLimits(const tcu::Platform & platform)145 inline tcu::PlatformMemoryLimits getMemoryLimits (const tcu::Platform& platform)
146 {
147 	tcu::PlatformMemoryLimits limits;
148 	platform.getMemoryLimits(limits);
149 	return limits;
150 }
151 
152 } // tcu
153 
154 #endif // _TCUPLATFORM_HPP
155