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