ac/nir: clamp shadow texture comparison value on VI
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 25 Jun 2017 13:45:09 +0000 (15:45 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Jul 2017 12:55:42 +0000 (14:55 +0200)
Needed for TC-compatible HTILE in radeonsi for test cases like
piglit spec/arb_texture_rg/execution/fs-shadow2d-red-01.shader_test

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_nir_to_llvm.c

index f75d8958fccffa286a54b981ed713087c1880d89..8b76cd9cbe66e99a24e476ed856a581eaa2ac2c9 100644 (file)
@@ -4483,7 +4483,19 @@ static void visit_tex(struct ac_nir_context *ctx, nir_tex_instr *instr)
 
        /* Pack depth comparison value */
        if (instr->is_shadow && comparator) {
-               address[count++] = llvm_extract_elem(&ctx->ac, comparator, 0);
+               LLVMValueRef z = llvm_extract_elem(&ctx->ac, comparator, 0);
+
+               /* TC-compatible HTILE promotes Z16 and Z24 to Z32_FLOAT,
+                * so the depth comparison value isn't clamped for Z16 and
+                * Z24 anymore. Do it manually here.
+                *
+                * It's unnecessary if the original texture format was
+                * Z32_FLOAT, but we don't know that here.
+                */
+               if (ctx->abi->chip_class == VI)
+                       z = ac_build_clamp(&ctx->ac, z);
+
+               address[count++] = z;
        }
 
        /* pack derivatives */