1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2018 Advanced Micro Devices, Inc.
6 * Copyright (c) 2018 The Khronos Group Inc.
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 *//*!
21 * \file
22 * \brief VK_KHR_driver_properties tests
23 *//*--------------------------------------------------------------------*/
24
25 #include "vktApiDriverPropertiesTests.hpp"
26 #include "vktTestGroupUtil.hpp"
27 #include "vktTestCaseUtil.hpp"
28 #include "vkQueryUtil.hpp"
29 #include "vkTypeUtil.hpp"
30 #include "vkKnownDriverIds.inl"
31
32 using namespace vk;
33
34 namespace vkt
35 {
36 namespace api
37 {
38 namespace
39 {
40
41 enum TestType
42 {
43 TEST_TYPE_DRIVER_ID_MATCH = 0,
44 TEST_TYPE_NAME_IS_NOT_EMPTY,
45 TEST_TYPE_NAME_ZERO_TERMINATED,
46 TEST_TYPE_INFO_ZERO_TERMINATED,
47 TEST_TYPE_VERSION,
48 };
49
50 static const VkConformanceVersion knownConformanceVersions[] =
51 {
52 #ifndef CTS_USES_VULKANSC
53 makeConformanceVersion(1, 3, 5, 2),
54 makeConformanceVersion(1, 3, 5, 1),
55 makeConformanceVersion(1, 3, 5, 0),
56 makeConformanceVersion(1, 3, 4, 1),
57 makeConformanceVersion(1, 3, 4, 0),
58 makeConformanceVersion(1, 3, 3, 1),
59 makeConformanceVersion(1, 3, 3, 0),
60 makeConformanceVersion(1, 3, 2, 0),
61 makeConformanceVersion(1, 3, 1, 1),
62 makeConformanceVersion(1, 3, 1, 0),
63 makeConformanceVersion(1, 3, 0, 0),
64 makeConformanceVersion(1, 2, 8, 0),
65 makeConformanceVersion(1, 2, 7, 2),
66 makeConformanceVersion(1, 2, 7, 1),
67 makeConformanceVersion(1, 2, 7, 0),
68 makeConformanceVersion(1, 2, 6, 2),
69 makeConformanceVersion(1, 2, 6, 1),
70 makeConformanceVersion(1, 2, 6, 0),
71 makeConformanceVersion(1, 2, 5, 2),
72 makeConformanceVersion(1, 2, 5, 1),
73 makeConformanceVersion(1, 2, 5, 0),
74 makeConformanceVersion(1, 2, 4, 1),
75 makeConformanceVersion(1, 2, 4, 0),
76 makeConformanceVersion(1, 2, 3, 3),
77 makeConformanceVersion(1, 2, 3, 2),
78 makeConformanceVersion(1, 2, 3, 1),
79 makeConformanceVersion(1, 2, 3, 0),
80 makeConformanceVersion(1, 2, 2, 2),
81 makeConformanceVersion(1, 2, 2, 1),
82 makeConformanceVersion(1, 2, 2, 0),
83 makeConformanceVersion(1, 2, 1, 2),
84 makeConformanceVersion(1, 2, 1, 1),
85 makeConformanceVersion(1, 2, 1, 0),
86 makeConformanceVersion(1, 2, 0, 2),
87 makeConformanceVersion(1, 2, 0, 1),
88 makeConformanceVersion(1, 2, 0, 0),
89 makeConformanceVersion(1, 1, 6, 3),
90 makeConformanceVersion(1, 1, 6, 2),
91 makeConformanceVersion(1, 1, 6, 1),
92 makeConformanceVersion(1, 1, 6, 0),
93 makeConformanceVersion(1, 1, 5, 2),
94 makeConformanceVersion(1, 1, 5, 1),
95 makeConformanceVersion(1, 1, 5, 0),
96 makeConformanceVersion(1, 1, 4, 3),
97 makeConformanceVersion(1, 1, 4, 2),
98 makeConformanceVersion(1, 1, 4, 1),
99 makeConformanceVersion(1, 1, 4, 0),
100 makeConformanceVersion(1, 1, 3, 3),
101 makeConformanceVersion(1, 1, 3, 2),
102 makeConformanceVersion(1, 1, 3, 1),
103 makeConformanceVersion(1, 1, 3, 0),
104 #else
105 makeConformanceVersion(1, 0, 1, 0),
106 makeConformanceVersion(1, 0, 0, 0),
107 #endif // CTS_USES_VULKANSC
108 };
109
isNullTerminated(const char * str,const deUint32 maxSize)110 DE_INLINE bool isNullTerminated(const char* str, const deUint32 maxSize)
111 {
112 return deStrnlen(str, maxSize) < maxSize;
113 }
114
operator ==(const VkConformanceVersion & a,const VkConformanceVersion & b)115 DE_INLINE bool operator==(const VkConformanceVersion& a, const VkConformanceVersion& b)
116 {
117 return ((a.major == b.major) &&
118 (a.minor == b.minor) &&
119 (a.subminor == b.subminor) &&
120 (a.patch == b.patch));
121 }
122
checkSupport(Context & context,const TestType config)123 void checkSupport (Context& context, const TestType config)
124 {
125 DE_UNREF(config);
126 context.requireDeviceFunctionality("VK_KHR_driver_properties");
127 }
128
testDriverMatch(const VkPhysicalDeviceDriverProperties & deviceDriverProperties)129 void testDriverMatch (const VkPhysicalDeviceDriverProperties& deviceDriverProperties)
130 {
131 for (deUint32 driverNdx = 0; driverNdx < DE_LENGTH_OF_ARRAY(driverIds); driverNdx++)
132 {
133 if (deviceDriverProperties.driverID == driverIds[driverNdx].id)
134 return;
135 }
136
137 TCU_FAIL("Driver ID did not match any known driver");
138 }
139
testNameIsNotEmpty(const VkPhysicalDeviceDriverProperties & deviceDriverProperties)140 void testNameIsNotEmpty (const VkPhysicalDeviceDriverProperties& deviceDriverProperties)
141 {
142 if (deviceDriverProperties.driverName[0] == 0)
143 TCU_FAIL("Driver name is empty");
144 }
145
testNameZeroTerminated(const VkPhysicalDeviceDriverProperties & deviceDriverProperties)146 void testNameZeroTerminated (const VkPhysicalDeviceDriverProperties& deviceDriverProperties)
147 {
148 if (!isNullTerminated(deviceDriverProperties.driverName, VK_MAX_DRIVER_NAME_SIZE))
149 TCU_FAIL("Driver name is not a null-terminated string");
150 }
151
testInfoZeroTerminated(const VkPhysicalDeviceDriverProperties & deviceDriverProperties)152 void testInfoZeroTerminated (const VkPhysicalDeviceDriverProperties& deviceDriverProperties)
153 {
154 if (!isNullTerminated(deviceDriverProperties.driverInfo, VK_MAX_DRIVER_INFO_SIZE))
155 TCU_FAIL("Driver info is not a null-terminated string");
156 }
157
testVersion(const VkPhysicalDeviceDriverProperties & deviceDriverProperties,deUint32 usedApiVersion)158 void testVersion (const VkPhysicalDeviceDriverProperties& deviceDriverProperties, deUint32 usedApiVersion)
159 {
160 const deUint32 apiMajorVersion = VK_API_VERSION_MAJOR(usedApiVersion);
161 const deUint32 apiMinorVersion = VK_API_VERSION_MINOR(usedApiVersion);
162
163 if (deviceDriverProperties.conformanceVersion.major < apiMajorVersion ||
164 (deviceDriverProperties.conformanceVersion.major == apiMajorVersion &&
165 deviceDriverProperties.conformanceVersion.minor < apiMinorVersion))
166 {
167 TCU_FAIL("Wrong driver conformance version (older than used API version)");
168 }
169
170 for (const VkConformanceVersion* pConformanceVersion = knownConformanceVersions;
171 pConformanceVersion != DE_ARRAY_END(knownConformanceVersions);
172 ++pConformanceVersion)
173 {
174 if (deviceDriverProperties.conformanceVersion == *pConformanceVersion)
175 return;
176 }
177
178 TCU_FAIL("Wrong driver conformance version (not known)");
179 }
180
testQueryProperties(Context & context,const TestType testType)181 tcu::TestStatus testQueryProperties (Context& context, const TestType testType)
182 {
183 // Query the driver properties
184 const VkPhysicalDevice physDevice = context.getPhysicalDevice();
185 const int memsetPattern = 0xaa;
186 VkPhysicalDeviceProperties2 deviceProperties2;
187 VkPhysicalDeviceDriverProperties deviceDriverProperties;
188
189 deMemset(&deviceDriverProperties, memsetPattern, sizeof(deviceDriverProperties));
190 deviceDriverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
191 deviceDriverProperties.pNext = DE_NULL;
192
193 deMemset(&deviceProperties2, memsetPattern, sizeof(deviceProperties2));
194 deviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
195 deviceProperties2.pNext = &deviceDriverProperties;
196
197 context.getInstanceInterface().getPhysicalDeviceProperties2(physDevice, &deviceProperties2);
198
199 // Verify the returned values
200 switch (testType)
201 {
202 case TEST_TYPE_DRIVER_ID_MATCH: testDriverMatch (deviceDriverProperties); break;
203 case TEST_TYPE_NAME_IS_NOT_EMPTY: testNameIsNotEmpty (deviceDriverProperties); break;
204 case TEST_TYPE_NAME_ZERO_TERMINATED: testNameZeroTerminated (deviceDriverProperties); break;
205 case TEST_TYPE_INFO_ZERO_TERMINATED: testInfoZeroTerminated (deviceDriverProperties); break;
206 case TEST_TYPE_VERSION: testVersion (deviceDriverProperties, context.getUsedApiVersion()); break;
207 default: TCU_THROW(InternalError, "Unknown test type specified");
208 }
209
210 return tcu::TestStatus::pass("Pass");
211 }
212
createTestCases(tcu::TestCaseGroup * group)213 void createTestCases (tcu::TestCaseGroup* group)
214 {
215 addFunctionCase(group, "driver_id_match", "Check driverID is supported", checkSupport, testQueryProperties, TEST_TYPE_DRIVER_ID_MATCH);
216 addFunctionCase(group, "name_is_not_empty", "Check name field is not empty", checkSupport, testQueryProperties, TEST_TYPE_NAME_IS_NOT_EMPTY);
217 addFunctionCase(group, "name_zero_terminated", "Check name field is zero-terminated", checkSupport, testQueryProperties, TEST_TYPE_NAME_ZERO_TERMINATED);
218 addFunctionCase(group, "info_zero_terminated", "Check info field is zero-terminated", checkSupport, testQueryProperties, TEST_TYPE_INFO_ZERO_TERMINATED);
219 addFunctionCase(group, "conformance_version", "Check conformanceVersion reported by driver", checkSupport, testQueryProperties, TEST_TYPE_VERSION);
220 }
221
222 } // anonymous
223
createDriverPropertiesTests(tcu::TestContext & testCtx)224 tcu::TestCaseGroup* createDriverPropertiesTests(tcu::TestContext& testCtx)
225 {
226 return createTestGroup(testCtx, "driver_properties", "VK_KHR_driver_properties tests", createTestCases);
227 }
228
229 } // api
230 } // vkt
231