On Tue, Jan 10, 2017 at 7:33 PM, Samuel Pitoiset <samuel.pitoi...@gmail.com> wrote: > diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c > b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c > index 3e0f7c4f76..3cd87f2f66 100644 > --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c > +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c > @@ -677,14 +677,14 @@ LLVMValueRef si_llvm_emit_fetch(struct > lp_build_tgsi_context *bld_base, > if (tgsi_type_is_64bit(type)) { > result = > LLVMGetUndef(LLVMVectorType(LLVMIntTypeInContext(bld_base->base.gallivm->context, > 32), bld_base->base.type.length * 2)); > result = LLVMConstInsertElement(result, > - > bld->immediates[reg->Register.Index][swizzle], > + > si_llvm_get_immediate(bld_base, reg->Register.Index, swizzle), > > bld_base->int_bld.zero); > result = LLVMConstInsertElement(result, > - > bld->immediates[reg->Register.Index][swizzle + 1], > + > si_llvm_get_immediate(bld_base, reg->Register.Index, swizzle + 1), > > bld_base->int_bld.one); > return LLVMConstBitCast(result, ctype); > } else { > - return > LLVMConstBitCast(bld->immediates[reg->Register.Index][swizzle], ctype); > + return > LLVMConstBitCast(si_llvm_get_immediate(bld_base, reg->Register.Index, > swizzle), ctype); > } > } > > @@ -1230,13 +1230,28 @@ static void emit_immediate(struct > lp_build_tgsi_context *bld_base, > struct si_shader_context *ctx = si_shader_context(bld_base); > > for (i = 0; i < 4; ++i) { > - ctx->soa.immediates[ctx->soa.num_immediates][i] = > - LLVMConstInt(bld_base->uint_bld.elem_type, > imm->u[i].Uint, false ); > + LLVMValueRef value = > + LLVMConstInt(bld_base->uint_bld.elem_type, > imm->u[i].Uint, false); > + if (!ctx->imms_array) { > + ctx->soa.immediates[ctx->soa.num_immediates][i] = > value; > + } else { > + ctx->imms_array[ctx->soa.num_immediates * 4 + i] = > value; > + } > } > > ctx->soa.num_immediates++; > } > > +LLVMValueRef si_llvm_get_immediate(struct lp_build_tgsi_context *bld_base, > + int index, int channel) > +{ > + struct si_shader_context *ctx = si_shader_context(bld_base); > + > + if (!ctx->imms_array) > + return ctx->soa.immediates[index][channel]; > + return ctx->imms_array[index * 4 + channel]; > +} > + > void si_llvm_context_init(struct si_shader_context *ctx, > struct si_screen *sscreen, > struct si_shader *shader, > @@ -1281,6 +1296,16 @@ void si_llvm_context_init(struct si_shader_context > *ctx, > ctx->temp_arrays); > } > > + if (info && > + info->file_max[TGSI_FILE_IMMEDIATE] >= LP_MAX_INLINED_IMMEDIATES) > { > + int size = info->file_max[TGSI_FILE_IMMEDIATE] + 1; > + > + /* Use a dynamically allocated array for immediates when their > + * number is too great, but only in certain situations for > + * performance reasons because static allocation is better. */ > + ctx->imms_array = CALLOC(size * 4, > sizeof(ctx->imms_array[0])); > + }
Would it make sense adding something here like else ctx->imms_array = ctx->soa.immediates; and then on free if (ctx->imms_array != ctx->soa.immediates) FREE(ctx->imms_array); to avoid all the conditionals around usual imms_array use? Gražvydas _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev