Avoid using custom instances in robustness tests
authorRicardo Garcia <rgarcia@igalia.com>
Mon, 28 Nov 2022 12:20:50 +0000 (13:20 +0100)
committerMatthew Netsch <quic_mnetsch@quicinc.com>
Thu, 1 Dec 2022 23:40:50 +0000 (23:40 +0000)
Some robustness custom devices are created with a large amount of
enabled extensions and features, using the default device as a
reference. Some drivers may expose or hide different device extensions
depending on the enabled instance extensions.

This means if we use a custom instance with no extensions and try to
enable everything that's available on the default device, device
creation may fail unexpectedly. This can be solved in two ways:

* Create the custom instance with the same extensions as the default
  instance.

* Avoid creating a custom instance at all and reuse the context
  instance.

This commit opts for the second option. Creating a custom instance is
rarely useful. The focus of robustness tests in on creating a custom
device with robustness features.

In addition, this commit also fixes some cases where the code was mixing
the context DeviceInterface with custom devices, and fixes validation
errors caused by the tests failing to enable shaderInt64 or vert/frag
stores and atomics in cases they were needed.

Affects:
dEQP-VK.robustness.*
dEQP-VKSC.robustness.*

VK-GL-CTS issue: 4136
Components: Vulkan

Change-Id: I820f8932e74100f01dba397ccf9eac24042ce33d

external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp
external/vulkancts/modules/vulkan/robustness/vktRobustness1VertexAccessTests.cpp
external/vulkancts/modules/vulkan/robustness/vktRobustnessBufferAccessTests.cpp
external/vulkancts/modules/vulkan/robustness/vktRobustnessExtsTests.cpp
external/vulkancts/modules/vulkan/robustness/vktRobustnessUtil.cpp
external/vulkancts/modules/vulkan/robustness/vktRobustnessUtil.hpp
external/vulkancts/modules/vulkan/robustness/vktRobustnessVertexAccessTests.cpp

index 121648b..8ccddc7 100644 (file)
@@ -65,7 +65,7 @@ namespace
 {
 
 // Creates a custom device with robust buffer access and variable pointer features.
-Move<VkDevice> createRobustBufferAccessVariablePointersDevice (Context& context, VkInstance instance, const InstanceInterface& vki )
+Move<VkDevice> createRobustBufferAccessVariablePointersDevice (Context& context)
 {
        auto pointerFeatures = context.getVariablePointersFeatures();
 
@@ -74,7 +74,7 @@ Move<VkDevice> createRobustBufferAccessVariablePointersDevice (Context& context,
        features2.features.robustBufferAccess = VK_TRUE;
        features2.pNext = &pointerFeatures;
 
-       return createRobustBufferAccessDevice(context, instance, vki, &features2);
+       return createRobustBufferAccessDevice(context, &features2);
 }
 
 // A supplementary structures that can hold information about buffer size
@@ -304,7 +304,6 @@ class AccessInstance : public vkt::TestInstance
 {
 public:
                                                                AccessInstance                          (Context&                       context,
-                                                                                                                        std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                         Move<VkDevice>         device,
 #ifndef CTS_USES_VULKANSC
                                                                                                                         de::MovePtr<vk::DeviceDriver>          deviceDriver,
@@ -333,7 +332,6 @@ private:
                                                                                                                         VkDeviceSize           valueSize);
 
 protected:
-       std::shared_ptr<CustomInstanceWrapper>  m_instanceWrapper;
        Move<VkDevice>                                                  m_device;
 #ifndef CTS_USES_VULKANSC
        de::MovePtr<vk::DeviceDriver>                   m_deviceDriver;
@@ -378,7 +376,6 @@ class ReadInstance: public AccessInstance
 {
 public:
                                                                ReadInstance                    (Context&                               context,
-                                                                                                                std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                 Move<VkDevice>                 device,
 #ifndef CTS_USES_VULKANSC
                                                                                                                 de::MovePtr<vk::DeviceDriver>          deviceDriver,
@@ -399,7 +396,6 @@ class WriteInstance: public AccessInstance
 {
 public:
                                                                WriteInstance                   (Context&                               context,
-                                                                                                                std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                 Move<VkDevice>                 device,
 #ifndef CTS_USES_VULKANSC
                                                                                                                 de::MovePtr<vk::DeviceDriver>          deviceDriver,
@@ -1318,15 +1314,14 @@ RobustReadTest::RobustReadTest (tcu::TestContext&               testContext,
 
 TestInstance* RobustReadTest::createInstance (Context& context) const
 {
-       std::shared_ptr<CustomInstanceWrapper> instanceWrapper(new CustomInstanceWrapper(context));
-       auto device = createRobustBufferAccessVariablePointersDevice(context, instanceWrapper->instance, instanceWrapper->instance.getDriver());
+       auto device = createRobustBufferAccessVariablePointersDevice(context);
 #ifndef CTS_USES_VULKANSC
-       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instanceWrapper->instance, *device));
+       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *device));
 #else
-       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instanceWrapper->instance, *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
+       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), context.getInstance(), *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
 #endif // CTS_USES_VULKANSC
 
-       return new ReadInstance(context, instanceWrapper, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_readAccessRange, m_accessOutOfBackingMemory);
+       return new ReadInstance(context, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_readAccessRange, m_accessOutOfBackingMemory);
 }
 
 void RobustReadTest::initPrograms(SourceCollections&   programCollection) const
@@ -1359,15 +1354,14 @@ RobustWriteTest::RobustWriteTest (tcu::TestContext&             testContext,
 
 TestInstance* RobustWriteTest::createInstance (Context& context) const
 {
-       std::shared_ptr<CustomInstanceWrapper> instanceWrapper(new CustomInstanceWrapper(context));
-       auto device = createRobustBufferAccessVariablePointersDevice(context, instanceWrapper->instance, instanceWrapper->instance.getDriver());
+       auto device = createRobustBufferAccessVariablePointersDevice(context);
 #ifndef CTS_USES_VULKANSC
-       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instanceWrapper->instance, *device));
+       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *device));
 #else
-       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instanceWrapper->instance, *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
+       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), context.getInstance(), *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
 #endif // CTS_USES_VULKANSC
 
-       return new WriteInstance(context, instanceWrapper, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_writeAccessRange, m_accessOutOfBackingMemory);
+       return new WriteInstance(context, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_writeAccessRange, m_accessOutOfBackingMemory);
 }
 
 void RobustWriteTest::initPrograms(SourceCollections&  programCollection) const
@@ -1384,7 +1378,6 @@ void RobustWriteTest::initPrograms(SourceCollections&     programCollection) const
 }
 
 AccessInstance::AccessInstance (Context&                       context,
-                                                               std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                Move<VkDevice>          device,
 #ifndef CTS_USES_VULKANSC
                                                                de::MovePtr<vk::DeviceDriver>           deviceDriver,
@@ -1400,7 +1393,6 @@ AccessInstance::AccessInstance (Context&                  context,
                                                                VkDeviceSize            outBufferAccessRange,
                                                                bool                            accessOutOfBackingMemory)
        : vkt::TestInstance                             (context)
-       , m_instanceWrapper                             (instanceWrapper)
        , m_device                                              (device)
        , m_deviceDriver                                (deviceDriver)
        , m_shaderType                                  (shaderType)
@@ -1411,9 +1403,11 @@ AccessInstance::AccessInstance (Context&                 context,
 {
        tcu::TestLog&                                                                   log                                             = context.getTestContext().getLog();
        const DeviceInterface&                                                  vk                                              = *m_deviceDriver;
+       const auto&                                                                             vki                                             = context.getInstanceInterface();
+       const auto                                                                              instance                                = context.getInstance();
        const deUint32                                                                  queueFamilyIndex                = context.getUniversalQueueFamilyIndex();
-       const VkPhysicalDevice                                                  physicalDevice                  = chooseDevice(instanceWrapper->instance.getDriver(), instanceWrapper->instance, context.getTestContext().getCommandLine());
-       SimpleAllocator                                                                 memAlloc                                (vk, *m_device, getPhysicalDeviceMemoryProperties(instanceWrapper->instance.getDriver(), physicalDevice));
+       const VkPhysicalDevice                                                  physicalDevice                  = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
+       SimpleAllocator                                                                 memAlloc                                (vk, *m_device, getPhysicalDeviceMemoryProperties(vki, physicalDevice));
 
        DE_ASSERT(RobustAccessWithPointersTest::s_numberOfBytesAccessed % sizeof(deUint32) == 0);
        DE_ASSERT(inBufferAccessRange <= RobustAccessWithPointersTest::s_numberOfBytesAccessed);
@@ -1512,7 +1506,7 @@ AccessInstance::AccessInstance (Context&                  context,
 
        if (m_shaderStage == VK_SHADER_STAGE_COMPUTE_BIT)
        {
-               m_testEnvironment = de::MovePtr<TestEnvironment>(new ComputeEnvironment(m_context, m_instanceWrapper->instance, m_instanceWrapper->instance.getDriver(), *m_device, *m_descriptorSetLayout, *m_descriptorSet));
+               m_testEnvironment = de::MovePtr<TestEnvironment>(new ComputeEnvironment(m_context, *m_deviceDriver, *m_device, *m_descriptorSetLayout, *m_descriptorSet));
        }
        else
        {
@@ -1553,8 +1547,7 @@ AccessInstance::AccessInstance (Context&                  context,
                };
 
                m_testEnvironment = de::MovePtr<TestEnvironment>(new GraphicsEnvironment(m_context,
-                                                                                                                                                                m_instanceWrapper->instance,
-                                                                                                                                                                m_instanceWrapper->instance.getDriver(),
+                                                                                                                                                                *m_deviceDriver,
                                                                                                                                                                 *m_device,
                                                                                                                                                                 *m_descriptorSetLayout,
                                                                                                                                                                 *m_descriptorSet,
@@ -1862,7 +1855,6 @@ bool AccessInstance::verifyResult (bool splitAccess)
 // BufferReadInstance
 
 ReadInstance::ReadInstance (Context&                           context,
-                                                       std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                        Move<VkDevice>                  device,
 #ifndef CTS_USES_VULKANSC
                                                        de::MovePtr<vk::DeviceDriver>   deviceDriver,
@@ -1876,7 +1868,7 @@ ReadInstance::ReadInstance (Context&                              context,
                                                        VkDeviceSize                    inBufferAccessRange,
                                                        bool                                    accessOutOfBackingMemory)
 
-       : AccessInstance        (context, instanceWrapper, device, deviceDriver, shaderType, shaderStage, bufferFormat,
+       : AccessInstance        (context, device, deviceDriver, shaderType, shaderStage, bufferFormat,
                                                 BUFFER_ACCESS_TYPE_READ_FROM_STORAGE,
                                                 inBufferAccessRange, RobustAccessWithPointersTest::s_numberOfBytesAccessed,
                                                 accessOutOfBackingMemory)
@@ -1886,7 +1878,6 @@ ReadInstance::ReadInstance (Context&                              context,
 // BufferWriteInstance
 
 WriteInstance::WriteInstance (Context&                         context,
-                                                         std::shared_ptr<CustomInstanceWrapper>        instanceWrapper,
                                                          Move<VkDevice>                device,
 #ifndef CTS_USES_VULKANSC
                                                          de::MovePtr<vk::DeviceDriver>         deviceDriver,
@@ -1899,7 +1890,7 @@ WriteInstance::WriteInstance (Context&                            context,
                                                          VkDeviceSize                  writeBufferAccessRange,
                                                          bool                                  accessOutOfBackingMemory)
 
-       : AccessInstance        (context, instanceWrapper, device, deviceDriver, shaderType, shaderStage, bufferFormat,
+       : AccessInstance        (context, device, deviceDriver, shaderType, shaderStage, bufferFormat,
                                                 BUFFER_ACCESS_TYPE_WRITE_TO_STORAGE,
                                                 RobustAccessWithPointersTest::s_numberOfBytesAccessed, writeBufferAccessRange,
                                                 accessOutOfBackingMemory)
index b7978da..93f0502 100644 (file)
@@ -802,7 +802,6 @@ class Robustness1AccessInstance : public vkt::TestInstance
 public:
                                                                Robustness1AccessInstance       (TestContext&                                                   testCtx,
                                                                                                                         Context&                                                               context,
-                                                                                                                        std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                         T                                                                              device,
                                                                                                                         DeviceDriverPtr                                                deviceDriver,
                                                                                                                         const Robustness1TestInfo&                             testInfo);
@@ -810,7 +809,6 @@ public:
        virtual TestStatus                      iterate() override;
 
 private:
-       std::shared_ptr<CustomInstanceWrapper>                                          m_instanceWrapper;
        TestContext&                                                                                            m_testCtx;
        T                                                                                                                       m_device;
 #ifndef CTS_USES_VULKANSC
@@ -824,12 +822,10 @@ private:
 template<typename T>
 Robustness1AccessInstance<T>::Robustness1AccessInstance (TestContext&                                                  testCtx,
                                                                                                                 Context&                                                               context,
-                                                                                                                std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                 T                                                                              device,
                                                                                                                 DeviceDriverPtr                                                deviceDriver,
                                                                                                                 const Robustness1TestInfo&                             testInfo)
        : vkt::TestInstance                             (context)
-       , m_instanceWrapper                             (instanceWrapper)
        , m_testCtx                                             (testCtx)
        , m_device                                              (device)
        , m_deviceDriver                                (deviceDriver)
@@ -868,15 +864,14 @@ Robustness1AccessTest::Robustness1AccessTest (TestContext &testContext, const Ro
 
 TestInstance *Robustness1AccessTest::createInstance (Context &context) const
 {
-       std::shared_ptr<CustomInstanceWrapper> instanceWrapper(new CustomInstanceWrapper(context));
-       Move<VkDevice>  device = createRobustBufferAccessDevice(context, instanceWrapper->instance, instanceWrapper->instance.getDriver());
+       Move<VkDevice>  device = createRobustBufferAccessDevice(context);
 #ifndef CTS_USES_VULKANSC
-       DeviceDriverPtr deviceDriver = DeviceDriverPtr (new DeviceDriver(context.getPlatformInterface(), instanceWrapper->instance, *device));
+       DeviceDriverPtr deviceDriver = DeviceDriverPtr (new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *device));
 #else
-       DeviceDriverPtr deviceDriver = DeviceDriverPtr (new DeviceDriverSC(context.getPlatformInterface(), instanceWrapper->instance, *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter( context.getResourceInterface().get(), *device ));
+       DeviceDriverPtr deviceDriver = DeviceDriverPtr (new DeviceDriverSC(context.getPlatformInterface(), context.getInstance(), *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter( context.getResourceInterface().get(), *device ));
 #endif // CTS_USES_VULKANSC
 
-       return new Robustness1AccessInstance<Move<VkDevice>>(m_testCtx, context, instanceWrapper, device, deviceDriver, m_testInfo);
+       return new Robustness1AccessInstance<Move<VkDevice>>(m_testCtx, context, device, deviceDriver, m_testInfo);
 }
 
 void Robustness1AccessTest::initPrograms (SourceCollections& programCollection) const
index a8a43bc..9b18ec0 100644 (file)
@@ -99,6 +99,10 @@ private:
                                                                                                                         bool                                   readFromStorage);
 
 protected:
+       bool                                            is64BitsTest                            (void) const;
+       bool                                            isVertexTest                            (void) const;
+       bool                                            isFragmentTest                          (void) const;
+
        static void                                     initBufferAccessPrograms        (SourceCollections&             programCollection,
                                                                                                                         VkShaderStageFlags             shaderStage,
                                                                                                                         ShaderType                             shaderType,
@@ -163,12 +167,11 @@ class BufferAccessInstance : public vkt::TestInstance
 {
 public:
                                                                        BufferAccessInstance                    (Context&                       context,
-                                                                                                                                        std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                                         Move<VkDevice>         device,
 #ifndef CTS_USES_VULKANSC
-                                                                                                                                       de::MovePtr<vk::DeviceDriver>   deviceDriver,
+                                                                                                                                        de::MovePtr<vk::DeviceDriver>  deviceDriver,
 #else
-                                                                                                                                       de::MovePtr<vk::DeviceDriverSC,vk::DeinitDeviceDeleter> deviceDriver,
+                                                                                                                                        de::MovePtr<vk::DeviceDriverSC,vk::DeinitDeviceDeleter>        deviceDriver,
 #endif // CTS_USES_VULKANSC
                                                                                                                                         ShaderType                     shaderType,
                                                                                                                                         VkShaderStageFlags     shaderStage,
@@ -190,7 +193,6 @@ private:
        bool                                                    isOutBufferValueUnchanged               (VkDeviceSize offsetInBytes, VkDeviceSize valueSize);
 
 protected:
-       std::shared_ptr<CustomInstanceWrapper>  m_instanceWrapper;
        Move<VkDevice>                                  m_device;
 #ifndef CTS_USES_VULKANSC
        de::MovePtr<vk::DeviceDriver>   m_deviceDriver;
@@ -243,7 +245,6 @@ class BufferReadInstance: public BufferAccessInstance
 {
 public:
                                                                        BufferReadInstance                      (Context&                               context,
-                                                                                                                                std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                                 Move<VkDevice>                 device,
 #ifndef CTS_USES_VULKANSC
                                                                                                                                 de::MovePtr<vk::DeviceDriver>          deviceDriver,
@@ -267,7 +268,6 @@ class BufferWriteInstance: public BufferAccessInstance
 {
 public:
                                                                        BufferWriteInstance                     (Context&                               context,
-                                                                                                                                std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                                 Move<VkDevice>                 device,
 #ifndef CTS_USES_VULKANSC
                                                                                                                                 de::MovePtr<vk::DeviceDriver>          deviceDriver,
@@ -309,6 +309,15 @@ void RobustBufferAccessTest::checkSupport(Context& context) const
 {
        if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getDeviceFeatures().robustBufferAccess)
                TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: robustBufferAccess not supported by this implementation");
+
+       if (is64BitsTest())
+               context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_INT64);
+
+       if (isVertexTest())
+               context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS);
+
+       if (isFragmentTest())
+               context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS);
 }
 
 void RobustBufferAccessTest::genBufferShaderAccess (ShaderType                 shaderType,
@@ -520,6 +529,21 @@ void RobustBufferAccessTest::genTexelBufferShaderAccess (VkFormat                          bufferForma
                          << "  }\n";
 }
 
+bool RobustBufferAccessTest::is64BitsTest (void) const
+{
+       return (m_bufferFormat == VK_FORMAT_R64_SINT || m_bufferFormat == VK_FORMAT_R64_UINT);
+}
+
+bool RobustBufferAccessTest::isVertexTest (void) const
+{
+       return ((m_shaderStage & VK_SHADER_STAGE_VERTEX_BIT) != 0u);
+}
+
+bool RobustBufferAccessTest::isFragmentTest (void) const
+{
+       return ((m_shaderStage & VK_SHADER_STAGE_FRAGMENT_BIT) != 0u);
+}
+
 void RobustBufferAccessTest::initBufferAccessPrograms (SourceCollections&      programCollection,
                                                                                                           VkShaderStageFlags   shaderStage,
                                                                                                           ShaderType                   shaderType,
@@ -664,11 +688,26 @@ void RobustBufferReadTest::initPrograms (SourceCollections& programCollection) c
 
 TestInstance* RobustBufferReadTest::createInstance (Context& context) const
 {
-       std::shared_ptr<CustomInstanceWrapper> instanceWrapper(new CustomInstanceWrapper(context));
-       VkPhysicalDeviceFeatures2                                                       features2                                               = initVulkanStructure();
+       const bool is64BitsTest_        = is64BitsTest();
+       const bool isVertexTest_        = isVertexTest();
+       const bool isFragmentTest_      = isFragmentTest();
+
+       VkPhysicalDeviceFeatures2                                                       features2                                       = initVulkanStructure();
+
+       if (!m_testPipelineRobustness)
+               features2.features.robustBufferAccess = VK_TRUE;
+
+       if (is64BitsTest_)
+               features2.features.shaderInt64 = VK_TRUE;
+
+       if (isVertexTest_)
+               features2.features.vertexPipelineStoresAndAtomics = VK_TRUE;
+
+       if (isFragmentTest_)
+               features2.features.fragmentStoresAndAtomics = VK_TRUE;
 
 #ifndef CTS_USES_VULKANSC
-       VkPhysicalDevicePipelineRobustnessFeaturesEXT           pipelineRobustnessFeatures = initVulkanStructure();
+       VkPhysicalDevicePipelineRobustnessFeaturesEXT           pipelineRobustnessFeatures      = initVulkanStructure();
        if (m_testPipelineRobustness)
        {
                context.requireDeviceFunctionality("VK_EXT_pipeline_robustness");
@@ -680,14 +719,16 @@ TestInstance* RobustBufferReadTest::createInstance (Context& context) const
        }
 #endif
 
-       Move<VkDevice>  device                  = createRobustBufferAccessDevice(context, instanceWrapper->instance, instanceWrapper->instance.getDriver(), m_testPipelineRobustness ? &features2 : DE_NULL);
+       const bool useFeatures2 = (m_testPipelineRobustness || is64BitsTest_ || isVertexTest_ || isFragmentTest_);
+
+       Move<VkDevice>  device                  = createRobustBufferAccessDevice(context, (useFeatures2 ? &features2 : nullptr));
 #ifndef CTS_USES_VULKANSC
-       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instanceWrapper->instance, *device));
+       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *device));
 #else
-       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instanceWrapper->instance, *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter( context.getResourceInterface().get(), *device ));
+       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), context.getInstance(), *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter( context.getResourceInterface().get(), *device ));
 #endif // CTS_USES_VULKANSC
 
-       return new BufferReadInstance(context, instanceWrapper, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_readFromStorage, m_readAccessRange, m_accessOutOfBackingMemory, m_testPipelineRobustness);
+       return new BufferReadInstance(context, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_readFromStorage, m_readAccessRange, m_accessOutOfBackingMemory, m_testPipelineRobustness);
 }
 
 // RobustBufferWriteTest
@@ -715,11 +756,23 @@ void RobustBufferWriteTest::initPrograms (SourceCollections& programCollection)
 
 TestInstance* RobustBufferWriteTest::createInstance (Context& context) const
 {
-       std::shared_ptr<CustomInstanceWrapper> instanceWrapper(new CustomInstanceWrapper(context));
-       VkPhysicalDeviceFeatures2                                                       features2                                               = initVulkanStructure();
+       const bool is64BitsTest_        = is64BitsTest();
+       const bool isVertexTest_        = isVertexTest();
+       const bool isFragmentTest_      = isFragmentTest();
+
+       VkPhysicalDeviceFeatures2                                                       features2                                       = initVulkanStructure();
+
+       if (is64BitsTest_)
+               features2.features.shaderInt64 = VK_TRUE;
+
+       if (isVertexTest_)
+               features2.features.vertexPipelineStoresAndAtomics = VK_TRUE;
+
+       if (isFragmentTest_)
+               features2.features.fragmentStoresAndAtomics = VK_TRUE;
 
 #ifndef CTS_USES_VULKANSC
-       VkPhysicalDevicePipelineRobustnessFeaturesEXT           pipelineRobustnessFeatures = initVulkanStructure();
+       VkPhysicalDevicePipelineRobustnessFeaturesEXT           pipelineRobustnessFeatures      = initVulkanStructure();
        if (m_testPipelineRobustness)
        {
                context.requireDeviceFunctionality("VK_EXT_pipeline_robustness");
@@ -734,20 +787,21 @@ TestInstance* RobustBufferWriteTest::createInstance (Context& context) const
        }
 #endif
 
-       Move<VkDevice>  device = createRobustBufferAccessDevice(context, instanceWrapper->instance, instanceWrapper->instance.getDriver(), m_testPipelineRobustness ? &features2 : DE_NULL);
+       const bool useFeatures2 = (m_testPipelineRobustness || is64BitsTest_ || isVertexTest_ || isFragmentTest_);
+
+       Move<VkDevice>  device = createRobustBufferAccessDevice(context, (useFeatures2 ? &features2 : nullptr));
 #ifndef CTS_USES_VULKANSC
-       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instanceWrapper->instance, *device));
+       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *device));
 #else
-       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC,DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instanceWrapper->instance, *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
+       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC,DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), context.getInstance(), *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
 #endif // CTS_USES_VULKANSC
 
-       return new BufferWriteInstance(context, instanceWrapper, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_writeAccessRange, m_accessOutOfBackingMemory, m_testPipelineRobustness);
+       return new BufferWriteInstance(context, device, deviceDriver, m_shaderType, m_shaderStage, m_bufferFormat, m_writeAccessRange, m_accessOutOfBackingMemory, m_testPipelineRobustness);
 }
 
 // BufferAccessInstance
 
 BufferAccessInstance::BufferAccessInstance (Context&                   context,
-                                                                                       std::shared_ptr<CustomInstanceWrapper>  instanceWrapper,
                                                                                        Move<VkDevice>          device,
 #ifndef CTS_USES_VULKANSC
                                                                                        de::MovePtr<vk::DeviceDriver>   deviceDriver,
@@ -763,7 +817,6 @@ BufferAccessInstance::BufferAccessInstance (Context&                        context,
                                                                                        bool                            accessOutOfBackingMemory,
                                                                                        bool                            testPipelineRobustness)
        : vkt::TestInstance                             (context)
-       , m_instanceWrapper                             (instanceWrapper)
        , m_device                                              (device)
        , m_deviceDriver                                (deviceDriver)
        , m_shaderType                                  (shaderType)
@@ -776,11 +829,13 @@ BufferAccessInstance::BufferAccessInstance (Context&                      context,
        , m_testPipelineRobustness              (testPipelineRobustness)
 {
        const DeviceInterface&          vk                                              = *m_deviceDriver;
+       const auto&                                     vki                                             = context.getInstanceInterface();
+       const auto                                      instance                                = context.getInstance();
        const deUint32                          queueFamilyIndex                = context.getUniversalQueueFamilyIndex();
        const bool                                      isTexelAccess                   = !!(m_shaderType == SHADER_TYPE_TEXEL_COPY);
        const bool                                      readFromStorage                 = !!(m_bufferAccessType == BUFFER_ACCESS_TYPE_READ_FROM_STORAGE);
-       const VkPhysicalDevice          physicalDevice                  = chooseDevice(instanceWrapper->instance.getDriver(), instanceWrapper->instance, context.getTestContext().getCommandLine());
-       SimpleAllocator                         memAlloc                                (vk, *m_device, getPhysicalDeviceMemoryProperties(instanceWrapper->instance.getDriver(), physicalDevice));
+       const VkPhysicalDevice          physicalDevice                  = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
+       SimpleAllocator                         memAlloc                                (vk, *m_device, getPhysicalDeviceMemoryProperties(vki, physicalDevice));
        tcu::TestLog&                           log                                             = m_context.getTestContext().getLog();
 
        DE_ASSERT(RobustBufferAccessTest::s_numberOfBytesAccessed % sizeof(deUint32) == 0);
@@ -811,7 +866,7 @@ BufferAccessInstance::BufferAccessInstance (Context&                        context,
        // Check format support
        {
                VkFormatFeatureFlags            requiredFormatFeatures  = 0;
-               const VkFormatProperties        formatProperties                = getPhysicalDeviceFormatProperties(instanceWrapper->instance.getDriver(), physicalDevice, m_bufferFormat);
+               const VkFormatProperties        formatProperties                = getPhysicalDeviceFormatProperties(vki, physicalDevice, m_bufferFormat);
 
                if (isTexelAccess)
                {
@@ -1066,7 +1121,7 @@ BufferAccessInstance::BufferAccessInstance (Context&                      context,
 
        if (m_shaderStage == VK_SHADER_STAGE_COMPUTE_BIT)
        {
-               m_testEnvironment = de::MovePtr<TestEnvironment>(new ComputeEnvironment(m_context, m_instanceWrapper->instance, m_instanceWrapper->instance.getDriver(), *m_device, *m_descriptorSetLayout, *m_descriptorSet, m_testPipelineRobustness));
+               m_testEnvironment = de::MovePtr<TestEnvironment>(new ComputeEnvironment(m_context, *m_deviceDriver, *m_device, *m_descriptorSetLayout, *m_descriptorSet, m_testPipelineRobustness));
        }
        else
        {
@@ -1131,8 +1186,7 @@ BufferAccessInstance::BufferAccessInstance (Context&                      context,
                };
 
                m_testEnvironment = de::MovePtr<TestEnvironment>(new GraphicsEnvironment(m_context,
-                                                                                                                                                                m_instanceWrapper->instance,
-                                                                                                                                                                m_instanceWrapper->instance.getDriver(),
+                                                                                                                                                                *m_deviceDriver,
                                                                                                                                                                 *m_device,
                                                                                                                                                                 *m_descriptorSetLayout,
                                                                                                                                                                 *m_descriptorSet,
@@ -1436,7 +1490,6 @@ bool BufferAccessInstance::verifyResult (void)
 // BufferReadInstance
 
 BufferReadInstance::BufferReadInstance (Context&                       context,
-                                                                               std::shared_ptr<CustomInstanceWrapper>  instanceWrapper,
                                                                                Move<VkDevice>          device,
 #ifndef CTS_USES_VULKANSC
                                                                                de::MovePtr<vk::DeviceDriver>   deviceDriver,
@@ -1451,7 +1504,7 @@ BufferReadInstance::BufferReadInstance (Context&                  context,
                                                                                bool                            accessOutOfBackingMemory,
                                                                                bool                            testPipelineRobustness)
 
-       : BufferAccessInstance  (context, instanceWrapper, device, deviceDriver, shaderType, shaderStage, bufferFormat,
+       : BufferAccessInstance  (context, device, deviceDriver, shaderType, shaderStage, bufferFormat,
                                                         readFromStorage ? BUFFER_ACCESS_TYPE_READ_FROM_STORAGE : BUFFER_ACCESS_TYPE_READ,
                                                         inBufferAccessRange,
                                                         RobustBufferAccessTest::s_numberOfBytesAccessed,       // outBufferAccessRange
@@ -1463,7 +1516,6 @@ BufferReadInstance::BufferReadInstance (Context&                  context,
 // BufferWriteInstance
 
 BufferWriteInstance::BufferWriteInstance (Context&                             context,
-                                                                                 std::shared_ptr<CustomInstanceWrapper>        instanceWrapper,
                                                                                  Move<VkDevice>                device,
 #ifndef CTS_USES_VULKANSC
                                                                                  de::MovePtr<vk::DeviceDriver>         deviceDriver,
@@ -1477,7 +1529,7 @@ BufferWriteInstance::BufferWriteInstance (Context&                                context,
                                                                                  bool                                  accessOutOfBackingMemory,
                                                                                  bool                                  testPipelineRobustness)
 
-       : BufferAccessInstance  (context, instanceWrapper, device, deviceDriver, shaderType, shaderStage, bufferFormat,
+       : BufferAccessInstance  (context, device, deviceDriver, shaderType, shaderStage, bufferFormat,
                                                         BUFFER_ACCESS_TYPE_WRITE,
                                                         RobustBufferAccessTest::s_numberOfBytesAccessed,       // inBufferAccessRange
                                                         writeBufferAccessRange,
index a3f2fb6..cbb4e46 100644 (file)
@@ -80,7 +80,8 @@ template <RobustnessFeatures FEATURES>
 class SingletonDevice
 {
        SingletonDevice (Context& context)
-               : m_context(context), m_instanceWrapper(new CustomInstanceWrapper(context, context.getInstanceExtensions())), m_logicalDevice()
+               : m_context(context)
+               , m_logicalDevice()
        {
                // Note we are already checking the needed features are available in checkSupport().
                VkPhysicalDeviceRobustness2FeaturesEXT                          robustness2Features                             = initVulkanStructure();
@@ -135,14 +136,17 @@ class SingletonDevice
                        features2.pNext = &shaderImageAtomicInt64Features;
                }
 
-               const VkPhysicalDevice physicalDevice = chooseDevice(m_instanceWrapper->instance.getDriver(), m_instanceWrapper->instance, context.getTestContext().getCommandLine());
-               m_instanceWrapper->instance.getDriver().getPhysicalDeviceFeatures2(physicalDevice, &features2);
-               m_logicalDevice = createRobustBufferAccessDevice(context, m_instanceWrapper->instance, m_instanceWrapper->instance.getDriver(), &features2);
+               const auto&     vki                             = m_context.getInstanceInterface();
+               const auto      instance                = m_context.getInstance();
+               const auto      physicalDevice  = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
+
+               vki.getPhysicalDeviceFeatures2(physicalDevice, &features2);
+               m_logicalDevice = createRobustBufferAccessDevice(context, &features2);
 
 #ifndef CTS_USES_VULKANSC
-               m_deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), m_instanceWrapper->instance, *m_logicalDevice));
+               m_deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instance, *m_logicalDevice));
 #else
-               m_deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), m_instanceWrapper->instance, *m_logicalDevice, context.getTestContext().getCommandLine(), context.getResourceInterface(), m_context.getDeviceVulkanSC10Properties(), m_context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *m_logicalDevice));
+               m_deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instance, *m_logicalDevice, context.getTestContext().getCommandLine(), context.getResourceInterface(), m_context.getDeviceVulkanSC10Properties(), m_context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *m_logicalDevice));
 #endif // CTS_USES_VULKANSC
        }
 
@@ -150,20 +154,6 @@ public:
        ~SingletonDevice()
        {
        }
-       static VkInstance getInstance(Context& context)
-       {
-               if (!m_singletonDevice)
-                       m_singletonDevice = SharedPtr<SingletonDevice>(new SingletonDevice(context));
-               DE_ASSERT(m_singletonDevice);
-               return m_singletonDevice->m_instanceWrapper->instance;
-       }
-       static const InstanceInterface& getInstanceInterface(Context& context)
-       {
-               if (!m_singletonDevice)
-                       m_singletonDevice = SharedPtr<SingletonDevice>(new SingletonDevice(context));
-               DE_ASSERT(m_singletonDevice);
-               return m_singletonDevice->m_instanceWrapper->instance.getDriver();
-       }
 
        static VkDevice getDevice(Context& context)
        {
@@ -187,7 +177,6 @@ public:
 
 private:
        const Context&                                                          m_context;
-       std::shared_ptr<CustomInstanceWrapper>          m_instanceWrapper;
        Move<vk::VkDevice>                                                      m_logicalDevice;
 #ifndef CTS_USES_VULKANSC
        de::MovePtr<vk::DeviceDriver>                           m_deviceDriver;
@@ -300,64 +289,6 @@ static bool formatIsR64(const VkFormat& f)
 }
 
 // Returns the appropriate singleton device for the given case.
-VkInstance getInstance(Context& ctx, const CaseDef& caseDef)
-{
-       if (caseDef.needsScalarBlockLayout())
-       {
-               if (formatIsR64(caseDef.format))
-               {
-                       if (caseDef.testRobustness2)
-                               return Robustness2Int64AtomicsScalarSingleton::getInstance(ctx);
-                       return ImageRobustnessInt64AtomicsScalarSingleton::getInstance(ctx);
-               }
-
-               if (caseDef.testRobustness2)
-                       return Robustness2ScalarSingleton::getInstance(ctx);
-               return ImageRobustnessScalarSingleton::getInstance(ctx);
-       }
-
-       if (formatIsR64(caseDef.format))
-       {
-               if (caseDef.testRobustness2)
-                       return Robustness2Int64AtomicsSingleton::getInstance(ctx);
-               return ImageRobustnessInt64AtomicsSingleton::getInstance(ctx);
-       }
-
-       if (caseDef.testRobustness2)
-               return Robustness2Singleton::getInstance(ctx);
-       return ImageRobustnessSingleton::getInstance(ctx);
-}
-
-// Returns the appropriate singleton device driver for the given case.
-const InstanceInterface& getInstanceInterface(Context& ctx, const CaseDef& caseDef)
-{
-       if (caseDef.needsScalarBlockLayout())
-       {
-               if (formatIsR64(caseDef.format))
-               {
-                       if (caseDef.testRobustness2)
-                               return Robustness2Int64AtomicsScalarSingleton::getInstanceInterface(ctx);
-                       return ImageRobustnessInt64AtomicsScalarSingleton::getInstanceInterface(ctx);
-               }
-
-               if (caseDef.testRobustness2)
-                       return Robustness2ScalarSingleton::getInstanceInterface(ctx);
-               return ImageRobustnessScalarSingleton::getInstanceInterface(ctx);
-       }
-
-       if (formatIsR64(caseDef.format))
-       {
-               if (caseDef.testRobustness2)
-                       return Robustness2Int64AtomicsSingleton::getInstanceInterface(ctx);
-               return ImageRobustnessInt64AtomicsSingleton::getInstanceInterface(ctx);
-       }
-
-       if (caseDef.testRobustness2)
-               return Robustness2Singleton::getInstanceInterface(ctx);
-       return ImageRobustnessSingleton::getInstanceInterface(ctx);
-}
-
-// Returns the appropriate singleton device for the given case.
 VkDevice getLogicalDevice (Context& ctx, const CaseDef& caseDef)
 {
        if (caseDef.needsScalarBlockLayout())
@@ -1868,8 +1799,8 @@ TestInstance* RobustnessExtsTestCase::createInstance (Context& context) const
 
 tcu::TestStatus RobustnessExtsTestInstance::iterate (void)
 {
-       const VkInstance                        instance                        = getInstance(m_context, m_data);
-       const InstanceInterface&        vki                                     = getInstanceInterface(m_context, m_data);
+       const VkInstance                        instance                        = m_context.getInstance();
+       const InstanceInterface&        vki                                     = m_context.getInstanceInterface();
        const VkDevice                          device                          = getLogicalDevice(m_context, m_data);
        const vk::DeviceInterface&      vk                                      = getDeviceInterface(m_context, m_data);
        const VkPhysicalDevice          physicalDevice          = chooseDevice(vki, instance, m_context.getTestContext().getCommandLine());
index 318b338..bbede5b 100644 (file)
@@ -66,7 +66,7 @@ vector<string> removeExtensions (const vector<string>& a, const vector<const cha
        return res;
 }
 
-Move<VkDevice> createRobustBufferAccessDevice (Context& context, VkInstance instance, const InstanceInterface& vki, const VkPhysicalDeviceFeatures2* enabledFeatures2)
+Move<VkDevice> createRobustBufferAccessDevice (Context& context, const VkPhysicalDeviceFeatures2* enabledFeatures2)
 {
        const float queuePriority = 1.0f;
 
@@ -148,7 +148,12 @@ Move<VkDevice> createRobustBufferAccessDevice (Context& context, VkInstance inst
                enabledFeatures2 ? NULL : &enabledFeatures      // const VkPhysicalDeviceFeatures*      pEnabledFeatures;
        };
 
-       const VkPhysicalDevice                  physicalDevice = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
+       // We are creating a custom device with a potentially large amount of extensions and features enabled, using the default device
+       // as a reference. Some implementations may only enable certain device extensions if some instance extensions are enabled, so in
+       // this case it's important to reuse the context instance when creating the device.
+       const auto&     vki                             = context.getInstanceInterface();
+       const auto      instance                = context.getInstance();
+       const auto      physicalDevice  = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
 
        return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(),
                                                          instance, vki, physicalDevice, &deviceParams);
@@ -304,20 +309,15 @@ void logValue (std::ostringstream& logMsg, const void* valuePtr, VkFormat valueF
 // TestEnvironment
 
 TestEnvironment::TestEnvironment (Context&                                     context,
-                                                                 VkInstance                            instance,
-                                                                 const InstanceInterface&      instanceInterface,
+                                                                 const DeviceInterface&        vk,
                                                                  VkDevice                                      device,
                                                                  VkDescriptorSetLayout         descriptorSetLayout,
                                                                  VkDescriptorSet                       descriptorSet)
        : m_context                             (context)
-       , m_instance                    (instance)
-       , m_instanceInterface   (instanceInterface)
        , m_device                              (device)
        , m_descriptorSetLayout (descriptorSetLayout)
        , m_descriptorSet               (descriptorSet)
 {
-       const DeviceInterface& vk = context.getDeviceInterface();
-
        // Create command pool
        {
                const VkCommandPoolCreateInfo commandPoolParams =
@@ -354,8 +354,7 @@ VkCommandBuffer TestEnvironment::getCommandBuffer (void)
 // GraphicsEnvironment
 
 GraphicsEnvironment::GraphicsEnvironment (Context&                                     context,
-                                                                                 VkInstance                            instance,
-                                                                                 const InstanceInterface&      instanceInterface,
+                                                                                 const DeviceInterface&        vk,
                                                                                  VkDevice                                      device,
                                                                                  VkDescriptorSetLayout         descriptorSetLayout,
                                                                                  VkDescriptorSet                       descriptorSet,
@@ -364,15 +363,16 @@ GraphicsEnvironment::GraphicsEnvironment (Context&                                        context,
                                                                                  const DrawConfig&                     drawConfig,
                                                                                  bool                                          testPipelineRobustness)
 
-       : TestEnvironment               (context, instance, instanceInterface, device, descriptorSetLayout, descriptorSet)
+       : TestEnvironment               (context, vk, device, descriptorSetLayout, descriptorSet)
        , m_renderSize                  (16, 16)
        , m_colorFormat                 (VK_FORMAT_R8G8B8A8_UNORM)
 {
-       const DeviceInterface&          vk                                              = context.getDeviceInterface();
+       const auto&                                     vki                                             = context.getInstanceInterface();
+       const auto                                      instance                                = context.getInstance();
        const deUint32                          queueFamilyIndex                = context.getUniversalQueueFamilyIndex();
        const VkComponentMapping        componentMappingRGBA    = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
-       const VkPhysicalDevice          physicalDevice                  = chooseDevice(m_instanceInterface, instance, context.getTestContext().getCommandLine());
-       SimpleAllocator                         memAlloc                                (vk, m_device, getPhysicalDeviceMemoryProperties(m_instanceInterface, physicalDevice));
+       const VkPhysicalDevice          physicalDevice                  = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
+       SimpleAllocator                         memAlloc                                (vk, m_device, getPhysicalDeviceMemoryProperties(vki, physicalDevice));
 
        // Create color image and view
        {
@@ -562,17 +562,14 @@ GraphicsEnvironment::GraphicsEnvironment (Context&                                        context,
 // ComputeEnvironment
 
 ComputeEnvironment::ComputeEnvironment (Context&                                       context,
-                                                                               VkInstance                                      instance,
-                                                                               const InstanceInterface&        instanceInterface,
+                                                                               const DeviceInterface&          vk,
                                                                                VkDevice                                        device,
                                                                                VkDescriptorSetLayout           descriptorSetLayout,
                                                                                VkDescriptorSet                         descriptorSet,
                                                                                bool                                            testPipelineRobustness)
 
-       : TestEnvironment       (context, instance, instanceInterface, device, descriptorSetLayout, descriptorSet)
+       : TestEnvironment       (context, vk, device, descriptorSetLayout, descriptorSet)
 {
-       const DeviceInterface& vk = context.getDeviceInterface();
-
        // Create pipeline layout
        {
                const VkPipelineLayoutCreateInfo pipelineLayoutParams =
index 1da6504..4127dab 100644 (file)
 #include "vkMemUtil.hpp"
 #include "deUniquePtr.hpp"
 #include "tcuVectorUtil.hpp"
-#include "vktCustomInstancesDevices.hpp"
 
 namespace vkt
 {
 namespace robustness
 {
 
-vk::Move<vk::VkDevice> createRobustBufferAccessDevice          (Context& context, vk::VkInstance instance, const vk::InstanceInterface& vki, const vk::VkPhysicalDeviceFeatures2* enabledFeatures2 = DE_NULL);
+vk::Move<vk::VkDevice> createRobustBufferAccessDevice          (Context& context, const vk::VkPhysicalDeviceFeatures2* enabledFeatures2 = DE_NULL);
 bool                                   areEqual                                                        (float a, float b);
 bool                                   isValueZero                                                     (const void* valuePtr, size_t valueSize);
 bool                                   isValueWithinBuffer                                     (const void* buffer, vk::VkDeviceSize bufferSize, const void* valuePtr, size_t valueSizeInBytes);
@@ -51,8 +50,7 @@ class TestEnvironment
 {
 public:
                                                                        TestEnvironment         (Context&                                               context,
-                                                                                                                vk::VkInstance                                 instance,
-                                                                                                                const vk::InstanceInterface&   instanceInterface,
+                                                                                                                const vk::DeviceInterface&             vk,
                                                                                                                 vk::VkDevice                                   device,
                                                                                                                 vk::VkDescriptorSetLayout              descriptorSetLayout,
                                                                                                                 vk::VkDescriptorSet                    descriptorSet);
@@ -63,8 +61,6 @@ public:
 
 protected:
        Context&                                                m_context;
-       vk::VkInstance                                  m_instance;
-       const vk::InstanceInterface&    m_instanceInterface;
        vk::VkDevice                                    m_device;
        vk::VkDescriptorSetLayout               m_descriptorSetLayout;
        vk::VkDescriptorSet                             m_descriptorSet;
@@ -90,8 +86,7 @@ public:
        };
 
                                                                        GraphicsEnvironment             (Context&                                               context,
-                                                                                                                        vk::VkInstance                                 instance,
-                                                                                                                        const vk::InstanceInterface&   instanceInterface,
+                                                                                                                        const vk::DeviceInterface&             vk,
                                                                                                                         vk::VkDevice                                   device,
                                                                                                                         vk::VkDescriptorSetLayout              descriptorSetLayout,
                                                                                                                         vk::VkDescriptorSet                    descriptorSet,
@@ -126,8 +121,7 @@ class ComputeEnvironment: public TestEnvironment
 {
 public:
                                                                        ComputeEnvironment              (Context&                                               context,
-                                                                                                                        vk::VkInstance                                 instance,
-                                                                                                                        const vk::InstanceInterface&   instanceInterface,
+                                                                                                                        const vk::DeviceInterface&             vk,
                                                                                                                         vk::VkDevice                                   device,
                                                                                                                         vk::VkDescriptorSetLayout              descriptorSetLayout,
                                                                                                                         vk::VkDescriptorSet                    descriptorSet,
index d0ea302..af91e27 100644 (file)
@@ -125,12 +125,11 @@ class VertexAccessInstance : public vkt::TestInstance
 {
 public:
                                                                                VertexAccessInstance                                    (Context&                                               context,
-                                                                                                                                                                std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                                                                 Move<VkDevice>                                 device,
 #ifndef CTS_USES_VULKANSC
-                                                                                                                                                               de::MovePtr<vk::DeviceDriver>   deviceDriver,
+                                                                                                                                                                de::MovePtr<vk::DeviceDriver>  deviceDriver,
 #else
-                                                                                                                                                               de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver,
+                                                                                                                                                                de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>       deviceDriver,
 #endif // CTS_USES_VULKANSC
                                                                                                                                                                 VkFormat                                               inputFormat,
                                                                                                                                                                 deUint32                                               numVertexValues,
@@ -153,7 +152,6 @@ protected:
        virtual void                                            initVertexIds                                                   (deUint32 *indicesPtr, size_t indexCount) = 0;
        virtual deUint32                                        getIndex                                                                (deUint32 vertexNum) const = 0;
 
-       std::shared_ptr<CustomInstanceWrapper>  m_instanceWrapper;
        Move<VkDevice>                                          m_device;
 #ifndef CTS_USES_VULKANSC
        de::MovePtr<vk::DeviceDriver>           m_deviceDriver;
@@ -206,7 +204,6 @@ class DrawAccessInstance : public VertexAccessInstance
 {
 public:
                                                DrawAccessInstance      (Context&                               context,
-                                                                                        std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                         Move<VkDevice>                 device,
 #ifndef CTS_USES_VULKANSC
                                                                                        de::MovePtr<vk::DeviceDriver>   deviceDriver,
@@ -230,7 +227,6 @@ class DrawIndexedAccessInstance : public VertexAccessInstance
 {
 public:
                                                                                DrawIndexedAccessInstance       (Context&                                               context,
-                                                                                                                                        std::shared_ptr<CustomInstanceWrapper> instanceWrapper,
                                                                                                                                         Move<VkDevice>                                 device,
 #ifndef CTS_USES_VULKANSC
                                                                                                                                         de::MovePtr<vk::DeviceDriver>          deviceDriver,
@@ -402,16 +398,14 @@ DrawAccessTest::DrawAccessTest (tcu::TestContext&         testContext,
 
 TestInstance* DrawAccessTest::createInstance (Context& context) const
 {
-       std::shared_ptr<CustomInstanceWrapper> instanceWrapper(new CustomInstanceWrapper(context));
-       Move<VkDevice>  device = createRobustBufferAccessDevice(context, instanceWrapper->instance, instanceWrapper->instance.getDriver());
+       Move<VkDevice>  device = createRobustBufferAccessDevice(context);
 #ifndef CTS_USES_VULKANSC
-       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instanceWrapper->instance, *device));
+       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *device));
 #else
-       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instanceWrapper->instance, *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
+       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), context.getInstance(), *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
 #endif // CTS_USES_VULKANSC
 
        return new DrawAccessInstance(context,
-                                                                 instanceWrapper,
                                                                  device,
                                                                  deviceDriver,
                                                                  m_inputFormat,
@@ -463,16 +457,14 @@ DrawIndexedAccessTest::DrawIndexedAccessTest (tcu::TestContext&           testContext,
 
 TestInstance* DrawIndexedAccessTest::createInstance (Context& context) const
 {
-       std::shared_ptr<CustomInstanceWrapper> instanceWrapper(new CustomInstanceWrapper(context));
-       Move<VkDevice>  device = createRobustBufferAccessDevice(context, instanceWrapper->instance, instanceWrapper->instance.getDriver());
+       Move<VkDevice>  device = createRobustBufferAccessDevice(context);
 #ifndef CTS_USES_VULKANSC
-       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instanceWrapper->instance, *device));
+       de::MovePtr<vk::DeviceDriver>   deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *device));
 #else
-       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instanceWrapper->instance, *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
+       de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>        deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), context.getInstance(), *device, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *device));
 #endif // CTS_USES_VULKANSC
 
        return new DrawIndexedAccessInstance(context,
-                                                                                instanceWrapper,
                                                                                 device,
                                                                                 deviceDriver,
                                                                                 m_inputFormat,
@@ -486,7 +478,6 @@ TestInstance* DrawIndexedAccessTest::createInstance (Context& context) const
 // VertexAccessInstance
 
 VertexAccessInstance::VertexAccessInstance (Context&                                           context,
-                                                                                       std::shared_ptr<CustomInstanceWrapper>  instanceWrapper,
                                                                                        Move<VkDevice>                                  device,
 #ifndef CTS_USES_VULKANSC
                                                                                        de::MovePtr<vk::DeviceDriver>   deviceDriver,
@@ -501,7 +492,6 @@ VertexAccessInstance::VertexAccessInstance (Context&                                                context,
                                                                                        const std::vector<deUint32>&    indices)
 
        : vkt::TestInstance                     (context)
-       , m_instanceWrapper                     (instanceWrapper)
        , m_device                                      (device)
        , m_deviceDriver                        (deviceDriver)
        , m_inputFormat                         (inputFormat)
@@ -512,8 +502,9 @@ VertexAccessInstance::VertexAccessInstance (Context&                                                context,
 {
        const DeviceInterface&          vk                                              = *m_deviceDriver;
        const deUint32                          queueFamilyIndex                = context.getUniversalQueueFamilyIndex();
-       const VkPhysicalDevice          physicalDevice                  = chooseDevice(instanceWrapper->instance.getDriver(), instanceWrapper->instance, context.getTestContext().getCommandLine());
-       SimpleAllocator                         memAlloc                                (vk, *m_device, getPhysicalDeviceMemoryProperties(instanceWrapper->instance.getDriver(), physicalDevice));
+       const auto&                                     vki                                             = context.getInstanceInterface();
+       const VkPhysicalDevice          physicalDevice                  = chooseDevice(vki, context.getInstance(), context.getTestContext().getCommandLine());
+       SimpleAllocator                         memAlloc                                (vk, *m_device, getPhysicalDeviceMemoryProperties(vki, physicalDevice));
        const deUint32                          formatSizeInBytes               = tcu::getPixelSize(mapVkFormat(m_inputFormat));
 
        // Check storage support
@@ -524,7 +515,7 @@ VertexAccessInstance::VertexAccessInstance (Context&                                                context,
 
        if (m_inputFormat == VK_FORMAT_R64_UINT || m_inputFormat == VK_FORMAT_R64_SINT)
        {
-               const VkFormatProperties        formatProperties        = getPhysicalDeviceFormatProperties(instanceWrapper->instance.getDriver(), physicalDevice, m_inputFormat);
+               const VkFormatProperties        formatProperties        = getPhysicalDeviceFormatProperties(vki, physicalDevice, m_inputFormat);
                context.requireDeviceFunctionality("VK_EXT_shader_image_atomic_int64");
 
                if ((formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
@@ -775,8 +766,7 @@ VertexAccessInstance::VertexAccessInstance (Context&                                                context,
                drawConfig.indexCount           = (deUint32)(m_indexBufferSize / sizeof(deUint32));
 
                m_graphicsTestEnvironment       = de::MovePtr<GraphicsEnvironment>(new GraphicsEnvironment(m_context,
-                                                                                                                                                                                          m_instanceWrapper->instance,
-                                                                                                                                                                                          m_instanceWrapper->instance.getDriver(),
+                                                                                                                                                                                          *m_deviceDriver,
                                                                                                                                                                                           *m_device,
                                                                                                                                                                                           *m_descriptorSetLayout,
                                                                                                                                                                                           *m_descriptorSet,
@@ -1097,7 +1087,6 @@ VkDeviceSize VertexAccessInstance::getBufferSizeInBytes (deUint32 numScalars, Vk
 // DrawAccessInstance
 
 DrawAccessInstance::DrawAccessInstance (Context&                               context,
-                                                                               std::shared_ptr<CustomInstanceWrapper>  instanceWrapper,
                                                                                Move<VkDevice>                  device,
 #ifndef CTS_USES_VULKANSC
                                                                                de::MovePtr<vk::DeviceDriver>   deviceDriver,
@@ -1110,7 +1099,6 @@ DrawAccessInstance::DrawAccessInstance (Context&                          context,
                                                                                deUint32                                numVertices,
                                                                                deUint32                                numInstances)
        : VertexAccessInstance (context,
-                                                       instanceWrapper,
                                                        device,
                                                        deviceDriver,
                                                        inputFormat,
@@ -1136,7 +1124,6 @@ deUint32 DrawAccessInstance::getIndex (deUint32 vertexNum) const
 // DrawIndexedAccessInstance
 
 DrawIndexedAccessInstance::DrawIndexedAccessInstance (Context&                                         context,
-                                                                                                         std::shared_ptr<CustomInstanceWrapper>        instanceWrapper,
                                                                                                          Move<VkDevice>                                device,
 #ifndef CTS_USES_VULKANSC
                                                                                                          de::MovePtr<vk::DeviceDriver>         deviceDriver,
@@ -1150,7 +1137,6 @@ DrawIndexedAccessInstance::DrawIndexedAccessInstance (Context&                                            context,
                                                                                                          deUint32                                              numInstances,
                                                                                                          const std::vector<deUint32>&  indices)
        : VertexAccessInstance  (context,
-                                                        instanceWrapper,
                                                         device,
                                                         deviceDriver,
                                                         inputFormat,