r600/sfn: lower intrinsic_load_tess_coord to driver version
Fixes KHR-GL45.tessellation_shader.tessellation_shader_tessellation.TCS_TES KHR-GL45.tessellation_shader.tessellation_shader_tessellation.TES Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9373>
This commit is contained in:
@@ -962,6 +962,10 @@ int r600_shader_from_nir(struct r600_context *rctx,
|
||||
NIR_PASS_V(sh, r600_append_tcs_TF_emission,
|
||||
(pipe_prim_type)key->tcs.prim_mode);
|
||||
|
||||
if (sh->info.stage == MESA_SHADER_TESS_EVAL)
|
||||
NIR_PASS_V(sh, r600_lower_tess_coord,
|
||||
static_cast<pipe_prim_type>(sh->info.tess.primitive_mode));
|
||||
|
||||
NIR_PASS_V(sh, nir_lower_ubo_vec4);
|
||||
if (lower_64bit)
|
||||
NIR_PASS_V(sh, r600::r600_nir_64_to_vec2);
|
||||
|
@@ -136,6 +136,7 @@ r600_imm_ivec3(nir_builder *build, int x, int y, int z)
|
||||
|
||||
bool r600_lower_tess_io(nir_shader *shader, enum pipe_prim_type prim_type);
|
||||
bool r600_append_tcs_TF_emission(nir_shader *shader, enum pipe_prim_type prim_type);
|
||||
bool r600_lower_tess_coord(nir_shader *sh, enum pipe_prim_type prim_type);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@@ -462,3 +462,36 @@ bool r600_append_tcs_TF_emission(nir_shader *shader, enum pipe_prim_type prim_ty
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
r600_lower_tess_coord_filter(const nir_instr *instr, UNUSED const void *_options)
|
||||
{
|
||||
if (instr->type != nir_instr_type_intrinsic)
|
||||
return false;
|
||||
auto intr = nir_instr_as_intrinsic(instr);
|
||||
return intr->intrinsic == nir_intrinsic_load_tess_coord;
|
||||
}
|
||||
|
||||
static nir_ssa_def *
|
||||
r600_lower_tess_coord_impl(nir_builder *b, nir_instr *instr, void *_options)
|
||||
{
|
||||
pipe_prim_type prim_type = *(pipe_prim_type *)_options;
|
||||
|
||||
auto tc_xy = nir_load_tess_coord_r600(b);
|
||||
|
||||
auto tc_x = nir_channel(b, tc_xy, 0);
|
||||
auto tc_y = nir_channel(b, tc_xy, 1);
|
||||
|
||||
if (prim_type == PIPE_PRIM_TRIANGLES)
|
||||
return nir_vec3(b, tc_x, tc_y, nir_fsub(b, nir_imm_float(b, 1.0),
|
||||
nir_fadd(b, tc_x, tc_y)));
|
||||
else
|
||||
return nir_vec3(b, tc_x, tc_y, nir_imm_float(b, 0.0));
|
||||
}
|
||||
|
||||
|
||||
bool r600_lower_tess_coord(nir_shader *sh, enum pipe_prim_type prim_type)
|
||||
{
|
||||
return nir_shader_lower_instructions(sh, r600_lower_tess_coord_filter,
|
||||
r600_lower_tess_coord_impl, &prim_type);
|
||||
}
|
||||
|
@@ -51,7 +51,7 @@ bool TEvalShaderFromNir::scan_sysvalue_access(nir_instr *instr)
|
||||
auto ir = nir_instr_as_intrinsic(instr);
|
||||
|
||||
switch (ir->intrinsic) {
|
||||
case nir_intrinsic_load_tess_coord:
|
||||
case nir_intrinsic_load_tess_coord_r600:
|
||||
m_sv_values.set(es_tess_coord);
|
||||
break;
|
||||
case nir_intrinsic_load_primitive_id:
|
||||
@@ -106,24 +106,12 @@ bool TEvalShaderFromNir::do_allocate_reserved_registers()
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TEvalShaderFromNir::load_tess_z_coord(nir_intrinsic_instr* instr)
|
||||
{
|
||||
if (m_tess_coord[2])
|
||||
return load_preloaded_value(instr->dest, 2, m_tess_coord[2]);
|
||||
|
||||
m_tess_coord[2] = from_nir(instr->dest, 2);
|
||||
emit_instruction(new AluInstruction(op2_add, m_tess_coord[2], Value::one_f, m_tess_coord[0], {alu_last_instr, alu_write, alu_src1_neg}));
|
||||
emit_instruction(new AluInstruction(op2_add, m_tess_coord[2], m_tess_coord[2], m_tess_coord[1], {alu_last_instr, alu_write, alu_src1_neg}));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TEvalShaderFromNir::emit_intrinsic_instruction_override(nir_intrinsic_instr* instr)
|
||||
{
|
||||
switch (instr->intrinsic) {
|
||||
case nir_intrinsic_load_tess_coord:
|
||||
case nir_intrinsic_load_tess_coord_r600:
|
||||
return load_preloaded_value(instr->dest, 0, m_tess_coord[0]) &&
|
||||
load_preloaded_value(instr->dest, 1, m_tess_coord[1]) &&
|
||||
load_tess_z_coord(instr);
|
||||
load_preloaded_value(instr->dest, 1, m_tess_coord[1]);
|
||||
case nir_intrinsic_load_primitive_id:
|
||||
return load_preloaded_value(instr->dest, 0, m_primitive_id);
|
||||
case nir_intrinsic_load_tcs_rel_patch_id_r600:
|
||||
|
Reference in New Issue
Block a user