Adding check for multidraw support in indirect tests. Changing clearColorImage flags...
authorPiotrowski, Piotr <piotr.piotrowski@intel.com>
Fri, 22 Jan 2016 12:07:16 +0000 (13:07 +0100)
committerPiotrowski, Piotr <piotr.piotrowski@intel.com>
Fri, 22 Jan 2016 13:50:54 +0000 (14:50 +0100)
external/vulkancts/modules/vulkan/draw/vktDrawBaseClass.cpp
external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp

index 815ab2c..0e0e62f 100644 (file)
@@ -60,7 +60,7 @@ void DrawTestsBaseClass::initialize (void)
 
        const vk::VkExtent3D targetImageExtent  = { WIDTH, HEIGHT, 1 };
        const ImageCreateInfo targetImageCreateInfo(vk::VK_IMAGE_TYPE_2D, m_colorAttachmentFormat, targetImageExtent, 1, 1, vk::VK_SAMPLE_COUNT_1_BIT,
-                                                                                               vk::VK_IMAGE_TILING_OPTIMAL, vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+               vk::VK_IMAGE_TILING_OPTIMAL, vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT);
 
        m_colorTargetImage                                              = Image::createAndAlloc(m_vk, device, targetImageCreateInfo, m_context.getDefaultAllocator());
 
index f8ac4a0..0dd2e7f 100644 (file)
@@ -77,6 +77,9 @@ private:
        deUint32                                                                m_strideInBuffer;
        deUint32                                                                m_drawCount;
        JunkData                                                                m_junkData;
+protected:
+       deBool                                                                  m_isMultiDrawEnabled;
+       deUint32                                                                m_drawIndirectMaxCount;
 };
 
 class IndirectDrawInstanced : public IndirectDraw
@@ -141,6 +144,20 @@ IndirectDraw::IndirectDraw (Context &context, ShaderMap shaders, vk::VkPrimitive
                        break;
        }
        initialize();
+
+       // Check device for multidraw support:
+       vk::VkPhysicalDeviceFeatures    deviceFeatures;
+       vk::VkPhysicalDeviceProperties  deviceProperties;
+
+       m_context.getInstanceInterface().getPhysicalDeviceProperties(m_context.getPhysicalDevice(), &deviceProperties);
+       m_context.getInstanceInterface().getPhysicalDeviceFeatures(m_context.getPhysicalDevice(), &deviceFeatures);
+       if (deviceFeatures.multiDrawIndirect)
+               m_isMultiDrawEnabled = true;    
+       else
+               m_isMultiDrawEnabled = false;
+       
+       m_drawIndirectMaxCount = deviceProperties.limits.maxDrawIndirectCount;
+
 }
 
 tcu::TestStatus IndirectDraw::iterate (void)
@@ -245,7 +262,13 @@ tcu::TestStatus IndirectDraw::iterate (void)
                                                           dataSize);
 
        m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
-       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+       if (m_isMultiDrawEnabled && m_drawCount <= m_drawIndirectMaxCount)
+               m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+       else{
+               for(deUint32 i = 0; i < m_drawCount; i++){
+                       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + i*m_strideInBuffer, 1, m_strideInBuffer);
+               }
+       }
        m_vk.cmdEndRenderPass(*m_cmdBuffer);
        m_vk.endCommandBuffer(*m_cmdBuffer);
 
@@ -415,7 +438,13 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void)
                                                           dataSize);
 
        m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
-       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+       if (m_isMultiDrawEnabled && m_drawCount <= m_drawIndirectMaxCount)
+               m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+       else{
+               for (deUint32 i = 0; i < m_drawCount; i++){
+                       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + i*m_strideInBuffer, 1, m_strideInBuffer);
+               }
+       }
        m_vk.cmdEndRenderPass(*m_cmdBuffer);
        m_vk.endCommandBuffer(*m_cmdBuffer);