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
