r600/sfn: Handle loading sample_pos

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5085>
This commit is contained in:
Gert Wollny
2020-05-07 00:03:29 +02:00
committed by Marge Bot
parent 70b84920be
commit 91a618eae9
3 changed files with 36 additions and 0 deletions
@@ -121,6 +121,7 @@ protected:
es_rel_patch_id,
es_sample_mask_in,
es_sample_id,
es_sample_pos,
es_tess_factor_base,
es_vertexid,
es_tess_coord,
@@ -120,6 +120,9 @@ bool FragmentShaderFromNir::scan_sysvalue_access(nir_instr *instr)
case nir_intrinsic_load_sample_mask_in:
m_sv_values.set(es_sample_mask_in);
break;
case nir_intrinsic_load_sample_pos:
m_sv_values.set(es_sample_pos);
/* fallthrough */
case nir_intrinsic_load_sample_id:
m_sv_values.set(es_sample_id);
break;
@@ -346,6 +349,9 @@ bool FragmentShaderFromNir::emit_intrinsic_instruction_override(nir_intrinsic_in
return emit_interp_deref_at_offset(instr);
case nir_intrinsic_interp_deref_at_centroid:
return emit_interp_deref_at_centroid(instr);
case nir_intrinsic_load_sample_pos:
return emit_load_sample_pos(instr);
default:
return false;
}
@@ -363,6 +369,34 @@ void FragmentShaderFromNir::load_front_face()
emit_instruction(ir);
}
bool FragmentShaderFromNir::emit_load_sample_pos(nir_intrinsic_instr* instr)
{
GPRVector dest = vec_from_nir(instr->dest, nir_dest_num_components(instr->dest));
auto fetch = new FetchInstruction(vc_fetch,
no_index_offset,
fmt_32_32_32_32_float,
vtx_nf_scaled,
vtx_es_none,
m_sample_id_reg,
dest,
0,
false,
0xf,
R600_BUFFER_INFO_CONST_BUFFER,
0,
bim_none,
false,
false,
0,
0,
0,
PValue(),
{0,1,2,3});
fetch->set_flag(vtx_srf_mode);
emit_instruction(fetch);
return true;
}
bool FragmentShaderFromNir::emit_interp_deref_at_sample(nir_intrinsic_instr* instr)
{
GPRVector slope = get_temp_vec4();
@@ -70,6 +70,7 @@ private:
bool emit_load_front_face(nir_intrinsic_instr* instr);
bool emit_load_sample_mask_in(nir_intrinsic_instr* instr);
bool emit_load_sample_pos(nir_intrinsic_instr* instr);
bool emit_load_sample_id(nir_intrinsic_instr* instr);
bool emit_interp_deref_at_sample(nir_intrinsic_instr* instr);
bool emit_interp_deref_at_offset(nir_intrinsic_instr* instr);