From 615da3795a76e7f18e518d2c896613c3f9c04d27 Mon Sep 17 00:00:00 2001 From: Kristian Høgsberg Kristensen Date: Thu, 20 Aug 2015 22:32:28 -0700 Subject: vk: Always use a placeholder vertex shader in meta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/vulkan/anv_meta.c | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) (limited to 'src/vulkan/anv_meta.c') diff --git a/src/vulkan/anv_meta.c b/src/vulkan/anv_meta.c index 8f681230292..858a3daf11c 100644 --- a/src/vulkan/anv_meta.c +++ b/src/vulkan/anv_meta.c @@ -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); -- cgit v1.2.3