[Mesa-dev] [PATCH] gallivm: cleanup the gs interface

Jose Fonseca jfonseca at vmware.com
Fri Mar 29 03:39:22 PDT 2013


Thanks for the cleanup.

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>

Jose

----- Original Message -----
> Instead of void pointers use a base interface.
> 
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
>  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
> 
> 



More information about the mesa-dev mailing list