From 5ded1abda3169e29a6116b6e6b53ce0b9a6d5ab2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Samuel=20Iglesias=20Gons=C3=A1lvez?= Date: Wed, 27 Nov 2019 11:06:54 +0100 Subject: [PATCH] Check memory model support in volatile atomic tests Volatile atomic tests were not checking vulkan memory model support. Components: Vulkan VK-GL-CTS issue: 2125 Affected tests: dEQP-VK.spirv_assembly.*atomic* Change-Id: I67557361e2df9fc057ab38a1104f66512a532cf0 --- .../vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp | 6 ++++++ .../vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp | 2 ++ .../modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp | 16 ++++++++++++++++ .../modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp | 15 +++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp index 504f70b..210b154 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp @@ -487,6 +487,12 @@ tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void) TCU_THROW(NotSupportedError, "Requested 16bit float or 8bit int feature not supported"); } + // Vulkan Memory Model features + { + if (!isVulkanMemoryModelFeaturesSupported(m_context, m_shaderSpec.requestedVulkanFeatures.extVulkanMemoryModel)) + TCU_THROW(NotSupportedError, "Requested Vulkan Memory Model feature not supported"); + } + // FloatControls features if (!isFloatControlsFeaturesSupported(m_context, m_shaderSpec.requestedVulkanFeatures.floatControlsProperties)) TCU_THROW(NotSupportedError, "Requested Float Controls features not supported"); diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp index 60cee96..f373d88 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp @@ -1435,6 +1435,8 @@ tcu::TestCaseGroup* createOpAtomicGroup (tcu::TestContext& testCtx, bool useStor if (volatileAtomic) { spec.extensions.push_back("VK_KHR_vulkan_memory_model"); + spec.requestedVulkanFeatures.extVulkanMemoryModel = EXTVULKANMEMORYMODELFEATURES_ENABLE; + // volatile, queuefamily scope specializations["SEMANTICS"] = "%volbit"; specializations["SCOPE"] = "%five"; diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp index 3182a79..2022f68 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp @@ -177,6 +177,22 @@ bool isFloat16Int8FeaturesSupported (const Context& context, ExtensionFloat16Int return true; } +bool isVulkanMemoryModelFeaturesSupported (const Context& context, ExtensionVulkanMemoryModelFeatures toCheck) +{ + const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& extensionFeatures = context.getVulkanMemoryModelFeatures(); + + if ((toCheck & EXTVULKANMEMORYMODELFEATURES_ENABLE) != 0 && extensionFeatures.vulkanMemoryModel == VK_FALSE) + return false; + + if ((toCheck & EXTVULKANMEMORYMODELFEATURES_DEVICESCOPE) != 0 && extensionFeatures.vulkanMemoryModelDeviceScope == VK_FALSE) + return false; + + if ((toCheck & EXTVULKANMEMORYMODELFEATURES_AVAILABILITYVISIBILITYCHAINS) != 0 && extensionFeatures.vulkanMemoryModelAvailabilityVisibilityChains == VK_FALSE) + return false; + + return true; +} + bool isFloatControlsFeaturesSupported (const Context& context, const ExtensionFloatControlsFeatures& toCheck) { // if all flags are set to false then no float control features are actualy requested by the test diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp index f5630b5..02979d7 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp @@ -251,6 +251,14 @@ enum ExtensionFloat16Int8FeaturesBits typedef deUint32 ExtensionFloat16Int8Features; typedef vk::VkPhysicalDeviceFloatControlsPropertiesKHR ExtensionFloatControlsFeatures; +enum ExtensionVulkanMemoryModelFeaturesBits +{ + EXTVULKANMEMORYMODELFEATURES_ENABLE = (1u << 1), + EXTVULKANMEMORYMODELFEATURES_DEVICESCOPE = (1u << 2), + EXTVULKANMEMORYMODELFEATURES_AVAILABILITYVISIBILITYCHAINS = (1u << 3), +}; +typedef deUint32 ExtensionVulkanMemoryModelFeatures; + struct VulkanFeatures { vk::VkPhysicalDeviceFeatures coreFeatures; @@ -258,13 +266,16 @@ struct VulkanFeatures Extension8BitStorageFeatures ext8BitStorage; Extension16BitStorageFeatures ext16BitStorage; ExtensionVariablePointersFeatures extVariablePointers; + ExtensionVulkanMemoryModelFeatures extVulkanMemoryModel; ExtensionFloatControlsFeatures floatControlsProperties; + VulkanFeatures (void) : extFloat16Int8 (0) , ext8BitStorage (0) , ext16BitStorage (0) , extVariablePointers (0) + , extVulkanMemoryModel (0) { deMemset(&coreFeatures, 0, sizeof(coreFeatures)); deMemset(&floatControlsProperties, 0, sizeof(ExtensionFloatControlsFeatures)); @@ -311,6 +322,10 @@ bool isVariablePointersFeaturesSupported (const Context& context, bool isFloat16Int8FeaturesSupported (const Context& context, ExtensionFloat16Int8Features toCheck); +// Returns true if the given Vulkan Memory Model extension features in `toCheck` are all supported. +bool isVulkanMemoryModelFeaturesSupported (const Context& context, + ExtensionVulkanMemoryModelFeatures toCheck); + // Returns true if the given float controls features in `toCheck` are all supported. bool isFloatControlsFeaturesSupported (const Context& context, const ExtensionFloatControlsFeatures& toCheck); -- 2.7.4