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 "vktApiToolingInfoTests.hpp"
26 #include "vktTestGroupUtil.hpp"
27 #include "vktTestCaseUtil.hpp"
28 #include "vkQueryUtil.hpp"
29 #include "vkStrUtil.hpp"
30 #include "vkTypeUtil.hpp"
31 #include "tcuTestLog.hpp"
47 bool validateToolPurposeFlagBits(const VkToolPurposeFlagsEXT purposes)
49 const VkToolPurposeFlagsEXT validPurposes = VK_TOOL_PURPOSE_VALIDATION_BIT_EXT |
50 VK_TOOL_PURPOSE_PROFILING_BIT_EXT |
51 VK_TOOL_PURPOSE_TRACING_BIT_EXT |
52 VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT |
53 VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT |
54 VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT |
55 VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT;
56 return (purposes | validPurposes) == validPurposes;
59 void checkSupport (Context& context)
61 context.requireDeviceFunctionality("VK_EXT_tooling_info");
64 tcu::TestStatus validateGetter(Context& context)
66 tcu::TestLog& testLog = context.getTestContext().getLog();
68 VkResult result = VK_SUCCESS;
69 deUint32 toolCount = 0;
71 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCount, DE_NULL);
73 if(result != VK_SUCCESS)
75 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
76 return tcu::TestStatus::fail("Fail");
81 deUint32 toolCountSecondCall = toolCount;
83 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCountSecondCall);
85 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
87 if (result != VK_SUCCESS)
89 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
90 return tcu::TestStatus::fail("Fail");
93 if (toolCountSecondCall != toolCount)
95 testLog << tcu::TestLog::Message << "Got different tools count on the second call" << tcu::TestLog::EndMessage;
96 return tcu::TestStatus::fail("Fail");
99 toolCountSecondCall++;
101 deviceToolPropertiesEXTArray.resize(toolCountSecondCall);
103 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
105 if (result != VK_SUCCESS)
107 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
108 return tcu::TestStatus::fail("Fail");
111 if (toolCountSecondCall != toolCount)
113 testLog << tcu::TestLog::Message << "Bigger array causes an error" << tcu::TestLog::EndMessage;
114 return tcu::TestStatus::fail("Fail");
117 toolCountSecondCall = 0;
119 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
121 if (result != VK_INCOMPLETE)
123 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
124 return tcu::TestStatus::fail("Fail");
127 if (toolCountSecondCall != 0)
129 testLog << tcu::TestLog::Message << "Zero array causes an error" << tcu::TestLog::EndMessage;
130 return tcu::TestStatus::fail("Fail");
136 deUint32 toolCountSecondCall = toolCount / 2;
138 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCountSecondCall);
140 result = context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCountSecondCall, &deviceToolPropertiesEXTArray[0]);
142 if (result != VK_INCOMPLETE)
144 testLog << tcu::TestLog::Message << "getPhysicalDeviceToolPropertiesEXT wrong result code" << tcu::TestLog::EndMessage;
145 return tcu::TestStatus::fail("Fail");
148 if (toolCountSecondCall != (toolCount / 2))
150 testLog << tcu::TestLog::Message << "Smaller array causes an error" << tcu::TestLog::EndMessage;
151 return tcu::TestStatus::fail("Fail");
155 return tcu::TestStatus::pass("Pass");
158 tcu::TestStatus validateToolsProperties (Context& context)
160 tcu::TestLog& testLog = context.getTestContext().getLog();
163 deUint32 toolCount = 0;
165 VK_CHECK(context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCount, DE_NULL));
169 std::vector<VkPhysicalDeviceToolPropertiesEXT> deviceToolPropertiesEXTArray(toolCount);
171 VK_CHECK(context.getInstanceInterface().getPhysicalDeviceToolPropertiesEXT(context.getPhysicalDevice(), &toolCount, &deviceToolPropertiesEXTArray[0]));
173 for (deUint32 i = 0; i < toolCount; ++i)
175 size_t nameSize = strnlen(deviceToolPropertiesEXTArray[i].name, VK_MAX_EXTENSION_NAME_SIZE);
176 size_t versionSize = strnlen(deviceToolPropertiesEXTArray[i].version, VK_MAX_EXTENSION_NAME_SIZE);
177 size_t descSize = strnlen(deviceToolPropertiesEXTArray[i].description, VK_MAX_DESCRIPTION_SIZE);
178 size_t layerSize = strnlen(deviceToolPropertiesEXTArray[i].layer, VK_MAX_EXTENSION_NAME_SIZE);
180 result = result && (deviceToolPropertiesEXTArray[i].sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT);
181 result = result && validateToolPurposeFlagBits(deviceToolPropertiesEXTArray[i].purposes);
182 result = result && ((nameSize > 0) && (nameSize < VK_MAX_EXTENSION_NAME_SIZE));
183 result = result && ((versionSize > 0) && (versionSize < VK_MAX_EXTENSION_NAME_SIZE));
184 result = result && ((descSize > 0) && (descSize < VK_MAX_DESCRIPTION_SIZE));
185 result = result && ((layerSize == 0) || (layerSize < VK_MAX_EXTENSION_NAME_SIZE));
189 testLog << tcu::TestLog::Message << "Tool validation failed" << tcu::TestLog::EndMessage;
190 testLog << tcu::TestLog::Message << "Tool name: " << deviceToolPropertiesEXTArray[i].name << tcu::TestLog::EndMessage;
191 testLog << tcu::TestLog::Message << "Version: " << deviceToolPropertiesEXTArray[i].version << tcu::TestLog::EndMessage;
192 testLog << tcu::TestLog::Message << "Description: " << deviceToolPropertiesEXTArray[i].description << tcu::TestLog::EndMessage;
193 testLog << tcu::TestLog::Message << "Purposes: " << getToolPurposeFlagsEXTStr(deviceToolPropertiesEXTArray[i].purposes) << tcu::TestLog::EndMessage;
196 testLog << tcu::TestLog::Message << "Corresponding Layer: " << deviceToolPropertiesEXTArray[i].layer << tcu::TestLog::EndMessage;
206 return tcu::TestStatus::pass("Pass");
210 return tcu::TestStatus::fail("Fail");
214 void createTestCases (tcu::TestCaseGroup* group)
216 addFunctionCase(group, "validate_getter", "Validate getPhysicalDeviceToolPropertiesEXT", checkSupport, validateGetter);
217 addFunctionCase(group, "validate_tools_properties","Validate tools properties", checkSupport, validateToolsProperties);
222 tcu::TestCaseGroup* createToolingInfoTests(tcu::TestContext& testCtx)
224 return createTestGroup(testCtx, "tooling_info", "VK_EXT_tooling_info tests", createTestCases);