From 4cf29427770f6900c5e84e3b30f2e72e65954548 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Fri, 31 Mar 2017 13:02:34 +0200 Subject: [PATCH] radeonsi: support 64-bit system values MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For simplicitly, always store system values as 32-bit values or arrays of 32-bit values. 64-bit values are unpacked and packed accordingly. Reviewed-by: Marek Olšák --- .../drivers/radeonsi/si_shader_tgsi_setup.c | 24 ++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index 3e38f0d..3b8951c 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -762,13 +762,29 @@ static LLVMValueRef fetch_system_value(struct lp_build_tgsi_context *bld_base, unsigned swizzle) { struct si_shader_context *ctx = si_shader_context(bld_base); - struct gallivm_state *gallivm = &ctx->gallivm; - + LLVMBuilderRef builder = ctx->gallivm.builder; LLVMValueRef cval = ctx->system_values[reg->Register.Index]; + + if (tgsi_type_is_64bit(type)) { + LLVMValueRef lo, hi; + + assert(swizzle == 0 || swizzle == 2); + + lo = LLVMBuildExtractElement( + builder, cval, LLVMConstInt(ctx->i32, swizzle, 0), ""); + hi = LLVMBuildExtractElement( + builder, cval, LLVMConstInt(ctx->i32, swizzle + 1, 0), ""); + + return si_llvm_emit_fetch_64bit(bld_base, type, lo, hi); + } + if (LLVMGetTypeKind(LLVMTypeOf(cval)) == LLVMVectorTypeKind) { - cval = LLVMBuildExtractElement(gallivm->builder, cval, - LLVMConstInt(ctx->i32, swizzle, 0), ""); + cval = LLVMBuildExtractElement( + builder, cval, LLVMConstInt(ctx->i32, swizzle, 0), ""); + } else { + assert(swizzle == 0); } + return bitcast(bld_base, type, cval); } -- 2.7.4