radv: fix texturesamples to handle single sample case
authorDave Airlie <airlied@redhat.com>
Thu, 10 Nov 2016 00:32:08 +0000 (10:32 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 10 Nov 2016 23:35:43 +0000 (09:35 +1000)
We can only read the valid samples if this is an MSAA
texture, which means the type field must be 0x14 or 0x15.

This fixes:
dEQP-VK.glsl.texture_functions.query.texturesamples.*

Cc: "13.0" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_nir_to_llvm.c

index 35e669ad7e1d7ef8abdba6568d136792f5509f5d..b7ccea88372bfc28c0226d1b9dc4e03324d9f1b4 100644 (file)
@@ -3371,17 +3371,25 @@ static void visit_tex(struct nir_to_llvm_context *ctx, nir_tex_instr *instr)
        }
 
        if (instr->op == nir_texop_texture_samples) {
-               LLVMValueRef res, samples;
+               LLVMValueRef res, samples, is_msaa;
                res = LLVMBuildBitCast(ctx->builder, res_ptr, ctx->v8i32, "");
                samples = LLVMBuildExtractElement(ctx->builder, res,
                                                  LLVMConstInt(ctx->i32, 3, false), "");
+               is_msaa = LLVMBuildLShr(ctx->builder, samples,
+                                       LLVMConstInt(ctx->i32, 28, false), "");
+               is_msaa = LLVMBuildAnd(ctx->builder, is_msaa,
+                                      LLVMConstInt(ctx->i32, 0xe, false), "");
+               is_msaa = LLVMBuildICmp(ctx->builder, LLVMIntEQ, is_msaa,
+                                       LLVMConstInt(ctx->i32, 0xe, false), "");
+
                samples = LLVMBuildLShr(ctx->builder, samples,
                                        LLVMConstInt(ctx->i32, 16, false), "");
                samples = LLVMBuildAnd(ctx->builder, samples,
                                       LLVMConstInt(ctx->i32, 0xf, false), "");
                samples = LLVMBuildShl(ctx->builder, ctx->i32one,
                                       samples, "");
-
+               samples = LLVMBuildSelect(ctx->builder, is_msaa, samples,
+                                         ctx->i32one, "");
                result = samples;
                goto write_result;
        }