From 723a1fabacda4924ba2c197a68abc597efbe8fdc Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Mon, 2 Jun 2025 14:02:30 -0400 Subject: [PATCH] tu: Use safe-const GS variant for VPC binning state When binning with a GS, both VS and GS are active. This means that we could have to use the safe-const variant for the GS. However we only emitted VPC state for the binning case with the "normal" GS variant. Emit the VPC state with the safe-const variant too, and select between the state variants at link time. This fixes a few tests like dEQP-VK.spirv_assembly.instruction.graphics.8bit_storage.32struct_to_8struct.uniform_uint_geom with TU_DEBUG=gmem,forcebin. Cc: mesa-stable Part-of: --- src/freedreno/vulkan/tu_pipeline.cc | 2 ++ src/freedreno/vulkan/tu_shader.cc | 7 +++++++ src/freedreno/vulkan/tu_shader.h | 1 + 3 files changed, 10 insertions(+) diff --git a/src/freedreno/vulkan/tu_pipeline.cc b/src/freedreno/vulkan/tu_pipeline.cc index 08f7a58d889..f6a75023317 100644 --- a/src/freedreno/vulkan/tu_pipeline.cc +++ b/src/freedreno/vulkan/tu_pipeline.cc @@ -2289,6 +2289,8 @@ tu_emit_program_state(struct tu_cs *sub_cs, prog->ds_state = draw_states[MESA_SHADER_TESS_EVAL]; prog->gs_state = draw_states[MESA_SHADER_GEOMETRY]; prog->gs_binning_state = + (safe_variants & (1u << MESA_SHADER_GEOMETRY)) ? + shaders[MESA_SHADER_GEOMETRY]->safe_const_binning_state : shaders[MESA_SHADER_GEOMETRY]->binning_state; prog->fs_state = draw_states[MESA_SHADER_FRAGMENT]; diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index 0d521f6876e..69c79ccefb2 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -2373,6 +2373,13 @@ tu_upload_shader(struct tu_device *dev, tu_cs_begin_sub_stream(&shader->cs, vpc_size, &sub_cs); TU_CALLX(dev, tu6_emit_vpc)(&sub_cs, NULL, NULL, NULL, v, NULL); shader->binning_state = tu_cs_end_draw_state(&shader->cs, &sub_cs); + + if (safe_const) { + tu_cs_begin_sub_stream(&shader->cs, vpc_size, &sub_cs); + TU_CALLX(dev, tu6_emit_vpc)(&sub_cs, NULL, NULL, NULL, safe_const, NULL); + shader->safe_const_binning_state = + tu_cs_end_draw_state(&shader->cs, &sub_cs); + } } return VK_SUCCESS; diff --git a/src/freedreno/vulkan/tu_shader.h b/src/freedreno/vulkan/tu_shader.h index ab1bade16f4..983796f79d7 100644 --- a/src/freedreno/vulkan/tu_shader.h +++ b/src/freedreno/vulkan/tu_shader.h @@ -69,6 +69,7 @@ struct tu_shader struct tu_draw_state state; struct tu_draw_state safe_const_state; struct tu_draw_state binning_state; + struct tu_draw_state safe_const_binning_state; struct tu_const_state const_state; uint32_t view_mask;