[Mesa-dev] [PATCH 1/2] radeonsi: fix array textures layer coordinate
Nicolai Hähnle
nhaehnle at gmail.com
Mon Sep 18 14:57:37 UTC 2017
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
Like for cube map (array) gather, we need to round to nearest on <= VI.
Fixes tests in dEQP-GLES3.functional.shaders.texture_functions.texture.*
Cc: mesa-stable at lists.freedesktop.org
---
src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
index d0969a7dd02..54832fc0ee4 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
@@ -1471,27 +1471,37 @@ static void tex_fetch_args(
for (chan = num_src_deriv_channels;
chan < num_dst_deriv_channels; chan++)
derivs[param * num_dst_deriv_channels + chan] =
bld_base->base.zero;
}
}
if (target == TGSI_TEXTURE_CUBE ||
target == TGSI_TEXTURE_CUBE_ARRAY ||
target == TGSI_TEXTURE_SHADOWCUBE ||
- target == TGSI_TEXTURE_SHADOWCUBE_ARRAY)
+ target == TGSI_TEXTURE_SHADOWCUBE_ARRAY) {
ac_prepare_cube_coords(&ctx->ac,
opcode == TGSI_OPCODE_TXD,
target == TGSI_TEXTURE_CUBE_ARRAY ||
target == TGSI_TEXTURE_SHADOWCUBE_ARRAY,
opcode == TGSI_OPCODE_LODQ,
coords, derivs);
+ } else if (tgsi_is_array_sampler(target) &&
+ opcode != TGSI_OPCODE_TXF &&
+ opcode != TGSI_OPCODE_TXF_LZ &&
+ ctx->screen->b.chip_class <= VI) {
+ unsigned array_coord = target == TGSI_TEXTURE_1D ||
+ target == TGSI_TEXTURE_1D_ARRAY ? 1 : 2;
+ coords[array_coord] =
+ ac_build_intrinsic(&ctx->ac, "llvm.rint.f32", ctx->f32,
+ &coords[array_coord], 1, 0);
+ }
if (opcode == TGSI_OPCODE_TXD)
for (int i = 0; i < num_deriv_channels * 2; i++)
address[count++] = derivs[i];
/* Pack texture coordinates */
address[count++] = coords[0];
if (num_coords > 1)
address[count++] = coords[1];
if (num_coords > 2)
--
2.11.0
More information about the mesa-dev
mailing list