OSDN Git Service

radeonsi: Fix crash on shaders using MSAA image load/store
authorAlex Smith <asmith@feralinteractive.com>
Wed, 30 May 2018 08:39:27 +0000 (09:39 +0100)
committerAlex Smith <asmith@feralinteractive.com>
Fri, 1 Jun 2018 07:53:38 +0000 (08:53 +0100)
The value returned by tgsi_util_get_texture_coord_dim() does not
account for the sample index. This means image_fetch_coords() will not
fetch it, leading to a null deref in ac_build_image_opcode() which
expects it to be present (the return value of ac_num_coords() *does*
include the sample index).

Signed-off-by: Alex Smith <asmith@feralinteractive.com>
Cc: "18.1" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c

index 1c244fa..d0dd4e7 100644 (file)
@@ -276,10 +276,16 @@ static void image_fetch_coords(
        struct si_shader_context *ctx = si_shader_context(bld_base);
        LLVMBuilderRef builder = ctx->ac.builder;
        unsigned target = inst->Memory.Texture;
-       const unsigned num_coords = tgsi_util_get_texture_coord_dim(target);
+       unsigned num_coords = tgsi_util_get_texture_coord_dim(target);
        LLVMValueRef tmp;
        int chan;
 
+       if (target == TGSI_TEXTURE_2D_MSAA ||
+           target == TGSI_TEXTURE_2D_ARRAY_MSAA) {
+               /* Need the sample index as well. */
+               num_coords++;
+       }
+
        for (chan = 0; chan < num_coords; ++chan) {
                tmp = lp_build_emit_fetch(bld_base, inst, src, chan);
                tmp = ac_to_integer(&ctx->ac, tmp);