dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_write_enable
float scaleY;
float offsetX;
float offsetY;
+ float fanScale;
MeshParams (const tcu::Vec4& color_ = kDefaultTriangleColor,
float depth_ = 0.0f,
float scaleX_ = 1.0f,
float scaleY_ = 1.0f,
float offsetX_ = 0.0f,
- float offsetY_ = 0.0f)
+ float offsetY_ = 0.0f,
+ float fanScale_ = 0.0f)
: color (color_)
, depth (depth_)
, reversed (reversed_)
, scaleY (scaleY_)
, offsetX (offsetX_)
, offsetY (offsetY_)
+ , fanScale (fanScale_)
{}
};
// Force inclusion of passthrough geometry shader or not.
bool forceGeometryShader;
+ // Force single vertex in the VBO.
+ bool singleVertex;
+ deUint32 singleVertexDrawCount;
+
// Offset and extra room after the vertex buffer data.
vk::VkDeviceSize vertexDataOffset;
vk::VkDeviceSize vertexDataExtraBytes;
, minDepthBounds (0.0f)
, maxDepthBounds (1.0f)
, forceGeometryShader (false)
+ , singleVertex (false)
+ , singleVertexDrawCount (0)
, vertexDataOffset (0ull)
, vertexDataExtraBytes (0ull)
, vertexGenerator (makeVertexGeneratorConfig(staticVertexGenerator, dynamicVertexGenerator))
float scaleY;
float offsetX;
float offsetY;
+ float fanScale;
};
void copy(vk::VkStencilOpState& dst, const StencilOpParams& src)
<< " float scaleY;\n"
<< " float offsetX;\n"
<< " float offsetY;\n"
+ << " float fanScale;\n"
<< "} pushConstants;\n"
;
const auto pushConstants = pushSource.str();
<< "void main() {\n"
<< "${CALCULATIONS}"
<< " gl_Position = vec4(vertexCoords.x * pushConstants.scaleX + pushConstants.offsetX, vertexCoords.y * pushConstants.scaleY + pushConstants.offsetY, pushConstants.depthValue, 1.0);\n"
+ << " vec2 fanOffset;\n"
+ << " switch (gl_VertexIndex) {\n"
+ << " case 0: fanOffset = vec2(0.0, 0.0); break;\n"
+ << " case 1: fanOffset = vec2(1.0, 0.0); break;\n"
+ << " case 2: fanOffset = vec2(1.0, -1.0); break;\n"
+ << " case 3: fanOffset = vec2(0.0, -1.0); break;\n"
+ << " case 4: fanOffset = vec2(-1.0, -1.0); break;\n"
+ << " case 5: fanOffset = vec2(-1.0, 0.0); break;\n"
+ << " default: fanOffset = vec2(-1000.0); break;\n"
+ << " }\n"
+ << " gl_Position.xy += pushConstants.fanScale * fanOffset;\n"
<< "}\n"
;
}
}
+ if (m_testConfig.singleVertex)
+ vertices.resize(1);
+
// Reversed vertices, except for the first one (0, 5, 4, 3, 2, 1): clockwise mesh for triangles. Not to be used with lines.
std::vector<tcu::Vec2> rvertices;
if (topologyClass == TopologyClass::TRIANGLE)
m_testConfig.meshParams[meshIdx].scaleY, // float scaleY;
m_testConfig.meshParams[meshIdx].offsetX, // float offsetX;
m_testConfig.meshParams[meshIdx].offsetY, // float offsetY;
+ m_testConfig.meshParams[meshIdx].fanScale, // float fanScale;
};
vkd.cmdPushConstants(cmdBuffer, pipelineLayout.get(), pushConstantStageFlags, 0u, static_cast<deUint32>(sizeof(pushConstants)), &pushConstants);
vkd.cmdDrawIndexed(cmdBuffer, numIndices, 1u, 0u, 0u, 0u);
}
else
- vkd.cmdDraw(cmdBuffer, static_cast<deUint32>(vertices.size()), 1u, 0u, 0u);
+ {
+ deUint32 vertex_count = static_cast<deUint32>(vertices.size());
+ if (m_testConfig.singleVertex)
+ vertex_count = m_testConfig.singleVertexDrawCount;
+ vkd.cmdDraw(cmdBuffer, vertex_count, 1u, 0u, 0u);
+ }
}
}
orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, prefix + "_with_offset_and_padding", "Dynamically set stride using a nonzero vertex data offset and extra bytes", config));
}
}
+
+ // Dynamic stride of 0
+ {
+ TestConfig config(kOrdering, getVertexWithExtraAttributesGenerator());
+ config.strideConfig.staticValue = config.getActiveVertexGenerator()->getVertexDataStrides();
+ config.strideConfig.dynamicValue = { 0 };
+ config.vertexDataOffset = 4;
+ config.singleVertex = true;
+ config.singleVertexDrawCount = 6;
+
+ // Make the mesh cover the top half only. If the implementation reads data outside the vertex data it should read the
+ // offscreen vertex and draw something in the bottom half.
+ config.referenceColor = HorizontalSplitGenerator(kDefaultTriangleColor, kDefaultClearColor);
+ config.meshParams[0].scaleY = 0.5f;
+ config.meshParams[0].offsetY = -0.5f;
+
+ // Use fan scale to synthesize a fan from a vertex attribute which remains constant over the draw call.
+ config.meshParams[0].fanScale = 1.0f;
+
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "zero_stride_with_offset", "Dynamically set zero stride using a nonzero vertex data offset", config));
+ }
}
// Depth test enable.
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.zero_stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_write_enable