r600/sfn: Only use sample mask if the according shader key is set
authorGert Wollny <gert.wollny@collabora.com>
Sun, 5 Jul 2020 14:49:14 +0000 (16:49 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 20 Jul 2020 09:32:51 +0000 (09:32 +0000)
This fixes all the piglits from arb_sample_shading "samplemask * *"
with the nir backend.

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5963>

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

index 978d96277d13bc20cb120bb91ddd2f75151000b8..b59d32f6dfa1c8a0b134800fd397ce95bc2289ca 100644 (file)
@@ -47,7 +47,8 @@ FragmentShaderFromNir::FragmentShaderFromNir(const nir_shader& nir,
    m_need_back_color(false),
    m_front_face_loaded(false),
    m_depth_exports(0),
-   m_enable_centroid_interpolators(false)
+   m_enable_centroid_interpolators(false),
+   m_apply_sample_mask(key.ps.apply_sample_id_mask)
 {
    for (auto&  i: m_interpolator) {
       i.enabled = false;
@@ -145,6 +146,7 @@ bool FragmentShaderFromNir::do_allocate_reserved_registers()
    assert(!m_reserved_registers);
 
    int face_reg_index = -1;
+   int sample_id_index = -1;
    // enabled interpolators based on inputs
    for (auto& i: m_shaderio.inputs()) {
       int ij = i->ij_index();
@@ -220,16 +222,17 @@ bool FragmentShaderFromNir::do_allocate_reserved_registers()
       m_shaderio.add_input(new ShaderInputSystemValue(TGSI_SEMANTIC_SAMPLEMASK, face_reg_index));
    }
 
-   if (m_sv_values.test(es_sample_id)) {
-      if (face_reg_index < 0)
-         face_reg_index = m_reserved_registers++;
+   if (m_sv_values.test(es_sample_id) ||
+       m_sv_values.test(es_sample_mask_in)) {
+      if (sample_id_index < 0)
+         sample_id_index = m_reserved_registers++;
 
-      auto smi = new GPRValue(face_reg_index, 3);
+      auto smi = new GPRValue(sample_id_index, 3);
       smi->set_as_input();
       m_sample_id_reg.reset(smi);
       sfn_log << SfnLog::io << "Set sample id register to " <<  *m_sample_id_reg << "\n";
       sh_info().nsys_inputs++;
-      m_shaderio.add_input(new ShaderInputSystemValue(TGSI_SEMANTIC_SAMPLEID, face_reg_index));
+      m_shaderio.add_input(new ShaderInputSystemValue(TGSI_SEMANTIC_SAMPLEID, sample_id_index));
    }
 
    // The back color handling is not emmited in the code, so we have
@@ -336,11 +339,25 @@ bool FragmentShaderFromNir::do_process_outputs(nir_variable *output)
    return false;
 }
 
+bool FragmentShaderFromNir::emit_load_sample_mask_in(nir_intrinsic_instr* instr)
+{
+   auto dest = from_nir(instr->dest, 0);
+   assert(m_sample_id_reg);
+   assert(m_sample_mask_reg);
+
+   emit_instruction(new AluInstruction(op2_lshl_int, dest, Value::one_i, m_sample_id_reg, EmitInstruction::last_write));
+   emit_instruction(new AluInstruction(op2_and_int, dest, dest, m_sample_mask_reg, EmitInstruction::last_write));
+   return true;
+}
+
 bool FragmentShaderFromNir::emit_intrinsic_instruction_override(nir_intrinsic_instr* instr)
 {
    switch (instr->intrinsic) {
    case nir_intrinsic_load_sample_mask_in:
-      return load_preloaded_value(instr->dest, 0, m_sample_mask_reg);
+      if (m_apply_sample_mask) {
+         return emit_load_sample_mask_in(instr);
+      } else
+         return load_preloaded_value(instr->dest, 0, m_sample_mask_reg);
    case nir_intrinsic_load_sample_id:
       return load_preloaded_value(instr->dest, 0, m_sample_id_reg);
    case nir_intrinsic_load_front_face:
index 045c054d7e6c937f64994d1c6f66b693315c480e..31dfc3b8925ef680e76d5fa47b36bf35a7197f8e 100644 (file)
@@ -96,6 +96,7 @@ private:
 
    std::map<unsigned, PValue> m_input_cache;
    bool m_enable_centroid_interpolators;
+   unsigned m_apply_sample_mask;
 };
        
 }