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);