diff options
author | Dave Airlie <airlied@redhat.com> | 2016-11-21 01:12:39 +0000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-11-22 17:15:57 +1000 |
commit | 220912e21432dba996cb2694dea480c65cf6a7c6 (patch) | |
tree | 032010f709817b692f58971352e16e712900fd1f /src/amd | |
parent | 3c6151ccafeb47febb8320b7f4f7bbc0e819708e (diff) |
radv: fix sample id loading
The sample id is packed into bits 8-12, so adjust
things properly.
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 19 |
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); |