Mesa (staging/21.3): zink: cast image atomic op params/results based on image type
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Feb 2 21:21:48 UTC 2022
Module: Mesa
Branch: staging/21.3
Commit: e71e90eea7829f011d802417f96128718e8ccf60
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e71e90eea7829f011d802417f96128718e8ccf60
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Jan 14 16:30:28 2022 -0500
zink: cast image atomic op params/results based on image type
according to spec, these must match the texel pointer type
cc: mesa-stable
fixes (nvidia):
dEQP-GLES31.functional.image_load_store.2d.atomic.exchange_r32f_return_value
dEQP-GLES31.functional.image_load_store.2d_array.atomic.exchange_r32f_return_value
dEQP-GLES31.functional.image_load_store.cube.atomic.exchange_r32f_return_value
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14690>
(cherry picked from commit 2361c52b5e88bdc9212161a7fb4070c40082c01a)
---
.pick_status.json | 2 +-
.../drivers/zink/nir_to_spirv/nir_to_spirv.c | 27 +++++++++++++++-------
2 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index a601a0b7a89..fc8660952ed 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1012,7 +1012,7 @@
"description": "zink: cast image atomic op params/results based on image type",
"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/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 3dd05824d50..1476b52e75e 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
@@ -2487,12 +2487,12 @@ emit_interpolate(struct ntv_context *ctx, nir_intrinsic_instr *intr)
}
static void
-handle_atomic_op(struct ntv_context *ctx, nir_intrinsic_instr *intr, SpvId ptr, SpvId param, SpvId param2)
+handle_atomic_op(struct ntv_context *ctx, nir_intrinsic_instr *intr, SpvId ptr, SpvId param, SpvId param2, nir_alu_type type)
{
- SpvId dest_type = get_dest_type(ctx, &intr->dest, nir_type_uint32);
+ SpvId dest_type = get_dest_type(ctx, &intr->dest, type);
SpvId result = emit_atomic(ctx, get_atomic_op(intr->intrinsic), dest_type, ptr, param, param2);
assert(result);
- store_dest(ctx, &intr->dest, result, nir_type_uint);
+ store_dest(ctx, &intr->dest, result, type);
}
static void
@@ -2531,7 +2531,7 @@ emit_ssbo_atomic_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
if (intr->intrinsic == nir_intrinsic_ssbo_atomic_comp_swap)
param2 = get_src(ctx, &intr->src[3]);
- handle_atomic_op(ctx, intr, ptr, param, param2);
+ handle_atomic_op(ctx, intr, ptr, param, param2, nir_type_uint32);
}
static void
@@ -2552,7 +2552,7 @@ emit_shared_atomic_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
if (intr->intrinsic == nir_intrinsic_shared_atomic_comp_swap)
param2 = get_src(ctx, &intr->src[2]);
- handle_atomic_op(ctx, intr, ptr, param, param2);
+ handle_atomic_op(ctx, intr, ptr, param, param2, nir_type_uint32);
}
static void
@@ -2687,13 +2687,24 @@ emit_image_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
type_to_dim(glsl_get_sampler_dim(type), &is_ms);
SpvId sample = is_ms ? get_src(ctx, &intr->src[2]) : emit_uint_const(ctx, 32, 0);
SpvId coord = get_image_coords(ctx, type, &intr->src[1]);
- SpvId base_type = get_glsl_basetype(ctx, glsl_get_sampler_result_type(type));
+ enum glsl_base_type glsl_type = glsl_get_sampler_result_type(type);
+ SpvId base_type = get_glsl_basetype(ctx, glsl_type);
SpvId texel = spirv_builder_emit_image_texel_pointer(&ctx->builder, base_type, img_var, coord, sample);
SpvId param2 = 0;
- if (intr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap)
+ /* The type of Value must be the same as Result Type.
+ * The type of the value pointed to by Pointer must be the same as Result Type.
+ */
+ nir_alu_type ntype = nir_get_nir_type_for_glsl_base_type(glsl_type);
+ SpvId cast_type = get_dest_type(ctx, &intr->dest, ntype);
+ param = emit_bitcast(ctx, cast_type, param);
+
+ if (intr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap) {
param2 = get_src(ctx, &intr->src[4]);
- handle_atomic_op(ctx, intr, texel, param, param2);
+ param2 = emit_bitcast(ctx, cast_type, param2);
+ }
+
+ handle_atomic_op(ctx, intr, texel, param, param2, ntype);
}
static void
More information about the mesa-commit
mailing list