diff options
author | Christian König <[email protected]> | 2012-08-12 20:06:21 +0200 |
---|---|---|
committer | Christian König <[email protected]> | 2012-08-15 22:13:19 +0200 |
commit | 4444b9d1ecddb09468d2878ffb1463a66ea0ffd3 (patch) | |
tree | 560ba59084750cbb122a5544b090a4e14143841c /src/gallium/drivers | |
parent | b6051bc7859829588b2361da96f8e828a7fe1326 (diff) |
radeon/llvm: add support to fetch temps as vectors
Necessary for texture fetches with temp regs as source on SI.
Signed-off-by: Christian König <[email protected]>
Reviewed-by: Tom Stellard <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c index 641d27745c3..04469e28759 100644 --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c @@ -159,11 +159,21 @@ emit_fetch_temporary( { struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base); LLVMBuilderRef builder = bld_base->base.gallivm->builder; + if (swizzle == ~0) { + LLVMValueRef values[TGSI_NUM_CHANNELS] = {}; + unsigned chan; + for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { + values[chan] = emit_fetch_temporary(bld_base, reg, type, chan); + } + return lp_build_gather_values(bld_base->base.gallivm, values, + TGSI_NUM_CHANNELS); + } + if (reg->Register.Indirect) { LLVMValueRef array_index = emit_array_index(bld, reg, swizzle); LLVMValueRef ptr = LLVMBuildGEP(builder, bld->temps_array, &array_index, 1, ""); - return LLVMBuildLoad(builder, ptr, ""); + return LLVMBuildLoad(builder, ptr, ""); } else { LLVMValueRef temp_ptr; temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle); |