Mesa (master): spirv: Implement SPV_EXT_fragment_shader_interlock

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 4 17:48:36 UTC 2019


Module: Mesa
Branch: master
Commit: 517680547163e423732ce0d8be69ac7b2000c484
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=517680547163e423732ce0d8be69ac7b2000c484

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Fri May 17 11:32:10 2019 -0500

spirv: Implement SPV_EXT_fragment_shader_interlock

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>

---

 src/compiler/shader_info.h        |  2 ++
 src/compiler/spirv/spirv_to_nir.c | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
index 166ff8dec4e..32d87b234ec 100644
--- a/src/compiler/shader_info.h
+++ b/src/compiler/shader_info.h
@@ -42,6 +42,8 @@ struct spirv_supported_capabilities {
    bool device_group;
    bool draw_parameters;
    bool float64;
+   bool fragment_shader_sample_interlock;
+   bool fragment_shader_pixel_interlock;
    bool geometry_streams;
    bool gcn_shader;
    bool image_ms_array;
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 613a4e876a8..fdcc9fdb96b 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -3744,6 +3744,14 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
          spv_check_supported(float16, cap);
          break;
 
+      case SpvCapabilityFragmentShaderSampleInterlockEXT:
+         spv_check_supported(fragment_shader_sample_interlock, cap);
+         break;
+
+      case SpvCapabilityFragmentShaderPixelInterlockEXT:
+         spv_check_supported(fragment_shader_pixel_interlock, cap);
+         break;
+
       default:
          vtn_fail("Unhandled capability: %s (%u)",
                   spirv_capability_to_string(cap), cap);
@@ -4000,6 +4008,26 @@ vtn_handle_execution_mode(struct vtn_builder *b, struct vtn_value *entry_point,
       b->shader->info.cs.derivative_group = DERIVATIVE_GROUP_LINEAR;
       break;
 
+   case SpvExecutionModePixelInterlockOrderedEXT:
+      vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
+      b->shader->info.fs.pixel_interlock_ordered = true;
+      break;
+
+   case SpvExecutionModePixelInterlockUnorderedEXT:
+      vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
+      b->shader->info.fs.pixel_interlock_unordered = true;
+      break;
+
+   case SpvExecutionModeSampleInterlockOrderedEXT:
+      vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
+      b->shader->info.fs.sample_interlock_ordered = true;
+      break;
+
+   case SpvExecutionModeSampleInterlockUnorderedEXT:
+      vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
+      b->shader->info.fs.sample_interlock_unordered = true;
+      break;
+
    default:
       vtn_fail("Unhandled execution mode: %s (%u)",
                spirv_executionmode_to_string(mode->exec_mode),
@@ -4505,6 +4533,14 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
       vtn_handle_ptr(b, opcode, w, count);
       break;
 
+   case SpvOpBeginInvocationInterlockEXT:
+      vtn_emit_barrier(b, nir_intrinsic_begin_invocation_interlock);
+      break;
+
+   case SpvOpEndInvocationInterlockEXT:
+      vtn_emit_barrier(b, nir_intrinsic_end_invocation_interlock);
+      break;
+
    default:
       vtn_fail_with_opcode("Unhandled opcode", opcode);
    }




More information about the mesa-commit mailing list