freedreno/ir3: handle image buffer
authorRob Clark <robdclark@gmail.com>
Thu, 7 Jun 2018 19:00:32 +0000 (15:00 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 19 Jun 2018 17:02:28 +0000 (13:02 -0400)
Similar to txf case, we need to insert a 2nd coordinate (zero).

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c

index 2cbb21f3d105d5c11c5a99575b411621ed6ce4d5..73871f8e0dbc592dd2ac303f6d520bde5380723a 100644 (file)
@@ -1975,7 +1975,8 @@ emit_intrinsic_load_image(struct ir3_context *ctx, nir_intrinsic_instr *intr,
        struct ir3_block *b = ctx->block;
        const nir_variable *var = intr->variables[0]->var;
        struct ir3_instruction *sam;
-       struct ir3_instruction * const *coords = get_src(ctx, &intr->src[0]);
+       struct ir3_instruction * const *src0 = get_src(ctx, &intr->src[0]);
+       struct ir3_instruction *coords[4];
        unsigned flags, ncoords = get_image_coords(var, &flags);
        unsigned tex_idx = get_image_slot(ctx, intr->variables[0]);
        type_t type = get_image_type(var);
@@ -1988,6 +1989,12 @@ emit_intrinsic_load_image(struct ir3_context *ctx, nir_intrinsic_instr *intr,
                flags |= IR3_INSTR_A;
        }
 
+       for (unsigned i = 0; i < ncoords; i++)
+               coords[i] = src0[i];
+
+       if (ncoords == 1)
+               coords[ncoords++] = create_immed(b, 0);
+
        sam = ir3_SAM(b, OPC_ISAM, type, TGSI_WRITEMASK_XYZW, flags,
                        tex_idx, tex_idx, create_collect(ctx, coords, ncoords), NULL);