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 9aa57c44569..ff87ba79531 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -765,6 +765,20 @@ spirv_builder_emit_demote(struct spirv_builder *b) spirv_buffer_emit_word(&b->instructions, SpvOpDemoteToHelperInvocation | (1 << 16)); } +SpvId +spirv_is_helper_invocation(struct spirv_builder *b) +{ + SpvId result = spirv_builder_new_id(b); + SpvId result_type = spirv_builder_type_bool(b); + + int words = 3; + spirv_buffer_prepare(&b->instructions, b->mem_ctx, words); + spirv_buffer_emit_word(&b->instructions, SpvOpIsHelperInvocationEXT | (words << 16)); + spirv_buffer_emit_word(&b->instructions, result_type); + spirv_buffer_emit_word(&b->instructions, result); + return result; +} + SpvId spirv_builder_emit_vote(struct spirv_builder *b, SpvOp op, SpvId src) { 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 f4515deea5c..c3233a0030d 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -271,6 +271,9 @@ spirv_builder_emit_kill(struct spirv_builder *b); void spirv_builder_emit_demote(struct spirv_builder *b); +SpvId +spirv_is_helper_invocation(struct spirv_builder *b); + SpvId spirv_builder_emit_vote(struct spirv_builder *b, SpvOp op, SpvId src);