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;