Thanks for the cleanup. Reviewed-by: Jose Fonseca <[email protected]>
Jose ----- Original Message ----- > Instead of void pointers use a base interface. > > Signed-off-by: Zack Rusin <[email protected]> > --- > src/gallium/auxiliary/draw/draw_llvm.c | 77 > ++++++++++++++++------- > src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 25 ++++---- > src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 31 ++++----- > 3 files changed, 83 insertions(+), 50 deletions(-) > > diff --git a/src/gallium/auxiliary/draw/draw_llvm.c > b/src/gallium/auxiliary/draw/draw_llvm.c > index 3ce48d8..efbcb04 100644 > --- a/src/gallium/auxiliary/draw/draw_llvm.c > +++ b/src/gallium/auxiliary/draw/draw_llvm.c > @@ -64,6 +64,13 @@ draw_llvm_generate(struct draw_llvm *llvm, struct > draw_llvm_variant *var, > boolean elts); > > > +struct draw_gs_llvm_iface { > + struct lp_build_tgsi_gs_iface base; > + > + struct draw_gs_llvm_variant *variant; > + LLVMValueRef input; > +}; > + > /** > * Create LLVM type for struct draw_jit_texture > */ > @@ -1237,14 +1244,39 @@ clipmask_booli32(struct gallivm_state *gallivm, > return ret; > } > > +static LLVMValueRef > +draw_gs_llvm_fetch_input(const struct lp_build_tgsi_gs_iface *gs_iface, > + struct lp_build_tgsi_context * bld_base, > + LLVMValueRef vertex_index, > + LLVMValueRef attrib_index, > + LLVMValueRef swizzle_index) > +{ > + const struct draw_gs_llvm_iface *gs = > + (const struct draw_gs_llvm_iface *)gs_iface; > + struct gallivm_state *gallivm = bld_base->base.gallivm; > + LLVMBuilderRef builder = gallivm->builder; > + LLVMValueRef indices[3]; > + LLVMValueRef res; > + > + indices[0] = vertex_index; > + indices[1] = attrib_index; > + indices[2] = swizzle_index; > + > + res = LLVMBuildGEP(builder, gs->input, indices, 3, ""); > + res = LLVMBuildLoad(builder, res, ""); > + > + return res; > +} > + > static void > -draw_gs_llvm_emit_vertex(struct lp_build_tgsi_context * bld_base, > +draw_gs_llvm_emit_vertex(const struct lp_build_tgsi_gs_iface *gs_base, > + struct lp_build_tgsi_context * bld_base, > LLVMValueRef (*outputs)[4], > - LLVMValueRef emitted_vertices_vec, > - void *user_data) > + LLVMValueRef emitted_vertices_vec) > { > - struct draw_gs_llvm_variant *variant = > - (struct draw_gs_llvm_variant *)user_data; > + const struct draw_gs_llvm_iface *gs_iface = > + (const struct draw_gs_llvm_iface *)gs_base; > + struct draw_gs_llvm_variant *variant = gs_iface->variant; > struct gallivm_state *gallivm = variant->gallivm; > LLVMBuilderRef builder = gallivm->builder; > struct lp_type gs_type = bld_base->base.type; > @@ -1272,13 +1304,14 @@ draw_gs_llvm_emit_vertex(struct lp_build_tgsi_context > * bld_base, > } > > static void > -draw_gs_llvm_end_primitive(struct lp_build_tgsi_context * bld_base, > +draw_gs_llvm_end_primitive(const struct lp_build_tgsi_gs_iface *gs_base, > + struct lp_build_tgsi_context * bld_base, > LLVMValueRef verts_per_prim_vec, > - LLVMValueRef emitted_prims_vec, > - void *user_data) > + LLVMValueRef emitted_prims_vec) > { > - struct draw_gs_llvm_variant *variant = > - (struct draw_gs_llvm_variant *)user_data; > + const struct draw_gs_llvm_iface *gs_iface = > + (const struct draw_gs_llvm_iface *)gs_base; > + struct draw_gs_llvm_variant *variant = gs_iface->variant; > struct gallivm_state *gallivm = variant->gallivm; > LLVMBuilderRef builder = gallivm->builder; > LLVMValueRef prim_lengts_ptr = > @@ -1301,13 +1334,14 @@ draw_gs_llvm_end_primitive(struct > lp_build_tgsi_context * bld_base, > } > > static void > -draw_gs_llvm_epilogue(struct lp_build_tgsi_context * bld_base, > +draw_gs_llvm_epilogue(const struct lp_build_tgsi_gs_iface *gs_base, > + struct lp_build_tgsi_context * bld_base, > LLVMValueRef total_emitted_vertices_vec, > - LLVMValueRef emitted_prims_vec, > - void *user_data) > + LLVMValueRef emitted_prims_vec) > { > - struct draw_gs_llvm_variant *variant = > - (struct draw_gs_llvm_variant *)user_data; > + const struct draw_gs_llvm_iface *gs_iface = > + (const struct draw_gs_llvm_iface *)gs_base; > + struct draw_gs_llvm_variant *variant = gs_iface->variant; > struct gallivm_state *gallivm = variant->gallivm; > LLVMBuilderRef builder = gallivm->builder; > LLVMValueRef emitted_verts_ptr = > @@ -1867,7 +1901,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm, > struct lp_bld_tgsi_system_values system_values; > struct lp_type gs_type; > unsigned i; > - struct lp_build_tgsi_gs_iface gs_iface; > + struct draw_gs_llvm_iface gs_iface; > const struct tgsi_token *tokens = variant->shader->base.state.tokens; > LLVMValueRef consts_ptr; > LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS]; > @@ -1912,11 +1946,12 @@ draw_gs_llvm_generate(struct draw_llvm *llvm, > variant->io_ptr = io_ptr; > variant->num_prims = num_prims; > > + gs_iface.base.fetch_input = draw_gs_llvm_fetch_input; > + gs_iface.base.emit_vertex = draw_gs_llvm_emit_vertex; > + gs_iface.base.end_primitive = draw_gs_llvm_end_primitive; > + gs_iface.base.gs_epilogue = draw_gs_llvm_epilogue; > gs_iface.input = input_array; > - gs_iface.emit_vertex = draw_gs_llvm_emit_vertex; > - gs_iface.end_primitive = draw_gs_llvm_end_primitive; > - gs_iface.gs_epilogue = draw_gs_llvm_epilogue; > - gs_iface.user_data = variant; > + gs_iface.variant = variant; > > /* > * Function body > @@ -1955,7 +1990,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm, > outputs, > sampler, > &llvm->draw->gs.geometry_shader->info, > - &gs_iface); > + (const struct lp_build_tgsi_gs_iface *)&gs_iface); > > sampler->destroy(sampler); > > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > index fe4444e..5764847 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h > @@ -365,20 +365,23 @@ struct lp_build_tgsi_context > > struct lp_build_tgsi_gs_iface > { > - LLVMValueRef input; > - void (*emit_vertex)(struct lp_build_tgsi_context * bld_base, > + LLVMValueRef (*fetch_input)(const struct lp_build_tgsi_gs_iface > *gs_iface, > + struct lp_build_tgsi_context * bld_base, > + LLVMValueRef vertex_index, > + LLVMValueRef attrib_index, > + LLVMValueRef swizzle_index); > + void (*emit_vertex)(const struct lp_build_tgsi_gs_iface *gs_iface, > + struct lp_build_tgsi_context * bld_base, > LLVMValueRef (*outputs)[4], > - LLVMValueRef emitted_vertices_vec, > - void *user_data); > - void (*end_primitive)(struct lp_build_tgsi_context * bld_base, > + LLVMValueRef emitted_vertices_vec); > + void (*end_primitive)(const struct lp_build_tgsi_gs_iface *gs_iface, > + struct lp_build_tgsi_context * bld_base, > LLVMValueRef verts_per_prim_vec, > - LLVMValueRef emitted_prims_vec, > - void *user_data); > - void (*gs_epilogue)(struct lp_build_tgsi_context * bld_base, > + LLVMValueRef emitted_prims_vec); > + void (*gs_epilogue)(const struct lp_build_tgsi_gs_iface *gs_iface, > + struct lp_build_tgsi_context * bld_base, > LLVMValueRef total_emitted_vertices_vec, > - LLVMValueRef emitted_prims_vec, > - void *user_data); > - void *user_data; > + LLVMValueRef emitted_prims_vec); > }; > > struct lp_build_tgsi_soa_context > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > index d038b05..af3140c 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c > @@ -805,11 +805,9 @@ emit_fetch_gs_input( > struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); > struct gallivm_state *gallivm = bld->bld_base.base.gallivm; > LLVMBuilderRef builder = gallivm->builder; > - //struct lp_build_context *uint_bld = &bld_base->uint_bld; > LLVMValueRef attrib_index = NULL; > LLVMValueRef vertex_index = NULL; > LLVMValueRef swizzle_index = lp_build_const_int32(gallivm, swizzle); > - LLVMValueRef indices[3]; > LLVMValueRef res; > > if (reg->Register.Indirect) { > @@ -830,12 +828,10 @@ emit_fetch_gs_input( > vertex_index = lp_build_const_int32(gallivm, reg->Dimension.Index); > } > > - indices[0] = vertex_index; > - indices[1] = attrib_index; > - indices[2] = swizzle_index; > > - res = LLVMBuildGEP(builder, bld->gs_iface->input, indices, 3, ""); > - res = LLVMBuildLoad(builder, res, ""); > + res = bld->gs_iface->fetch_input(bld->gs_iface, bld_base, > + vertex_index, attrib_index, > + swizzle_index); > > assert(res); > > @@ -2200,9 +2196,9 @@ emit_vertex( > if (bld->gs_iface->emit_vertex) { > LLVMValueRef masked_ones = mask_to_one_vec(bld_base); > gather_outputs(bld); > - bld->gs_iface->emit_vertex(&bld->bld_base, bld->outputs, > - bld->total_emitted_vertices_vec, > - bld->gs_iface->user_data); > + bld->gs_iface->emit_vertex(bld->gs_iface, &bld->bld_base, > + bld->outputs, > + bld->total_emitted_vertices_vec); > bld->emitted_vertices_vec = > LLVMBuildAdd(builder, bld->emitted_vertices_vec, masked_ones, ""); > bld->total_emitted_vertices_vec = > @@ -2223,10 +2219,9 @@ end_primitive( > > if (bld->gs_iface->end_primitive) { > LLVMValueRef masked_ones = mask_to_one_vec(bld_base); > - bld->gs_iface->end_primitive(&bld->bld_base, > - bld->emitted_vertices_vec, > - bld->emitted_prims_vec, > - bld->gs_iface->user_data); > + bld->gs_iface->end_primitive(bld->gs_iface, &bld->bld_base, > + bld->emitted_vertices_vec, > + bld->emitted_prims_vec); > bld->emitted_prims_vec = > LLVMBuildAdd(builder, bld->emitted_prims_vec, masked_ones, ""); > bld->emitted_vertices_vec = bld_base->uint_bld.zero; > @@ -2544,10 +2539,10 @@ static void emit_epilogue(struct > lp_build_tgsi_context * bld_base) > bld->pending_end_primitive = FALSE; > } > > - bld->gs_iface->gs_epilogue(&bld->bld_base, > - bld->total_emitted_vertices_vec, > - bld->emitted_prims_vec, > - bld->gs_iface->user_data); > + bld->gs_iface->gs_epilogue(bld->gs_iface, > + &bld->bld_base, > + bld->total_emitted_vertices_vec, > + bld->emitted_prims_vec); > } else { > gather_outputs(bld); > } > -- > 1.7.10.4 > > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
