I don't like the hardcoded numbers and they are mostly wrong anyway. The number of constant buffers is NUM_CONST_BUFFERS (which is 2). The number of sampler views is NUM_SAMPLER_VIEWS (which is 32 at the moment). The number of sampler states is NUM_TEX_UNITS (which is 16 at the moment), feel free to define NUM_SAMPLER_STATES=NUM_TEX_UNITS next to the definition of NUM_SAMPLER_VIEWS.
I don't like the magic "3" number in the expression "if (i < 3)". Could you use a proper definition SI_PARAM_xxx? Marek On Sun, Oct 6, 2013 at 4:05 PM, Vincent Lejeune <[email protected]> wrote: > This fixes a crash in Unigine Heaven 3.0, and probably in some > others apps. > --- > src/gallium/drivers/radeonsi/radeonsi_shader.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c > b/src/gallium/drivers/radeonsi/radeonsi_shader.c > index 97ed4e3..89c12c3 100644 > --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c > +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c > @@ -114,8 +114,12 @@ static LLVMValueRef build_indexed_load( > { > struct lp_build_context * base = > &si_shader_ctx->radeon_bld.soa.bld_base.base; > > + LLVMValueRef indices[2] = { > + LLVMConstInt(LLVMInt64TypeInContext(base->gallivm->context), > 0, false), > + offset > + }; > LLVMValueRef computed_ptr = LLVMBuildGEP( > - base->gallivm->builder, base_ptr, &offset, 1, ""); > + base->gallivm->builder, base_ptr, indices, 2, ""); > > LLVMValueRef result = LLVMBuildLoad(base->gallivm->builder, > computed_ptr, ""); > LLVMSetMetadata(result, 1, si_shader_ctx->const_md); > @@ -1578,9 +1582,13 @@ static void create_function(struct si_shader_context > *si_shader_ctx) > v2i32 = LLVMVectorType(i32, 2); > v3i32 = LLVMVectorType(i32, 3); > > - params[SI_PARAM_CONST] = LLVMPointerType(LLVMVectorType(i8, 16), > CONST_ADDR_SPACE); > - params[SI_PARAM_SAMPLER] = params[SI_PARAM_CONST]; > - params[SI_PARAM_RESOURCE] = LLVMPointerType(LLVMVectorType(i8, 32), > CONST_ADDR_SPACE); > + params[SI_PARAM_CONST] = > LLVMPointerType(LLVMArrayType(LLVMVectorType(i8, 16), 64), CONST_ADDR_SPACE); > + /* We assume at most 16 textures per program at the moment. > + * This need probably need to be changed to support bindless textures > */ > + params[SI_PARAM_SAMPLER] = LLVMPointerType( > + LLVMArrayType(LLVMVectorType(i8, 16), 16), CONST_ADDR_SPACE); > + params[SI_PARAM_RESOURCE] = LLVMPointerType( > + LLVMArrayType(LLVMVectorType(i8, 32), 16), CONST_ADDR_SPACE); > > switch (si_shader_ctx->type) { > case TGSI_PROCESSOR_VERTEX: > @@ -1647,6 +1655,10 @@ static void create_function(struct si_shader_context > *si_shader_ctx) > for (i = 0; i <= last_sgpr; ++i) { > LLVMValueRef P = > LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, i); > LLVMAddAttribute(P, LLVMInRegAttribute); > + /* We tell llvm that array inputs are passed by value to > allow Sinking pass > + * to move load. Inputs are constant so this is fine. */ > + if (i < 3) > + LLVMAddAttribute(P, LLVMByValAttribute); > } > > #if HAVE_LLVM >= 0x0304 > -- > 1.8.3.1 > > _______________________________________________ > mesa-dev mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
