radeonsi: fix array textures layer coordinate
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 17 Sep 2017 14:00:38 +0000 (16:00 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 20 Sep 2017 13:42:58 +0000 (15:42 +0200)
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@lists.freedesktop.org
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c

index d0969a7dd024a9caedc4c421efb63c9ba071797f..0f65984db071c11478d16d501cc600d960c81c7f 100644 (file)
@@ -1478,13 +1478,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++)