summaryrefslogtreecommitdiffstats
path: root/src/vulkan
diff options
context:
space:
mode:
authorKristian Høgsberg Kristensen <[email protected]>2015-08-20 22:32:28 -0700
committerKristian Høgsberg Kristensen <[email protected]>2015-08-24 13:45:41 -0700
commit615da3795a76e7f18e518d2c896613c3f9c04d27 (patch)
tree0f1fd474eac6cc06abb911423aeaa864b6bff2d2 /src/vulkan
parentac738ada7a319c202b59ad6beb878e04d2e7a2ac (diff)
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 <[email protected]>
Diffstat (limited to 'src/vulkan')
-rw-r--r--src/vulkan/anv_meta.c44
-rw-r--r--src/vulkan/gen8_pipeline.c8
2 files changed, 40 insertions, 12 deletions
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);
diff --git a/src/vulkan/gen8_pipeline.c b/src/vulkan/gen8_pipeline.c
index 05091831b98..220317c2d48 100644
--- a/src/vulkan/gen8_pipeline.c
+++ b/src/vulkan/gen8_pipeline.c
@@ -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,