r600/sfn: Handle loading sample_pos
authorGert Wollny <gert.wollny@collabora.com>
Wed, 6 May 2020 22:03:29 +0000 (00:03 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 19 May 2020 07:52:13 +0000 (07:52 +0000)
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>

src/gallium/drivers/r600/sfn/sfn_shader_base.h
src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp
src/gallium/drivers/r600/sfn/sfn_shader_fragment.h

index d284efc3f074f0ca7bbfa20f11994902d82596a6..27afe4023d4fe92a3bdf5e3c9c38717856a983b2 100644 (file)
@@ -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,
index c4084553f16e6b47a348aabfbeb12073b77d0107..a443ea3e86ab29e4e35e737e28139dce29cf2c60 100644 (file)
@@ -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();
index 57d6cf7ec9acc8bbd50b99370f0dc0804418adb1..045c054d7e6c937f64994d1c6f66b693315c480e 100644 (file)
@@ -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);