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+"
---
 src/amd/common/ac_llvm_build.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index a686b72287b..4052488f03a 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -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;
-- 
2.17.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to