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

Reply via email to