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

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Apr  2 14:36:02 2021 -0400

zink: support ARB_fragment_shader_interlock

just smashing in some caps and intrinsics

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10013>

---

 .../drivers/zink/nir_to_spirv/nir_to_spirv.c        | 21 +++++++++++++++++++++
 .../drivers/zink/nir_to_spirv/spirv_builder.c       |  6 ++++++
 .../drivers/zink/nir_to_spirv/spirv_builder.h       |  3 +++
 3 files changed, 30 insertions(+)

diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c 
b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 79ab5d50eb5..5c32b16f227 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -2600,6 +2600,11 @@ emit_intrinsic(struct ntv_context *ctx, 
nir_intrinsic_instr *intr)
       emit_shared_atomic_intrinsic(ctx, intr);
       break;
 
+   case nir_intrinsic_begin_invocation_interlock:
+   case nir_intrinsic_end_invocation_interlock:
+      spirv_builder_emit_interlock(&ctx->builder, intr->intrinsic == 
nir_intrinsic_end_invocation_interlock);
+      break;
+
    case nir_intrinsic_get_ssbo_size: {
       SpvId uint_type = get_uvec_type(ctx, 32, 1);
       nir_variable *var = 
ctx->ssbo_vars[nir_src_as_const_value(intr->src[0])->u32];
@@ -3615,6 +3620,22 @@ nir_to_spirv(struct nir_shader *s, const struct 
zink_so_info *so_info)
          spirv_builder_emit_exec_mode(&ctx.builder, entry_point,
                                       SpvExecutionModePostDepthCoverage);
       }
+
+      if (s->info.fs.pixel_interlock_ordered || 
s->info.fs.pixel_interlock_unordered ||
+          s->info.fs.sample_interlock_ordered || 
s->info.fs.sample_interlock_unordered)
+         spirv_builder_emit_extension(&ctx.builder, 
"SPV_EXT_fragment_shader_interlock");
+      if (s->info.fs.pixel_interlock_ordered || 
s->info.fs.pixel_interlock_unordered)
+         spirv_builder_emit_cap(&ctx.builder, 
SpvCapabilityFragmentShaderPixelInterlockEXT);
+      if (s->info.fs.sample_interlock_ordered || 
s->info.fs.sample_interlock_unordered)
+         spirv_builder_emit_cap(&ctx.builder, 
SpvCapabilityFragmentShaderSampleInterlockEXT);
+      if (s->info.fs.pixel_interlock_ordered)
+         spirv_builder_emit_exec_mode(&ctx.builder, entry_point, 
SpvExecutionModePixelInterlockOrderedEXT);
+      if (s->info.fs.pixel_interlock_unordered)
+         spirv_builder_emit_exec_mode(&ctx.builder, entry_point, 
SpvExecutionModePixelInterlockUnorderedEXT);
+      if (s->info.fs.sample_interlock_ordered)
+         spirv_builder_emit_exec_mode(&ctx.builder, entry_point, 
SpvExecutionModeSampleInterlockOrderedEXT);
+      if (s->info.fs.sample_interlock_unordered)
+         spirv_builder_emit_exec_mode(&ctx.builder, entry_point, 
SpvExecutionModeSampleInterlockUnorderedEXT);
       break;
    case MESA_SHADER_TESS_CTRL:
       spirv_builder_emit_exec_mode_literal(&ctx.builder, entry_point,
diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c 
b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
index 8c73c8f56e8..dc9451bab2a 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -460,6 +460,12 @@ spirv_builder_emit_access_chain(struct spirv_builder *b, 
SpvId result_type,
    return result;
 }
 
+void
+spirv_builder_emit_interlock(struct spirv_builder *b, bool end)
+{
+   spirv_buffer_prepare(&b->instructions, b->mem_ctx, 1);
+   spirv_buffer_emit_word(&b->instructions, (end ? 
SpvOpEndInvocationInterlockEXT : SpvOpBeginInvocationInterlockEXT) | (1 << 16));
+}
 
 SpvId
 spirv_builder_emit_unop(struct spirv_builder *b, SpvOp op, SpvId result_type,
diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h 
b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
index c60786f01f9..60bad0388d7 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
@@ -187,6 +187,9 @@ spirv_builder_emit_access_chain(struct spirv_builder *b, 
SpvId result_type,
                                 SpvId base, const SpvId indexes[],
                                 size_t num_indexes);
 
+void
+spirv_builder_emit_interlock(struct spirv_builder *b, bool end);
+
 SpvId
 spirv_builder_emit_unop(struct spirv_builder *b, SpvOp op, SpvId result_type,
                         SpvId operand);

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to