On Thu, Mar 21, 2013 at 7:38 AM, Christian König <deathsim...@vodafone.de> wrote: > From: Christian König <christian.koe...@amd.com> > > Signed-off-by: Christian König <christian.koe...@amd.com> > --- > src/gallium/drivers/radeonsi/radeonsi_shader.c | 57 > +++++++++++++++++++----- > 1 file changed, 45 insertions(+), 12 deletions(-) > > diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c > b/src/gallium/drivers/radeonsi/radeonsi_shader.c > index 33f79e7..840537a 100644 > --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c > +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c > @@ -63,6 +63,8 @@ struct si_shader_context > LLVMValueRef const_md; > LLVMValueRef const_resource; > LLVMValueRef *constants; > + LLVMValueRef *resources; > + LLVMValueRef *samplers; > }; > > static struct si_shader_context * si_shader_context( > @@ -740,8 +742,6 @@ static void tex_fetch_args( > const struct tgsi_full_instruction * inst = emit_data->inst; > unsigned opcode = inst->Instruction.Opcode; > unsigned target = inst->Texture.Texture; > - LLVMValueRef ptr; > - LLVMValueRef offset; > LLVMValueRef coords[4]; > LLVMValueRef address[16]; > unsigned count = 0; > @@ -859,18 +859,10 @@ static void tex_fetch_args( > emit_data->args[1] = lp_build_gather_values(gallivm, address, count); > > /* Resource */ > - ptr = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, > SI_PARAM_RESOURCE); > - offset = lp_build_const_int32(bld_base->base.gallivm, > - emit_data->inst->Src[1].Register.Index); > - emit_data->args[2] = build_indexed_load(si_shader_ctx, > - ptr, offset); > + emit_data->args[2] = > si_shader_ctx->resources[emit_data->inst->Src[1].Register.Index]; > > /* Sampler */ > - ptr = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, > SI_PARAM_SAMPLER); > - offset = lp_build_const_int32(bld_base->base.gallivm, > - emit_data->inst->Src[1].Register.Index); > - emit_data->args[3] = build_indexed_load(si_shader_ctx, > - ptr, offset); > + emit_data->args[3] = > si_shader_ctx->samplers[emit_data->inst->Src[1].Register.Index]; > > /* Dimensions */ > emit_data->args[4] = lp_build_const_int32(bld_base->base.gallivm, > target); > @@ -1009,6 +1001,40 @@ static void preload_constants(struct si_shader_context > *si_shader_ctx) > } > } > > +static void preload_samplers(struct si_shader_context *si_shader_ctx) > +{ > + struct lp_build_tgsi_context * bld_base = > &si_shader_ctx->radeon_bld.soa.bld_base; > + struct gallivm_state * gallivm = bld_base->base.gallivm; > + const struct tgsi_shader_info * info = bld_base->info; > + > + unsigned i, num_samplers = info->file_max[TGSI_FILE_SAMPLER] + 1; > + > + LLVMValueRef res_ptr, samp_ptr; > + LLVMValueRef offset; > + > + if (num_samplers == 0) > + return; > + > + /* Allocate space for the values */ > + si_shader_ctx->resources = CALLOC(num_samplers, sizeof(LLVMValueRef)); > + si_shader_ctx->samplers = CALLOC(num_samplers, sizeof(LLVMValueRef)); > + > + res_ptr = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, > SI_PARAM_RESOURCE); > + samp_ptr = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, > SI_PARAM_SAMPLER); > + > + /* Load the resources and samplers, we rely on the code sinking to do > the rest */ > + for (i = 0; i < num_samplers; ++i) { > + > + /* Resource */ > + offset = lp_build_const_int32(gallivm, i); > + si_shader_ctx->resources[i] = > build_indexed_load(si_shader_ctx, res_ptr, offset); > + > + /* Sampler */ > + offset = lp_build_const_int32(gallivm, i); > + si_shader_ctx->samplers[i] = > build_indexed_load(si_shader_ctx, samp_ptr, offset); > + } > +} > +
Is there ever a case when num_samplers != num_resources? Alex > int si_pipe_shader_create( > struct pipe_context *ctx, > struct si_pipe_shader *shader, > @@ -1058,6 +1084,7 @@ int si_pipe_shader_create( > create_meta_data(&si_shader_ctx); > create_function(&si_shader_ctx); > preload_constants(&si_shader_ctx); > + preload_samplers(&si_shader_ctx); > > shader->shader.nr_cbufs = rctx->framebuffer.nr_cbufs; > > @@ -1070,6 +1097,8 @@ int si_pipe_shader_create( > if (!lp_build_tgsi_llvm(bld_base, sel->tokens)) { > fprintf(stderr, "Failed to translate shader from TGSI to > LLVM\n"); > FREE(si_shader_ctx.constants); > + FREE(si_shader_ctx.resources); > + FREE(si_shader_ctx.samplers); > return -EINVAL; > } > > @@ -1102,6 +1131,8 @@ int si_pipe_shader_create( > inst_byte_count - 12); > if (shader->bo == NULL) { > FREE(si_shader_ctx.constants); > + FREE(si_shader_ctx.resources); > + FREE(si_shader_ctx.samplers); > return -ENOMEM; > } > > @@ -1116,6 +1147,8 @@ int si_pipe_shader_create( > rctx->ws->buffer_unmap(shader->bo->cs_buf); > > FREE(si_shader_ctx.constants); > + FREE(si_shader_ctx.resources); > + FREE(si_shader_ctx.samplers); > free(inst_bytes); > > return 0; > -- > 1.7.9.5 > > _______________________________________________ > 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