From 165a940fc26fe87853be74bb0d6fb582f0257ee2 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 19 Aug 2020 18:41:06 -0400 Subject: [PATCH] zink: add a draw_id param to vs push constants gallium always gives us multidraws as individual draws, so we need to feed this through to the shader Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_draw.c | 7 +++++++ src/gallium/drivers/zink/zink_program.c | 2 +- src/gallium/drivers/zink/zink_program.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 26c4e93..80034b5 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -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, diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 54eb4fa..ad04147 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -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; diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index 66479a1..6ae250b 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -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]; }; -- 2.7.4