Add tests for indexed indirect draw calls and VertexIndex semantics
authorSlawomir Cygan <slawomir.cygan@intel.com>
Wed, 10 Aug 2016 17:39:32 +0000 (19:39 +0200)
committerPyry Haulos <phaulos@google.com>
Thu, 22 Sep 2016 19:47:52 +0000 (12:47 -0700)
Fixes #460

- dEQP-VK.draw.indirect_draw.indexed tests are added
- Each VS in these tests now also validates VertexIndex value
- firstVertex and vertexOffset values are no longer 0

Change-Id: Id78bd4c446b3e75a11e824f00775dc7ab96432cc

15 files changed:
android/cts/master/vk-master.txt
android/cts/nyc/src/vk-master.txt
android/cts/nyc/vk-master.txt
external/vulkancts/data/vulkan/draw/VertexFetch.vert
external/vulkancts/data/vulkan/draw/VertexFetchInstanced.vert
external/vulkancts/data/vulkan/draw/VertexFetchInstancedFirstInstance.vert
external/vulkancts/modules/vulkan/draw/vktDrawBaseClass.cpp
external/vulkancts/modules/vulkan/draw/vktDrawBaseClass.hpp
external/vulkancts/modules/vulkan/draw/vktDrawIndexedTest.cpp
external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp
external/vulkancts/modules/vulkan/draw/vktDrawSimpleTest.cpp
external/vulkancts/modules/vulkan/draw/vktDrawTestCaseUtil.hpp
external/vulkancts/mustpass/1.0.0/src/master.txt
external/vulkancts/mustpass/1.0.0/vk-default.txt
external/vulkancts/mustpass/1.0.1/vk-default.txt

index 2c8ffbf..60bbd35 100644 (file)
@@ -102333,12 +102333,18 @@ dEQP-VK.draw.indexed_draw.draw_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_indexed_triangle_strip
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_strip
 dEQP-VK.compute.basic.empty_shader
 dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation
 dEQP-VK.compute.basic.ubo_to_ssbo_single_group
index c0adf79..f8e64a5 100644 (file)
@@ -79894,12 +79894,12 @@ dEQP-VK.draw.indexed_draw.draw_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_indexed_triangle_strip
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip
 dEQP-VK.compute.basic.empty_shader
 dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation
 dEQP-VK.compute.basic.ubo_to_ssbo_single_group
index 049c171..29f98e8 100644 (file)
@@ -79894,12 +79894,12 @@ dEQP-VK.draw.indexed_draw.draw_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_indexed_triangle_strip
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip
 dEQP-VK.compute.basic.empty_shader
 dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation
 dEQP-VK.compute.basic.ubo_to_ssbo_single_group
index 7f070f5..c2b101b 100644 (file)
@@ -2,6 +2,7 @@
 
 layout(location = 0) in vec4 in_position;
 layout(location = 1) in vec4 in_color;
+layout(location = 2) in int in_refVertexIndex;
 
 layout(location = 0) out vec4 out_color;
 
@@ -11,5 +12,8 @@ out gl_PerVertex {
 
 void main() {
        gl_Position = in_position;
-       out_color = in_color;
+       if (gl_VertexIndex == in_refVertexIndex)
+               out_color = in_color;
+       else
+               out_color = vec4(1.0, 0.0, 0.0, 1.0);
 }
\ No newline at end of file
index 1576892..df0e5ca 100644 (file)
@@ -2,6 +2,7 @@
 
 layout(location = 0) in vec4 in_position;
 layout(location = 1) in vec4 in_color;
+layout(location = 2) in int in_refVertexIndex;
 
 layout(location = 0) out vec4 out_color;
 
@@ -14,5 +15,9 @@ void main() {
        vec2 perInstance[6]     = vec2[6](vec2(0.0, 0.0), vec2(0.3, 0.0), vec2(0.0, -0.3),vec2(0.3, -0.3), vec2(0.7, -0.7), vec2(-0.75, 0.8));
 
        gl_Position = vec4(perVertex + perInstance[gl_InstanceIndex], 0.0, 1.0);
-       out_color = in_color;
-}
\ No newline at end of file
+
+       if (gl_VertexIndex == in_refVertexIndex)
+               out_color = in_color;
+       else
+               out_color = vec4(1.0, 0.0, 0.0, 1.0);
+}
index f3e4a1a..1f1ae0e 100644 (file)
@@ -2,6 +2,7 @@
 
 layout(location = 0) in vec4 in_position;
 layout(location = 1) in vec4 in_color;
+layout(location = 2) in int in_refVertexIndex;
 
 layout(location = 0) out vec4 out_color;
 
@@ -14,5 +15,9 @@ void main() {
        vec2 perInstance[6]     = vec2[6](vec2(0.7, -0.7), vec2(-0.75, 0.8), vec2(0.0, 0.0), vec2(0.3, 0.0), vec2(0.0, -0.3),vec2(0.3, -0.3) );
 
        gl_Position = vec4(perVertex + perInstance[gl_InstanceIndex], 0.0, 1.0);
-       out_color = in_color;
-}
\ No newline at end of file
+
+       if (gl_VertexIndex == in_refVertexIndex)
+               out_color = in_color;
+       else
+               out_color = vec4(1.0, 0.0, 0.0, 1.0);
+}
index 00623a5..177c02f 100644 (file)
@@ -29,10 +29,10 @@ namespace vkt
 namespace Draw
 {
 
-DrawTestsBaseClass::DrawTestsBaseClass (Context& context, const char* vertexShaderName, const char* fragmentShaderName)
+DrawTestsBaseClass::DrawTestsBaseClass (Context& context, const char* vertexShaderName, const char* fragmentShaderName, vk::VkPrimitiveTopology topology)
        : TestInstance                          (context)
        , m_colorAttachmentFormat       (vk::VK_FORMAT_R8G8B8A8_UNORM)
-       , m_topology                            (vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
+       , m_topology                            (topology)
        , m_vk                                          (context.getDeviceInterface())
        , m_vertexShaderName            (vertexShaderName)
        , m_fragmentShaderName          (fragmentShaderName)
@@ -96,32 +96,38 @@ void DrawTestsBaseClass::initialize (void)
        const vk::VkVertexInputBindingDescription vertexInputBindingDescription =
        {
                0,
-               (deUint32)sizeof(tcu::Vec4) * 2,
+               sizeof(VertexElementData),
                vk::VK_VERTEX_INPUT_RATE_VERTEX,
        };
 
-       const vk::VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
+       const vk::VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] =
        {
                {
                        0u,
                        0u,
                        vk::VK_FORMAT_R32G32B32A32_SFLOAT,
                        0u
-               },
+               },      // VertexElementData::position
                {
                        1u,
                        0u,
                        vk::VK_FORMAT_R32G32B32A32_SFLOAT,
-                       (deUint32)(sizeof(float)* 4),
-               }
+                       static_cast<deUint32>(sizeof(tcu::Vec4))
+               },  // VertexElementData::color
+               {
+                       2u,
+                       0u,
+                       vk::VK_FORMAT_R32_SINT,
+                       static_cast<deUint32>(sizeof(tcu::Vec4)) * 2
+               }   // VertexElementData::refVertexIndex
        };
 
        m_vertexInputState = PipelineCreateInfo::VertexInputState(1,
                                                                                                                          &vertexInputBindingDescription,
-                                                                                                                         2,
+                                                                                                                         DE_LENGTH_OF_ARRAY(vertexInputAttributeDescriptions),
                                                                                                                          vertexInputAttributeDescriptions);
 
-       const vk::VkDeviceSize dataSize = m_data.size() * sizeof(PositionColorVertex);
+       const vk::VkDeviceSize dataSize = m_data.size() * sizeof(VertexElementData);
        m_vertexBuffer = Buffer::createAndAlloc(m_vk, device, BufferCreateInfo(dataSize,
                vk::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), m_context.getDefaultAllocator(), vk::MemoryRequirement::HostVisible);
 
index 3cd6fd2..905a167 100644 (file)
@@ -48,14 +48,18 @@ namespace vkt
 namespace Draw
 {
 
-struct PositionColorVertex
+struct VertexElementData
 {
-       PositionColorVertex(tcu::Vec4 position_, tcu::Vec4 color_)
-               : position(position_)
-               , color(color_)
-       {}
-       tcu::Vec4 position;
-       tcu::Vec4 color;
+                               VertexElementData (tcu::Vec4 position_, tcu::Vec4 color_, deUint32 refVertexIndex_)
+                                       : position                      (position_)
+                                       , color                         (color_)
+                                       , refVertexIndex        (refVertexIndex_)
+                               {
+                               }
+
+       tcu::Vec4       position;
+       tcu::Vec4       color;
+       deUint32        refVertexIndex;
 };
 
 struct ReferenceImageCoordinates
@@ -93,7 +97,7 @@ struct ReferenceImageInstancedCoordinates
 class DrawTestsBaseClass : public TestInstance
 {
 public:
-                                                               DrawTestsBaseClass      (Context& context, const char* vertexShaderName, const char* fragmentShaderName);
+                                                               DrawTestsBaseClass      (Context& context, const char* vertexShaderName, const char* fragmentShaderName, vk::VkPrimitiveTopology topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP);
 
 protected:
        void                                            initialize                      (void);
@@ -109,7 +113,7 @@ protected:
 
        vk::VkFormat                                                                    m_colorAttachmentFormat;
 
-       vk::VkPrimitiveTopology                                                 m_topology;
+       const vk::VkPrimitiveTopology                                   m_topology;
 
        const vk::DeviceInterface&                                              m_vk;
 
@@ -119,7 +123,12 @@ protected:
        de::SharedPtr<Image>                                                    m_colorTargetImage;
        vk::Move<vk::VkImageView>                                               m_colorTargetView;
 
+       // vertex buffer for vertex colors & position
        de::SharedPtr<Buffer>                                                   m_vertexBuffer;
+
+       // vertex buffer with reference data used in VS
+       de::SharedPtr<Buffer>                                                   m_vertexRefDataBuffer;
+
        PipelineCreateInfo::VertexInputState                    m_vertexInputState;
 
        vk::Move<vk::VkCommandPool>                                             m_cmdPool;
@@ -131,9 +140,7 @@ protected:
        const std::string                                                               m_vertexShaderName;
        const std::string                                                               m_fragmentShaderName;
 
-       std::vector<PositionColorVertex>                                m_data;
-       std::vector<deUint32>                                                   m_indexes;
-       de::SharedPtr<Buffer>                                                   m_indexBuffer;
+       std::vector<VertexElementData>                                  m_data;
 };
 
 }      // Draw
index caa0344..bc48596 100644 (file)
 
 #include "vkDefs.hpp"
 
+enum
+{
+       VERTEX_OFFSET = 13
+};
+
 namespace vkt
 {
 namespace Draw
@@ -46,32 +51,25 @@ namespace
 class DrawIndexed : public DrawTestsBaseClass
 {
 public:
-                                                               DrawIndexed                             (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology);
+       typedef         TestSpecBase    TestSpec;
+
+                                                               DrawIndexed                             (Context &context, TestSpec testSpec);
        virtual         tcu::TestStatus iterate                                 (void);
+protected:
+       std::vector<deUint32>           m_indexes;
+       de::SharedPtr<Buffer>           m_indexBuffer;
 };
 
 class DrawInstancedIndexed : public DrawIndexed
 {
 public:
-                                                               DrawInstancedIndexed    (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology);
+                                                               DrawInstancedIndexed    (Context &context, TestSpec testSpec);
        virtual         tcu::TestStatus iterate                                 (void);
 };
 
-DrawIndexed::DrawIndexed (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology)
-               : DrawTestsBaseClass(context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+DrawIndexed::DrawIndexed (Context &context, TestSpec testSpec)
+       : DrawTestsBaseClass(context, testSpec.shaders[glu::SHADERTYPE_VERTEX], testSpec.shaders[glu::SHADERTYPE_FRAGMENT], testSpec.topology)
 {
-       m_topology = topology;
-
-       /*0*/ m_data.push_back(PositionColorVertex(tcu::Vec4(   -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*1*/ m_data.push_back(PositionColorVertex(tcu::Vec4(   -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*2*/ m_data.push_back(PositionColorVertex(tcu::Vec4(   -0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*3*/ m_data.push_back(PositionColorVertex(tcu::Vec4(    1.0f,  -1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*4*/ m_data.push_back(PositionColorVertex(tcu::Vec4(   -0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*5*/ m_data.push_back(PositionColorVertex(tcu::Vec4(    0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*6*/ m_data.push_back(PositionColorVertex(tcu::Vec4(    0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*7*/ m_data.push_back(PositionColorVertex(tcu::Vec4(    0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-       /*8*/ m_data.push_back(PositionColorVertex(tcu::Vec4(   -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-
        switch (m_topology)
        {
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
@@ -111,6 +109,25 @@ DrawIndexed::DrawIndexed (Context &context, ShaderMap shaders, vk::VkPrimitiveTo
                        DE_FATAL("Unknown topology");
                        break;
        }
+
+       for (int unusedIdx = 0; unusedIdx < VERTEX_OFFSET; unusedIdx++)
+       {
+               m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
+       }
+
+       int vertexIndex = VERTEX_OFFSET;
+
+       m_data.push_back(VertexElementData(tcu::Vec4(   -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+       m_data.push_back(VertexElementData(tcu::Vec4(   -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+       m_data.push_back(VertexElementData(tcu::Vec4(   -0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+       m_data.push_back(VertexElementData(tcu::Vec4(    1.0f,  -1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+       m_data.push_back(VertexElementData(tcu::Vec4(   -0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+       m_data.push_back(VertexElementData(tcu::Vec4(    0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+       m_data.push_back(VertexElementData(tcu::Vec4(    0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+       m_data.push_back(VertexElementData(tcu::Vec4(    0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
+
+       m_data.push_back(VertexElementData(tcu::Vec4(   -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec(), -1));
+
        initialize();
 };
 
@@ -146,7 +163,7 @@ tcu::TestStatus DrawIndexed::iterate (void)
 
        m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
 
-       m_vk.cmdDrawIndexed(*m_cmdBuffer, 6, 1, 2, 0, 0);
+       m_vk.cmdDrawIndexed(*m_cmdBuffer, 6, 1, 2, VERTEX_OFFSET, 0);
 
        m_vk.cmdEndRenderPass(*m_cmdBuffer);
        m_vk.endCommandBuffer(*m_cmdBuffer);
@@ -210,8 +227,8 @@ tcu::TestStatus DrawIndexed::iterate (void)
        return tcu::TestStatus(res, qpGetTestResultName(res));
 };
 
-DrawInstancedIndexed::DrawInstancedIndexed (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology)
-       : DrawIndexed   (context, shaders, topology)
+DrawInstancedIndexed::DrawInstancedIndexed (Context &context, TestSpec testSpec)
+       : DrawIndexed   (context, testSpec)
 {
 }
 
@@ -248,10 +265,10 @@ tcu::TestStatus DrawInstancedIndexed::iterate (void)
        switch (m_topology)
        {
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
-                       m_vk.cmdDrawIndexed(*m_cmdBuffer, 6, 4, 2, 0, 2);
+                       m_vk.cmdDrawIndexed(*m_cmdBuffer, 6, 4, 2, VERTEX_OFFSET, 2);
                        break;
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
-                       m_vk.cmdDrawIndexed(*m_cmdBuffer, 4, 4, 2, 0, 2);
+                       m_vk.cmdDrawIndexed(*m_cmdBuffer, 4, 4, 2, VERTEX_OFFSET, 2);
                        break;
                case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
                case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
@@ -346,18 +363,26 @@ DrawIndexedTests::~DrawIndexedTests (void) {}
 
 void DrawIndexedTests::init (void)
 {
-       ShaderMap shaderPaths;
-       shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetch.vert";
-       shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
-
-       addChild(new InstanceFactory<DrawIndexed>(m_testCtx, "draw_indexed_triangle_list", "Draws indexed triangle list", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-       addChild(new InstanceFactory<DrawIndexed>(m_testCtx, "draw_indexed_triangle_strip", "Draws indexed triangle strip", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
-
-       shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstancedFirstInstance.vert";
-       shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
-
-       addChild(new InstanceFactory<DrawInstancedIndexed>(m_testCtx, "draw_instanced_indexed_triangle_list", "Draws indexed triangle list", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-       addChild(new InstanceFactory<DrawInstancedIndexed>(m_testCtx, "draw_instanced_indexed_triangle_strip", "Draws indexed triangle strip", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
+       {
+               DrawIndexed::TestSpec testSpec;
+               testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetch.vert";
+               testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
+
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+               addChild(new InstanceFactory<DrawIndexed>(m_testCtx, "draw_indexed_triangle_list", "Draws indexed triangle list", testSpec));
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+               addChild(new InstanceFactory<DrawIndexed>(m_testCtx, "draw_indexed_triangle_strip", "Draws indexed triangle strip", testSpec));
+       }
+       {
+               DrawInstancedIndexed::TestSpec testSpec;
+               testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstancedFirstInstance.vert";
+               testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
+
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+               addChild(new InstanceFactory<DrawInstancedIndexed>(m_testCtx, "draw_instanced_indexed_triangle_list", "Draws indexed triangle list", testSpec));
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+               addChild(new InstanceFactory<DrawInstancedIndexed>(m_testCtx, "draw_instanced_indexed_triangle_strip", "Draws indexed triangle strip", testSpec));
+       }
 }
 
 }      // DrawTests
index 5f3a4d1..f94bda4 100644 (file)
@@ -43,6 +43,12 @@ namespace Draw
 {
 namespace
 {
+
+enum
+{
+       VERTEX_OFFSET = 13
+};
+
 struct JunkData
 {
        JunkData()
@@ -54,21 +60,43 @@ struct JunkData
        const deUint32  varB;
 };
 
+enum DrawType
+{
+       DRAW_TYPE_SEQUENTIAL,
+       DRAW_TYPE_INDEXED,
+
+       DRAWTYPE_LAST
+};
+
+struct DrawTypedTestSpec : public TestSpecBase
+{
+       DrawType drawType;
+};
+
 class IndirectDraw : public DrawTestsBaseClass
 {
 public:
-                                                               IndirectDraw    (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology);
+       typedef DrawTypedTestSpec       TestSpec;
+
+                                                               IndirectDraw    (Context &context, TestSpec testSpec);
        virtual tcu::TestStatus         iterate                 (void);
-private:
-       de::SharedPtr<Buffer>                                   m_indirectBuffer;
-       std::vector<vk::VkDrawIndirectCommand>  m_indirectDrawCmd;
-       vk::VkDeviceSize                                                m_offsetInBuffer;
-       deUint32                                                                m_strideInBuffer;
-       deUint32                                                                m_drawCount;
-       JunkData                                                                m_junkData;
+
+       template<typename T> void       addCommand              (const T&);
+
 protected:
-       deBool                                                                  m_isMultiDrawEnabled;
-       deUint32                                                                m_drawIndirectMaxCount;
+       std::vector<char>               m_indirectBufferContents;
+       de::SharedPtr<Buffer>           m_indirectBuffer;
+       vk::VkDeviceSize                m_offsetInBuffer;
+       deUint32                        m_strideInBuffer;
+
+       deUint32                        m_drawCount;
+       JunkData                        m_junkData;
+
+       const DrawType                  m_drawType;
+       deBool                          m_isMultiDrawEnabled;
+       deUint32                        m_drawIndirectMaxCount;
+
+       de::SharedPtr<Buffer>           m_indexBuffer;
 };
 
 struct FirtsInstanceSupported
@@ -87,66 +115,71 @@ template<class FirstInstanceSupport>
 class IndirectDrawInstanced : public IndirectDraw
 {
 public:
-                                                               IndirectDrawInstanced   (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology);
+                                                               IndirectDrawInstanced   (Context &context, TestSpec testSpec);
        virtual tcu::TestStatus         iterate                                 (void);
-private:
-       de::SharedPtr<Buffer>                                   m_indirectBuffer;
-       std::vector<vk::VkDrawIndirectCommand>  m_indirectDrawCmd;
-       vk::VkDeviceSize                                                m_offsetInBuffer;
-       deUint32                                                                m_strideInBuffer;
-       deUint32                                                                m_drawCount;
-       JunkData                                                                m_junkData;
 };
 
-IndirectDraw::IndirectDraw (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology)
-               : DrawTestsBaseClass(context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+IndirectDraw::IndirectDraw (Context &context, TestSpec testSpec)
+       : DrawTestsBaseClass    (context, testSpec.shaders[glu::SHADERTYPE_VERTEX], testSpec.shaders[glu::SHADERTYPE_FRAGMENT], testSpec.topology)
+       , m_drawType                    (testSpec.drawType)
 {
-       m_topology = topology;
+
+       int refVertexIndex = 2;
+
+       if (testSpec.drawType == DRAW_TYPE_INDEXED)
+       {
+               for (int unusedIdx = 0; unusedIdx < VERTEX_OFFSET; unusedIdx++)
+               {
+                       m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
+               }
+               refVertexIndex += VERTEX_OFFSET;
+       }
+
+       m_data.push_back(VertexElementData(tcu::Vec4( 1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
+       m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
 
        switch (m_topology)
        {
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  1.0f,  -1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
                        break;
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( 1.0f,   -1.0f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f,    1.0f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(-0.3f,    0.0f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( 0.3f,    0.0f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(-0.3f,   -0.3f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( 0.3f,   -0.3f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(-0.3f,    0.3f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( 0.3f,    0.3f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(-0.3f,    0.0f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( 0.3f,    0.0f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f,    1.0f,   1.0f,   1.0f),  tcu::RGBA::blue().toVec()));
-                       break;
-               case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LAST:
-                       DE_FATAL("Topology not implemented");
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.0f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,      0.0f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,     -0.3f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,     -0.3f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.3f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,      0.3f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.0f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,      0.0f, 1.0f, 1.0f),      tcu::RGBA::blue().toVec(), refVertexIndex++));
                        break;
                default:
                        DE_FATAL("Unknown topology");
                        break;
        }
+
+       m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
+
        initialize();
 
+       if (testSpec.drawType == DRAW_TYPE_INDEXED)
+       {
+               const size_t indexBufferLength = m_data.size() - VERTEX_OFFSET;
+
+               m_indexBuffer = Buffer::createAndAlloc(m_vk, m_context.getDevice(), BufferCreateInfo(sizeof(deUint32) * indexBufferLength, vk::VK_BUFFER_USAGE_INDEX_BUFFER_BIT), m_context.getDefaultAllocator(), vk::MemoryRequirement::HostVisible);
+               deUint32* indices = reinterpret_cast<deUint32*>(m_indexBuffer->getBoundMemory().getHostPtr());
+               for (size_t i = 0; i < indexBufferLength; i++)
+               {
+                       indices[i] = static_cast<deUint32>(i);
+               }
+               vk::flushMappedMemoryRange(m_vk, m_context.getDevice(), m_indexBuffer->getBoundMemory().getMemory(), m_indexBuffer->getBoundMemory().getOffset(), sizeof(deUint32) * indexBufferLength);
+       }
+
        // Check device for multidraw support:
        if (m_context.getDeviceFeatures().multiDrawIndirect)
                m_isMultiDrawEnabled = true;
@@ -157,13 +190,39 @@ IndirectDraw::IndirectDraw (Context &context, ShaderMap shaders, vk::VkPrimitive
 
 }
 
+template<>
+void IndirectDraw::addCommand<vk::VkDrawIndirectCommand> (const vk::VkDrawIndirectCommand& command)
+{
+       DE_ASSERT(m_drawType == DRAW_TYPE_SEQUENTIAL);
+
+       const size_t currentSize = m_indirectBufferContents.size();
+
+       m_indirectBufferContents.resize(currentSize + sizeof(command));
+
+       deMemcpy(&m_indirectBufferContents[currentSize], &command, sizeof(command));
+}
+
+template<>
+void IndirectDraw::addCommand<vk::VkDrawIndexedIndirectCommand>(const vk::VkDrawIndexedIndirectCommand& command)
+{
+       DE_ASSERT(m_drawType == DRAW_TYPE_INDEXED);
+
+       const size_t currentSize = m_indirectBufferContents.size();
+
+       m_indirectBufferContents.resize(currentSize + sizeof(command));
+
+       deMemcpy(&m_indirectBufferContents[currentSize], &command, sizeof(command));
+}
+
 tcu::TestStatus IndirectDraw::iterate (void)
 {
        tcu::TestLog &log = m_context.getTestContext().getLog();
        const vk::VkQueue queue = m_context.getUniversalQueue();
 
-       switch (m_topology)
+       if (m_drawType == DRAW_TYPE_SEQUENTIAL)
        {
+               switch (m_topology)
+               {
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
                {
                        vk::VkDrawIndirectCommand drawCommands[] =
@@ -182,9 +241,9 @@ tcu::TestStatus IndirectDraw::iterate (void)
                                        0               //firstInstance
                                }
                        };
-                       m_indirectDrawCmd.push_back(drawCommands[0]);
-                       m_indirectDrawCmd.push_back(drawCommands[1]);
-                       m_indirectDrawCmd.push_back(drawCommands[2]);
+                       addCommand(drawCommands[0]);
+                       addCommand(drawCommands[1]);
+                       addCommand(drawCommands[2]);
                        break;
                }
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
@@ -205,29 +264,78 @@ tcu::TestStatus IndirectDraw::iterate (void)
                                        0               //firstInstance
                                }
                        };
-                       m_indirectDrawCmd.push_back(drawCommands[0]);
-                       m_indirectDrawCmd.push_back(drawCommands[1]);
-                       m_indirectDrawCmd.push_back(drawCommands[2]);
+                       addCommand(drawCommands[0]);
+                       addCommand(drawCommands[1]);
+                       addCommand(drawCommands[2]);
                        break;
                }
-               case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LAST:
-                       DE_FATAL("Topology not implemented");
-                       break;
                default:
-                       DE_FATAL("Unknown topology");
+                       TCU_FAIL("impossible");
+               }
+
+               m_strideInBuffer = 2 * (deUint32)sizeof(vk::VkDrawIndirectCommand);
+       }
+       else if (m_drawType == DRAW_TYPE_INDEXED)
+       {
+               switch (m_topology)
+               {
+               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+               {
+                       vk::VkDrawIndexedIndirectCommand drawCommands[] =
+                       {
+                               {
+                                       3,                                      // indexCount
+                                       1,                                      // instanceCount
+                                       2,                                      // firstIndex
+                                       VERTEX_OFFSET,          // vertexOffset
+                                       0,                                      // firstInstance
+                               },
+                               { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deInt32)9, (deUint32)-7 }, // junk (stride)
+                               {
+                                       3,                                      // indexCount
+                                       1,                                      // instanceCount
+                                       5,                                      // firstIndex
+                                       VERTEX_OFFSET,          // vertexOffset
+                                       0,                                      // firstInstance
+                               }
+                       };
+                       addCommand(drawCommands[0]);
+                       addCommand(drawCommands[1]);
+                       addCommand(drawCommands[2]);
                        break;
+               }
+               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+               {
+                       vk::VkDrawIndexedIndirectCommand drawCommands[] =
+                       {
+                               {
+                                       4,                              // indexCount
+                                       1,                              // instanceCount
+                                       2,                              // firstIndex
+                                       VERTEX_OFFSET,  // vertexOffset
+                                       0,                              // firstInstance
+                               },
+                               { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deInt32)9, (deUint32)-7 }, // junk (stride)
+                               {
+                                       4,                              // indexCount
+                                       1,                              // instanceCount
+                                       6,                              // firstIndex
+                                       VERTEX_OFFSET,  // vertexOffset
+                                       0,                              // firstInstance
+                               }
+                       };
+                       addCommand(drawCommands[0]);
+                       addCommand(drawCommands[1]);
+                       addCommand(drawCommands[2]);
+                       break;
+               }
+               default:
+                       TCU_FAIL("impossible");
+               }
+
+               m_strideInBuffer = 2 * (deUint32)sizeof(vk::VkDrawIndexedIndirectCommand);
        }
 
-       m_strideInBuffer        = 2 * (deUint32)sizeof(m_indirectDrawCmd[0]);
        m_drawCount                     = 2;
        m_offsetInBuffer        = sizeof(m_junkData);
 
@@ -238,7 +346,7 @@ tcu::TestStatus IndirectDraw::iterate (void)
 
        m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
 
-       const vk::VkDeviceSize dataSize = m_indirectDrawCmd.size()*sizeof(m_indirectDrawCmd[0]);
+       const vk::VkDeviceSize dataSize = m_indirectBufferContents.size();
 
        m_indirectBuffer = Buffer::createAndAlloc(      m_vk,
                                                                                                m_context.getDevice(),
@@ -250,7 +358,7 @@ tcu::TestStatus IndirectDraw::iterate (void)
        deUint8* ptr = reinterpret_cast<deUint8*>(m_indirectBuffer->getBoundMemory().getHostPtr());
 
        deMemcpy(ptr, &m_junkData, static_cast<size_t>(m_offsetInBuffer));
-       deMemcpy((ptr+m_offsetInBuffer), &m_indirectDrawCmd[0], static_cast<size_t>(dataSize));
+       deMemcpy(ptr + m_offsetInBuffer, &m_indirectBufferContents[0], static_cast<size_t>(dataSize));
 
        vk::flushMappedMemoryRange(m_vk,
                                                           m_context.getDevice(),
@@ -259,12 +367,41 @@ tcu::TestStatus IndirectDraw::iterate (void)
                                                           dataSize);
 
        m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+
+       if (m_drawType == DRAW_TYPE_INDEXED)
+       {
+               m_vk.cmdBindIndexBuffer(*m_cmdBuffer, m_indexBuffer->object(), DE_NULL, vk::VK_INDEX_TYPE_UINT32);
+       }
+
        if (m_isMultiDrawEnabled && m_drawCount <= m_drawIndirectMaxCount)
-               m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+       {
+               switch (m_drawType)
+               {
+                       case DRAW_TYPE_SEQUENTIAL:
+                               m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+                               break;
+                       case DRAW_TYPE_INDEXED:
+                               m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+                               break;
+                       default:
+                               TCU_FAIL("impossible");
+               }
+       }
        else
        {
-               for(deUint32 drawNdx = 0; drawNdx < m_drawCount; drawNdx++){
-                       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1, m_strideInBuffer);
+               for (deUint32 drawNdx = 0; drawNdx < m_drawCount; drawNdx++)
+               {
+                       switch (m_drawType)
+                       {
+                               case DRAW_TYPE_SEQUENTIAL:
+                                       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
+                                       break;
+                               case DRAW_TYPE_INDEXED:
+                                       m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
+                                       break;
+                               default:
+                                       TCU_FAIL("impossible");
+                       }
                }
        }
        m_vk.cmdEndRenderPass(*m_cmdBuffer);
@@ -330,8 +467,8 @@ tcu::TestStatus IndirectDraw::iterate (void)
 }
 
 template<class FirstInstanceSupport>
-IndirectDrawInstanced<FirstInstanceSupport>::IndirectDrawInstanced (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology)
-       : IndirectDraw  (context, shaders, topology)
+IndirectDrawInstanced<FirstInstanceSupport>::IndirectDrawInstanced (Context &context, TestSpec testSpec)
+       : IndirectDraw(context, testSpec)
 {
        if (!FirstInstanceSupport::isTestSupported(m_context.getDeviceFeatures()))
        {
@@ -345,72 +482,125 @@ tcu::TestStatus IndirectDrawInstanced<FirstInstanceSupport>::iterate (void)
        tcu::TestLog &log = m_context.getTestContext().getLog();
        const vk::VkQueue queue = m_context.getUniversalQueue();
 
-       switch (m_topology)
+       if (m_drawType == DRAW_TYPE_SEQUENTIAL)
        {
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+               switch (m_topology)
                {
-                       vk::VkDrawIndirectCommand drawCmd[] =
+                       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
                        {
+                               vk::VkDrawIndirectCommand drawCmd[] =
                                {
-                                       3,                                                                                      //vertexCount
-                                       4,                                                                                      //instanceCount
-                                       2,                                                                                      //firstVertex
-                                       FirstInstanceSupport::getFirstInstance()        //firstInstance
-                               },
-                               { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deUint32)-9 }, // junk (stride)
+                                       {
+                                               3,                                                                                      //vertexCount
+                                               4,                                                                                      //instanceCount
+                                               2,                                                                                      //firstVertex
+                                               FirstInstanceSupport::getFirstInstance()        //firstInstance
+                                       },
+                                       { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deUint32)-9 }, // junk (stride)
+                                       {
+                                               3,                                                                                      //vertexCount
+                                               4,                                                                                      //instanceCount
+                                               5,                                                                                      //firstVertex
+                                               FirstInstanceSupport::getFirstInstance()        //firstInstance
+                                       }
+                               };
+                               addCommand(drawCmd[0]);
+                               addCommand(drawCmd[1]);
+                               addCommand(drawCmd[2]);
+                               break;
+                       }
+                       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+                       {
+                               vk::VkDrawIndirectCommand drawCmd[] =
                                {
-                                       3,                                                                                      //vertexCount
-                                       4,                                                                                      //instanceCount
-                                       5,                                                                                      //firstVertex
-                                       FirstInstanceSupport::getFirstInstance()        //firstInstance
-                               }
-                       };
-                       m_indirectDrawCmd.push_back(drawCmd[0]);
-                       m_indirectDrawCmd.push_back(drawCmd[1]);
-                       m_indirectDrawCmd.push_back(drawCmd[2]);
-                       break;
+                                       {
+                                               4,                                                                                      //vertexCount
+                                               4,                                                                                      //instanceCount
+                                               2,                                                                                      //firstVertex
+                                               FirstInstanceSupport::getFirstInstance()        //firstInstance
+                                       },
+                                       { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deUint32)-9 },
+                                       {
+                                               4,                                                                                      //vertexCount
+                                               4,                                                                                      //instanceCount
+                                               6,                                                                                      //firstVertex
+                                               FirstInstanceSupport::getFirstInstance()        //firstInstance
+                                       }
+                               };
+                               addCommand(drawCmd[0]);
+                               addCommand(drawCmd[1]);
+                               addCommand(drawCmd[2]);
+                               break;
+                       }
+                       default:
+                               TCU_FAIL("impossible");
+                               break;
                }
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+
+               m_strideInBuffer = 2 * (deUint32)sizeof(vk::VkDrawIndirectCommand);
+       }
+       else if (m_drawType == DRAW_TYPE_INDEXED)
+       {
+               switch (m_topology)
                {
-                       vk::VkDrawIndirectCommand drawCmd[] =
+                       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
                        {
+                               vk::VkDrawIndexedIndirectCommand drawCmd[] =
                                {
-                                       4,                                                                                      //vertexCount
-                                       4,                                                                                      //instanceCount
-                                       2,                                                                                      //firstVertex
-                                       FirstInstanceSupport::getFirstInstance()        //firstInstance
-                               },
-                               { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deUint32)-9 },
+                                       {
+                                               3,                                                                                      // indexCount
+                                               4,                                                                                      // instanceCount
+                                               2,                                                                                      // firstIndex
+                                               VERTEX_OFFSET,                                                          // vertexOffset
+                                               FirstInstanceSupport::getFirstInstance()        // firstInstance
+                                       },
+                                       { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deInt32)9, (deUint32)-7 },        // junk (stride)
+                                       {
+                                               3,                                                                                      // indexCount
+                                               4,                                                                                      // instanceCount
+                                               5,                                                                                      // firstIndex
+                                               VERTEX_OFFSET,                                                          // vertexOffset
+                                               FirstInstanceSupport::getFirstInstance()        // firstInstance
+                                       }
+                               };
+                               addCommand(drawCmd[0]);
+                               addCommand(drawCmd[1]);
+                               addCommand(drawCmd[2]);
+                               break;
+                       }
+                       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+                       {
+                               vk::VkDrawIndexedIndirectCommand drawCmd[] =
                                {
-                                       4,                                                                                      //vertexCount
-                                       4,                                                                                      //instanceCount
-                                       6,                                                                                      //firstVertex
-                                       FirstInstanceSupport::getFirstInstance()        //firstInstance
-                               }
-                       };
-                       m_indirectDrawCmd.push_back(drawCmd[0]);
-                       m_indirectDrawCmd.push_back(drawCmd[1]);
-                       m_indirectDrawCmd.push_back(drawCmd[2]);
-                       break;
+                                       {
+                                               4,                                                                                      // indexCount
+                                               4,                                                                                      // instanceCount
+                                               2,                                                                                      // firstIndex
+                                               VERTEX_OFFSET,                                                          // vertexOffset
+                                               FirstInstanceSupport::getFirstInstance()        // firstInstance
+                                       },
+                                       { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deInt32)9, (deUint32)-7 },        // junk (stride)
+                                       {
+                                               4,                                                                                      // indexCount
+                                               4,                                                                                      // instanceCount
+                                               6,                                                                                      // firstIndex
+                                               VERTEX_OFFSET,                                                          // vertexOffset
+                                               FirstInstanceSupport::getFirstInstance()        // firstInstance
+                                       }
+                               };
+                               addCommand(drawCmd[0]);
+                               addCommand(drawCmd[1]);
+                               addCommand(drawCmd[2]);
+                               break;
+                       }
+                       default:
+                               TCU_FAIL("impossible");
+                               break;
                }
-               case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
-               case vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
-               case vk::VK_PRIMITIVE_TOPOLOGY_LAST:
-                       DE_FATAL("Topology not implemented");
-                       break;
-               default:
-                       DE_FATAL("Unknown topology");
-                       break;
+
+               m_strideInBuffer = 2 * (deUint32)sizeof(vk::VkDrawIndexedIndirectCommand);
        }
 
-       m_strideInBuffer        = 2 * (deUint32)sizeof(m_indirectDrawCmd[0]);
        m_drawCount                     = 2;
        m_offsetInBuffer        = sizeof(m_junkData);
 
@@ -421,7 +611,7 @@ tcu::TestStatus IndirectDrawInstanced<FirstInstanceSupport>::iterate (void)
 
        m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
 
-       const vk::VkDeviceSize dataSize = m_indirectDrawCmd.size()*sizeof(m_indirectDrawCmd[0]);
+       const vk::VkDeviceSize dataSize = m_indirectBufferContents.size();
 
        m_indirectBuffer = Buffer::createAndAlloc(      m_vk,
                                                                                                m_context.getDevice(),
@@ -433,7 +623,7 @@ tcu::TestStatus IndirectDrawInstanced<FirstInstanceSupport>::iterate (void)
        deUint8* ptr = reinterpret_cast<deUint8*>(m_indirectBuffer->getBoundMemory().getHostPtr());
 
        deMemcpy(ptr, &m_junkData, static_cast<size_t>(m_offsetInBuffer));
-       deMemcpy((ptr + m_offsetInBuffer), &m_indirectDrawCmd[0], static_cast<size_t>(dataSize));
+       deMemcpy((ptr + m_offsetInBuffer), &m_indirectBufferContents[0], static_cast<size_t>(dataSize));
 
        vk::flushMappedMemoryRange(m_vk,
                                                           m_context.getDevice(),
@@ -442,12 +632,41 @@ tcu::TestStatus IndirectDrawInstanced<FirstInstanceSupport>::iterate (void)
                                                           dataSize);
 
        m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+
+       if (m_drawType == DRAW_TYPE_INDEXED)
+       {
+               m_vk.cmdBindIndexBuffer(*m_cmdBuffer, m_indexBuffer->object(), DE_NULL, vk::VK_INDEX_TYPE_UINT32);
+       }
+
        if (m_isMultiDrawEnabled && m_drawCount <= m_drawIndirectMaxCount)
-               m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+       {
+               switch (m_drawType)
+               {
+                       case DRAW_TYPE_SEQUENTIAL:
+                               m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+                               break;
+                       case DRAW_TYPE_INDEXED:
+                               m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
+                               break;
+                       default:
+                               TCU_FAIL("impossible");
+               }
+       }
        else
        {
-               for (deUint32 drawNdx = 0; drawNdx < m_drawCount; drawNdx++){
-                       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1, m_strideInBuffer);
+               for (deUint32 drawNdx = 0; drawNdx < m_drawCount; drawNdx++)
+               {
+                       switch (m_drawType)
+                       {
+                               case DRAW_TYPE_SEQUENTIAL:
+                                       m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
+                                       break;
+                               case DRAW_TYPE_INDEXED:
+                                       m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
+                                       break;
+                               default:
+                                       TCU_FAIL("impossible");
+                       }
                }
        }
        m_vk.cmdEndRenderPass(*m_cmdBuffer);
@@ -517,7 +736,7 @@ tcu::TestStatus IndirectDrawInstanced<FirstInstanceSupport>::iterate (void)
 
 }      // anonymous
 
-IndirectDrawTests::IndirectDrawTests (tcu::TestContext &testCtx)
+IndirectDrawTests::IndirectDrawTests (tcu::TestContexttestCtx)
        : TestCaseGroup(testCtx, "indirect_draw", "indirect drawing simple geometry")
 {
        /* Left blank on purpose */
@@ -528,39 +747,74 @@ IndirectDrawTests::~IndirectDrawTests (void) {}
 
 void IndirectDrawTests::init (void)
 {
-       ShaderMap shaderPaths;
-       shaderPaths[glu::SHADERTYPE_VERTEX]             = "vulkan/draw/VertexFetch.vert";
-       shaderPaths[glu::SHADERTYPE_FRAGMENT]   = "vulkan/draw/VertexFetch.frag";
-
-       tcu::TestCaseGroup* indirectDrawGroup   = new tcu::TestCaseGroup(m_testCtx, "indirect_draw", "Draws geometry");
+       for (int drawTypeIdx = 0; drawTypeIdx < DRAWTYPE_LAST; drawTypeIdx++)
        {
-               indirectDrawGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_list", "Draws triangle list", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-               indirectDrawGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_strip", "Draws triangle strip", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
-       }
-       addChild(indirectDrawGroup);
-
-
-       tcu::TestCaseGroup* indirectDrawInstancedGroup  = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_instanced", "Draws an instanced geometry");
-       {
-               tcu::TestCaseGroup*     noFirstInstanceGroup    = new tcu::TestCaseGroup(m_testCtx, "no_first_instance", "Use 0 as firstInstance");
+               std::string drawTypeStr;
+               switch (drawTypeIdx)
                {
-                       shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstanced.vert";
-
-                       noFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceNotSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-                       noFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceNotSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
+                       case DRAW_TYPE_SEQUENTIAL:
+                               drawTypeStr = "sequential";
+                               break;
+                       case DRAW_TYPE_INDEXED:
+                               drawTypeStr = "indexed";
+                               break;
+                       default:
+                               TCU_FAIL("impossible");
                }
-               indirectDrawInstancedGroup->addChild(noFirstInstanceGroup);
 
-               tcu::TestCaseGroup*     firstInstanceGroup              = new tcu::TestCaseGroup(m_testCtx, "first_instance", "Use drawIndirectFirstInstance optional feature");
+               tcu::TestCaseGroup* drawTypeGroup = new tcu::TestCaseGroup(m_testCtx, drawTypeStr.c_str(), ("Draws geometry using " + drawTypeStr + "draw call").c_str());
                {
-                       shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstancedFirstInstance.vert";
+                       tcu::TestCaseGroup* indirectDrawGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw", "Draws geometry");
+                       {
+                               IndirectDraw::TestSpec testSpec;
+                               testSpec.drawType = static_cast<DrawType>(drawTypeIdx);
+                               testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetch.vert";
+                               testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
+                               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+                               indirectDrawGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_list", "Draws triangle list", testSpec));
+                               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+                               indirectDrawGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec));
+                       }
+                       drawTypeGroup->addChild(indirectDrawGroup);
+
+
+                       tcu::TestCaseGroup* indirectDrawInstancedGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_instanced", "Draws an instanced geometry");
+                       {
+                               tcu::TestCaseGroup*     noFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "no_first_instance", "Use 0 as firstInstance");
+                               {
+                                       IndirectDrawInstanced<FirtsInstanceNotSupported>::TestSpec testSpec;
+                                       testSpec.drawType = static_cast<DrawType>(drawTypeIdx);
 
-                       firstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-                       firstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
+                                       testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstanced.vert";
+                                       testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
+
+                                       testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+                                       noFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceNotSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
+                                       testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+                                       noFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceNotSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec));
+                               }
+                               indirectDrawInstancedGroup->addChild(noFirstInstanceGroup);
+
+                               tcu::TestCaseGroup*     firstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "first_instance", "Use drawIndirectFirstInstance optional feature");
+                               {
+                                       IndirectDrawInstanced<FirtsInstanceSupported>::TestSpec testSpec;
+                                       testSpec.drawType = static_cast<DrawType>(drawTypeIdx);
+
+                                       testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstancedFirstInstance.vert";
+                                       testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
+
+                                       testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+                                       firstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
+                                       testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+                                       firstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec));
+                               }
+                               indirectDrawInstancedGroup->addChild(firstInstanceGroup);
+                       }
+                       drawTypeGroup->addChild(indirectDrawInstancedGroup);
                }
-               indirectDrawInstancedGroup->addChild(firstInstanceGroup);
+
+               addChild(drawTypeGroup);
        }
-       addChild(indirectDrawInstancedGroup);
 }
 
 }      // DrawTests
index cde11f5..816e589 100644 (file)
@@ -46,44 +46,43 @@ namespace
 class SimpleDraw : public DrawTestsBaseClass
 {
 public:
-                                                       SimpleDraw                              (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology);
+       typedef TestSpecBase    TestSpec;
+                                                       SimpleDraw                              (Context &context, TestSpec testSpec);
        virtual tcu::TestStatus iterate                                 (void);
 };
 
 class SimpleDrawInstanced : public SimpleDraw
 {
 public:
-                                                       SimpleDrawInstanced             (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology);
+       typedef TestSpec                TestSpec;
+                                                       SimpleDrawInstanced             (Context &context, TestSpec testSpec);
        tcu::TestStatus                 iterate                                 (void);
 };
 
-SimpleDraw::SimpleDraw (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology)
-       : DrawTestsBaseClass    (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+SimpleDraw::SimpleDraw (Context &context, TestSpec testSpec)
+       : DrawTestsBaseClass(context, testSpec.shaders[glu::SHADERTYPE_VERTEX], testSpec.shaders[glu::SHADERTYPE_FRAGMENT], testSpec.topology)
 {
-       m_topology = topology;
+       m_data.push_back(VertexElementData(tcu::Vec4(1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
+       m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
+
+       int refVertexIndex = 2;
 
        switch (m_topology)
        {
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  1.0f,  -1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
                        break;
                case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  1.0f,  -1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,  -0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4(  0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -0.3f,   0.3f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
-                       m_data.push_back(PositionColorVertex(tcu::Vec4( -1.0f,   1.0f,  1.0f,   1.0f), tcu::RGBA::blue().toVec()));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,     -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
+                       m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,      0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refVertexIndex++));
                        break;
                case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
                case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
@@ -101,6 +100,9 @@ SimpleDraw::SimpleDraw (Context &context, ShaderMap shaders, vk::VkPrimitiveTopo
                        DE_FATAL("Unknown topology");
                        break;
        }
+
+       m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
+
        initialize();
 }
 
@@ -205,8 +207,8 @@ tcu::TestStatus SimpleDraw::iterate (void)
 
 }
 
-SimpleDrawInstanced::SimpleDrawInstanced (Context &context, ShaderMap shaders, vk::VkPrimitiveTopology topology)
-       : SimpleDraw    (context, shaders, topology) {}
+SimpleDrawInstanced::SimpleDrawInstanced (Context &context, TestSpec testSpec)
+       : SimpleDraw    (context, testSpec) {}
 
 tcu::TestStatus SimpleDrawInstanced::iterate (void)
 {
@@ -325,18 +327,26 @@ SimpleDrawTests::~SimpleDrawTests (void) {}
 
 void SimpleDrawTests::init (void)
 {
-       ShaderMap shaderPaths;
-       shaderPaths[glu::SHADERTYPE_VERTEX]             = "vulkan/draw/VertexFetch.vert";
-       shaderPaths[glu::SHADERTYPE_FRAGMENT]   = "vulkan/draw/VertexFetch.frag";
-
-       addChild(new InstanceFactory<SimpleDraw>(m_testCtx, "simple_draw_triangle_list", "Draws triangle list", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-       addChild(new InstanceFactory<SimpleDraw>(m_testCtx, "simple_draw_triangle_strip", "Draws triangle strip", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
-
-       shaderPaths[glu::SHADERTYPE_VERTEX]             = "vulkan/draw/VertexFetchInstancedFirstInstance.vert";
-       shaderPaths[glu::SHADERTYPE_FRAGMENT]   = "vulkan/draw/VertexFetch.frag";
-
-       addChild(new InstanceFactory<SimpleDrawInstanced>(m_testCtx, "simple_draw_instanced_triangle_list", "Draws an instanced triangle list", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-       addChild(new InstanceFactory<SimpleDrawInstanced>(m_testCtx, "simple_draw_instanced_triangle_strip", "Draws an instanced triangle strip", shaderPaths, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
+       {
+               SimpleDraw::TestSpec testSpec;
+               testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetch.vert";
+               testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
+
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+               addChild(new InstanceFactory<SimpleDraw>(m_testCtx, "simple_draw_triangle_list", "Draws triangle list", testSpec));
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+               addChild(new InstanceFactory<SimpleDraw>(m_testCtx, "simple_draw_triangle_strip", "Draws triangle strip", testSpec));
+       }
+       {
+               SimpleDrawInstanced::TestSpec testSpec;
+               testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstancedFirstInstance.vert";
+               testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
+
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+               addChild(new InstanceFactory<SimpleDrawInstanced>(m_testCtx, "simple_draw_instanced_triangle_list", "Draws an instanced triangle list", testSpec));
+               testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+               addChild(new InstanceFactory<SimpleDrawInstanced>(m_testCtx, "simple_draw_instanced_triangle_strip", "Draws an instanced triangle strip", testSpec));
+       }
 }
 
 }      // DrawTests
index 2ff9e07..c650b2c 100644 (file)
@@ -59,26 +59,30 @@ public:
 
 typedef std::map<glu::ShaderType, const char*> ShaderMap;
 
+struct TestSpecBase
+{
+       ShaderMap                               shaders;
+       vk::VkPrimitiveTopology topology;
+};
+
 template<typename Instance>
 class InstanceFactory : public TestCase
 {
 public:
-       InstanceFactory (tcu::TestContext& testCtx, const std::string& name, const std::string& desc,
-               const std::map<glu::ShaderType, const char*> shaderPaths, const vk::VkPrimitiveTopology topology)
+       InstanceFactory (tcu::TestContext& testCtx, const std::string& name, const std::string& desc, typename Instance::TestSpec testSpec)
                : TestCase              (testCtx, name, desc)
-               , m_shaderPaths (shaderPaths)
-               , m_topology    (topology)
+               , m_testSpec    (testSpec)
        {
        }
 
        TestInstance* createInstance (Context& context) const
        {
-               return new Instance(context, m_shaderPaths, m_topology);
+               return new Instance(context, m_testSpec);
        }
 
        virtual void initPrograms (vk::SourceCollections& programCollection) const
        {
-               for (ShaderMap::const_iterator i = m_shaderPaths.begin(); i != m_shaderPaths.end(); ++i)
+               for (ShaderMap::const_iterator i = m_testSpec.shaders.begin(); i != m_testSpec.shaders.end(); ++i)
                {
                        programCollection.glslSources.add(i->second) <<
                                glu::ShaderSource(i->first, ShaderSourceProvider::getSource(m_testCtx.getArchive(), i->second));
@@ -86,8 +90,7 @@ public:
        }
 
 private:
-       const ShaderMap m_shaderPaths;
-       const vk::VkPrimitiveTopology m_topology;
+       const typename Instance::TestSpec m_testSpec;
 };
 
 } // Draw
index 9a03c03..a1c30a8 100644 (file)
@@ -79330,12 +79330,12 @@ dEQP-VK.draw.indexed_draw.draw_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_indexed_triangle_strip
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip
 dEQP-VK.compute.basic.empty_shader
 dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation
 dEQP-VK.compute.basic.ubo_to_ssbo_single_group
index 8f704bc..538f922 100644 (file)
@@ -79330,12 +79330,12 @@ dEQP-VK.draw.indexed_draw.draw_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_indexed_triangle_strip
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip
 dEQP-VK.compute.basic.empty_shader
 dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation
 dEQP-VK.compute.basic.ubo_to_ssbo_single_group
index f5bf7fd..0e3bc75 100644 (file)
@@ -95902,12 +95902,18 @@ dEQP-VK.draw.indexed_draw.draw_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_indexed_triangle_strip
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list
 dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.no_first_instance.triangle_strip
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_list
-dEQP-VK.draw.indirect_draw.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_list
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_strip
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_strip
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_list
+dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_strip
 dEQP-VK.compute.basic.empty_shader
 dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation
 dEQP-VK.compute.basic.ubo_to_ssbo_single_group