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 <gert.wollny@collabora.com>
This commit is contained in:
Gert Wollny 2026-05-04 23:26:47 +02:00
parent 642bed9eba
commit 04f15cc710
3 changed files with 46 additions and 1 deletions

View file

@ -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<mesa_prim>(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(_,

View file

@ -8,6 +8,8 @@
#include "sfn_instr_export.h"
#include "sfn_shader_vs.h"
#include "sfn_nir.h"
#include "nir.h"
#include <sstream>
@ -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);
}

View file

@ -83,4 +83,6 @@ private:
} // namespace r600
int r600_lower_tess_level_default_to_ubo(nir_shader *sh);
#endif // TCS_H