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
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
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
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;
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
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;
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);
+}
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;
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);
+}
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)
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);
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
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);
vk::VkFormat m_colorAttachmentFormat;
- vk::VkPrimitiveTopology m_topology;
+ const vk::VkPrimitiveTopology m_topology;
const vk::DeviceInterface& m_vk;
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;
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
#include "vkDefs.hpp"
+enum
+{
+ VERTEX_OFFSET = 13
+};
+
namespace vkt
{
namespace Draw
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:
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();
};
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);
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)
{
}
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:
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
{
namespace
{
+
+enum
+{
+ VERTEX_OFFSET = 13
+};
+
struct JunkData
{
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
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;
}
+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[] =
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:
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);
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(),
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(),
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);
}
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()))
{
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);
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(),
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(),
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);
} // anonymous
-IndirectDrawTests::IndirectDrawTests (tcu::TestContext &testCtx)
+IndirectDrawTests::IndirectDrawTests (tcu::TestContext& testCtx)
: TestCaseGroup(testCtx, "indirect_draw", "indirect drawing simple geometry")
{
/* Left blank on purpose */
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
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:
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();
}
}
-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)
{
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
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));
}
private:
- const ShaderMap m_shaderPaths;
- const vk::VkPrimitiveTopology m_topology;
+ const typename Instance::TestSpec m_testSpec;
};
} // Draw
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
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
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