X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=external%2Fvulkancts%2Fmodules%2Fvulkan%2Fspirv_assembly%2FvktSpvAsmUtils.cpp;h=cadebe68fdfa91c6d10eef58a145429c878b8fbc;hb=889c2ca6299d711564e46e8eb7baa03e3669e72b;hp=fd023bc2fcaf02c13dfaf2fdfdd5991f06235b2f;hpb=13a4b87ea7fc230f65aec1dbe0aab3da7989d0ad;p=platform%2Fupstream%2FVK-GL-CTS.git diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp index fd023bc..cadebe6 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp @@ -74,16 +74,40 @@ VkPhysicalDevice16BitStorageFeaturesKHR querySupported16BitStorageFeatures (cons return extensionFeatures; } +VkPhysicalDeviceVariablePointerFeaturesKHR querySupportedVariablePointersFeatures (const InstanceInterface& vki, VkPhysicalDevice device, const std::vector& instanceExtensions) +{ + VkPhysicalDeviceVariablePointerFeaturesKHR extensionFeatures = + { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR, // sType + DE_NULL, // pNext + false, // variablePointersStorageBuffer + false, // variablePointers + }; + + VkPhysicalDeviceFeatures2KHR features; + deMemset(&features, 0, sizeof(features)); + features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; + features.pNext = &extensionFeatures; + + // Call the getter only if supported. Otherwise above "zero" defaults are used + if (de::contains(instanceExtensions.begin(), instanceExtensions.end(), "VK_KHR_get_physical_device_properties2")) + { + vki.getPhysicalDeviceFeatures2KHR(device, &features); + } + + return extensionFeatures; +} + } // anonymous bool is16BitStorageFeaturesSupported (const InstanceInterface& vki, VkPhysicalDevice device, const std::vector& instanceExtensions, Extension16BitStorageFeatures toCheck) { VkPhysicalDevice16BitStorageFeaturesKHR extensionFeatures = querySupported16BitStorageFeatures(vki, device, instanceExtensions); - if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK) != 0 && extensionFeatures.storageUniformBufferBlock16 == VK_FALSE) + if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK) != 0 && extensionFeatures.storageBuffer16BitAccess == VK_FALSE) return false; - if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM) != 0 && extensionFeatures.storageUniform16 == VK_FALSE) + if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM) != 0 && extensionFeatures.uniformAndStorageBuffer16BitAccess == VK_FALSE) return false; if ((toCheck & EXT16BITSTORAGEFEATURES_PUSH_CONSTANT) != 0 && extensionFeatures.storagePushConstant16 == VK_FALSE) @@ -95,15 +119,31 @@ bool is16BitStorageFeaturesSupported (const InstanceInterface& vki, VkPhysicalDe return true; } +bool isVariablePointersFeaturesSupported (const InstanceInterface& vki, VkPhysicalDevice device, const std::vector& instanceExtensions, ExtensionVariablePointersFeatures toCheck) +{ + VkPhysicalDeviceVariablePointerFeaturesKHR extensionFeatures = querySupportedVariablePointersFeatures(vki, device, instanceExtensions); + + if ((toCheck & EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER) != 0 && extensionFeatures.variablePointersStorageBuffer == VK_FALSE) + return false; + + if ((toCheck & EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS) != 0 && extensionFeatures.variablePointers == VK_FALSE) + return false; + + return true; +} + Move createDeviceWithExtensions (Context& context, const deUint32 queueFamilyIndex, const std::vector& supportedExtensions, const std::vector& requiredExtensions) { - const InstanceInterface& vki = context.getInstanceInterface(); - const VkPhysicalDevice physicalDevice = context.getPhysicalDevice(); - std::vector extensions (requiredExtensions.size()); - bool requires16BitStorageExtension = false; + const InstanceInterface& vki = context.getInstanceInterface(); + const VkPhysicalDevice physicalDevice = context.getPhysicalDevice(); + std::vector extensions (requiredExtensions.size()); + void* pExtension = DE_NULL; + const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(vki, physicalDevice); + VkPhysicalDevice16BitStorageFeaturesKHR ext16BitStorageFeatures; + VkPhysicalDeviceVariablePointerFeaturesKHR extVariablePointerFeatures; for (deUint32 extNdx = 0; extNdx < requiredExtensions.size(); ++extNdx) { @@ -115,19 +155,25 @@ Move createDeviceWithExtensions (Context& context, TCU_THROW(NotSupportedError, (std::string("Device extension not supported: ") + ext).c_str()); } + // Currently don't support enabling multiple extensions at the same time. if (ext == "VK_KHR_16bit_storage") { - requires16BitStorageExtension = true; + // For the 16bit storage extension, we have four features to test. Requesting all features supported. + // Note that we don't throw NotImplemented errors here if a specific feature is not supported; + // that should be done when actually trying to use that specific feature. + ext16BitStorageFeatures = querySupported16BitStorageFeatures(vki, physicalDevice, context.getInstanceExtensions()); + pExtension = &ext16BitStorageFeatures; + } + else if (ext == "VK_KHR_variable_pointers") + { + // For the VariablePointers extension, we have two features to test. Requesting all features supported. + extVariablePointerFeatures = querySupportedVariablePointersFeatures(vki, physicalDevice, context.getInstanceExtensions()); + pExtension = &extVariablePointerFeatures; } extensions[extNdx] = ext.c_str(); } - // For the 16bit storage extension, we have four features to test. Requesting all features supported. - // Note that we don't throw NotImplemented errors here if a specific feature is not supported; - // that should be done when actually trying to use that specific feature. - VkPhysicalDevice16BitStorageFeaturesKHR ext16BitStorageFeatures = querySupported16BitStorageFeatures(vki, physicalDevice, context.getInstanceExtensions()); - const float queuePriorities[] = { 1.0f }; const VkDeviceQueueCreateInfo queueInfos[] = { @@ -140,11 +186,11 @@ Move createDeviceWithExtensions (Context& context, &queuePriorities[0] } }; - const VkPhysicalDeviceFeatures features = filterDefaultDeviceFeatures(getPhysicalDeviceFeatures(vki, physicalDevice)); + const VkPhysicalDeviceFeatures features = filterDefaultDeviceFeatures(deviceFeatures); const VkDeviceCreateInfo deviceParams = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, - (requires16BitStorageExtension ? &ext16BitStorageFeatures : DE_NULL), + pExtension, (VkDeviceCreateFlags)0, DE_LENGTH_OF_ARRAY(queueInfos), &queueInfos[0],