vk: Always use a placeholder vertex shader in meta
The clear pipeline didn't have a vertex shader and relied on the clear shader being hardcoded by the compiler to accept one attribute. This necessitated a few special cases in the 3DSTATE_VS setup. Instead, always provide a vertex shader, even if we disable VS dispatch. Signed-off-by: Kristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
This commit is contained in:
@@ -34,8 +34,21 @@ static void
|
||||
anv_device_init_meta_clear_state(struct anv_device *device)
|
||||
{
|
||||
/* We don't use a vertex shader for clearing, but instead build and pass
|
||||
* the VUEs directly to the rasterization backend.
|
||||
* the VUEs directly to the rasterization backend. However, we do need
|
||||
* to provide GLSL source for the vertex shader so that the compiler
|
||||
* does not dead-code our inputs.
|
||||
*/
|
||||
VkShaderModule vsm = GLSL_VK_SHADER_MODULE(device, VERTEX,
|
||||
in vec2 a_pos;
|
||||
in vec4 a_color;
|
||||
flat out vec4 v_color;
|
||||
void main()
|
||||
{
|
||||
v_color = a_color;
|
||||
gl_Position = vec4(a_pos, 0, 1);
|
||||
}
|
||||
);
|
||||
|
||||
VkShaderModule fsm = GLSL_VK_SHADER_MODULE(device, FRAGMENT,
|
||||
out vec4 f_color;
|
||||
flat in vec4 v_color;
|
||||
@@ -45,6 +58,14 @@ anv_device_init_meta_clear_state(struct anv_device *device)
|
||||
}
|
||||
);
|
||||
|
||||
VkShader vs;
|
||||
anv_CreateShader(anv_device_to_handle(device),
|
||||
&(VkShaderCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
|
||||
.module = vsm,
|
||||
.pName = "main",
|
||||
}, &vs);
|
||||
|
||||
VkShader fs;
|
||||
anv_CreateShader(anv_device_to_handle(device),
|
||||
&(VkShaderCreateInfo) {
|
||||
@@ -103,12 +124,20 @@ anv_device_init_meta_clear_state(struct anv_device *device)
|
||||
anv_graphics_pipeline_create(anv_device_to_handle(device),
|
||||
&(VkGraphicsPipelineCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
|
||||
.stageCount = 1,
|
||||
.pStages = &(VkPipelineShaderStageCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
|
||||
.stage = VK_SHADER_STAGE_FRAGMENT,
|
||||
.shader = fs,
|
||||
.pSpecializationInfo = NULL,
|
||||
|
||||
.stageCount = 2,
|
||||
.pStages = (VkPipelineShaderStageCreateInfo[]) {
|
||||
{
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
|
||||
.stage = VK_SHADER_STAGE_VERTEX,
|
||||
.shader = vs,
|
||||
.pSpecializationInfo = NULL
|
||||
}, {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
|
||||
.stage = VK_SHADER_STAGE_FRAGMENT,
|
||||
.shader = fs,
|
||||
.pSpecializationInfo = NULL,
|
||||
}
|
||||
},
|
||||
.pVertexInputState = &vi_create_info,
|
||||
.pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
|
||||
@@ -153,6 +182,7 @@ anv_device_init_meta_clear_state(struct anv_device *device)
|
||||
&(struct anv_graphics_pipeline_create_info) {
|
||||
.use_repclear = true,
|
||||
.disable_viewport = true,
|
||||
.disable_vs = true,
|
||||
.use_rectlist = true
|
||||
},
|
||||
&device->meta_state.clear.pipeline);
|
||||
|
@@ -527,12 +527,10 @@ gen8_graphics_pipeline_create(
|
||||
if (pipeline->vs_simd8 == NO_KERNEL || (extra && extra->disable_vs))
|
||||
anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_VS,
|
||||
.FunctionEnable = false,
|
||||
.VertexURBEntryOutputReadOffset = 1,
|
||||
/* Even if VS is disabled, SBE still gets the amount of
|
||||
* vertex data to read from this field. We use attribute
|
||||
* count - 1, as we don't count the VUE header here. */
|
||||
.VertexURBEntryOutputLength =
|
||||
DIV_ROUND_UP(pCreateInfo->pVertexInputState->attributeCount - 1, 2));
|
||||
* vertex data to read from this field. */
|
||||
.VertexURBEntryOutputReadOffset = offset,
|
||||
.VertexURBEntryOutputLength = length);
|
||||
else
|
||||
anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_VS,
|
||||
.KernelStartPointer = pipeline->vs_simd8,
|
||||
|
Reference in New Issue
Block a user