zink: add a draw_id param to vs push constants
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 19 Aug 2020 22:41:06 +0000 (18:41 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 16 Feb 2021 00:52:32 +0000 (00:52 +0000)
gallium always gives us multidraws as individual draws, so we need to feed
this through to the shader

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8971>

src/gallium/drivers/zink/zink_draw.c
src/gallium/drivers/zink/zink_program.c
src/gallium/drivers/zink/zink_program.h

index 26c4e93..80034b5 100644 (file)
@@ -713,6 +713,13 @@ zink_draw_vbo(struct pipe_context *pctx,
                          offsetof(struct zink_push_constant, draw_mode_is_indexed), sizeof(unsigned),
                          &draw_mode_is_indexed);
    }
+   if (BITSET_TEST(ctx->gfx_stages[PIPE_SHADER_VERTEX]->nir->info.system_values_read, SYSTEM_VALUE_DRAW_ID) &&
+       dinfo->drawid != 0) {
+      unsigned draw_id = dinfo->drawid;
+      vkCmdPushConstants(batch->cmdbuf, gfx_program->layout, VK_SHADER_STAGE_VERTEX_BIT,
+                         offsetof(struct zink_push_constant, draw_id), sizeof(unsigned),
+                         &draw_id);
+   }
    if (gfx_program->shaders[PIPE_SHADER_TESS_CTRL] && gfx_program->shaders[PIPE_SHADER_TESS_CTRL]->is_generated)
       vkCmdPushConstants(batch->cmdbuf, gfx_program->layout, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
                          offsetof(struct zink_push_constant, default_inner_level), sizeof(float) * 6,
index 54eb4fa..ad04147 100644 (file)
@@ -166,7 +166,7 @@ create_gfx_pipeline_layout(VkDevice dev, VkDescriptorSetLayout dsl)
    VkPushConstantRange pcr[2] = {};
    pcr[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
    pcr[0].offset = offsetof(struct zink_push_constant, draw_mode_is_indexed);
-   pcr[0].size = sizeof(unsigned);
+   pcr[0].size = 2 * sizeof(unsigned);
    pcr[1].stageFlags = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
    pcr[1].offset = offsetof(struct zink_push_constant, default_inner_level);
    pcr[1].size = sizeof(float) * 6;
index 66479a1..6ae250b 100644 (file)
@@ -42,6 +42,7 @@ struct set;
 
 struct zink_push_constant {
    unsigned draw_mode_is_indexed;
+   unsigned draw_id;
    float default_inner_level[2];
    float default_outer_level[4];
 };