From c84dbd189bcb1128dffba9185277d465a3d27822 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 27 Oct 2022 16:07:43 +0200 Subject: [PATCH] ac/nir/ngg: fix emitting streamout output by using packed location In RadeonSI, they are packed but not in RADV, so don't rely on driver locations. Signed-off-by: Samuel Pitoiset Reviewed-by: Qiang Yu Part-of: --- src/gallium/drivers/zink/zink_context.c | 2 +- src/gallium/drivers/zink/zink_draw.cpp | 6 +++--- src/gallium/drivers/zink/zink_program.c | 19 ++++++------------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 8f0e5bd9e62..e7bb39972e6 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2445,7 +2445,7 @@ update_layered_rendering_state(struct zink_context *ctx) VKCTX(CmdPushConstants)( ctx->batch.state->cmdbuf, zink_screen(ctx->base.screen)->gfx_push_constant_layout, - VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, + VK_SHADER_STAGE_ALL_GRAPHICS, offsetof(struct zink_gfx_push_constant, framebuffer_is_layered), sizeof(unsigned), &framebffer_is_layered); } diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 02a39aab2d5..6d155d34e95 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -181,7 +181,7 @@ zink_bind_vertex_state(struct zink_batch *batch, struct zink_context *ctx, ALWAYS_INLINE static void update_drawid(struct zink_context *ctx, unsigned draw_id) { - VKCTX(CmdPushConstants)(ctx->batch.state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_VERTEX_BIT, + VKCTX(CmdPushConstants)(ctx->batch.state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_ALL_GRAPHICS, offsetof(struct zink_gfx_push_constant, draw_id), sizeof(unsigned), &draw_id); } @@ -766,12 +766,12 @@ zink_draw(struct pipe_context *pctx, if (reads_basevertex) { unsigned draw_mode_is_indexed = index_size > 0; - VKCTX(CmdPushConstants)(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_VERTEX_BIT, + VKCTX(CmdPushConstants)(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_ALL_GRAPHICS, offsetof(struct zink_gfx_push_constant, draw_mode_is_indexed), sizeof(unsigned), &draw_mode_is_indexed); } if (ctx->curr_program->shaders[MESA_SHADER_TESS_CTRL] && ctx->curr_program->shaders[MESA_SHADER_TESS_CTRL]->is_generated) { - VKCTX(CmdPushConstants)(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, + VKCTX(CmdPushConstants)(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_ALL_GRAPHICS, offsetof(struct zink_gfx_push_constant, default_inner_level), sizeof(float) * 6, &ctx->tess_levels[0]); } diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 8673f53a559..9a3bb8b85f5 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -792,21 +792,14 @@ zink_pipeline_layout_create(struct zink_screen *screen, VkDescriptorSetLayout *d plci.pSetLayouts = dsl; plci.setLayoutCount = num_dsl; - VkPushConstantRange pcr[3] = {0}; + VkPushConstantRange pcr; if (!is_compute) { - pcr[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - pcr[0].offset = offsetof(struct zink_gfx_push_constant, draw_mode_is_indexed); - pcr[0].size = 2 * sizeof(unsigned); - pcr[1].stageFlags = - VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; - pcr[1].offset = offsetof(struct zink_gfx_push_constant, framebuffer_is_layered); - pcr[1].size = 1 * sizeof(unsigned); - pcr[2].stageFlags = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; - pcr[2].offset = offsetof(struct zink_gfx_push_constant, default_inner_level); - pcr[2].size = sizeof(float) * 6; - plci.pushConstantRangeCount = ARRAY_SIZE(pcr); + pcr.stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS; + pcr.offset = 0; + pcr.size = sizeof(struct zink_gfx_push_constant); + plci.pushConstantRangeCount = 1; + plci.pPushConstantRanges = &pcr; } - plci.pPushConstantRanges = pcr; VkPipelineLayout layout; VkResult result = VKSCR(CreatePipelineLayout)(screen->dev, &plci, NULL, &layout);