diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 37f08b7a2af..bad212a712f 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -61,6 +61,7 @@ fields[member_idx].offset = offsetof(struct zink_gfx_push_constant, field); struct glsl_struct_field *fields = rzalloc_array(nir, struct glsl_struct_field, ZINK_GFX_PUSHCONST_MAX); PUSHCONST_MEMBER(ZINK_GFX_PUSHCONST_DRAW_MODE_IS_INDEXED, draw_mode_is_indexed); PUSHCONST_MEMBER(ZINK_GFX_PUSHCONST_DRAW_ID, draw_id); + PUSHCONST_MEMBER(ZINK_GFX_PUSHCONST_FRAMEBUFFER_IS_LAYERED, framebuffer_is_layered); PUSHCONST_MEMBER(ZINK_GFX_PUSHCONST_DEFAULT_INNER_LEVEL, default_inner_level); PUSHCONST_MEMBER(ZINK_GFX_PUSHCONST_DEFAULT_OUTER_LEVEL, default_outer_level); diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 7a42e675b3f..13ef948e6e9 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2436,6 +2436,18 @@ begin_rendering(struct zink_context *ctx) return clear_buffers; } +ALWAYS_INLINE static void +update_layered_rendering_state(struct zink_context *ctx) +{ + unsigned framebffer_is_layered = zink_framebuffer_get_num_layers(&ctx->fb_state) > 1; + 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, + offsetof(struct zink_gfx_push_constant, framebuffer_is_layered), sizeof(unsigned), + &framebffer_is_layered); +} + void zink_batch_rp(struct zink_context *ctx) { @@ -2775,6 +2787,7 @@ flush_batch(struct zink_context *ctx, bool sync) if (conditional_render_active) zink_start_conditional_render(ctx); reapply_color_write(ctx); + update_layered_rendering_state(ctx); } } @@ -3034,6 +3047,8 @@ zink_set_framebuffer_state(struct pipe_context *pctx, /* this is an ideal time to oom flush since it won't split a renderpass */ if (ctx->oom_flush) flush_batch(ctx, false); + else + update_layered_rendering_state(ctx); } static void diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index a54d1d29588..f5cabdd6b78 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -792,7 +792,7 @@ zink_pipeline_layout_create(struct zink_screen *screen, VkDescriptorSetLayout *d plci.pSetLayouts = dsl; plci.setLayoutCount = num_dsl; - VkPushConstantRange pcr[2] = {0}; + VkPushConstantRange pcr[3] = {0}; if (is_compute) { pcr[0].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; pcr[0].offset = 0; @@ -802,10 +802,14 @@ zink_pipeline_layout_create(struct zink_screen *screen, VkDescriptorSetLayout *d 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_TESSELLATION_CONTROL_BIT; - pcr[1].offset = offsetof(struct zink_gfx_push_constant, default_inner_level); - pcr[1].size = sizeof(float) * 6; - plci.pushConstantRangeCount = 2; + 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); } plci.pPushConstantRanges = pcr; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 3653f42204e..35508fb98f3 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -794,6 +794,7 @@ struct zink_compute_pipeline_state { struct zink_gfx_push_constant { unsigned draw_mode_is_indexed; unsigned draw_id; + unsigned framebuffer_is_layered; float default_inner_level[2]; float default_outer_level[4]; }; @@ -804,6 +805,7 @@ struct zink_gfx_push_constant { enum zink_gfx_push_constant_member { ZINK_GFX_PUSHCONST_DRAW_MODE_IS_INDEXED, ZINK_GFX_PUSHCONST_DRAW_ID, + ZINK_GFX_PUSHCONST_FRAMEBUFFER_IS_LAYERED, ZINK_GFX_PUSHCONST_DEFAULT_INNER_LEVEL, ZINK_GFX_PUSHCONST_DEFAULT_OUTER_LEVEL, ZINK_GFX_PUSHCONST_MAX