Mesa (master): zink: add handling for 64bit values in spirv_builder

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 18 01:17:10 UTC 2020


Module: Mesa
Branch: master
Commit: 536863eeeaa24e1995968d87827bc98271fe56d4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=536863eeeaa24e1995968d87827bc98271fe56d4

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Nov  5 13:00:23 2020 -0500

zink: add handling for 64bit values in spirv_builder

Reviewed-by: Erik Faye-Lund <kusmabite at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7654>

---

 .../drivers/zink/nir_to_spirv/spirv_builder.c      | 52 +++++++++++++++-------
 .../drivers/zink/nir_to_spirv/spirv_builder.h      |  6 +--
 2 files changed, 39 insertions(+), 19 deletions(-)

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 7373ea64a95..5ec876d9392 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -1108,6 +1108,20 @@ get_const_def(struct spirv_builder *b, SpvOp op, SpvId type,
    return ((struct spirv_const *)entry->data)->result;
 }
 
+static SpvId
+emit_constant_32(struct spirv_builder *b, SpvId type, uint32_t val)
+{
+   uint32_t args[] = { val };
+   return get_const_def(b, SpvOpConstant, type, args, ARRAY_SIZE(args));
+}
+
+static SpvId
+emit_constant_64(struct spirv_builder *b, SpvId type, uint64_t val)
+{
+   uint32_t args[] = { val & UINT32_MAX, val >> 32 };
+   return get_const_def(b, SpvOpConstant, type, args, ARRAY_SIZE(args));
+}
+
 SpvId
 spirv_builder_const_bool(struct spirv_builder *b, bool val)
 {
@@ -1116,30 +1130,36 @@ spirv_builder_const_bool(struct spirv_builder *b, bool val)
 }
 
 SpvId
-spirv_builder_const_int(struct spirv_builder *b, int width, int32_t val)
+spirv_builder_const_int(struct spirv_builder *b, int width, int64_t val)
 {
-   assert(width <= 32);
-   uint32_t args[] = { val };
-   return get_const_def(b, SpvOpConstant, spirv_builder_type_int(b, width),
-                        args, ARRAY_SIZE(args));
+   assert(width >= 32);
+   SpvId type = spirv_builder_type_int(b, width);
+   if (width <= 32)
+      return emit_constant_32(b, type, val);
+   else
+      return emit_constant_64(b, type, val);
 }
 
 SpvId
-spirv_builder_const_uint(struct spirv_builder *b, int width, uint32_t val)
+spirv_builder_const_uint(struct spirv_builder *b, int width, uint64_t val)
 {
-   assert(width <= 32);
-   uint32_t args[] = { val };
-   return get_const_def(b, SpvOpConstant, spirv_builder_type_uint(b, width),
-                        args, ARRAY_SIZE(args));
+   assert(width >= 32);
+   SpvId type = spirv_builder_type_uint(b, width);
+   if (width <= 32)
+      return emit_constant_32(b, type, val);
+   else
+      return emit_constant_64(b, type, val);
 }
 
 SpvId
-spirv_builder_const_float(struct spirv_builder *b, int width, float val)
-{
-   assert(width <= 32);
-   uint32_t args[] = { u_bitcast_f2u(val) };
-   return get_const_def(b, SpvOpConstant, spirv_builder_type_float(b, width),
-                        args, ARRAY_SIZE(args));
+spirv_builder_const_float(struct spirv_builder *b, int width, double val)
+{
+   assert(width >= 32);
+   SpvId type = spirv_builder_type_float(b, width);
+   if (width <= 32)
+      return emit_constant_32(b, type, u_bitcast_f2u(val));
+   else
+      return emit_constant_64(b, type, u_bitcast_d2u(val));
 }
 
 SpvId
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 cb868034782..47d8f3a576f 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
@@ -334,13 +334,13 @@ SpvId
 spirv_builder_const_bool(struct spirv_builder *b, bool val);
 
 SpvId
-spirv_builder_const_int(struct spirv_builder *b, int width, int32_t val);
+spirv_builder_const_int(struct spirv_builder *b, int width, int64_t val);
 
 SpvId
-spirv_builder_const_uint(struct spirv_builder *b, int width, uint32_t val);
+spirv_builder_const_uint(struct spirv_builder *b, int width, uint64_t val);
 
 SpvId
-spirv_builder_const_float(struct spirv_builder *b, int width, float val);
+spirv_builder_const_float(struct spirv_builder *b, int width, double val);
 
 SpvId
 spirv_builder_const_composite(struct spirv_builder *b, SpvId result_type,



More information about the mesa-commit mailing list