From 04f15cc71092f566cccc47ca29aead831bdfd634 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Mon, 4 May 2026 23:26:47 +0200 Subject: [PATCH] r600/sfn: Add lowering of tess inner and outer default intrinsics These are UBO loads and so we do the lowering in nir. Signed-off-by: Gert Wollny --- src/gallium/drivers/r600/sfn/sfn_nir.cpp | 6 ++- .../drivers/r600/sfn/sfn_shader_tess.cpp | 39 +++++++++++++++++++ .../drivers/r600/sfn/sfn_shader_tess.h | 2 + 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_nir.cpp b/src/gallium/drivers/r600/sfn/sfn_nir.cpp index 613204f4356..0a59584121d 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir.cpp @@ -22,6 +22,7 @@ #include "sfn_nir_lower_tex.h" #include "sfn_optimizer.h" #include "sfn_ra.h" +#include "sfn_shader_tess.h" #include "sfn_scheduler.h" #include "sfn_shader.h" #include "sfn_split_address_loads.h" @@ -869,8 +870,11 @@ r600_lower_and_optimize_nir(nir_shader *sh, NIR_PASS(_, sh, r600_lower_tess_io, static_cast(prim_type)); } - if (sh->info.stage == MESA_SHADER_TESS_CTRL) + if (sh->info.stage == MESA_SHADER_TESS_CTRL) { + NIR_PASS(_, sh, nir_lower_system_values); + NIR_PASS(_, sh, r600_lower_tess_level_default_to_ubo); NIR_PASS(_, sh, r600_append_tcs_TF_emission, (mesa_prim)key->tcs.prim_mode); + } if (sh->info.stage == MESA_SHADER_TESS_EVAL) { NIR_PASS(_, diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_tess.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_tess.cpp index 16c7d0ccb0c..28f4f4a7c96 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_tess.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader_tess.cpp @@ -8,6 +8,8 @@ #include "sfn_instr_export.h" #include "sfn_shader_vs.h" +#include "sfn_nir.h" +#include "nir.h" #include @@ -245,4 +247,41 @@ TESShader::do_print_properties(std::ostream& os) const (void)os; } +class LowerTessLevelDefault : public NirLowerInstruction { + bool filter(const nir_instr *instr) const override + { + if (instr->type != nir_instr_type_intrinsic) + return false; + + auto intr = nir_instr_as_intrinsic(instr); + return intr->intrinsic == nir_intrinsic_load_tess_level_inner_default || + intr->intrinsic == nir_intrinsic_load_tess_level_outer_default; + } + + nir_def *lower(nir_instr *instr) override + { + auto intr = nir_instr_as_intrinsic(instr); + + auto info_buffer = nir_imm_int(b, R600_BUFFER_INFO_CONST_BUFFER); + + switch (intr->intrinsic) { + case nir_intrinsic_load_tess_level_inner_default: + return nir_load_ubo(b, 2, 32, info_buffer, nir_imm_int(b, 16), + .range_base = 16, .range = 8); + case nir_intrinsic_load_tess_level_outer_default: + return nir_load_ubo(b, 4, 32, info_buffer, nir_imm_int(b, 0), + .range_base = 0, .range = 16); + default: + assert(0); + return nullptr; + } + } +}; + } // namespace r600 + +int r600_lower_tess_level_default_to_ubo(nir_shader *sh) +{ + return r600::LowerTessLevelDefault().run(sh); +} + diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_tess.h b/src/gallium/drivers/r600/sfn/sfn_shader_tess.h index d932bf46c8e..62410ba69b2 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_tess.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader_tess.h @@ -83,4 +83,6 @@ private: } // namespace r600 +int r600_lower_tess_level_default_to_ubo(nir_shader *sh); + #endif // TCS_H