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());
deUint32 m_strideInBuffer;
deUint32 m_drawCount;
JunkData m_junkData;
+protected:
+ deBool m_isMultiDrawEnabled;
+ deUint32 m_drawIndirectMaxCount;
};
class IndirectDrawInstanced : public IndirectDraw
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)
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);
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);