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
30namespace glu
31{
32class Platform;
33}
34
35namespace eglu
36{
37class Platform;
38}
39
40namespace vk
41{
42class Platform;
43}
44
45namespace tcu
46{
47
48class CommandLine;
49class FunctionLibrary;
50
51struct 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
65	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 *//*--------------------------------------------------------------------*/
93class Platform
94{
95public:
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
145inline 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