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]));
+ }