From 0fba3bc2365fe0131f1ca890dd213cbd5664a45c Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 5 Apr 2021 09:54:05 -0400 Subject: [PATCH] zink: add spirv builder for unops with a const operand Reviewed-by: Dave Airlie Part-of: --- .../drivers/zink/nir_to_spirv/spirv_builder.c | 13 +++++++++++++ .../drivers/zink/nir_to_spirv/spirv_builder.h | 3 +++ 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 ed8e0c707a9..f76dda8be67 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -467,6 +467,19 @@ spirv_builder_emit_interlock(struct spirv_builder *b, bool end) spirv_buffer_emit_word(&b->instructions, (end ? SpvOpEndInvocationInterlockEXT : SpvOpBeginInvocationInterlockEXT) | (1 << 16)); } + +SpvId +spirv_builder_emit_unop_const(struct spirv_builder *b, SpvOp op, SpvId result_type, uint64_t operand) +{ + SpvId result = spirv_builder_new_id(b); + spirv_buffer_prepare(&b->instructions, b->mem_ctx, 4); + spirv_buffer_emit_word(&b->instructions, op | (4 << 16)); + spirv_buffer_emit_word(&b->instructions, result_type); + spirv_buffer_emit_word(&b->instructions, result); + spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, operand)); + return result; +} + SpvId spirv_builder_emit_unop(struct spirv_builder *b, SpvOp op, SpvId result_type, SpvId operand) 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 60bad0388d7..683607badbb 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -190,6 +190,9 @@ spirv_builder_emit_access_chain(struct spirv_builder *b, SpvId result_type, void spirv_builder_emit_interlock(struct spirv_builder *b, bool end); +SpvId +spirv_builder_emit_unop_const(struct spirv_builder *b, SpvOp op, SpvId result_type, uint64_t operand); + SpvId spirv_builder_emit_unop(struct spirv_builder *b, SpvOp op, SpvId result_type, SpvId operand);