From db1c9b36b441141eca9080a20a7c8a3e37dc84ea Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 7 Aug 2020 14:57:39 -0400 Subject: [PATCH] zink: add spirv builder function for OpAtomicStore Reviewed-by: Adam Jackson Reviewed-by: Dave Airlie Part-of: --- .../drivers/zink/nir_to_spirv/spirv_builder.c | 12 ++++++++++++ .../drivers/zink/nir_to_spirv/spirv_builder.h | 4 ++++ 2 files changed, 16 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 55e53b7fd43..315be8b0c8e 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -407,6 +407,18 @@ spirv_builder_emit_store(struct spirv_builder *b, SpvId pointer, SpvId object) spirv_buffer_emit_word(&b->instructions, object); } +void +spirv_builder_emit_atomic_store(struct spirv_builder *b, SpvId pointer, SpvScope scope, + SpvMemorySemanticsMask semantics, SpvId object) +{ + spirv_buffer_prepare(&b->instructions, b->mem_ctx, 5); + spirv_buffer_emit_word(&b->instructions, SpvOpAtomicStore | (5 << 16)); + spirv_buffer_emit_word(&b->instructions, pointer); + 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)); + spirv_buffer_emit_word(&b->instructions, object); +} + SpvId spirv_builder_emit_access_chain(struct spirv_builder *b, SpvId result_type, SpvId base, const SpvId indexes[], 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 54dab449935..dc76db37f7a 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -169,6 +169,10 @@ SpvId spirv_builder_emit_load(struct spirv_builder *b, SpvId result_type, SpvId pointer); +void +spirv_builder_emit_atomic_store(struct spirv_builder *b, SpvId pointer, SpvScope scope, + SpvMemorySemanticsMask semantics, SpvId object); + void spirv_builder_emit_store(struct spirv_builder *b, SpvId pointer, SpvId object);