1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2019 Advanced Micro Devices, Inc.
6 * Copyright (c) 2019 The Khronos Group Inc.
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 * \brief VK_EXT_tooling_info tests
23 *//*--------------------------------------------------------------------*/
25 #include "vktCustomInstancesDevices.hpp"
26 #include "vkDeviceUtil.hpp"
27 #include "vktApiToolingInfoTests.hpp"
28 #include "vktTestGroupUtil.hpp"
29 #include "vktTestCaseUtil.hpp"
30 #include "vkQueryUtil.hpp"
31 #include "vkStrUtil.hpp"
32 #include "vkTypeUtil.hpp"
33 #include "tcuTestLog.hpp"
49 bool validateToolPurposeFlagBits (const VkToolPurposeFlagsEXT purposes)
51 const VkToolPurposeFlagsEXT validPurposes = VK_TOOL_PURPOSE_VALIDATION_BIT_EXT |
52 VK_TOOL_PURPOSE_PROFILING_BIT_EXT |
53 VK_TOOL_PURPOSE_TRACING_BIT_EXT |
54 VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT |
55 VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT |
56 VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT |
57 VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT;
58 return (purposes | validPurposes) == validPurposes;
61 void checkSupport (Context& context)
63 context.requireDeviceFunctionality("VK_EXT_tooling_info");
66 CustomInstance createCustomInstance (Context& context, bool allowLayers)
68 std::vector<const char*> enabledLayers;
69 std::vector<std::string> enabledLayersStr;
70 const std::vector<std::string> enabledExtensions;
72 const deUint32 apiVersion = context.getUsedApiVersion();
73 const vk::PlatformInterface& vkp = context.getPlatformInterface();
77 enabledLayers = getValidationLayers(context.getPlatformInterface());
78 enabledLayersStr = std::vector<std::string>(begin(enabledLayers), end(enabledLayers));
81 Move<VkInstance> instance = vk::createDefaultInstance(vkp, apiVersion, enabledLayersStr, enabledExtensions, DE_NULL);
82 return CustomInstance(context, instance, allowLayers);
85 bool checkToolsProperties (Context& context, const std::vector<VkPhysicalDeviceToolPropertiesEXT>& deviceToolPropertiesEXTArray)
87 tcu::TestLog& testLog = context.getTestContext().getLog();
90 for (size_t i = 0; i < deviceToolPropertiesEXTArray.size(); ++i)
92 size_t nameSize = strnlen(deviceToolPropertiesEXTArray[i].name, VK_MAX_EXTENSION_NAME_SIZE);
93 size_t versionSize = strnlen(deviceToolPropertiesEXTArray[i].version, VK_MAX_EXTENSION_NAME_SIZE);
94 size_t descSize = strnlen(deviceToolPropertiesEXTArray[i].description, VK_MAX_DESCRIPTION_SIZE);
95 size_t layerSize = strnlen(deviceToolPropertiesEXTArray[i].layer, VK_MAX_EXTENSION_NAME_SIZE);
97 result = result && (deviceToolPropertiesEXTArray[i].sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT);
98 result = result && validateToolPurposeFlagBits(deviceToolPropertiesEXTArray[i].purposes);
99 result = result && ((nameSize > 0) && (nameSize < VK_MAX_EXTENSION_NAME_SIZE));
100 result = result && ((versionSize > 0) && (versionSize < VK_MAX_EXTENSION_NAME_SIZE));
101 result = result && ((descSize > 0) && (descSize < VK_MAX_DESCRIPTION_SIZE));
102 result = result && ((layerSize == 0) || (layerSize < VK_MAX_EXTENSION_NAME_SIZE));
106 testLog << tcu::TestLog::Message << "Tool validation failed" << tcu::TestLog::EndMessage;
107 testLog << tcu::TestLog::Message << "Tool name: " << deviceToolPropertiesEXTArray[i].name << tcu::TestLog::EndMessage;
108 testLog << tcu::TestLog::Message << "Version: " << deviceToolPropertiesEXTArray[i].version << tcu::TestLog::EndMessage;
109 testLog << tcu::TestLog::Message << "Description: " << deviceToolPropertiesEXTArray[i].description << tcu::TestLog::EndMessage;
110 testLog << tcu::TestLog::Message << "Purposes: " << getToolPurposeFlagsEXTStr(deviceToolPropertiesEXTArray[i].purposes) << tcu::TestLog::EndMessage;
113 testLog << tcu::TestLog::Message << "Corresponding Layer: " << deviceToolPropertiesEXTArray[i].layer << tcu::TestLog::EndMessage;
122 tcu::TestStatus validateGetter (Context& context)
124 tcu::TestLog& testLog = context.getTestContext().getLog();
126 VkResult result = VK_SUCCESS;
127 deUint32 toolCount = 0;
129 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCount, DE_NULL);
131 if(result != VK_SUCCESS)
133 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
134 return tcu::TestStatus::fail("Fail");
139 deUint32 toolCountSecondCall = toolCount;
141 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCountSecondCall);
143 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
145 if (result != VK_SUCCESS)
147 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
148 return tcu::TestStatus::fail("Fail");
151 if (toolCountSecondCall != toolCount)
153 testLog << tcu::TestLog::Message << "Got different tools count on the second call" << tcu::TestLog::EndMessage;
154 return tcu::TestStatus::fail("Fail");
157 toolCountSecondCall++;
159 deviceToolPropertiesEXTArray.resize(toolCountSecondCall);
161 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
163 if (result != VK_SUCCESS)
165 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
166 return tcu::TestStatus::fail("Fail");
169 if (toolCountSecondCall != toolCount)
171 testLog << tcu::TestLog::Message << "Bigger array causes an error" << tcu::TestLog::EndMessage;
172 return tcu::TestStatus::fail("Fail");
175 toolCountSecondCall = 0;
177 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
179 if (result != VK_INCOMPLETE)
181 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
182 return tcu::TestStatus::fail("Fail");
185 if (toolCountSecondCall != 0)
187 testLog << tcu::TestLog::Message << "Zero array causes an error" << tcu::TestLog::EndMessage;
188 return tcu::TestStatus::fail("Fail");
194 deUint32 toolCountSecondCall = toolCount / 2;
196 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCountSecondCall);
198 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
200 if (result != VK_INCOMPLETE)
202 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
203 return tcu::TestStatus::fail("Fail");
206 if (toolCountSecondCall != (toolCount / 2))
208 testLog << tcu::TestLog::Message << "Smaller array causes an error" << tcu::TestLog::EndMessage;
209 return tcu::TestStatus::fail("Fail");
213 return tcu::TestStatus::pass("Pass");
216 tcu::TestStatus validateToolsProperties (Context& context)
218 deUint32 toolCount = 0;
220 VK_CHECK(context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCount, DE_NULL));
224 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCount);
226 VK_CHECK(context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCount, &deviceToolPropertiesEXTArray[0]));
228 if (checkToolsProperties(context, deviceToolPropertiesEXTArray) == false)
229 return tcu::TestStatus::fail("Fail");
232 return tcu::TestStatus::pass("Pass");
235 tcu::TestStatus validateInstanceLayers (Context& context)
237 const std::vector<const char*> layers = getValidationLayers(context.getPlatformInterface());
238 bool qualityWarning = false;
241 deUint32 toolCount = 0;
242 CustomInstance instance (createCustomInstance(context, true));
243 VkPhysicalDevice physicalDevice = chooseDevice(instance.getDriver(), instance, context.getTestContext().getCommandLine());
245 VK_CHECK(instance.getDriver().getPhysicalDeviceToolPropertiesEXT(physicalDevice, &toolCount, DE_NULL));
247 if (toolCount < layers.size())
248 qualityWarning = true;
252 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCount);
254 VK_CHECK(context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(physicalDevice, &toolCount, &deviceToolPropertiesEXTArray[0]));
256 if (checkToolsProperties(context, deviceToolPropertiesEXTArray) == false)
257 return tcu::TestStatus::fail("Fail");
259 for (size_t layerNdx = 0; layerNdx < layers.size(); ++layerNdx)
263 for (deUint32 toolNdx = 0; toolNdx < toolCount; ++toolNdx)
265 if (strcmp(layers[layerNdx], deviceToolPropertiesEXTArray[toolNdx].layer) == 0)
271 qualityWarning = true;
279 deUint32 toolCount = 0;
280 CustomInstance instance (createCustomInstance(context, false));
281 VkPhysicalDevice physicalDevice = chooseDevice(instance.getDriver(), instance, context.getTestContext().getCommandLine());
283 VK_CHECK(instance.getDriver().getPhysicalDeviceToolPropertiesEXT(physicalDevice, &toolCount, DE_NULL));
287 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCount);
289 VK_CHECK(context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(physicalDevice, &toolCount, &deviceToolPropertiesEXTArray[0]));
291 if (checkToolsProperties(context, deviceToolPropertiesEXTArray) == false)
292 return tcu::TestStatus::fail("Fail");
294 for (size_t layerNdx = 0; layerNdx < layers.size(); ++layerNdx)
296 for (deUint32 toolNdx = 0; toolNdx < toolCount; ++toolNdx)
298 if (strcmp(layers[layerNdx], deviceToolPropertiesEXTArray[toolNdx].layer) == 0)
300 qualityWarning = true;
301 layerNdx = layers.size();
311 return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Layers have been reported wrong");
315 return tcu::TestStatus::pass("Pass");
319 void createTestCases (tcu::TestCaseGroup* group)
321 addFunctionCase(group, "validate_getter", "Validate getPhysicalDeviceToolPropertiesEXT", checkSupport, validateGetter);
322 addFunctionCase(group, "validate_tools_properties","Validate tools properties", checkSupport, validateToolsProperties);
323 addFunctionCase(group, "validate_instance_layers", "Validate instance layers", checkSupport, validateInstanceLayers);
328 tcu::TestCaseGroup* createToolingInfoTests (tcu::TestContext& testCtx)
330 return createTestGroup(testCtx, "tooling_info", "VK_EXT_tooling_info tests", createTestCases);