1 #ifndef _VKTTESTCASE_HPP
2 #define _VKTTESTCASE_HPP
3 /*-------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
6 *
7 * Copyright (c) 2015 Google Inc.
8 * Copyright (c) 2023 LunarG, Inc.
9 * Copyright (c) 2023 Nintendo
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 *
23 *//*!
24 * \file
25 * \brief Vulkan test case base classes
26 *//*--------------------------------------------------------------------*/
27
28 #include "tcuDefs.hpp"
29 #include "tcuTestCase.hpp"
30 #include "vkDefs.hpp"
31 #include "deUniquePtr.hpp"
32 #include "vkPrograms.hpp"
33 #include "vkApiVersion.hpp"
34 #include "vkDebugReportUtil.hpp"
35 #include "vkPlatform.hpp"
36 #include "vkResourceInterface.hpp"
37 #include "vktTestCaseDefs.hpp"
38 #include "vkPipelineConstructionUtil.hpp"
39 #include <vector>
40 #include <string>
41 #ifdef CTS_USES_VULKANSC
42 #include <mutex>
43 #endif // CTS_USES_VULKANSC
44
45 namespace glu
46 {
47 struct ProgramSources;
48 }
49
50 namespace vk
51 {
52 class PlatformInterface;
53 class Allocator;
54 struct SourceCollections;
55 } // namespace vk
56
57 namespace vkt
58 {
59
60 struct ContextCommonData
61 {
62 const vk::PlatformInterface &vkp;
63 const vk::InstanceInterface &vki;
64 const vk::DeviceInterface &vkd;
65 vk::VkInstance instance;
66 vk::VkPhysicalDevice physicalDevice;
67 vk::VkDevice device;
68 vk::Allocator &allocator;
69 uint32_t qfIndex;
70 vk::VkQueue queue;
71 };
72
73 class DefaultDevice;
74
75 class Context
76 {
77 public:
78 Context(tcu::TestContext &testCtx, const vk::PlatformInterface &platformInterface,
79 vk::BinaryCollection &progCollection, de::SharedPtr<vk::ResourceInterface> resourceInterface);
80 ~Context(void);
81
getTestContext(void) const82 tcu::TestContext &getTestContext(void) const
83 {
84 return m_testCtx;
85 }
getPlatformInterface(void) const86 const vk::PlatformInterface &getPlatformInterface(void) const
87 {
88 return m_platformInterface;
89 }
getBinaryCollection(void) const90 vk::BinaryCollection &getBinaryCollection(void) const
91 {
92 return m_progCollection;
93 }
94
95 // Default instance & device, selected with --deqp-vk-device-id=N
96 uint32_t getMaximumFrameworkVulkanVersion(void) const;
97 uint32_t getAvailableInstanceVersion(void) const;
98 const std::vector<std::string> &getInstanceExtensions(void) const;
99 vk::VkInstance getInstance(void) const;
100 const vk::InstanceInterface &getInstanceInterface(void) const;
101 vk::VkPhysicalDevice getPhysicalDevice(void) const;
102 uint32_t getDeviceVersion(void) const;
103 bool isDeviceFeatureInitialized(vk::VkStructureType sType) const;
104 const vk::VkPhysicalDeviceFeatures &getDeviceFeatures(void) const;
105 const vk::VkPhysicalDeviceFeatures2 &getDeviceFeatures2(void) const;
106 const vk::VkPhysicalDeviceVulkan11Features &getDeviceVulkan11Features(void) const;
107 const vk::VkPhysicalDeviceVulkan12Features &getDeviceVulkan12Features(void) const;
108 #ifndef CTS_USES_VULKANSC
109 const vk::VkPhysicalDeviceVulkan13Features &getDeviceVulkan13Features(void) const;
110 const vk::VkPhysicalDeviceVulkan14Features &getDeviceVulkan14Features(void) const;
111 #endif
112 #ifdef CTS_USES_VULKANSC
113 const vk::VkPhysicalDeviceVulkanSC10Features &getDeviceVulkanSC10Features(void) const;
114 #endif // CTS_USES_VULKANSC
115
116 bool isInstanceFunctionalitySupported(const std::string &extension) const;
117 bool isDeviceFunctionalitySupported(const std::string &extension) const;
118
119 #include "vkDeviceFeaturesForContextDecl.inl"
120
121 bool isDevicePropertyInitialized(vk::VkStructureType sType) const;
122 const vk::VkPhysicalDeviceProperties &getDeviceProperties(void) const;
123 const vk::VkPhysicalDeviceProperties2 &getDeviceProperties2(void) const;
124 const vk::VkPhysicalDeviceVulkan11Properties &getDeviceVulkan11Properties(void) const;
125 const vk::VkPhysicalDeviceVulkan12Properties &getDeviceVulkan12Properties(void) const;
126 #ifndef CTS_USES_VULKANSC
127 const vk::VkPhysicalDeviceVulkan13Properties &getDeviceVulkan13Properties(void) const;
128 const vk::VkPhysicalDeviceVulkan14Properties &getDeviceVulkan14Properties(void) const;
129 #endif
130 #ifdef CTS_USES_VULKANSC
131 const vk::VkPhysicalDeviceVulkanSC10Properties &getDeviceVulkanSC10Properties(void) const;
132 #endif // CTS_USES_VULKANSC
133
134 #include "vkDevicePropertiesForContextDecl.inl"
135
136 const std::vector<std::string> &getDeviceExtensions(void) const;
137 const std::vector<const char *> &getDeviceCreationExtensions(void) const;
138 vk::VkDevice getDevice(void) const;
139 const vk::DeviceInterface &getDeviceInterface(void) const;
140 uint32_t getUniversalQueueFamilyIndex(void) const;
141 vk::VkQueue getUniversalQueue(void) const;
142 uint32_t getUsedApiVersion(void) const;
143 uint32_t getSparseQueueFamilyIndex(void) const;
144 vk::VkQueue getSparseQueue(void) const;
145 int getComputeQueueFamilyIndex(void) const;
146 vk::VkQueue getComputeQueue(void) const;
147 int getTransferQueueFamilyIndex(void) const;
148 vk::VkQueue getTransferQueue(void) const;
149
150 de::SharedPtr<vk::ResourceInterface> getResourceInterface(void) const;
151 vk::Allocator &getDefaultAllocator(void) const;
152 bool contextSupports(const uint32_t variantNum, const uint32_t majorNum, const uint32_t minorNum,
153 const uint32_t patchNum) const;
154 bool contextSupports(const vk::ApiVersion version) const;
155 bool contextSupports(const uint32_t requiredApiVersionBits) const;
156 bool requireDeviceFunctionality(const std::string &required) const;
157 bool requireInstanceFunctionality(const std::string &required) const;
158 bool requireDeviceCoreFeature(const DeviceCoreFeature requiredDeviceCoreFeature);
159
160 #ifndef CTS_USES_VULKANSC
161 vk::VkFormatProperties3 getFormatProperties(const vk::VkFormat &format) const;
162 vk::VkFormatProperties3 getRequiredFormatProperties(const vk::VkFormat &format) const;
163 #endif // CTS_USES_VULKANSC
164
165 void *getInstanceProcAddr();
166
167 bool isBufferDeviceAddressSupported(void) const;
168
resultSetOnValidation() const169 bool resultSetOnValidation() const
170 {
171 return m_resultSetOnValidation;
172 }
resultSetOnValidation(bool value)173 void resultSetOnValidation(bool value)
174 {
175 m_resultSetOnValidation = value;
176 }
177
178 #ifndef CTS_USES_VULKANSC
179 bool hasDebugReportRecorder() const;
180 vk::DebugReportRecorder &getDebugReportRecorder() const;
181 #endif // CTS_USES_VULKANSC
182
183 void checkPipelineConstructionRequirements(const vk::PipelineConstructionType pipelineConstructionType);
184 void resetCommandPoolForVKSC(const vk::VkDevice device, const vk::VkCommandPool commandPool);
185 ContextCommonData getContextCommonData() const;
186
187 #ifdef CTS_USES_VULKANSC
188 static std::vector<VkFaultData> m_faultData;
189 static std::mutex m_faultDataMutex;
190 static VKAPI_ATTR void VKAPI_CALL faultCallbackFunction(VkBool32 unrecordedFaults, uint32_t faultCount,
191 const VkFaultData *pFaults);
192 #endif // CTS_USES_VULKANSC
193
194 protected:
195 tcu::TestContext &m_testCtx;
196 const vk::PlatformInterface &m_platformInterface;
197 vk::BinaryCollection &m_progCollection;
198
199 de::SharedPtr<vk::ResourceInterface> m_resourceInterface;
200 const de::UniquePtr<DefaultDevice> m_device;
201 const de::UniquePtr<vk::Allocator> m_allocator;
202
203 bool m_resultSetOnValidation;
204
205 private:
206 Context(const Context &); // Not allowed
207 Context &operator=(const Context &); // Not allowed
208 };
209
210 class TestInstance;
211
212 class TestCase : public tcu::TestCase
213 {
214 public:
215 TestCase(tcu::TestContext &testCtx, const std::string &name);
~TestCase(void)216 virtual ~TestCase(void)
217 {
218 }
219
220 virtual void delayedInit(void); // non-const init called after checkSupport but before initPrograms
221 virtual void initPrograms(vk::SourceCollections &programCollection) const;
222 virtual TestInstance *createInstance(Context &context) const = 0;
223 virtual void checkSupport(Context &context) const;
224
iterate(void)225 IterateResult iterate(void)
226 {
227 DE_ASSERT(false);
228 return STOP;
229 } // Deprecated in this module
230 };
231
232 class TestInstance
233 {
234 public:
TestInstance(Context & context)235 TestInstance(Context &context) : m_context(context)
236 {
237 }
~TestInstance(void)238 virtual ~TestInstance(void)
239 {
240 }
241
242 virtual tcu::TestStatus iterate(void) = 0;
243
244 protected:
245 Context &m_context;
246
247 private:
248 TestInstance(const TestInstance &);
249 TestInstance &operator=(const TestInstance &);
250 };
251
TestCase(tcu::TestContext & testCtx,const std::string & name)252 inline TestCase::TestCase(tcu::TestContext &testCtx, const std::string &name) : tcu::TestCase(testCtx, name.c_str(), "")
253 {
254 }
255
256 #ifndef CTS_USES_VULKANSC
257
258 void collectAndReportDebugMessages(vk::DebugReportRecorder &debugReportRecorder, Context &context);
259
260 #endif // CTS_USES_VULKANSC
261
262 uint32_t findQueueFamilyIndexWithCaps(const vk::InstanceInterface &vkInstance, vk::VkPhysicalDevice physicalDevice,
263 vk::VkQueueFlags requiredCaps, vk::VkQueueFlags excludedCaps = 0u);
264
265 } // namespace vkt
266
267 #endif // _VKTTESTCASE_HPP
268