From fb1793bf9c89a4b0c8b475f3fa529ed70a3e6866 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 17 Jul 2020 09:51:03 -0400 Subject: [PATCH] zink: add some spirv builder functions for barriers Reviewed-by: Erik Faye-Lund Part-of: --- .../drivers/zink/nir_to_spirv/spirv_builder.c | 19 +++++++++++++++++++ .../drivers/zink/nir_to_spirv/spirv_builder.h | 6 ++++++ 2 files changed, 25 insertions(+) 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 92430291ba7..df6d02168bd 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -1167,6 +1167,25 @@ spirv_builder_emit_var(struct spirv_builder *b, SpvId type, return ret; } +void +spirv_builder_emit_memory_barrier(struct spirv_builder *b, SpvScope scope, SpvMemorySemanticsMask semantics) +{ + spirv_buffer_prepare(&b->instructions, b->mem_ctx, 3); + spirv_buffer_emit_word(&b->instructions, SpvOpMemoryBarrier | (3 << 16)); + spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, scope)); + spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, semantics)); +} + +void +spirv_builder_emit_control_barrier(struct spirv_builder *b, SpvScope scope, SpvScope mem_scope, SpvMemorySemanticsMask semantics) +{ + spirv_buffer_prepare(&b->instructions, b->mem_ctx, 4); + spirv_buffer_emit_word(&b->instructions, SpvOpControlBarrier | (4 << 16)); + spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, scope)); + spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, mem_scope)); + spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, semantics)); +} + SpvId spirv_builder_import(struct spirv_builder *b, const char *name) { 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 a01d4fab8c4..cb868034782 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -351,6 +351,12 @@ SpvId spirv_builder_emit_var(struct spirv_builder *b, SpvId type, SpvStorageClass storage_class); +void +spirv_builder_emit_memory_barrier(struct spirv_builder *b, SpvScope scope, SpvMemorySemanticsMask semantics); + +void +spirv_builder_emit_control_barrier(struct spirv_builder *b, SpvScope scope, SpvScope mem_scope, SpvMemorySemanticsMask semantics); + SpvId spirv_builder_import(struct spirv_builder *b, const char *name);