radv/llvm: implement the image load DCC bug
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 23 Apr 2021 13:06:10 +0000 (15:06 +0200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 23 Apr 2021 16:01:22 +0000 (16:01 +0000)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10436>

src/amd/vulkan/radv_nir_to_llvm.c

index 26fba7d..cc3faec 100644 (file)
@@ -584,6 +584,19 @@ radv_get_sampler_desc(struct ac_shader_abi *abi, unsigned descriptor_set, unsign
       for (unsigned i = 4; i < 8; ++i)
          components[i] = ac_llvm_extract_elem(&ctx->ac, descriptor2, i);
       descriptor = ac_build_gather_values(&ctx->ac, components, 8);
+   } else if (desc_type == AC_DESC_IMAGE &&
+              ctx->args->options->has_image_load_dcc_bug &&
+              image && !write) {
+      LLVMValueRef components[8];
+
+      for (unsigned i = 0; i < 8; i++)
+         components[i] = ac_llvm_extract_elem(&ctx->ac, descriptor, i);
+
+      /* WRITE_COMPRESS_ENABLE must be 0 for all image loads to workaround a hardware bug. */
+      components[6] = LLVMBuildAnd(ctx->ac.builder, components[6],
+                                   LLVMConstInt(ctx->ac.i32, C_00A018_WRITE_COMPRESS_ENABLE, false), "");
+
+      descriptor = ac_build_gather_values(&ctx->ac, components, 8);
    }
 
    return descriptor;