On Fri, Dec 06, 2013 at 10:43:42PM +0100, Vincent Lejeune wrote: > ---
Reviewed-by: Tom Stellard <thomas.stell...@amd.com> > src/gallium/drivers/radeon/radeon_llvm.h | 6 +++ > .../drivers/radeon/radeon_setup_tgsi_llvm.c | 43 > ++++++++++++++++++++-- > 2 files changed, 45 insertions(+), 4 deletions(-) > > diff --git a/src/gallium/drivers/radeon/radeon_llvm.h > b/src/gallium/drivers/radeon/radeon_llvm.h > index 2cab6b0..00714fb 100644 > --- a/src/gallium/drivers/radeon/radeon_llvm.h > +++ b/src/gallium/drivers/radeon/radeon_llvm.h > @@ -112,6 +112,12 @@ struct radeon_llvm_context { > LLVMValueRef outputs[RADEON_LLVM_MAX_OUTPUTS][TGSI_NUM_CHANNELS]; > unsigned output_reg_count; > > + /** This pointer is used to contain the temporary values. > + * The amount of temporary used in tgsi can't be bound to a max value > and > + * thus we must allocate this array at runtime. > + */ > + LLVMValueRef *temps; > + unsigned temps_count; > LLVMValueRef system_values[RADEON_LLVM_MAX_SYSTEM_VALUES]; > > /*=== Private Members ===*/ > diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > index 3bb01ec..4c30de4 100644 > --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > @@ -142,6 +142,13 @@ emit_array_fetch( > return result; > } > > +static bool uses_temp_indirect_addressing( > + struct lp_build_tgsi_context *bld_base) > +{ > + struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base); > + return (bld->indirect_files & (1 << TGSI_FILE_TEMPORARY)); > +} > + > static LLVMValueRef > emit_fetch( > struct lp_build_tgsi_context *bld_base, > @@ -184,7 +191,11 @@ emit_fetch( > break; > > case TGSI_FILE_TEMPORARY: > - ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle); > + if (uses_temp_indirect_addressing(bld_base)) { > + ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, > swizzle); > + break; > + } > + ptr = ctx->temps[reg->Register.Index * TGSI_NUM_CHANNELS + > swizzle]; > result = LLVMBuildLoad(builder, ptr, ""); > break; > > @@ -216,6 +227,7 @@ static void emit_declaration( > const struct tgsi_full_declaration *decl) > { > struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base); > + unsigned first, last, i, idx; > switch(decl->Declaration.File) { > case TGSI_FILE_ADDRESS: > { > @@ -234,7 +246,23 @@ static void emit_declaration( > case TGSI_FILE_TEMPORARY: > if (decl->Declaration.Array && decl->Array.ArrayID <= > RADEON_LLVM_MAX_ARRAYS) > ctx->arrays[decl->Array.ArrayID - 1] = decl->Range; > - lp_emit_declaration_soa(bld_base, decl); > + if (uses_temp_indirect_addressing(bld_base)) { > + lp_emit_declaration_soa(bld_base, decl); > + break; > + } > + first = decl->Range.First; > + last = decl->Range.Last; > + if (!ctx->temps_count) { > + ctx->temps_count = > bld_base->info->file_max[TGSI_FILE_TEMPORARY] + 1; > + ctx->temps = MALLOC(TGSI_NUM_CHANNELS * > ctx->temps_count * sizeof(LLVMValueRef)); > + } > + for (idx = first; idx <= last; idx++) { > + for (i = 0; i < TGSI_NUM_CHANNELS; i++) { > + ctx->temps[idx * TGSI_NUM_CHANNELS + i] = > + lp_build_alloca(bld_base->base.gallivm, > bld_base->base.vec_type, > + "temp"); > + } > + } > break; > > case TGSI_FILE_INPUT: > @@ -284,6 +312,7 @@ emit_store( > const struct tgsi_opcode_info * info, > LLVMValueRef dst[4]) > { > + struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base); > struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base); > struct gallivm_state *gallivm = bld->bld_base.base.gallivm; > struct lp_build_context base = bld->bld_base.base; > @@ -359,7 +388,10 @@ emit_store( > break; > > case TGSI_FILE_TEMPORARY: > - temp_ptr = lp_get_temp_ptr_soa(bld, i + > range.First, chan_index); > + if > (uses_temp_indirect_addressing(bld_base)) > + temp_ptr = > lp_get_temp_ptr_soa(bld, i + range.First, chan_index); > + else > + temp_ptr = ctx->temps[(i + > range.First) * TGSI_NUM_CHANNELS + chan_index]; > break; > > default: > @@ -377,7 +409,9 @@ emit_store( > break; > > case TGSI_FILE_TEMPORARY: > - temp_ptr = lp_get_temp_ptr_soa(bld, > reg->Register.Index, chan_index); > + if (uses_temp_indirect_addressing(bld_base)) > + break; > + temp_ptr = ctx->temps[ TGSI_NUM_CHANNELS * > reg->Register.Index + chan_index]; > break; > > default: > @@ -1392,4 +1426,5 @@ void radeon_llvm_dispose(struct radeon_llvm_context * > ctx) > { > LLVMDisposeModule(ctx->soa.bld_base.base.gallivm->module); > LLVMContextDispose(ctx->soa.bld_base.base.gallivm->context); > + FREE(ctx->temps); > } > -- > 1.8.4.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev