----- Original Message ----- > On Fri, Jun 08, 2012 at 09:01:42AM -0700, Jose Fonseca wrote: > > Oliver, > > > > There will be other system values in the future, so instead of > > passing every value as a different parameter, please define a > > structure in src/gallium/auxiliary/gallivm/lp_bld_tgsi.h as > > > > struct lp_bld_tgsi_system_values { > > LLVMValueRef facing; > > LLVMValueRef instance_id; > > LLVMValueRef vertex_id; > > ... > > } > > > > which is then passed to lp_build_tgsi_soa and all other functions. > > > > Otherwise the change looks good overall. > > Something like that for the second part?
Yep, that looks good to me. Thanks. Jose > > OG. > > Author: Olivier Galibert <galib...@pobox.com> > Date: Fri Jun 1 22:58:58 2012 +0200 > > llvmpipe: Add vertex id support. > > Signed-off-by: Olivier Galibert <galib...@pobox.com> > > diff --git a/src/gallium/auxiliary/draw/draw_llvm.c > b/src/gallium/auxiliary/draw/draw_llvm.c > index d5eb727..de495cf 100644 > --- a/src/gallium/auxiliary/draw/draw_llvm.c > +++ b/src/gallium/auxiliary/draw/draw_llvm.c > @@ -456,7 +456,7 @@ generate_vs(struct draw_llvm *llvm, > LLVMBuilderRef builder, > LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS], > const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS], > - LLVMValueRef instance_id, > + const struct lp_bld_tgsi_system_values *system_values, > LLVMValueRef context_ptr, > struct lp_build_sampler_soa *draw_sampler, > boolean clamp_vertex_color) > @@ -488,7 +488,7 @@ generate_vs(struct draw_llvm *llvm, > vs_type, > NULL /*struct lp_build_mask_context *mask*/, > consts_ptr, > - instance_id, > + system_values, > NULL /*pos*/, > inputs, > outputs, > @@ -1245,7 +1245,6 @@ draw_llvm_generate(struct draw_llvm *llvm, > struct draw_llvm_variant *variant, > LLVMValueRef count, fetch_elts, fetch_count; > LLVMValueRef stride, step, io_itr; > LLVMValueRef io_ptr, vbuffers_ptr, vb_ptr; > - LLVMValueRef instance_id; > LLVMValueRef zero = lp_build_const_int32(gallivm, 0); > LLVMValueRef one = lp_build_const_int32(gallivm, 1); > struct draw_context *draw = llvm->draw; > @@ -1267,6 +1266,9 @@ draw_llvm_generate(struct draw_llvm *llvm, > struct draw_llvm_variant *variant, > const unsigned pos = > draw_current_shader_position_output(llvm->draw); > const unsigned cv = > draw_current_shader_clipvertex_output(llvm->draw); > boolean have_clipdist = FALSE; > + struct lp_bld_tgsi_system_values system_values; > + > + memset(&system_values, 0, sizeof(system_values)); > > arg_types[0] = get_context_ptr_type(llvm); /* context */ > arg_types[1] = get_vertex_header_ptr_type(llvm); /* vertex_header > */ > @@ -1297,19 +1299,19 @@ draw_llvm_generate(struct draw_llvm *llvm, > struct draw_llvm_variant *variant, > LLVMAddAttribute(LLVMGetParam(variant_func, i), > LLVMNoAliasAttribute); > > - context_ptr = LLVMGetParam(variant_func, 0); > - io_ptr = LLVMGetParam(variant_func, 1); > - vbuffers_ptr = LLVMGetParam(variant_func, 2); > - stride = LLVMGetParam(variant_func, 5); > - vb_ptr = LLVMGetParam(variant_func, 6); > - instance_id = LLVMGetParam(variant_func, 7); > + context_ptr = LLVMGetParam(variant_func, 0); > + io_ptr = LLVMGetParam(variant_func, 1); > + vbuffers_ptr = LLVMGetParam(variant_func, 2); > + stride = LLVMGetParam(variant_func, 5); > + vb_ptr = LLVMGetParam(variant_func, 6); > + system_values.instance_id = LLVMGetParam(variant_func, 7); > > lp_build_name(context_ptr, "context"); > lp_build_name(io_ptr, "io"); > lp_build_name(vbuffers_ptr, "vbuffers"); > lp_build_name(stride, "stride"); > lp_build_name(vb_ptr, "vb"); > - lp_build_name(instance_id, "instance_id"); > + lp_build_name(system_values.instance_id, "instance_id"); > > if (elts) { > fetch_elts = LLVMGetParam(variant_func, 3); > @@ -1375,6 +1377,7 @@ draw_llvm_generate(struct draw_llvm *llvm, > struct draw_llvm_variant *variant, > lp_build_printf(builder, " --- io %d = %p, loop counter %d\n", > io_itr, io, lp_loop.counter); > #endif > + system_values.vertex_id = lp_build_zero(gallivm, > lp_type_uint_vec(32)); > for (i = 0; i < TGSI_NUM_CHANNELS; ++i) { > LLVMValueRef true_index = > LLVMBuildAdd(builder, > @@ -1392,7 +1395,10 @@ draw_llvm_generate(struct draw_llvm *llvm, > struct draw_llvm_variant *variant, > &true_index, 1, ""); > true_index = LLVMBuildLoad(builder, fetch_ptr, > "fetch_elt"); > } > - > + > + system_values.vertex_id = > LLVMBuildInsertElement(gallivm->builder, > + > > system_values.vertex_id, > true_index, > + > > lp_build_const_int32(gallivm, > i), ""); > for (j = 0; j < draw->pt.nr_vertex_elements; ++j) { > struct pipe_vertex_element *velem = > &draw->pt.vertex_element[j]; > LLVMValueRef vb_index = > @@ -1400,7 +1406,7 @@ draw_llvm_generate(struct draw_llvm *llvm, > struct draw_llvm_variant *variant, > LLVMValueRef vb = LLVMBuildGEP(builder, vb_ptr, > &vb_index, 1, ""); > generate_fetch(gallivm, vbuffers_ptr, > &aos_attribs[j][i], velem, vb, > true_index, > - instance_id); > + system_values.instance_id); > } > } > convert_to_soa(gallivm, aos_attribs, inputs, > @@ -1411,7 +1417,7 @@ draw_llvm_generate(struct draw_llvm *llvm, > struct draw_llvm_variant *variant, > builder, > outputs, > ptr_aos, > - instance_id, > + &system_values, > context_ptr, > sampler, > variant->key.clamp_vertex_color); > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > index c4e690c..4423bc5 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > @@ -146,6 +146,15 @@ struct lp_tgsi_info > }; > > /** > + * Reference to system values. > + */ > +struct lp_bld_tgsi_system_values { > + LLVMValueRef instance_id; > + LLVMValueRef vertex_id; > +}; > + > + > +/** > * Sampler code generation interface. > * > * Although texture sampling is a requirement for TGSI translation, > it is > @@ -205,7 +214,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm, > struct lp_type type, > struct lp_build_mask_context *mask, > LLVMValueRef consts_ptr, > - LLVMValueRef instance_id, > + const struct lp_bld_tgsi_system_values > *system_values, > const LLVMValueRef *pos, > const LLVMValueRef (*inputs)[4], > LLVMValueRef (*outputs)[4], > @@ -381,7 +390,7 @@ struct lp_build_tgsi_soa_context > */ > LLVMValueRef inputs_array; > > - LLVMValueRef instance_id; > + struct lp_bld_tgsi_system_values system_values; > > /** bitmask indicating which register files are accessed > indirectly */ > unsigned indirect_files; > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > index 26be902..d9faaf2 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > @@ -795,7 +795,12 @@ emit_fetch_system_value( > > switch (info->system_value_semantic_name[reg->Register.Index]) { > case TGSI_SEMANTIC_INSTANCEID: > - res = lp_build_broadcast_scalar(&bld_base->uint_bld, > bld->instance_id); > + res = lp_build_broadcast_scalar(&bld_base->uint_bld, > bld->system_values.instance_id); > + atype = TGSI_TYPE_UNSIGNED; > + break; > + > + case TGSI_SEMANTIC_VERTEXID: > + res = bld->system_values.vertex_id; > atype = TGSI_TYPE_UNSIGNED; > break; > > @@ -1995,7 +2000,7 @@ lp_build_tgsi_soa(struct gallivm_state > *gallivm, > struct lp_type type, > struct lp_build_mask_context *mask, > LLVMValueRef consts_ptr, > - LLVMValueRef instance_id, > + const struct lp_bld_tgsi_system_values > *system_values, > const LLVMValueRef *pos, > const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS], > LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS], > @@ -2070,7 +2075,7 @@ lp_build_tgsi_soa(struct gallivm_state > *gallivm, > > lp_exec_mask_init(&bld.exec_mask, &bld.bld_base.base); > > - bld.instance_id = instance_id; > + bld.system_values = *system_values; > > lp_build_tgsi_llvm(&bld.bld_base, tokens); > > diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c > b/src/gallium/drivers/llvmpipe/lp_state_fs.c > index 3b69dad..7e52eb0 100644 > --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c > +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c > @@ -245,6 +245,9 @@ generate_fs(struct gallivm_state *gallivm, > unsigned chan; > unsigned cbuf; > unsigned depth_mode; > + struct lp_bld_tgsi_system_values system_values; > + > + memset(&system_values, 0, sizeof(system_values)); > > if (key->depth.enabled || > key->stencil[0].enabled || > @@ -334,7 +337,7 @@ generate_fs(struct gallivm_state *gallivm, > > /* Build the actual shader */ > lp_build_tgsi_soa(gallivm, tokens, type, &mask, > - consts_ptr, NULL, /* instance id */ > + consts_ptr, &system_values, > interp->pos, interp->inputs, > outputs, sampler, &shader->info.base); > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev