Add support for checking extension features in SpvAsm tests
authorLei Zhang <antiagainst@google.com>
Thu, 30 Mar 2017 15:53:21 +0000 (11:53 -0400)
committerPyry Haulos <phaulos@google.com>
Tue, 4 Apr 2017 22:40:10 +0000 (18:40 -0400)
Affects: dEQP-VK.spirv_assembly.*

Component: Vulkan

Change-Id: Ib3db9817054f93299f6e127cdf85d6ef7546d1f9

13 files changed:
AndroidGen.mk
external/vulkancts/framework/vulkan/vkBasicTypes.inl
external/vulkancts/framework/vulkan/vkStrUtil.inl
external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
external/vulkancts/framework/vulkan/vkStructTypes.inl
external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.hpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp [new file with mode: 0644]
external/vulkancts/scripts/src/vulkan.h.in

index 1b8e27f..6ab0a7f 100644 (file)
@@ -206,6 +206,7 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTests.cpp \
+       external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp \
        external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutCase.cpp \
        external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutTests.cpp \
        external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.cpp \
index 323d6e4..b6e64b3 100644 (file)
@@ -199,6 +199,7 @@ enum VkStructureType
        VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHX                                = 1000078001,
        VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHX                                                   = 1000078002,
        VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHX                                                  = 1000079000,
+       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR                    = 1000083000,
        VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX                                                  = 1000086000,
        VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX                              = 1000086001,
        VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX                                                 = 1000086002,
index c02cc03..37cf798 100644 (file)
@@ -352,6 +352,7 @@ std::ostream&       operator<<      (std::ostream& s, const VkQueueFamilyProperties2KHR& va
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceMemoryProperties2KHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkSparseImageFormatProperties2KHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceSparseImageFormatInfo2KHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDevice16BitStorageFeaturesKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkRectLayerKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPresentRegionKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPresentRegionsKHR& value);
index 7b2c81c..c86faa4 100644 (file)
@@ -210,6 +210,7 @@ const char* getStructureTypeName (VkStructureType value)
                case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHX:                                  return "VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHX";
                case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHX:                                                             return "VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHX";
                case VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHX:                                                    return "VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHX";
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR:                              return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR";
                case VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX:                                                    return "VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX";
                case VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX:                                return "VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX";
                case VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX:                                                   return "VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX";
@@ -3558,6 +3559,19 @@ std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSparseImageForm
        return s;
 }
 
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDevice16BitStorageFeaturesKHR& value)
+{
+       s << "VkPhysicalDevice16BitStorageFeaturesKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tstorageUniformBufferBlock16 = " << value.storageUniformBufferBlock16 << '\n';
+       s << "\tstorageUniform16 = " << value.storageUniform16 << '\n';
+       s << "\tstoragePushConstant16 = " << value.storagePushConstant16 << '\n';
+       s << "\tstorageInputOutput16 = " << value.storageInputOutput16 << '\n';
+       s << '}';
+       return s;
+}
+
 std::ostream& operator<< (std::ostream& s, const VkRectLayerKHR& value)
 {
        s << "VkRectLayerKHR = {\n";
index a09ba7d..cf1c239 100644 (file)
@@ -1434,6 +1434,16 @@ struct VkPhysicalDeviceSparseImageFormatInfo2KHR
        VkImageTiling                   tiling;
 };
 
+struct VkPhysicalDevice16BitStorageFeaturesKHR
+{
+       VkStructureType sType;
+       const void*             pNext;
+       VkBool32                storageUniformBufferBlock16;
+       VkBool32                storageUniform16;
+       VkBool32                storagePushConstant16;
+       VkBool32                storageInputOutput16;
+};
+
 struct VkRectLayerKHR
 {
        VkOffset2D      offset;
index c871c9e..26a3644 100644 (file)
@@ -13,6 +13,8 @@ set(DEQP_VK_SPIRV_ASSEMBLY_SRCS
        vktSpvAsmInstructionTests.hpp
        vktSpvAsmTests.cpp
        vktSpvAsmTests.hpp
+       vktSpvAsmUtils.cpp
+       vktSpvAsmUtils.hpp
        )
 
 set(DEQP_VK_SPIRV_ASSEMBLY_LIBS
index 790a302..a6237c1 100644 (file)
@@ -337,6 +337,17 @@ tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
                throw tcu::NotSupportedError("shaderInt64 feature is not supported");
        }
 
+       {
+               const InstanceInterface&                        vki                                     = m_context.getInstanceInterface();
+               const VkPhysicalDevice                          physicalDevice          = m_context.getPhysicalDevice();
+
+               // 16bit storage features
+               {
+                       if (!is16BitStorageFeaturesSupported(vki, physicalDevice, m_shaderSpec.requestedExtensionFeatures.ext16BitStorage))
+                               TCU_THROW(NotSupportedError, "Requested 16bit storage features not supported");
+               }
+       }
+
        vector<AllocationSp>                            inputAllocs;
        vector<AllocationSp>                            outputAllocs;
        vector<BufferHandleSp>                          inputBuffers;
index 6349cd1..2461756 100644 (file)
@@ -29,6 +29,7 @@
 #include "tcuTestLog.hpp"
 #include "tcuVector.hpp"
 #include "vkMemUtil.hpp"
+#include "vktSpvAsmUtils.hpp"
 
 #include <string>
 #include <vector>
@@ -108,6 +109,7 @@ struct ComputeShaderSpec
        std::vector<deUint32>                                   specConstants;
        BufferSp                                                                pushConstants;
        std::vector<std::string>                                extensions;
+       ExtensionFeatures                                               requestedExtensionFeatures;
        qpTestResult                                                    failResult;
        std::string                                                             failMessage;
        // If null, a default verification will be performed by comparing the memory pointed to by outputAllocations
@@ -117,11 +119,12 @@ struct ComputeShaderSpec
        ComputeVerifyIOFunc                                             verifyIO;
 
                                                                                        ComputeShaderSpec (void)
-                                                                                               : entryPoint    ("main")
-                                                                                               , pushConstants (DE_NULL)
-                                                                                               , failResult    (QP_TEST_RESULT_FAIL)
-                                                                                               , failMessage   ("Output doesn't match with expected")
-                                                                                               , verifyIO              (DE_NULL)
+                                                                                               : entryPoint                                    ("main")
+                                                                                               , pushConstants                                 (DE_NULL)
+                                                                                               , requestedExtensionFeatures    ()
+                                                                                               , failResult                                    (QP_TEST_RESULT_FAIL)
+                                                                                               , failMessage                                   ("Output doesn't match with expected")
+                                                                                               , verifyIO                                              (DE_NULL)
                                                                                        {}
 };
 
index e78fd20..57cb7cf 100644 (file)
@@ -190,18 +190,20 @@ InstanceContext::InstanceContext (const RGBA                                              (&inputs)[4],
                                                                  const GraphicsResources&                      resources_,
                                                                  const GraphicsInterfaces&                     interfaces_,
                                                                  const vector<string>&                         extensions_,
-                                                                 const vector<string>&                         features_)
-       : testCodeFragments                     (testCodeFragments_)
-       , specConstants                         (specConstants_)
-       , hasTessellation                       (false)
-       , requiredStages                        (static_cast<VkShaderStageFlagBits>(0))
-       , requiredDeviceExtensions      (extensions_)
-       , requiredDeviceFeatures        (features_)
-       , pushConstants                         (pushConsants_)
-       , resources                                     (resources_)
-       , interfaces                            (interfaces_)
-       , failResult                            (QP_TEST_RESULT_FAIL)
-       , failMessageTemplate           ("${reason}")
+                                                                 const vector<string>&                         features_,
+                                                                 ExtensionFeatures                                     extensionFeatures_)
+       : testCodeFragments                             (testCodeFragments_)
+       , specConstants                                 (specConstants_)
+       , hasTessellation                               (false)
+       , requiredStages                                (static_cast<VkShaderStageFlagBits>(0))
+       , requiredDeviceExtensions              (extensions_)
+       , requiredDeviceFeatures                (features_)
+       , requestedExtensionFeatures    (extensionFeatures_)
+       , pushConstants                                 (pushConsants_)
+       , resources                                             (resources_)
+       , interfaces                                    (interfaces_)
+       , failResult                                    (QP_TEST_RESULT_FAIL)
+       , failMessageTemplate                   ("${reason}")
 {
        inputColors[0]          = inputs[0];
        inputColors[1]          = inputs[1];
@@ -215,18 +217,19 @@ InstanceContext::InstanceContext (const RGBA                                              (&inputs)[4],
 }
 
 InstanceContext::InstanceContext (const InstanceContext& other)
-       : moduleMap                                     (other.moduleMap)
-       , testCodeFragments                     (other.testCodeFragments)
-       , specConstants                         (other.specConstants)
-       , hasTessellation                       (other.hasTessellation)
-       , requiredStages                        (other.requiredStages)
-       , requiredDeviceExtensions      (other.requiredDeviceExtensions)
-       , requiredDeviceFeatures        (other.requiredDeviceFeatures)
-       , pushConstants                         (other.pushConstants)
-       , resources                                     (other.resources)
-       , interfaces                            (other.interfaces)
-       , failResult                            (other.failResult)
-       , failMessageTemplate           (other.failMessageTemplate)
+       : moduleMap                                             (other.moduleMap)
+       , testCodeFragments                             (other.testCodeFragments)
+       , specConstants                                 (other.specConstants)
+       , hasTessellation                               (other.hasTessellation)
+       , requiredStages                                (other.requiredStages)
+       , requiredDeviceExtensions              (other.requiredDeviceExtensions)
+       , requiredDeviceFeatures                (other.requiredDeviceFeatures)
+       , requestedExtensionFeatures    (other.requestedExtensionFeatures)
+       , pushConstants                                 (other.pushConstants)
+       , resources                                             (other.resources)
+       , interfaces                                    (other.interfaces)
+       , failResult                                    (other.failResult)
+       , failMessageTemplate                   (other.failMessageTemplate)
 {
        inputColors[0]          = other.inputColors[0];
        inputColors[1]          = other.inputColors[1];
@@ -2021,11 +2024,12 @@ Move<VkBuffer> createBufferForResource(const DeviceInterface& vk, const VkDevice
        return createBuffer(vk, vkDevice, &resourceBufferParams);
 }
 
-
 TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instance)
 {
        const VkDevice                                                          vkDevice                                = context.getDevice();
+       const VkPhysicalDevice                                          vkPhysicalDevice                = context.getPhysicalDevice();
        const DeviceInterface&                                          vk                                              = context.getDeviceInterface();
+       const InstanceInterface&                                        vkInstance                              = context.getInstanceInterface();
        const VkQueue                                                           queue                                   = context.getUniversalQueue();
        const deUint32                                                          queueFamilyIndex                = context.getUniversalQueueFamilyIndex();
        const tcu::UVec2                                                        renderSize                              (256, 256);
@@ -2089,6 +2093,12 @@ TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instan
                }
        }
 
+       // 16bit storage features
+       {
+               if (!is16BitStorageFeaturesSupported(vkInstance, vkPhysicalDevice, instance.requestedExtensionFeatures.ext16BitStorage))
+                       TCU_THROW(NotSupportedError, "Requested 16bit storage features not supported");
+       }
+
        de::Random(seed).shuffle(instance.inputColors, instance.inputColors+4);
        de::Random(seed).shuffle(instance.outputColors, instance.outputColors+4);
        const Vec4                                                              vertexData[]                    =
@@ -3348,6 +3358,7 @@ void createTestsForAllStages (const std::string&                  name,
                                                          const GraphicsInterfaces&             interfaces,
                                                          const vector<string>&                 extensions,
                                                          const vector<string>&                 features,
+                                                         ExtensionFeatures                             extensionFeatures,
                                                          tcu::TestCaseGroup*                   tests,
                                                          const qpTestResult                    failResult,
                                                          const string&                                 failMessageTemplate)
@@ -3379,35 +3390,35 @@ void createTestsForAllStages (const std::string&                        name,
        addFunctionCaseWithPrograms<InstanceContext>(
                        tests, name + "_vert", "", addShaderCodeCustomVertex, runAndVerifyDefaultPipeline,
                        createInstanceContext(vertFragPipelineStages, inputColors, outputColors, testCodeFragments,
-                               specConstantMap, pushConstants, resources, interfaces, extensions, features, failResult, failMessageTemplate));
+                               specConstantMap, pushConstants, resources, interfaces, extensions, features, extensionFeatures, failResult, failMessageTemplate));
 
        specConstantMap.clear();
        specConstantMap[VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT] = specConstants;
        addFunctionCaseWithPrograms<InstanceContext>(
                        tests, name + "_tessc", "", addShaderCodeCustomTessControl, runAndVerifyDefaultPipeline,
                        createInstanceContext(tessPipelineStages, inputColors, outputColors, testCodeFragments,
-                               specConstantMap, pushConstants, resources, interfaces, extensions, features, failResult, failMessageTemplate));
+                               specConstantMap, pushConstants, resources, interfaces, extensions, features, extensionFeatures, failResult, failMessageTemplate));
 
        specConstantMap.clear();
        specConstantMap[VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT] = specConstants;
        addFunctionCaseWithPrograms<InstanceContext>(
                        tests, name + "_tesse", "", addShaderCodeCustomTessEval, runAndVerifyDefaultPipeline,
                        createInstanceContext(tessPipelineStages, inputColors, outputColors, testCodeFragments,
-                               specConstantMap, pushConstants, resources, interfaces, extensions, features, failResult, failMessageTemplate));
+                               specConstantMap, pushConstants, resources, interfaces, extensions, features, extensionFeatures, failResult, failMessageTemplate));
 
        specConstantMap.clear();
        specConstantMap[VK_SHADER_STAGE_GEOMETRY_BIT] = specConstants;
        addFunctionCaseWithPrograms<InstanceContext>(
                        tests, name + "_geom", "", addShaderCodeCustomGeometry, runAndVerifyDefaultPipeline,
                        createInstanceContext(geomPipelineStages, inputColors, outputColors, testCodeFragments,
-                               specConstantMap, pushConstants, resources, interfaces, extensions, features, failResult, failMessageTemplate));
+                               specConstantMap, pushConstants, resources, interfaces, extensions, features, extensionFeatures, failResult, failMessageTemplate));
 
        specConstantMap.clear();
        specConstantMap[VK_SHADER_STAGE_FRAGMENT_BIT] = specConstants;
        addFunctionCaseWithPrograms<InstanceContext>(
                        tests, name + "_frag", "", addShaderCodeCustomFragment, runAndVerifyDefaultPipeline,
                        createInstanceContext(vertFragPipelineStages, inputColors, outputColors, testCodeFragments,
-                               specConstantMap, pushConstants, resources, interfaces, extensions, features, failResult, failMessageTemplate));
+                               specConstantMap, pushConstants, resources, interfaces, extensions, features, extensionFeatures, failResult, failMessageTemplate));
 }
 
 void addTessCtrlTest(tcu::TestCaseGroup* group, const char* name, const map<string, string>& fragments)
@@ -3427,7 +3438,8 @@ void addTessCtrlTest(tcu::TestCaseGroup* group, const char* name, const map<stri
                        runAndVerifyDefaultPipeline, createInstanceContext(
                                pipelineStages, defaultColors, defaultColors, fragments,
                                StageToSpecConstantMap(), PushConstants(), GraphicsResources(),
-                               GraphicsInterfaces(), vector<string>(), vector<string>()));
+                               GraphicsInterfaces(), vector<string>(), vector<string>(),
+                               ExtensionFeatures()));
 }
 
 } // SpirVAssembly
index 751e77e..1f0f020 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "vkPrograms.hpp"
 #include "vktSpvAsmComputeShaderTestUtil.hpp"
+#include "vktSpvAsmUtils.hpp"
 #include "vktTestCaseUtil.hpp"
 
 #include "deRandom.hpp"
@@ -253,6 +254,7 @@ struct InstanceContext
        vk::VkShaderStageFlagBits                               requiredStages;
        std::vector<std::string>                                requiredDeviceExtensions;
        std::vector<std::string>                                requiredDeviceFeatures;
+       ExtensionFeatures                                               requestedExtensionFeatures;
        PushConstants                                                   pushConstants;
        // Possible resources used by the graphics pipeline.
        // If it is not empty, a single descriptor set (number 0) will be allocated
@@ -277,7 +279,8 @@ struct InstanceContext
                                         const GraphicsResources&                                       resources_,
                                         const GraphicsInterfaces&                                      interfaces_,
                                         const std::vector<std::string>&                        extensions_,
-                                        const std::vector<std::string>&                        features_);
+                                        const std::vector<std::string>&                        features_,
+                                        ExtensionFeatures                                                      extFeatures_);
 
        InstanceContext (const InstanceContext& other);
 
@@ -351,10 +354,11 @@ InstanceContext createInstanceContext (const ShaderElement                                                        (&elements)[N],
                                                                           const GraphicsInterfaces&                                    interfaces,
                                                                           const std::vector<std::string>&                              extensions,
                                                                           const std::vector<std::string>&                              features,
+                                                                          ExtensionFeatures                                                    extensionFeatures,
                                                                           const qpTestResult                                                   failResult                      = QP_TEST_RESULT_FAIL,
                                                                           const std::string&                                                   failMessageTemplate     = std::string())
 {
-       InstanceContext ctx (inputColors, outputColors, testCodeFragments, specConstants, pushConstants, resources, interfaces, extensions, features);
+       InstanceContext ctx (inputColors, outputColors, testCodeFragments, specConstants, pushConstants, resources, interfaces, extensions, features, extensionFeatures);
        for (size_t i = 0; i < N; ++i)
        {
                ctx.moduleMap[elements[i].moduleName].push_back(std::make_pair(elements[i].entryName, elements[i].stage));
@@ -375,7 +379,8 @@ inline InstanceContext createInstanceContext (const ShaderElement                                           (&element
 {
        return createInstanceContext(elements, inputColors, outputColors, testCodeFragments,
                                                                 StageToSpecConstantMap(), PushConstants(), GraphicsResources(),
-                                                                GraphicsInterfaces(), std::vector<std::string>(), std::vector<std::string>());
+                                                                GraphicsInterfaces(), std::vector<std::string>(), std::vector<std::string>(),
+                                                                ExtensionFeatures());
 }
 
 // The same as createInstanceContext above, but with default colors.
@@ -399,6 +404,7 @@ void createTestsForAllStages (const std::string&                                            name,
                                                          const GraphicsInterfaces&                                     interfaces,
                                                          const std::vector<std::string>&                       extensions,
                                                          const std::vector<std::string>&                       features,
+                                                         ExtensionFeatures                                                     extensionFeatures,
                                                          tcu::TestCaseGroup*                                           tests,
                                                          const qpTestResult                                            failResult                      = QP_TEST_RESULT_FAIL,
                                                          const std::string&                                            failMessageTemplate     = std::string());
@@ -420,7 +426,8 @@ inline void createTestsForAllStages (const std::string&                                                     name,
 
        createTestsForAllStages(
                        name, inputColors, outputColors, testCodeFragments, noSpecConstants, noPushConstants,
-                       noResources, noInterfaces, noExtensions, noFeatures, tests, failResult, failMessageTemplate);
+                       noResources, noInterfaces, noExtensions, noFeatures, ExtensionFeatures(),
+                       tests, failResult, failMessageTemplate);
 }
 
 inline void createTestsForAllStages (const std::string&                                                        name,
@@ -440,7 +447,8 @@ inline void createTestsForAllStages (const std::string&                                                     name,
 
        createTestsForAllStages(
                        name, inputColors, outputColors, testCodeFragments, specConstants, noPushConstants,
-                       noResources, noInterfaces, noExtensions, noFeatures, tests, failResult, failMessageTemplate);
+                       noResources, noInterfaces, noExtensions, noFeatures, ExtensionFeatures(),
+                       tests, failResult, failMessageTemplate);
 }
 
 inline void createTestsForAllStages (const std::string&                                                        name,
@@ -450,6 +458,7 @@ inline void createTestsForAllStages (const std::string&                                                     name,
                                                                         const GraphicsResources&                                       resources,
                                                                         const std::vector<std::string>&                        extensions,
                                                                         tcu::TestCaseGroup*                                            tests,
+                                                                        ExtensionFeatures                                                      extensionFeatures       = ExtensionFeatures(),
                                                                         const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
                                                                         const std::string&                                                     failMessageTemplate     = std::string())
 {
@@ -460,7 +469,8 @@ inline void createTestsForAllStages (const std::string&                                                     name,
 
        createTestsForAllStages(
                        name, inputColors, outputColors, testCodeFragments, noSpecConstants, noPushConstants,
-                       resources, noInterfaces, extensions, noFeatures, tests, failResult, failMessageTemplate);
+                       resources, noInterfaces, extensions, noFeatures, extensionFeatures,
+                       tests, failResult, failMessageTemplate);
 }
 
 inline void createTestsForAllStages (const std::string& name,
@@ -470,6 +480,7 @@ inline void createTestsForAllStages (const std::string& name,
                                                                         const GraphicsInterfaces                                       interfaces,
                                                                         const std::vector<std::string>&                        extensions,
                                                                         tcu::TestCaseGroup*                                            tests,
+                                                                        ExtensionFeatures                                                      extensionFeatures       = ExtensionFeatures(),
                                                                         const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
                                                                         const std::string&                                                     failMessageTemplate     = std::string())
 {
@@ -480,7 +491,8 @@ inline void createTestsForAllStages (const std::string& name,
 
        createTestsForAllStages(
                        name, inputColors, outputColors, testCodeFragments, noSpecConstants, noPushConstants,
-                       noResources, interfaces, extensions, noFeatures, tests, failResult, failMessageTemplate);
+                       noResources, interfaces, extensions, noFeatures, extensionFeatures,
+                       tests, failResult, failMessageTemplate);
 }
 
 inline void createTestsForAllStages (const std::string& name,
@@ -491,6 +503,7 @@ inline void createTestsForAllStages (const std::string& name,
                                                                         const GraphicsResources&                                       resources,
                                                                         const std::vector<std::string>&                        extensions,
                                                                         tcu::TestCaseGroup*                                            tests,
+                                                                        ExtensionFeatures                                                      extensionFeatures       = ExtensionFeatures(),
                                                                         const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
                                                                         const std::string&                                                     failMessageTemplate     = std::string())
 {
@@ -500,7 +513,8 @@ inline void createTestsForAllStages (const std::string& name,
 
        createTestsForAllStages(
                        name, inputColors, outputColors, testCodeFragments, noSpecConstants, pushConstants,
-                       resources, noInterfaces, extensions, noFeatures, tests, failResult, failMessageTemplate);
+                       resources, noInterfaces, extensions, noFeatures, extensionFeatures,
+                       tests, failResult, failMessageTemplate);
 }
 
 // Sets up and runs a Vulkan pipeline, then spot-checks the resulting image.
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp
new file mode 100644 (file)
index 0000000..b0f8609
--- /dev/null
@@ -0,0 +1,70 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Utilities for Vulkan SPIR-V assembly tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktSpvAsmUtils.hpp"
+
+#include "deMemory.h"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+using namespace vk;
+
+bool is16BitStorageFeaturesSupported (const InstanceInterface& vki, VkPhysicalDevice device, Extension16BitStorageFeatures toCheck)
+{
+       VkPhysicalDevice16BitStorageFeaturesKHR extensionFeatures       =
+       {
+               VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR,   // sType
+               DE_NULL,                                                                                                                // pNext
+               false,                                                                                                                  // storageUniformBufferBlock16
+               false,                                                                                                                  // storageUniform16
+               false,                                                                                                                  // storagePushConstant16
+               false,                                                                                                                  // storageInputOutput16
+       };
+       VkPhysicalDeviceFeatures2KHR                    features;
+
+       deMemset(&features, 0, sizeof(features));
+       features.sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR;
+       features.pNext  = &extensionFeatures;
+
+       vki.getPhysicalDeviceFeatures2KHR(device, &features);
+
+       if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK) != 0 && extensionFeatures.storageUniformBufferBlock16 == VK_FALSE)
+               return false;
+
+       if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM) != 0 && extensionFeatures.storageUniform16 == VK_FALSE)
+               return false;
+
+       if ((toCheck & EXT16BITSTORAGEFEATURES_PUSH_CONSTANT) != 0 && extensionFeatures.storagePushConstant16 == VK_FALSE)
+               return false;
+
+       if ((toCheck & EXT16BITSTORAGEFEATURES_INPUT_OUTPUT) != 0 && extensionFeatures.storageInputOutput16 == VK_FALSE)
+               return false;
+
+       return true;
+}
+
+} // SpirVAssembly
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp
new file mode 100644 (file)
index 0000000..7e89e6a
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef _VKTSPVASMUTILS_HPP
+#define _VKTSPVASMUTILS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Utilities for Vulkan SPIR-V assembly tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vkDefs.hpp"
+#include "vkTypeUtil.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+enum Extension16BitStorageFeatureBits
+{
+       EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK    = (1u << 1),
+       EXT16BITSTORAGEFEATURES_UNIFORM                                 = (1u << 2),
+       EXT16BITSTORAGEFEATURES_PUSH_CONSTANT                   = (1u << 3),
+       EXT16BITSTORAGEFEATURES_INPUT_OUTPUT                    = (1u << 4),
+};
+typedef deUint32 Extension16BitStorageFeatures;
+
+struct ExtensionFeatures
+{
+       Extension16BitStorageFeatures   ext16BitStorage;
+
+       ExtensionFeatures       (void)
+               : ext16BitStorage       (0)
+       {}
+       explicit ExtensionFeatures      (Extension16BitStorageFeatures  ext16BitStorage_)
+               : ext16BitStorage       (ext16BitStorage_)
+       {}
+};
+
+// Returns true if the given 16bit storage extension features in `toCheck` are all supported.
+bool is16BitStorageFeaturesSupported (const vk::InstanceInterface&     vkInstance,
+                                                                         vk::VkPhysicalDevice                  device,
+                                                                         Extension16BitStorageFeatures toCheck);
+
+} // SpirVAssembly
+} // vkt
+
+#endif // _VKTSPVASMUTILS_HPP
index 4e02ffd..6ba9186 100644 (file)
@@ -262,6 +262,7 @@ typedef enum VkStructureType {
     VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHX = 1000078001,
     VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHX = 1000078002,
     VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHX = 1000079000,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = 1000083000,
     VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000,
     VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001,
     VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX = 1000086002,
@@ -3930,6 +3931,19 @@ VKAPI_ATTR void VKAPI_CALL vkTrimCommandPoolKHR(
     VkCommandPoolTrimFlagsKHR                   flags);
 #endif
 
+#define VK_KHR_16bit_storage 1
+#define VK_KHR_16BIT_STORAGE_SPEC_VERSION 1
+#define VK_KHR_16BIT_STORAGE_EXTENSION_NAME "VK_KHR_16bit_storage"
+
+typedef struct VkPhysicalDevice16BitStorageFeaturesKHR {
+    VkStructureType    sType;
+    const void*        pNext;
+    VkBool32           storageUniformBufferBlock16;
+    VkBool32           storageUniform16;
+    VkBool32           storagePushConstant16;
+    VkBool32           storageInputOutput16;
+} VkPhysicalDevice16BitStorageFeaturesKHR;
+
 #define VK_KHR_incremental_present 1
 #define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 1
 #define VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME "VK_KHR_incremental_present"