Mesa (main): zink: declare int/float size caps inline with type usage
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Nov 9 22:03:50 UTC 2021
Module: Mesa
Branch: main
Commit: 854fd242faf00bf68555dce10fb0ae98a3ab34c0
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=854fd242faf00bf68555dce10fb0ae98a3ab34c0
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Mon Oct 25 11:06:19 2021 -0400
zink: declare int/float size caps inline with type usage
this is much more accurate than trying to use shader info
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13566>
---
.../drivers/zink/nir_to_spirv/nir_to_spirv.c | 12 -----------
.../drivers/zink/nir_to_spirv/spirv_builder.c | 25 +++++++++++++++++++---
2 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index dc864ede740..27a4270e2e4 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -3646,18 +3646,6 @@ nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info, uint32_t
spirv_builder_emit_cap(&ctx.builder, SpvCapabilityImageQuery);
}
- if (s->info.bit_sizes_int & 8)
- spirv_builder_emit_cap(&ctx.builder, SpvCapabilityInt8);
- if (s->info.bit_sizes_int & 16)
- spirv_builder_emit_cap(&ctx.builder, SpvCapabilityInt16);
- if (s->info.bit_sizes_int & 64)
- spirv_builder_emit_cap(&ctx.builder, SpvCapabilityInt64);
-
- if (s->info.bit_sizes_float & 16)
- spirv_builder_emit_cap(&ctx.builder, SpvCapabilityFloat16);
- if (s->info.bit_sizes_float & 64)
- spirv_builder_emit_cap(&ctx.builder, SpvCapabilityFloat64);
-
ctx.stage = s->info.stage;
ctx.so_info = so_info;
ctx.GLSL_std_450 = spirv_builder_import(&ctx.builder, "GLSL.std.450");
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 f859a3372e0..d93d47d11e4 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -1204,6 +1204,12 @@ SpvId
spirv_builder_type_uint(struct spirv_builder *b, unsigned width)
{
uint32_t args[] = { width, 0 };
+ if (width == 8)
+ spirv_builder_emit_cap(b, SpvCapabilityInt8);
+ else if (width == 16)
+ spirv_builder_emit_cap(b, SpvCapabilityInt16);
+ else if (width == 64)
+ spirv_builder_emit_cap(b, SpvCapabilityInt64);
return get_type_def(b, SpvOpTypeInt, args, ARRAY_SIZE(args));
}
@@ -1211,6 +1217,10 @@ SpvId
spirv_builder_type_float(struct spirv_builder *b, unsigned width)
{
uint32_t args[] = { width };
+ if (width == 16)
+ spirv_builder_emit_cap(b, SpvCapabilityFloat16);
+ else if (width == 64)
+ spirv_builder_emit_cap(b, SpvCapabilityFloat64);
return get_type_def(b, SpvOpTypeFloat, args, ARRAY_SIZE(args));
}
@@ -1430,6 +1440,12 @@ SpvId
spirv_builder_const_uint(struct spirv_builder *b, int width, uint64_t val)
{
assert(width >= 8);
+ if (width == 8)
+ spirv_builder_emit_cap(b, SpvCapabilityInt8);
+ else if (width == 16)
+ spirv_builder_emit_cap(b, SpvCapabilityInt16);
+ else if (width == 64)
+ spirv_builder_emit_cap(b, SpvCapabilityInt64);
SpvId type = spirv_builder_type_uint(b, width);
if (width <= 32)
return emit_constant_32(b, type, val);
@@ -1449,12 +1465,15 @@ spirv_builder_const_float(struct spirv_builder *b, int width, double val)
{
assert(width >= 16);
SpvId type = spirv_builder_type_float(b, width);
- if (width == 16)
+ if (width == 16) {
+ spirv_builder_emit_cap(b, SpvCapabilityFloat16);
return emit_constant_32(b, type, _mesa_float_to_half(val));
- else if (width == 32)
+ } else if (width == 32)
return emit_constant_32(b, type, u_bitcast_f2u(val));
- else if (width == 64)
+ else if (width == 64) {
+ spirv_builder_emit_cap(b, SpvCapabilityFloat64);
return emit_constant_64(b, type, u_bitcast_d2u(val));
+ }
unreachable("unhandled float-width");
}
More information about the mesa-commit
mailing list