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

Reply via email to