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