112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos/*------------------------------------------------------------------------- 2846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * Vulkan Conformance Tests 3846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * ------------------------ 412edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * 5846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * Copyright (c) 2015 Google Inc. 612edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * 7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 1012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1212edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 1812edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * 1912edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *//*! 2012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * \file 2112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * \brief Vulkan test case base classes 2212edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *//*--------------------------------------------------------------------*/ 2312edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos 2412edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos#include "vktTestCase.hpp" 2512edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos 2632675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkRef.hpp" 274b11ca9132ae388bc41f83a8fceaff3791314769Jarkko Pöyry#include "vkRefUtil.hpp" 2832675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkQueryUtil.hpp" 2932675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkDeviceUtil.hpp" 30bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry#include "vkMemUtil.hpp" 3132675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkPlatform.hpp" 32501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos#include "vkDebugReportUtil.hpp" 33501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 34501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos#include "tcuCommandLine.hpp" 3532675035be2a05886457025598f90c131d83c670Pyry Haulos 3625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos#include "deSTLUtil.hpp" 3732675035be2a05886457025598f90c131d83c670Pyry Haulos#include "deMemory.h" 3832675035be2a05886457025598f90c131d83c670Pyry Haulos 3912edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulosnamespace vkt 4012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos{ 4112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos 4232675035be2a05886457025598f90c131d83c670Pyry Haulos// Default device utilities 4332675035be2a05886457025598f90c131d83c670Pyry Haulos 4432675035be2a05886457025598f90c131d83c670Pyry Haulosusing std::vector; 45501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosusing std::string; 4632675035be2a05886457025598f90c131d83c670Pyry Haulosusing namespace vk; 4732675035be2a05886457025598f90c131d83c670Pyry Haulos 4825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosnamespace 4925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos{ 5025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 51501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosvector<string> getValidationLayers (const vector<VkLayerProperties>& supportedLayers) 52501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{ 53501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos static const char* s_magicLayer = "VK_LAYER_LUNARG_standard_validation"; 54501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos static const char* s_defaultLayers[] = 55501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos { 56501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_GOOGLE_threading", 57501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_LUNARG_parameter_validation", 58501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_LUNARG_device_limits", 59501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_LUNARG_object_tracker", 60501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_LUNARG_image", 61501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_LUNARG_core_validation", 62501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_LUNARG_swapchain", 63501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos "VK_LAYER_GOOGLE_unique_objects" 64501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos }; 65501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 66501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos vector<string> enabledLayers; 67501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 68501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos if (isLayerSupported(supportedLayers, RequiredLayer(s_magicLayer))) 69501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos enabledLayers.push_back(s_magicLayer); 70501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos else 71501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos { 72501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_defaultLayers); ++ndx) 73501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos { 74501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos if (isLayerSupported(supportedLayers, RequiredLayer(s_defaultLayers[ndx]))) 75501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos enabledLayers.push_back(s_defaultLayers[ndx]); 76501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos } 77501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos } 78501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 79501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos return enabledLayers; 80501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos} 81501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 82501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosvector<string> getValidationLayers (const PlatformInterface& vkp) 83501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{ 84501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos return getValidationLayers(enumerateInstanceLayerProperties(vkp)); 85501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos} 86501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 87501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosvector<string> getValidationLayers (const InstanceInterface& vki, VkPhysicalDevice physicalDevice) 88501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{ 89501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos return getValidationLayers(enumerateDeviceLayerProperties(vki, physicalDevice)); 90501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos} 91501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 92ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwavector<string> filterExtensions(const vector<VkExtensionProperties>& deviceExtensions) 93501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{ 94501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos vector<string> enabledExtensions; 95ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa const char* extensionGroups[] = 96ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa { 97ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa "VK_KHR_", 986f1adef8acaca9616e2ae0774566471b146d42b1Arkadiusz Sarwa "VK_EXT_", 996f1adef8acaca9616e2ae0774566471b146d42b1Arkadiusz Sarwa "VK_KHX_" 100ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa }; 101ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa 102ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa for (size_t deviceExtNdx = 0; deviceExtNdx < deviceExtensions.size(); deviceExtNdx++) 103ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa { 104ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa for (int extGroupNdx = 0; extGroupNdx < DE_LENGTH_OF_ARRAY(extensionGroups); extGroupNdx++) 105ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa { 106ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa if (deStringBeginsWith(deviceExtensions[deviceExtNdx].extensionName, extensionGroups[extGroupNdx])) 107ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa enabledExtensions.push_back(deviceExtensions[deviceExtNdx].extensionName); 108ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa } 109ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa } 110ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa 111ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa return enabledExtensions; 112ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa} 113ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa 1140dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz SarwaMove<VkInstance> createInstance (const PlatformInterface& vkp, const vector<string>& enabledExtensions, const tcu::CommandLine& cmdLine) 115ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa{ 116ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa const bool isValidationEnabled = cmdLine.isValidationEnabled(); 117ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa vector<string> enabledLayers; 118501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 119501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos if (isValidationEnabled) 120501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos { 121ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa if (!isDebugReportSupported(vkp)) 122501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported"); 123501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 124501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos enabledLayers = getValidationLayers(vkp); 125501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos if (enabledLayers.empty()) 126501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos TCU_THROW(NotSupportedError, "No validation layers found"); 127501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos } 128501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 129501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos return createDefaultInstance(vkp, enabledLayers, enabledExtensions); 130501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos} 131501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 132fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyrystatic deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps) 13332675035be2a05886457025598f90c131d83c670Pyry Haulos{ 1343d2071b82061ee418aa87064333069281133eddaPyry Haulos const vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vkInstance, physicalDevice); 13532675035be2a05886457025598f90c131d83c670Pyry Haulos 13632675035be2a05886457025598f90c131d83c670Pyry Haulos for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++) 13732675035be2a05886457025598f90c131d83c670Pyry Haulos { 13832675035be2a05886457025598f90c131d83c670Pyry Haulos if ((queueProps[queueNdx].queueFlags & requiredCaps) == requiredCaps) 13932675035be2a05886457025598f90c131d83c670Pyry Haulos return (deUint32)queueNdx; 14032675035be2a05886457025598f90c131d83c670Pyry Haulos } 14132675035be2a05886457025598f90c131d83c670Pyry Haulos 14232675035be2a05886457025598f90c131d83c670Pyry Haulos TCU_THROW(NotSupportedError, "No matching queue found"); 14332675035be2a05886457025598f90c131d83c670Pyry Haulos} 14432675035be2a05886457025598f90c131d83c670Pyry Haulos 14525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry HaulosMove<VkDevice> createDefaultDevice (const InstanceInterface& vki, 14625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos VkPhysicalDevice physicalDevice, 14725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos deUint32 queueIndex, 14825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const VkPhysicalDeviceFeatures2KHR& enabledFeatures, 14925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const vector<string>& enabledExtensions, 15025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const tcu::CommandLine& cmdLine) 15132675035be2a05886457025598f90c131d83c670Pyry Haulos{ 15232675035be2a05886457025598f90c131d83c670Pyry Haulos VkDeviceQueueCreateInfo queueInfo; 15332675035be2a05886457025598f90c131d83c670Pyry Haulos VkDeviceCreateInfo deviceInfo; 154501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos vector<string> enabledLayers; 155501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos vector<const char*> layerPtrs; 156ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos vector<const char*> extensionPtrs; 15766ccd764e687029f326b3eb6e30e1815e63e3c32Dae Kim const float queuePriority = 1.0f; 15832675035be2a05886457025598f90c131d83c670Pyry Haulos 159f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos deMemset(&queueInfo, 0, sizeof(queueInfo)); 160f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos deMemset(&deviceInfo, 0, sizeof(deviceInfo)); 161f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos 162501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos if (cmdLine.isValidationEnabled()) 163501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos { 164501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos enabledLayers = getValidationLayers(vki, physicalDevice); 165501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos if (enabledLayers.empty()) 166501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos TCU_THROW(NotSupportedError, "No validation layers found"); 167501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos } 168501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 169501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos layerPtrs.resize(enabledLayers.size()); 170501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 171501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx) 172501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos layerPtrs[ndx] = enabledLayers[ndx].c_str(); 173501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 174ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos extensionPtrs.resize(enabledExtensions.size()); 175ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos 176ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos for (size_t ndx = 0; ndx < enabledExtensions.size(); ++ndx) 177ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos extensionPtrs[ndx] = enabledExtensions[ndx].c_str(); 178ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos 17925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos // VK_KHR_get_physical_device_propeties2 is used if enabledFeatures.pNext != 0 18025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 18168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 18225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos queueInfo.pNext = enabledFeatures.pNext ? &enabledFeatures : DE_NULL; 18368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueInfo.flags = (VkDeviceQueueCreateFlags)0u; 18468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueInfo.queueFamilyIndex = queueIndex; 18568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueInfo.queueCount = 1u; 18666ccd764e687029f326b3eb6e30e1815e63e3c32Dae Kim queueInfo.pQueuePriorities = &queuePriority; 18768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 18868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; 18968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deviceInfo.pNext = DE_NULL; 19068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deviceInfo.queueCreateInfoCount = 1u; 19168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deviceInfo.pQueueCreateInfos = &queueInfo; 192ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos deviceInfo.enabledExtensionCount = (deUint32)extensionPtrs.size(); 193ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos deviceInfo.ppEnabledExtensionNames = (extensionPtrs.empty() ? DE_NULL : &extensionPtrs[0]); 194501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos deviceInfo.enabledLayerCount = (deUint32)layerPtrs.size(); 195501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos deviceInfo.ppEnabledLayerNames = (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]); 19625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos deviceInfo.pEnabledFeatures = enabledFeatures.pNext ? DE_NULL : &enabledFeatures.features; 197f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos 198f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos return createDevice(vki, physicalDevice, &deviceInfo); 19932675035be2a05886457025598f90c131d83c670Pyry Haulos}; 20032675035be2a05886457025598f90c131d83c670Pyry Haulos 20125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosbool isPhysicalDeviceFeatures2Supported (const vector<string>& instanceExtensions) 20225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos{ 20325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos return de::contains(instanceExtensions.begin(), instanceExtensions.end(), "VK_KHR_get_physical_device_properties2"); 20425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos} 20525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 20625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosstruct DeviceFeatures 20725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos{ 20825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos VkPhysicalDeviceFeatures2KHR coreFeatures; 20925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR samplerYCbCrConversionFeatures; 21025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 21125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos DeviceFeatures (const InstanceInterface& vki, 21225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos VkPhysicalDevice physicalDevice, 21325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const vector<string>& instanceExtensions, 21425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const vector<string>& deviceExtensions) 21525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos { 21625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos void** curExtPoint = &coreFeatures.pNext; 21725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 21825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos deMemset(&coreFeatures, 0, sizeof(coreFeatures)); 21925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos deMemset(&samplerYCbCrConversionFeatures, 0, sizeof(samplerYCbCrConversionFeatures)); 22025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 22125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos coreFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; 22225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos samplerYCbCrConversionFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR; 22325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 22425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos if (isPhysicalDeviceFeatures2Supported(instanceExtensions)) 22525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos { 22625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_sampler_ycbcr_conversion")) 22725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos { 22825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos *curExtPoint = &samplerYCbCrConversionFeatures; 22925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos curExtPoint = &samplerYCbCrConversionFeatures.pNext; 23025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos } 23125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 23225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos vki.getPhysicalDeviceFeatures2KHR(physicalDevice, &coreFeatures); 23325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos } 23425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos else 23525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos coreFeatures.features = getPhysicalDeviceFeatures(vki, physicalDevice); 23625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 23725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos // Disable robustness by default, as it has an impact on performance on some HW. 23825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos coreFeatures.features.robustBufferAccess = false; 23925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos } 24025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos}; 24125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 24225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos} // anonymous 24325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 24432675035be2a05886457025598f90c131d83c670Pyry Haulosclass DefaultDevice 24532675035be2a05886457025598f90c131d83c670Pyry Haulos{ 24632675035be2a05886457025598f90c131d83c670Pyry Haulospublic: 247689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DefaultDevice (const PlatformInterface& vkPlatform, const tcu::CommandLine& cmdLine); 248689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos ~DefaultDevice (void); 24932675035be2a05886457025598f90c131d83c670Pyry Haulos 25025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos VkInstance getInstance (void) const { return *m_instance; } 25125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const InstanceInterface& getInstanceInterface (void) const { return m_instanceInterface; } 25225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const vector<string>& getInstanceExtensions (void) const { return m_instanceExtensions; } 253b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 25425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos VkPhysicalDevice getPhysicalDevice (void) const { return m_physicalDevice; } 25525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const VkPhysicalDeviceFeatures& getDeviceFeatures (void) const { return m_deviceFeatures.coreFeatures.features; } 25625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const VkPhysicalDeviceFeatures2KHR& getDeviceFeatures2 (void) const { return m_deviceFeatures.coreFeatures; } 25725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos VkDevice getDevice (void) const { return *m_device; } 25825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const DeviceInterface& getDeviceInterface (void) const { return m_deviceInterface; } 25925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const VkPhysicalDeviceProperties& getDeviceProperties (void) const { return m_deviceProperties; } 26025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const vector<string>& getDeviceExtensions (void) const { return m_deviceExtensions; } 261b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 26225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos deUint32 getUniversalQueueFamilyIndex (void) const { return m_universalQueueFamilyIndex; } 263689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkQueue getUniversalQueue (void) const; 26432675035be2a05886457025598f90c131d83c670Pyry Haulos 26532675035be2a05886457025598f90c131d83c670Pyry Haulosprivate: 266b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim static VkPhysicalDeviceFeatures filterDefaultDeviceFeatures (const VkPhysicalDeviceFeatures& deviceFeatures); 267b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim 2680dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa const vector<string> m_instanceExtensions; 269689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const Unique<VkInstance> m_instance; 270689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const InstanceDriver m_instanceInterface; 271b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 272689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkPhysicalDevice m_physicalDevice; 273b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 274689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const deUint32 m_universalQueueFamilyIndex; 275ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos const vector<string> m_deviceExtensions; 27625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const DeviceFeatures m_deviceFeatures; 27725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos const VkPhysicalDeviceProperties m_deviceProperties; 278b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 279689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const Unique<VkDevice> m_device; 280689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const DeviceDriver m_deviceInterface; 28132675035be2a05886457025598f90c131d83c670Pyry Haulos}; 28232675035be2a05886457025598f90c131d83c670Pyry Haulos 28332675035be2a05886457025598f90c131d83c670Pyry HaulosDefaultDevice::DefaultDevice (const PlatformInterface& vkPlatform, const tcu::CommandLine& cmdLine) 2840dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa : m_instanceExtensions (filterExtensions(enumerateInstanceExtensionProperties(vkPlatform, DE_NULL))) 2850dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa , m_instance (createInstance(vkPlatform, m_instanceExtensions, cmdLine)) 286fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyry , m_instanceInterface (vkPlatform, *m_instance) 287fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyry , m_physicalDevice (chooseDevice(m_instanceInterface, *m_instance, cmdLine)) 2886d38a140551eb9f1ded273a40c93d55428efefc2Pyry Haulos , m_universalQueueFamilyIndex (findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT)) 2890dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa , m_deviceExtensions (filterExtensions(enumerateDeviceExtensionProperties(m_instanceInterface, m_physicalDevice, DE_NULL))) 29025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos , m_deviceFeatures (m_instanceInterface, m_physicalDevice, m_instanceExtensions, m_deviceExtensions) 29125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos , m_deviceProperties (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice)) 29225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos , m_device (createDefaultDevice(m_instanceInterface, 29325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos m_physicalDevice, 29425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos m_universalQueueFamilyIndex, 29525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos m_deviceFeatures.coreFeatures, 29625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos m_deviceExtensions, 29725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos cmdLine)) 298fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyry , m_deviceInterface (m_instanceInterface, *m_device) 29932675035be2a05886457025598f90c131d83c670Pyry Haulos{ 30032675035be2a05886457025598f90c131d83c670Pyry Haulos} 30132675035be2a05886457025598f90c131d83c670Pyry Haulos 30232675035be2a05886457025598f90c131d83c670Pyry HaulosDefaultDevice::~DefaultDevice (void) 30332675035be2a05886457025598f90c131d83c670Pyry Haulos{ 30432675035be2a05886457025598f90c131d83c670Pyry Haulos} 30532675035be2a05886457025598f90c131d83c670Pyry Haulos 30632675035be2a05886457025598f90c131d83c670Pyry HaulosVkQueue DefaultDevice::getUniversalQueue (void) const 30732675035be2a05886457025598f90c131d83c670Pyry Haulos{ 30855dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi return getDeviceQueue(m_deviceInterface, *m_device, m_universalQueueFamilyIndex, 0); 30932675035be2a05886457025598f90c131d83c670Pyry Haulos} 31032675035be2a05886457025598f90c131d83c670Pyry Haulos 31125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosnamespace 312b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim{ 313b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim 314bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry// Allocator utilities 315bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry 316bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyryvk::Allocator* createAllocator (DefaultDevice* device) 317bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry{ 318bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry const VkPhysicalDeviceMemoryProperties memoryProperties = vk::getPhysicalDeviceMemoryProperties(device->getInstanceInterface(), device->getPhysicalDevice()); 319bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry 320bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry // \todo [2015-07-24 jarkko] support allocator selection/configuration from command line (or compile time) 321bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry return new SimpleAllocator(device->getDeviceInterface(), device->getDevice(), memoryProperties); 322bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry} 323bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry 32425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos} // anonymous 32525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos 32632675035be2a05886457025598f90c131d83c670Pyry Haulos// Context 32732675035be2a05886457025598f90c131d83c670Pyry Haulos 32832675035be2a05886457025598f90c131d83c670Pyry HaulosContext::Context (tcu::TestContext& testCtx, 32932675035be2a05886457025598f90c131d83c670Pyry Haulos const vk::PlatformInterface& platformInterface, 33032675035be2a05886457025598f90c131d83c670Pyry Haulos vk::ProgramCollection<vk::ProgramBinary>& progCollection) 33132675035be2a05886457025598f90c131d83c670Pyry Haulos : m_testCtx (testCtx) 33232675035be2a05886457025598f90c131d83c670Pyry Haulos , m_platformInterface (platformInterface) 33332675035be2a05886457025598f90c131d83c670Pyry Haulos , m_progCollection (progCollection) 33432675035be2a05886457025598f90c131d83c670Pyry Haulos , m_device (new DefaultDevice(m_platformInterface, testCtx.getCommandLine())) 335bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry , m_allocator (createAllocator(m_device.get())) 33632675035be2a05886457025598f90c131d83c670Pyry Haulos{ 33732675035be2a05886457025598f90c131d83c670Pyry Haulos} 33832675035be2a05886457025598f90c131d83c670Pyry Haulos 33932675035be2a05886457025598f90c131d83c670Pyry HaulosContext::~Context (void) 34032675035be2a05886457025598f90c131d83c670Pyry Haulos{ 34132675035be2a05886457025598f90c131d83c670Pyry Haulos} 34232675035be2a05886457025598f90c131d83c670Pyry Haulos 3430dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwaconst vector<string>& Context::getInstanceExtensions (void) const { return m_device->getInstanceExtensions(); } 344fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkInstance Context::getInstance (void) const { return m_device->getInstance(); } 345fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::InstanceInterface& Context::getInstanceInterface (void) const { return m_device->getInstanceInterface(); } 346fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkPhysicalDevice Context::getPhysicalDevice (void) const { return m_device->getPhysicalDevice(); } 347fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::VkPhysicalDeviceFeatures& Context::getDeviceFeatures (void) const { return m_device->getDeviceFeatures(); } 34825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosconst vk::VkPhysicalDeviceFeatures2KHR& Context::getDeviceFeatures2 (void) const { return m_device->getDeviceFeatures2(); } 349fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::VkPhysicalDeviceProperties& Context::getDeviceProperties (void) const { return m_device->getDeviceProperties(); } 350ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulosconst vector<string>& Context::getDeviceExtensions (void) const { return m_device->getDeviceExtensions(); } 351fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkDevice Context::getDevice (void) const { return m_device->getDevice(); } 352fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::DeviceInterface& Context::getDeviceInterface (void) const { return m_device->getDeviceInterface(); } 353fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry HaulosdeUint32 Context::getUniversalQueueFamilyIndex (void) const { return m_device->getUniversalQueueFamilyIndex(); } 354fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkQueue Context::getUniversalQueue (void) const { return m_device->getUniversalQueue(); } 355fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::Allocator& Context::getDefaultAllocator (void) const { return *m_allocator; } 35632675035be2a05886457025598f90c131d83c670Pyry Haulos 35732675035be2a05886457025598f90c131d83c670Pyry Haulos// TestCase 35832675035be2a05886457025598f90c131d83c670Pyry Haulos 3597485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid TestCase::initPrograms (SourceCollections&) const 36012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos{ 36112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos} 36212edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos 36312edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos} // vkt 364