Mesa (master): zink: add push constant value to indicate whether the current draw is indexed

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Feb 16 01:00:33 UTC 2021


Module: Mesa
Branch: master
Commit: bf4fac51ee63ca3cb75a01fd5e18eddccf2d3fac
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=bf4fac51ee63ca3cb75a01fd5e18eddccf2d3fac

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Wed Aug 19 17:58:22 2020 -0400

zink: add push constant value to indicate whether the current draw is indexed

due to semantic differences between gl and vk variables, this is going to be
necessary for gl_BaseVertex

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

---

 src/gallium/drivers/zink/zink_draw.c    |  8 +++++++-
 src/gallium/drivers/zink/zink_program.c | 15 +++++++++------
 src/gallium/drivers/zink/zink_program.h |  1 +
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index 96b45fbb0dd..26c4e93ae3e 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -707,9 +707,15 @@ zink_draw_vbo(struct pipe_context *pctx,
 
    zink_bind_vertex_buffers(batch, ctx);
 
+   if (BITSET_TEST(ctx->gfx_stages[PIPE_SHADER_VERTEX]->nir->info.system_values_read, SYSTEM_VALUE_BASE_VERTEX)) {
+      unsigned draw_mode_is_indexed = dinfo->index_size > 0;
+      vkCmdPushConstants(batch->cmdbuf, gfx_program->layout, VK_SHADER_STAGE_VERTEX_BIT,
+                         offsetof(struct zink_push_constant, draw_mode_is_indexed), sizeof(unsigned),
+                         &draw_mode_is_indexed);
+   }
    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,
-                         0, sizeof(float) * 6,
+                         offsetof(struct zink_push_constant, default_inner_level), sizeof(float) * 6,
                          &ctx->tess_levels[0]);
 
    zink_query_update_gs_states(ctx);
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index f149d2dec6e..54eb4fae7ec 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -163,12 +163,15 @@ create_gfx_pipeline_layout(VkDevice dev, VkDescriptorSetLayout dsl)
    plci.setLayoutCount = 1;
 
 
-   VkPushConstantRange pcr = {};
-   pcr.stageFlags = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
-   pcr.offset = 0;
-   pcr.size = sizeof(float) * 6;
-   plci.pushConstantRangeCount = 1;
-   plci.pPushConstantRanges = &pcr;
+   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[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;
+   plci.pushConstantRangeCount = 2;
+   plci.pPushConstantRanges = &pcr[0];
 
    VkPipelineLayout layout;
    if (vkCreatePipelineLayout(dev, &plci, NULL, &layout) != VK_SUCCESS) {
diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h
index 372ad7900d1..66479a120cb 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -41,6 +41,7 @@ struct hash_table;
 struct set;
 
 struct zink_push_constant {
+   unsigned draw_mode_is_indexed;
    float default_inner_level[2];
    float default_outer_level[4];
 };



More information about the mesa-commit mailing list