xref: /aosp_15_r20/external/deqp/external/vulkancts/modules/vulkan/vktTestCase.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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::InstanceInterface &vki;
63     vk::VkDevice device;
64     const vk::DeviceInterface &vkd;
65     vk::VkPhysicalDevice physicalDevice;
66     vk::Allocator &allocator;
67     uint32_t qfIndex;
68     vk::VkQueue queue;
69 };
70 
71 class DefaultDevice;
72 
73 class Context
74 {
75 public:
76     Context(tcu::TestContext &testCtx, const vk::PlatformInterface &platformInterface,
77             vk::BinaryCollection &progCollection, de::SharedPtr<vk::ResourceInterface> resourceInterface);
78     ~Context(void);
79 
getTestContext(void) const80     tcu::TestContext &getTestContext(void) const
81     {
82         return m_testCtx;
83     }
getPlatformInterface(void) const84     const vk::PlatformInterface &getPlatformInterface(void) const
85     {
86         return m_platformInterface;
87     }
getBinaryCollection(void) const88     vk::BinaryCollection &getBinaryCollection(void) const
89     {
90         return m_progCollection;
91     }
92 
93     // Default instance & device, selected with --deqp-vk-device-id=N
94     uint32_t getMaximumFrameworkVulkanVersion(void) const;
95     uint32_t getAvailableInstanceVersion(void) const;
96     const std::vector<std::string> &getInstanceExtensions(void) const;
97     vk::VkInstance getInstance(void) const;
98     const vk::InstanceInterface &getInstanceInterface(void) const;
99     vk::VkPhysicalDevice getPhysicalDevice(void) const;
100     uint32_t getDeviceVersion(void) const;
101     bool isDeviceFeatureInitialized(vk::VkStructureType sType) const;
102     const vk::VkPhysicalDeviceFeatures &getDeviceFeatures(void) const;
103     const vk::VkPhysicalDeviceFeatures2 &getDeviceFeatures2(void) const;
104     const vk::VkPhysicalDeviceVulkan11Features &getDeviceVulkan11Features(void) const;
105     const vk::VkPhysicalDeviceVulkan12Features &getDeviceVulkan12Features(void) const;
106 #ifndef CTS_USES_VULKANSC
107     const vk::VkPhysicalDeviceVulkan13Features &getDeviceVulkan13Features(void) const;
108 #endif
109 #ifdef CTS_USES_VULKANSC
110     const vk::VkPhysicalDeviceVulkanSC10Features &getDeviceVulkanSC10Features(void) const;
111 #endif // CTS_USES_VULKANSC
112 
113     bool isInstanceFunctionalitySupported(const std::string &extension) const;
114     bool isDeviceFunctionalitySupported(const std::string &extension) const;
115 
116 #include "vkDeviceFeaturesForContextDecl.inl"
117 
118     bool isDevicePropertyInitialized(vk::VkStructureType sType) const;
119     const vk::VkPhysicalDeviceProperties &getDeviceProperties(void) const;
120     const vk::VkPhysicalDeviceProperties2 &getDeviceProperties2(void) const;
121     const vk::VkPhysicalDeviceVulkan11Properties &getDeviceVulkan11Properties(void) const;
122     const vk::VkPhysicalDeviceVulkan12Properties &getDeviceVulkan12Properties(void) const;
123 #ifndef CTS_USES_VULKANSC
124     const vk::VkPhysicalDeviceVulkan13Properties &getDeviceVulkan13Properties(void) const;
125 #endif
126 #ifdef CTS_USES_VULKANSC
127     const vk::VkPhysicalDeviceVulkanSC10Properties &getDeviceVulkanSC10Properties(void) const;
128 #endif // CTS_USES_VULKANSC
129 
130 #include "vkDevicePropertiesForContextDecl.inl"
131 
132     const std::vector<std::string> &getDeviceExtensions(void) const;
133     const std::vector<const char *> &getDeviceCreationExtensions(void) const;
134     vk::VkDevice getDevice(void) const;
135     const vk::DeviceInterface &getDeviceInterface(void) const;
136     uint32_t getUniversalQueueFamilyIndex(void) const;
137     vk::VkQueue getUniversalQueue(void) const;
138     uint32_t getUsedApiVersion(void) const;
139     uint32_t getSparseQueueFamilyIndex(void) const;
140     vk::VkQueue getSparseQueue(void) const;
141     int getComputeQueueFamilyIndex(void) const;
142     vk::VkQueue getComputeQueue(void) const;
143     int getTransferQueueFamilyIndex(void) const;
144     vk::VkQueue getTransferQueue(void) const;
145 
146     de::SharedPtr<vk::ResourceInterface> getResourceInterface(void) const;
147     vk::Allocator &getDefaultAllocator(void) const;
148     bool contextSupports(const uint32_t variantNum, const uint32_t majorNum, const uint32_t minorNum,
149                          const uint32_t patchNum) const;
150     bool contextSupports(const vk::ApiVersion version) const;
151     bool contextSupports(const uint32_t requiredApiVersionBits) const;
152     bool requireDeviceFunctionality(const std::string &required) const;
153     bool requireInstanceFunctionality(const std::string &required) const;
154     bool requireDeviceCoreFeature(const DeviceCoreFeature requiredDeviceCoreFeature);
155 
156 #ifndef CTS_USES_VULKANSC
157     vk::VkFormatProperties3 getFormatProperties(const vk::VkFormat &format) const;
158     vk::VkFormatProperties3 getRequiredFormatProperties(const vk::VkFormat &format) const;
159 #endif // CTS_USES_VULKANSC
160 
161     void *getInstanceProcAddr();
162 
163     bool isBufferDeviceAddressSupported(void) const;
164 
resultSetOnValidation() const165     bool resultSetOnValidation() const
166     {
167         return m_resultSetOnValidation;
168     }
resultSetOnValidation(bool value)169     void resultSetOnValidation(bool value)
170     {
171         m_resultSetOnValidation = value;
172     }
173 
174 #ifndef CTS_USES_VULKANSC
175     bool hasDebugReportRecorder() const;
176     vk::DebugReportRecorder &getDebugReportRecorder() const;
177 #endif // CTS_USES_VULKANSC
178 
179     void checkPipelineConstructionRequirements(const vk::PipelineConstructionType pipelineConstructionType);
180     void resetCommandPoolForVKSC(const vk::VkDevice device, const vk::VkCommandPool commandPool);
181     ContextCommonData getContextCommonData();
182 
183 #ifdef CTS_USES_VULKANSC
184     static std::vector<VkFaultData> m_faultData;
185     static std::mutex m_faultDataMutex;
186     static VKAPI_ATTR void VKAPI_CALL faultCallbackFunction(VkBool32 unrecordedFaults, uint32_t faultCount,
187                                                             const VkFaultData *pFaults);
188 #endif // CTS_USES_VULKANSC
189 
190 protected:
191     tcu::TestContext &m_testCtx;
192     const vk::PlatformInterface &m_platformInterface;
193     vk::BinaryCollection &m_progCollection;
194 
195     de::SharedPtr<vk::ResourceInterface> m_resourceInterface;
196     const de::UniquePtr<DefaultDevice> m_device;
197     const de::UniquePtr<vk::Allocator> m_allocator;
198 
199     bool m_resultSetOnValidation;
200 
201 private:
202     Context(const Context &);            // Not allowed
203     Context &operator=(const Context &); // Not allowed
204 };
205 
206 class TestInstance;
207 
208 class TestCase : public tcu::TestCase
209 {
210 public:
211     TestCase(tcu::TestContext &testCtx, const std::string &name);
~TestCase(void)212     virtual ~TestCase(void)
213     {
214     }
215 
216     virtual void delayedInit(void); // non-const init called after checkSupport but before initPrograms
217     virtual void initPrograms(vk::SourceCollections &programCollection) const;
218     virtual TestInstance *createInstance(Context &context) const = 0;
219     virtual void checkSupport(Context &context) const;
220 
iterate(void)221     IterateResult iterate(void)
222     {
223         DE_ASSERT(false);
224         return STOP;
225     } // Deprecated in this module
226 };
227 
228 class TestInstance
229 {
230 public:
TestInstance(Context & context)231     TestInstance(Context &context) : m_context(context)
232     {
233     }
~TestInstance(void)234     virtual ~TestInstance(void)
235     {
236     }
237 
238     virtual tcu::TestStatus iterate(void) = 0;
239 
240 protected:
241     Context &m_context;
242 
243 private:
244     TestInstance(const TestInstance &);
245     TestInstance &operator=(const TestInstance &);
246 };
247 
TestCase(tcu::TestContext & testCtx,const std::string & name)248 inline TestCase::TestCase(tcu::TestContext &testCtx, const std::string &name) : tcu::TestCase(testCtx, name.c_str(), "")
249 {
250 }
251 
252 #ifndef CTS_USES_VULKANSC
253 
254 void collectAndReportDebugMessages(vk::DebugReportRecorder &debugReportRecorder, Context &context);
255 
256 #endif // CTS_USES_VULKANSC
257 
258 uint32_t findQueueFamilyIndexWithCaps(const vk::InstanceInterface &vkInstance, vk::VkPhysicalDevice physicalDevice,
259                                       vk::VkQueueFlags requiredCaps, vk::VkQueueFlags excludedCaps = 0u);
260 
261 } // namespace vkt
262 
263 #endif // _VKTTESTCASE_HPP
264