Mesa (master): zink: handle non-const offsets for txf/tg4 ops
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jan 5 17:23:42 UTC 2021
Module: Mesa
Branch: master
Commit: 4283441cd6e323b596366e4750f2bf0fc5c5090d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4283441cd6e323b596366e4750f2bf0fc5c5090d
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue Jan 5 09:08:33 2021 -0500
zink: handle non-const offsets for txf/tg4 ops
required for gl_spirv handling and tg4
Fixes: b77f43f2539 ("zink: use ConstOffset for nir_tex_src_offset")
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8333>
---
src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 16 ++++++++++------
src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c | 19 +++++++++++++++++--
src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h | 3 +++
3 files changed, 30 insertions(+), 8 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 ffce5df6bc9..30eafa6b833 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
@@ -2171,7 +2171,7 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
assert(tex->texture_index == tex->sampler_index);
SpvId coord = 0, proj = 0, bias = 0, lod = 0, dref = 0, dx = 0, dy = 0,
- const_offset = 0, sample = 0, tex_offset = 0;
+ const_offset = 0, offset = 0, sample = 0, tex_offset = 0;
unsigned coord_components = 0;
for (unsigned i = 0; i < tex->num_srcs; i++) {
switch (tex->src[i].src_type) {
@@ -2191,8 +2191,10 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
break;
case nir_tex_src_offset:
- assert(nir_src_is_const(tex->src[i].src));
- const_offset = get_src_int(ctx, &tex->src[i].src);
+ if (nir_src_is_const(tex->src[i].src))
+ const_offset = get_src_int(ctx, &tex->src[i].src);
+ else
+ offset = get_src_int(ctx, &tex->src[i].src);
break;
case nir_tex_src_bias:
@@ -2329,6 +2331,8 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
actual_dest_type = spirv_builder_type_float(&ctx->builder, 32);
SpvId result;
+ if (offset)
+ spirv_builder_emit_cap(&ctx->builder, SpvCapabilityImageGatherExtended);
if (tex->op == nir_texop_txf ||
tex->op == nir_texop_txf_ms ||
tex->op == nir_texop_tg4) {
@@ -2339,17 +2343,17 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
spirv_builder_emit_cap(&ctx->builder, SpvCapabilityImageGatherExtended);
result = spirv_builder_emit_image_gather(&ctx->builder, dest_type,
load, coord, emit_uint_const(ctx, 32, tex->component),
- lod, sample, const_offset, dref);
+ lod, sample, const_offset, offset, dref);
} else
result = spirv_builder_emit_image_fetch(&ctx->builder, dest_type,
- image, coord, lod, sample, const_offset);
+ image, coord, lod, sample, const_offset, offset);
} else {
result = spirv_builder_emit_image_sample(&ctx->builder,
actual_dest_type, load,
coord,
proj != 0,
lod, bias, dref, dx, dy,
- const_offset);
+ const_offset, offset);
}
spirv_builder_emit_decoration(&ctx->builder, result,
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 47ea144cb1c..a413c551d06 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -669,7 +669,8 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
SpvId dref,
SpvId dx,
SpvId dy,
- SpvId const_offset)
+ SpvId const_offset,
+ SpvId offset)
{
SpvId result = spirv_builder_new_id(b);
@@ -699,9 +700,13 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
extra_operands[++num_extra_operands] = dy;
operand_mask |= SpvImageOperandsGradMask;
}
+ assert(!(const_offset && offset));
if (const_offset) {
extra_operands[++num_extra_operands] = const_offset;
operand_mask |= SpvImageOperandsConstOffsetMask;
+ } else if (offset) {
+ extra_operands[++num_extra_operands] = offset;
+ operand_mask |= SpvImageOperandsOffsetMask;
}
/* finalize num_extra_operands / extra_operands */
@@ -745,6 +750,7 @@ spirv_builder_emit_image_gather(struct spirv_builder *b,
SpvId lod,
SpvId sample,
SpvId const_offset,
+ SpvId offset,
SpvId dref)
{
SpvId result = spirv_builder_new_id(b);
@@ -761,9 +767,13 @@ spirv_builder_emit_image_gather(struct spirv_builder *b,
extra_operands[++num_extra_operands] = sample;
operand_mask |= SpvImageOperandsSampleMask;
}
+ assert(!(const_offset && offset));
if (const_offset) {
extra_operands[++num_extra_operands] = const_offset;
operand_mask |= SpvImageOperandsConstOffsetMask;
+ } else if (offset) {
+ extra_operands[++num_extra_operands] = offset;
+ operand_mask |= SpvImageOperandsOffsetMask;
}
if (dref)
op = SpvOpImageDrefGather;
@@ -796,7 +806,8 @@ spirv_builder_emit_image_fetch(struct spirv_builder *b,
SpvId coordinate,
SpvId lod,
SpvId sample,
- SpvId const_offset)
+ SpvId const_offset,
+ SpvId offset)
{
SpvId result = spirv_builder_new_id(b);
@@ -811,9 +822,13 @@ spirv_builder_emit_image_fetch(struct spirv_builder *b,
extra_operands[++num_extra_operands] = sample;
operand_mask |= SpvImageOperandsSampleMask;
}
+ assert(!(const_offset && offset));
if (const_offset) {
extra_operands[++num_extra_operands] = const_offset;
operand_mask |= SpvImageOperandsConstOffsetMask;
+ } else if (offset) {
+ extra_operands[++num_extra_operands] = offset;
+ operand_mask |= SpvImageOperandsOffsetMask;
}
/* finalize num_extra_operands / extra_operands */
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 f3c8d5b4eb1..632f196733f 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
@@ -256,6 +256,7 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
SpvId dref,
SpvId dx,
SpvId dy,
+ SpvId const_offset,
SpvId offset);
SpvId
@@ -269,6 +270,7 @@ spirv_builder_emit_image_fetch(struct spirv_builder *b,
SpvId coordinate,
SpvId lod,
SpvId sample,
+ SpvId const_offset,
SpvId offset);
SpvId
spirv_builder_emit_image_gather(struct spirv_builder *b,
@@ -278,6 +280,7 @@ spirv_builder_emit_image_gather(struct spirv_builder *b,
SpvId component,
SpvId lod,
SpvId sample,
+ SpvId const_offset,
SpvId offset,
SpvId dref);
More information about the mesa-commit
mailing list