defer device creation until after feature checks
authorDaniel Koch <dkoch@nvidia.com>
Wed, 21 Jun 2017 17:14:44 +0000 (13:14 -0400)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 23 Jun 2017 20:29:53 +0000 (16:29 -0400)
VK-GL-CTS Issue: 523
Component: Vulkan

Affects:
dEQP-VK.spirv_assembly.instruction.compute.16bit_storage.*
dEQP-VK.spirv_assembly.instruction.graphics.16bit_storage.*

Change-Id: Ife678bf4e70f5d312f9276356bc288f7d31f15f8
(cherry picked from commit 545cb418b912430bce80ae69d06f669114b4211e)

external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp

index d8e4d4e..6d485d5 100644 (file)
@@ -277,10 +277,6 @@ public:
        tcu::TestStatus                                         iterate                                         (void);
 
 private:
-       const Unique<VkDevice>                          m_device;
-       const DeviceDriver                                      m_deviceInterface;
-       const VkQueue                                           m_queue;
-       const de::UniquePtr<vk::Allocator>      m_allocator;
        const ComputeShaderSpec&                        m_shaderSpec;
        const ComputeTestFeatures                       m_features;
 };
@@ -308,10 +304,6 @@ TestInstance* SpvAsmComputeShaderCase::createInstance (Context& ctx) const
 
 SpvAsmComputeShaderInstance::SpvAsmComputeShaderInstance (Context& ctx, const ComputeShaderSpec& spec, const ComputeTestFeatures features)
        : TestInstance          (ctx)
-       , m_device                      (createDeviceWithExtensions(ctx, ctx.getUniversalQueueFamilyIndex(), ctx.getDeviceExtensions(), spec.extensions))
-       , m_deviceInterface     (ctx.getInstanceInterface(), *m_device)
-       , m_queue                       (getDeviceQueue(m_deviceInterface, *m_device, ctx.getUniversalQueueFamilyIndex(), 0))
-       , m_allocator           (createAllocator(ctx.getInstanceInterface(), ctx.getPhysicalDevice(), m_deviceInterface, *m_device))
        , m_shaderSpec          (spec)
        , m_features            (features)
 {
@@ -320,9 +312,6 @@ SpvAsmComputeShaderInstance::SpvAsmComputeShaderInstance (Context& ctx, const Co
 tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
 {
        const VkPhysicalDeviceFeatures&         features                        = m_context.getDeviceFeatures();
-       const DeviceInterface&                          vkdi                            = m_deviceInterface;
-       const VkDevice&                                         device                          = *m_device;
-       Allocator&                                                      allocator                       = *m_allocator;
 
        if ((m_features == COMPUTE_TEST_USES_INT16 || m_features == COMPUTE_TEST_USES_INT16_INT64) && !features.shaderInt16)
        {
@@ -345,6 +334,15 @@ tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
                }
        }
 
+       // defer device and resource creation until after feature checks
+       const Unique<VkDevice>                          vkDevice                        (createDeviceWithExtensions(m_context, m_context.getUniversalQueueFamilyIndex(), m_context.getDeviceExtensions(), m_shaderSpec.extensions));
+       const VkDevice&                                         device                          = *vkDevice;
+       const DeviceDriver                                      vkDeviceInterface       (m_context.getInstanceInterface(), device);
+       const DeviceInterface&                          vkdi                            = vkDeviceInterface;
+       const de::UniquePtr<vk::Allocator>      vkAllocator                     (createAllocator(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), vkDeviceInterface, device));
+       Allocator&                                                      allocator                       = *vkAllocator;
+       const VkQueue                                           queue                           (getDeviceQueue(vkDeviceInterface, device, m_context.getUniversalQueueFamilyIndex(), 0));
+
        vector<AllocationSp>                            inputAllocs;
        vector<AllocationSp>                            outputAllocs;
        vector<BufferHandleSp>                          inputBuffers;
@@ -448,7 +446,7 @@ tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
                (const VkSemaphore*)DE_NULL,
        };
 
-       VK_CHECK(vkdi.queueSubmit(m_queue, 1, &submitInfo, *cmdCompleteFence));
+       VK_CHECK(vkdi.queueSubmit(queue, 1, &submitInfo, *cmdCompleteFence));
        VK_CHECK(vkdi.waitForFences(device, 1, &cmdCompleteFence.get(), 0u, infiniteTimeout)); // \note: timeout is failure
 
        // Check output.
index 8acc544..cb1f629 100644 (file)
@@ -2141,12 +2141,7 @@ TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instan
        const VkPhysicalDevice                                          vkPhysicalDevice                = context.getPhysicalDevice();
        const deUint32                                                          queueFamilyIndex                = context.getUniversalQueueFamilyIndex();
        // Create a dedicated logic device with required extensions enabled for this test case.
-       const Unique<VkDevice>                                          vkDevice                                (createDeviceWithExtensions(context, queueFamilyIndex, context.getDeviceExtensions(), instance.requiredDeviceExtensions));
-       const DeviceDriver                                                      vk                                              (vkInstance, *vkDevice);
-       const VkQueue                                                           queue                                   = getDeviceQueue(vk, *vkDevice, queueFamilyIndex, 0);
        const tcu::UVec2                                                        renderSize                              (256, 256);
-       vector<ModuleHandleSp>                                          modules;
-       map<VkShaderStageFlagBits, VkShaderModule>      moduleByStage;
        const int                                                                       testSpecificSeed                = 31354125;
        const int                                                                       seed                                    = context.getTestContext().getCommandLine().getBaseSeed() ^ testSpecificSeed;
        bool                                                                            supportsGeometry                = false;
@@ -2156,8 +2151,7 @@ TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instan
        const deUint32                                                          numResources                    = static_cast<deUint32>(instance.resources.inputs.size() + instance.resources.outputs.size());
        const bool                                                                      needInterface                   = !instance.interfaces.empty();
        const VkPhysicalDeviceFeatures&                         features                                = context.getDeviceFeatures();
-       const de::UniquePtr<Allocator>                          allocatorUptr                   (createAllocator(vkInstance, vkPhysicalDevice, vk, *vkDevice));
-       Allocator&                                                                      allocator                               = *allocatorUptr;
+
 
        supportsGeometry                = features.geometryShader == VK_TRUE;
        supportsTessellation    = features.tessellationShader == VK_TRUE;
@@ -2198,6 +2192,15 @@ TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instan
                        TCU_THROW(NotSupportedError, "Requested 16bit storage features not supported");
        }
 
+       // defer device and other resource creation until after feature checks
+       const Unique<VkDevice>                                          vkDevice                                (createDeviceWithExtensions(context, queueFamilyIndex, context.getDeviceExtensions(), instance.requiredDeviceExtensions));
+       const DeviceDriver                                                      vk                                              (vkInstance, *vkDevice);
+       const VkQueue                                                           queue                                   = getDeviceQueue(vk, *vkDevice, queueFamilyIndex, 0);
+       const de::UniquePtr<Allocator>                          allocatorUptr                   (createAllocator(vkInstance, vkPhysicalDevice, vk, *vkDevice));
+       Allocator&                                                                      allocator                               = *allocatorUptr;
+       vector<ModuleHandleSp>                                          modules;
+       map<VkShaderStageFlagBits, VkShaderModule>      moduleByStage;
+
        de::Random(seed).shuffle(instance.inputColors, instance.inputColors+4);
        de::Random(seed).shuffle(instance.outputColors, instance.outputColors+4);
        const Vec4                                                              vertexData[]                    =