diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 3adb9daf400..57f6d2d276b 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -4655,13 +4655,22 @@ static void tex_fetch_args( 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_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++) |