• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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