summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2016-11-21 01:12:39 +0000
committerDave Airlie <[email protected]>2016-11-22 17:15:57 +1000
commit220912e21432dba996cb2694dea480c65cf6a7c6 (patch)
tree032010f709817b692f58971352e16e712900fd1f
parent3c6151ccafeb47febb8320b7f4f7bbc0e819708e (diff)
radv: fix sample id loading
The sample id is packed into bits 8-12, so adjust things properly. Reviewed-by: Bas Nieuwenhuizen <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r--src/amd/common/ac_nir_to_llvm.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 741a082c484..c68cb9c6a30 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -379,6 +379,23 @@ static LLVMValueRef to_float(struct nir_to_llvm_context *ctx, LLVMValueRef v)
return v;
}
+static LLVMValueRef unpack_param(struct nir_to_llvm_context *ctx,
+ LLVMValueRef param, unsigned rshift,
+ unsigned bitwidth)
+{
+ LLVMValueRef value = param;
+ if (rshift)
+ value = LLVMBuildLShr(ctx->builder, value,
+ LLVMConstInt(ctx->i32, rshift, false), "");
+
+ if (rshift + bitwidth < 32) {
+ unsigned mask = (1 << bitwidth) - 1;
+ value = LLVMBuildAnd(ctx->builder, value,
+ LLVMConstInt(ctx->i32, mask, false), "");
+ }
+ return value;
+}
+
static LLVMValueRef build_gep0(struct nir_to_llvm_context *ctx,
LLVMValueRef base_ptr, LLVMValueRef index)
{
@@ -2895,7 +2912,7 @@ static void visit_intrinsic(struct nir_to_llvm_context *ctx,
result = ctx->start_instance;
break;
case nir_intrinsic_load_sample_id:
- result = ctx->ancillary;
+ result = unpack_param(ctx, ctx->ancillary, 8, 4);
break;
case nir_intrinsic_load_sample_pos:
result = load_sample_pos(ctx);