Module: Mesa Branch: staging/22.2 Commit: ccac10eb5a088f73e7fb241e896cb0f41e632383 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ccac10eb5a088f73e7fb241e896cb0f41e632383
Author: Erik Faye-Lund <[email protected]> Date: Thu Aug 25 09:42:43 2022 +0200 zink: add spirv_builder_function_call It can be useful not just to create functions, but also being able to call them. This adds the spirv_builder-helper for this. Cc: mesa-stable Reviewed-by: Mike Blumenkrantz <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18244> (cherry picked from commit 47d67912bdf27aa11bcd097142d98016a4ca9874) --- .pick_status.json | 2 +- .../drivers/zink/nir_to_spirv/spirv_builder.c | 22 ++++++++++++++++++++++ .../drivers/zink/nir_to_spirv/spirv_builder.h | 5 +++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 6a19d09b544..7f748ac510c 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -10237,7 +10237,7 @@ "description": "zink: add spirv_builder_function_call", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, 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 b1573e566ed..88eb233e79e 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -404,6 +404,28 @@ spirv_builder_function_end(struct spirv_builder *b) spirv_buffer_emit_word(&b->instructions, SpvOpFunctionEnd | (1 << 16)); } +SpvId +spirv_builder_function_call(struct spirv_builder *b, SpvId result_type, + SpvId function, const SpvId arguments[], + size_t num_arguments) +{ + SpvId result = spirv_builder_new_id(b); + + int words = 4 + num_arguments; + spirv_buffer_prepare(&b->instructions, b->mem_ctx, words); + spirv_buffer_emit_word(&b->instructions, + SpvOpFunctionCall | (words << 16)); + spirv_buffer_emit_word(&b->instructions, result_type); + spirv_buffer_emit_word(&b->instructions, result); + spirv_buffer_emit_word(&b->instructions, function); + + for (int i = 0; i < num_arguments; ++i) + spirv_buffer_emit_word(&b->instructions, arguments[i]); + + return result; +} + + void spirv_builder_label(struct spirv_builder *b, SpvId label) { 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 01833ceb2df..2d5887e19a4 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -413,6 +413,11 @@ spirv_builder_type_function(struct spirv_builder *b, SpvId return_type, const SpvId parameter_types[], size_t num_parameter_types); +SpvId +spirv_builder_function_call(struct spirv_builder *b, SpvId result_type, + SpvId function, const SpvId arguments[], + size_t num_arguments); + SpvId spirv_builder_const_bool(struct spirv_builder *b, bool val);
