Tests for VK_KHR_uniform_buffer_standard_layout
authorGraeme Leese <gleese@broadcom.com>
Mon, 14 Jan 2019 19:01:56 +0000 (19:01 +0000)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 10 May 2019 08:23:32 +0000 (04:23 -0400)
Enables the existing std430 UBO tests based on support for the
extension.

Components: Vulkan
Affects: dEQP-VK.ubo.*.std430.*

Change-Id: I224377696979eea0ac8ca0b3f190414909ddc0a8
(cherry picked from commit 00a15d59264d0853c5d9ef2a0178293f536a3d29)

14 files changed:
external/vulkancts/framework/vulkan/vkBasicTypes.inl
external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
external/vulkancts/framework/vulkan/vkShaderProgram.hpp
external/vulkancts/framework/vulkan/vkSpirVAsm.cpp
external/vulkancts/framework/vulkan/vkStrUtil.inl
external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
external/vulkancts/framework/vulkan/vkStructTypes.inl
external/vulkancts/framework/vulkan/vkValidatorOptions.hpp
external/vulkancts/framework/vulkan/vkVulkan_c.inl
external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
external/vulkancts/modules/vulkan/ubo/vktUniformBlockCase.cpp
external/vulkancts/modules/vulkan/vktTestCase.cpp
external/vulkancts/modules/vulkan/vktTestCase.hpp
external/vulkancts/scripts/src/vulkan.h.in

index dad7289..35b19b2 100644 (file)
@@ -356,6 +356,7 @@ enum VkStructureType
        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT                                   = 1000244000,
        VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT                                                                = 1000244001,
        VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT                                                 = 1000244002,
+       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR   = 1000253000,
        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV                                = 1000249000,
        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV                              = 1000249002,
        VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV                                                              = 1000249001,
@@ -2291,3 +2292,4 @@ VK_DEFINE_PLATFORM_TYPE(RROutput,                                 void*);
 #define VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 2
 #define VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION 1
 #define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1
+#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
index 3351b71..6644d93 100644 (file)
@@ -1301,3 +1301,8 @@ template<> VkStructureType getStructureType<VkPhysicalDeviceHostQueryResetFeatur
        return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
 }
 
+template<> VkStructureType getStructureType<VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR> (void)
+{
+       return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR;
+}
+
index 73b96a1..c5e6853 100644 (file)
@@ -43,7 +43,8 @@ struct ShaderBuildOptions
        {
                FLAG_USE_STORAGE_BUFFER_STORAGE_CLASS   = (1u<<0),
                FLAG_ALLOW_RELAXED_OFFSETS                              = (1u<<1),      // allow block offsets to follow VK_KHR_relaxed_block_layout
-               FLAG_ALLOW_SCALAR_OFFSETS                               = (1u<<2)       // allow block offsets to follow VK_EXT_scalar_block_layout
+               FLAG_ALLOW_SCALAR_OFFSETS                               = (1u<<2),      // allow block offsets to follow VK_EXT_scalar_block_layout
+               FLAG_ALLOW_STD430_UBOS                                  = (1u<<3)       // allow block offsets to follow VK_EXT_uniform_buffer_standard_layout
        };
 
        deUint32                vulkanVersion;
@@ -70,6 +71,10 @@ struct ShaderBuildOptions
                {
                        rules = SpirvValidatorOptions::kScalarBlockLayout;
                }
+               else if (flags & FLAG_ALLOW_STD430_UBOS)
+               {
+                       rules = SpirvValidatorOptions::kUniformStandardLayout;
+               }
                else if (flags & FLAG_ALLOW_RELAXED_OFFSETS)
                {
                        rules = SpirvValidatorOptions::kRelaxedBlockLayout;
index 767c19f..332072b 100644 (file)
@@ -166,6 +166,9 @@ bool validateSpirV (size_t binarySizeInWords, const deUint32* binary, std::ostre
                        case SpirvValidatorOptions::kRelaxedBlockLayout:
                                spvValidatorOptionsSetRelaxBlockLayout(options, true);
                                break;
+                       case SpirvValidatorOptions::kUniformStandardLayout:
+                               spvValidatorOptionsSetUniformBufferStandardLayout(options, true);
+                               break;
                        case SpirvValidatorOptions::kScalarBlockLayout:
                                spvValidatorOptionsSetScalarBlockLayout(options, true);
                                break;
index b2adfef..1f62cd5 100644 (file)
@@ -639,3 +639,4 @@ std::ostream&       operator<<      (std::ostream& s, const VkCooperativeMatrixPropertiesNV
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceCooperativeMatrixPropertiesNV& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceCooperativeMatrixFeaturesNV& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceHostQueryResetFeaturesEXT& value);
+std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR& value);
index df06d29..bfa585b 100644 (file)
@@ -365,6 +365,7 @@ const char* getStructureTypeName (VkStructureType value)
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT:                                             return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT";
                case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT:                                                                  return "VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT";
                case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:                                                   return "VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT";
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR:             return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR";
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:                                  return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV";
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:                                return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV";
                case VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV:                                                                return "VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV";
@@ -6782,3 +6783,13 @@ std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceHostQueryResetF
        s << '}';
        return s;
 }
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR& value)
+{
+       s << "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tuniformBufferStandardLayout = " << value.uniformBufferStandardLayout << '\n';
+       s << '}';
+       return s;
+}
index d18f0e6..84ae29b 100644 (file)
@@ -3313,6 +3313,13 @@ struct VkPhysicalDeviceHostQueryResetFeaturesEXT
        VkBool32                hostQueryReset;
 };
 
+struct VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR
+{
+       VkStructureType sType;
+       void*                   pNext;
+       VkBool32                uniformBufferStandardLayout;
+};
+
 
 
 
index 31ca8a0..5364946 100644 (file)
@@ -38,6 +38,8 @@ struct SpirvValidatorOptions
                kNoneBlockLayout,
                // VK_KHR_relaxed_block_layout
                kRelaxedBlockLayout,
+               // VK_EXT_uniform_buffer_standard_layout
+               kUniformStandardLayout,
                // VK_EXT_scalar_block_layout
                kScalarBlockLayout
        };
index 4ee5aae..dca273a 100644 (file)
@@ -421,6 +421,7 @@ typedef enum VkStructureType {
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = 1000244000,
     VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
     VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = 1000253000,
     VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002,
@@ -8282,6 +8283,18 @@ VKAPI_ATTR void VKAPI_CALL vkResetQueryPoolEXT(
     deUint32                                    queryCount);
 #endif
 
+#define VK_KHR_uniform_buffer_standard_layout 1
+#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
+#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout"
+
+typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           uniformBufferStandardLayout;
+} VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;
+
+
+
 #ifdef __cplusplus
 }
 #endif
index 4020894..c50e72a 100644 (file)
@@ -760,6 +760,7 @@ void checkDeviceExtensions (tcu::ResultCollector& results, const vector<string>&
                "VK_KHR_shader_atomic_int64",
                "VK_KHR_vulkan_memory_model",
                "VK_KHR_swapchain_mutable_format",
+               "VK_KHR_uniform_buffer_standard_layout",
        };
 
        checkKhrExtensions(results, extensions, DE_LENGTH_OF_ARRAY(s_allowedDeviceKhrExtensions), s_allowedDeviceKhrExtensions);
index 9452d6a..1a01c19 100644 (file)
@@ -943,39 +943,6 @@ void generateCompareFuncs (std::ostream& str, const ShaderInterface& interface)
        }
 }
 
-bool uses16BitStorage (const ShaderInterface& interface)
-{
-       // If any of blocks has LAYOUT_16BIT_STORAGE flag
-       for (int ndx = 0; ndx < interface.getNumUniformBlocks(); ++ndx)
-       {
-               if (interface.getUniformBlock(ndx).getFlags() & LAYOUT_16BIT_STORAGE)
-                       return true;
-       }
-       return false;
-}
-
-bool uses8BitStorage (const ShaderInterface& interface)
-{
-       // If any of blocks has LAYOUT_8BIT_STORAGE flag
-       for (int ndx = 0; ndx < interface.getNumUniformBlocks(); ++ndx)
-       {
-               if (interface.getUniformBlock(ndx).getFlags() & LAYOUT_8BIT_STORAGE)
-                       return true;
-       }
-       return false;
-}
-
-bool usesScalarOrStd430Layout (const ShaderInterface& interface)
-{
-       // If any of blocks has LAYOUT_SCALAR or LAYOUT_STD430 flags
-       for (int ndx = 0; ndx < interface.getNumUniformBlocks(); ++ndx)
-       {
-               if (interface.getUniformBlock(ndx).getFlags() & (LAYOUT_SCALAR | LAYOUT_STD430))
-                       return true;
-       }
-       return false;
-}
-
 struct Indent
 {
        int level;
@@ -2233,10 +2200,10 @@ void UniformBlockCase::initPrograms (vk::SourceCollections& programCollection) c
        vk::ShaderBuildOptions::Flags flags = vk::ShaderBuildOptions::Flags(0);
        // TODO(dneto): If these tests ever use LAYOUT_RELAXED, then add support
        // here as well.
-       if (usesBlockLayout(UniformFlags(LAYOUT_SCALAR | LAYOUT_STD430)))
-       {
+       if (usesBlockLayout(LAYOUT_SCALAR))
                flags = vk::ShaderBuildOptions::FLAG_ALLOW_SCALAR_OFFSETS;
-       }
+       else if (usesBlockLayout(LAYOUT_STD430))
+               flags = vk::ShaderBuildOptions::FLAG_ALLOW_STD430_UBOS;
 
        programCollection.glslSources.add("vert") << glu::VertexSource(m_vertShaderSource)
        << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::getBaselineSpirvVersion(programCollection.usedVulkanVersion), flags);
@@ -2247,11 +2214,13 @@ void UniformBlockCase::initPrograms (vk::SourceCollections& programCollection) c
 
 TestInstance* UniformBlockCase::createInstance (Context& context) const
 {
-       if (!context.get16BitStorageFeatures().uniformAndStorageBuffer16BitAccess && uses16BitStorage(m_interface))
+       if (!context.get16BitStorageFeatures().uniformAndStorageBuffer16BitAccess && usesBlockLayout(LAYOUT_16BIT_STORAGE))
                TCU_THROW(NotSupportedError, "uniformAndStorageBuffer16BitAccess not supported");
-       if (!context.get8BitStorageFeatures().uniformAndStorageBuffer8BitAccess && uses8BitStorage(m_interface))
+       if (!context.get8BitStorageFeatures().uniformAndStorageBuffer8BitAccess && usesBlockLayout(LAYOUT_8BIT_STORAGE))
                TCU_THROW(NotSupportedError, "uniformAndStorageBuffer8BitAccess not supported");
-       if (!context.getScalarBlockLayoutFeatures().scalarBlockLayout && usesScalarOrStd430Layout(m_interface))
+       if (!context.getScalarBlockLayoutFeatures().scalarBlockLayout && !context.getUniformBufferStandardLayoutFeatures().uniformBufferStandardLayout && usesBlockLayout(LAYOUT_STD430))
+               TCU_THROW(NotSupportedError, "std430 not supported");
+       if (!context.getScalarBlockLayoutFeatures().scalarBlockLayout && usesBlockLayout(LAYOUT_SCALAR))
                TCU_THROW(NotSupportedError, "scalarBlockLayout not supported");
 
        return new UniformBlockCaseInstance(context, m_bufferMode, m_uniformLayout, m_blockPointers);
index 144b81f..a0ad20c 100644 (file)
@@ -326,6 +326,7 @@ public:
        VkPhysicalDeviceBufferAddressFeaturesEXT                        bufferDeviceAddressFeatures;
        VkPhysicalDeviceCooperativeMatrixFeaturesNV                     cooperativeMatrixFeatures;
        VkPhysicalDeviceHostQueryResetFeaturesEXT                       hostQueryResetFeatures;
+       VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR  uniformBufferStandardLayoutFeatures;
 
        DeviceFeatures (const InstanceInterface&        vki,
                                        const deUint32                          apiVersion,
@@ -352,6 +353,7 @@ public:
                deMemset(&bufferDeviceAddressFeatures, 0, sizeof(bufferDeviceAddressFeatures));
                deMemset(&cooperativeMatrixFeatures, 0, sizeof(cooperativeMatrixFeatures));
                deMemset(&hostQueryResetFeatures, 0, sizeof(hostQueryResetFeatures));
+               deMemset(&uniformBufferStandardLayoutFeatures, 0, sizeof(uniformBufferStandardLayoutFeatures));
 
                coreFeatures.sType                                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
                samplerYCbCrConversionFeatures.sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
@@ -372,6 +374,7 @@ public:
                bufferDeviceAddressFeatures.sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT;
                cooperativeMatrixFeatures.sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV;
                hostQueryResetFeatures.sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
+               uniformBufferStandardLayoutFeatures.sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR;
 
                vector<VkExtensionProperties> deviceExtensionProperties =
                        enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
@@ -470,6 +473,11 @@ public:
                                *nextPtr        = &hostQueryResetFeatures;
                                nextPtr         = &hostQueryResetFeatures.pNext;
                        }
+                       if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_uniform_buffer_standard_layout"))
+                       {
+                               *nextPtr        = &uniformBufferStandardLayoutFeatures;
+                               nextPtr         = &uniformBufferStandardLayoutFeatures.pNext;
+                       }
 
                        vki.getPhysicalDeviceFeatures2(physicalDevice, &coreFeatures);
                }
@@ -507,6 +515,7 @@ public:
        const VkPhysicalDeviceShaderAtomicInt64FeaturesKHR&             getShaderAtomicInt64Features            (void) const    { return m_deviceFeatures.shaderAtomicInt64Features;    }
        const VkPhysicalDeviceConditionalRenderingFeaturesEXT&  getConditionalRenderingFeatures         (void) const    { return m_deviceFeatures.conditionalRenderingFeatures; }
        const VkPhysicalDeviceScalarBlockLayoutFeaturesEXT&             getScalarBlockLayoutFeatures            (void) const    { return m_deviceFeatures.scalarBlockLayoutFeatures;    }
+       const VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR&                           getUniformBufferStandardLayoutFeatures                          (void) const    { return m_deviceFeatures.uniformBufferStandardLayoutFeatures;  }
        const VkPhysicalDeviceFloat16Int8FeaturesKHR&                   getFloat16Int8Features                          (void) const    { return m_deviceFeatures.float16Int8Features;                          }
        const VkPhysicalDeviceDepthClipEnableFeaturesEXT&               getDepthClipEnableFeatures                      (void) const    { return m_deviceFeatures.depthClipEnableFeatures;                      }
        const VkPhysicalDeviceBufferAddressFeaturesEXT&                 getBufferDeviceAddressFeatures          (void) const    { return m_deviceFeatures.bufferDeviceAddressFeatures;  }
@@ -653,6 +662,8 @@ const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT&
                                                                                Context::getConditionalRenderingFeatures(void) const { return m_device->getConditionalRenderingFeatures();      }
 const vk::VkPhysicalDeviceScalarBlockLayoutFeaturesEXT&
                                                                                Context::getScalarBlockLayoutFeatures   (void) const { return m_device->getScalarBlockLayoutFeatures(); }
+const vk::VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR&
+                                                                               Context::getUniformBufferStandardLayoutFeatures                 (void) const { return m_device->getUniformBufferStandardLayoutFeatures();       }
 const vk::VkPhysicalDeviceFloat16Int8FeaturesKHR&
                                                                                Context::getFloat16Int8Features                 (void) const { return m_device->getFloat16Int8Features();               }
 const vk::VkPhysicalDeviceDepthClipEnableFeaturesEXT&
index 0c854b0..2902918 100644 (file)
@@ -88,6 +88,8 @@ public:
                                                                                                getConditionalRenderingFeatures (void) const;
        const vk::VkPhysicalDeviceScalarBlockLayoutFeaturesEXT&
                                                                                                getScalarBlockLayoutFeatures    (void) const;
+       const vk::VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR&
+                                                                                               getUniformBufferStandardLayoutFeatures(void) const;
        const vk::VkPhysicalDeviceFloat16Int8FeaturesKHR&
                                                                                                getFloat16Int8Features                  (void) const;
        const vk::VkPhysicalDeviceDepthClipEnableFeaturesEXT&
index b60b165..8a303b3 100755 (executable)
@@ -418,6 +418,7 @@ typedef enum VkStructureType {
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = 1000244000,
     VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
     VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = 1000253000,
     VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002,
@@ -8279,6 +8280,18 @@ VKAPI_ATTR void VKAPI_CALL vkResetQueryPoolEXT(
     uint32_t                                    queryCount);
 #endif
 
+#define VK_KHR_uniform_buffer_standard_layout 1
+#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
+#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout"
+
+typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           uniformBufferStandardLayout;
+} VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;
+
+
+
 #ifdef __cplusplus
 }
 #endif