amd/common: Fix number of coords for getlod.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 5 Jun 2018 23:42:17 +0000 (01:42 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Thu, 7 Jun 2018 21:59:52 +0000 (23:59 +0200)
The LLVM 6 code reduced it to a non-array call. We need to do that
with the new code too.

This fixes dEQP-VK.glsl.texture_functions.query.texturequerylod.*array* for radv.

Fixes: a9a79934412 "amd/common: use the dimension-aware image intrinsics on LLVM 7+"
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_llvm_build.c

index a686b72287b7aa103b8c74434905ece6975e18e4..4052488f03ae174e750ac75e35486f2e7de86a61 100644 (file)
@@ -1662,6 +1662,7 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
        unsigned num_overloads = 0;
        LLVMValueRef args[18];
        unsigned num_args = 0;
+       enum ac_image_dim dim = a->dim;
 
        assert(!a->lod || a->lod == ctx->i32_0 || a->lod == ctx->f32_0 ||
               !a->level_zero);
@@ -1681,6 +1682,20 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
        if (HAVE_LLVM < 0x0700)
                return ac_build_image_opcode_llvm6(ctx, a);
 
+       if (a->opcode == ac_image_get_lod) {
+               switch (dim) {
+               case ac_image_1darray:
+                       dim = ac_image_1d;
+                       break;
+               case ac_image_2darray:
+               case ac_image_cube:
+                       dim = ac_image_2d;
+                       break;
+               default:
+                       break;
+               }
+       }
+
        bool sample = a->opcode == ac_image_sample ||
                      a->opcode == ac_image_gather4 ||
                      a->opcode == ac_image_get_lod;
@@ -1706,13 +1721,13 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
        if (a->compare)
                args[num_args++] = ac_to_float(ctx, a->compare);
        if (a->derivs[0]) {
-               unsigned count = ac_num_derivs(a->dim);
+               unsigned count = ac_num_derivs(dim);
                for (unsigned i = 0; i < count; ++i)
                        args[num_args++] = ac_to_float(ctx, a->derivs[i]);
                overload[num_overloads++] = ".f32";
        }
        unsigned num_coords =
-               a->opcode != ac_image_get_resinfo ? ac_num_coords(a->dim) : 0;
+               a->opcode != ac_image_get_resinfo ? ac_num_coords(dim) : 0;
        for (unsigned i = 0; i < num_coords; ++i)
                args[num_args++] = LLVMBuildBitCast(ctx->builder, a->coords[i], coord_type, "");
        if (a->lod)
@@ -1751,7 +1766,7 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
        }
 
        const char *dimname;
-       switch (a->dim) {
+       switch (dim) {
        case ac_image_1d: dimname = "1d"; break;
        case ac_image_2d: dimname = "2d"; break;
        case ac_image_3d: dimname = "3d"; break;