[Mesa-dev] [PATCH 2/2] draw/gallivm: add invocation ID support for llvmpipe.

Roland Scheidegger sroland at vmware.com
Mon Jun 22 14:29:51 PDT 2015


For the series:
Reviewed-by: Roland Scheidegger <sroland at vmware.com>


Am 22.06.2015 um 06:01 schrieb Dave Airlie:
> From: Dave Airlie <airlied at redhat.com>
> 
> This extends the draw code to add support for invocations.
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/gallium/auxiliary/draw/draw_gs.c            | 3 ++-
>  src/gallium/auxiliary/draw/draw_llvm.c          | 5 ++++-
>  src/gallium/auxiliary/draw/draw_llvm.h          | 3 ++-
>  src/gallium/auxiliary/gallivm/lp_bld_tgsi.h     | 1 +
>  src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 5 +++++
>  5 files changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
> index 755e527..a1564f9 100644
> --- a/src/gallium/auxiliary/draw/draw_gs.c
> +++ b/src/gallium/auxiliary/draw/draw_gs.c
> @@ -391,7 +391,8 @@ llvm_gs_run(struct draw_geometry_shader *shader,
>        (struct vertex_header*)input,
>        input_primitives,
>        shader->draw->instance_id,
> -      shader->llvm_prim_ids);
> +      shader->llvm_prim_ids,
> +      shader->invocation_id);
>  
>     return ret;
>  }
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
> index 9629a8a..90a31bc 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> @@ -2069,7 +2069,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
>     struct gallivm_state *gallivm = variant->gallivm;
>     LLVMContextRef context = gallivm->context;
>     LLVMTypeRef int32_type = LLVMInt32TypeInContext(context);
> -   LLVMTypeRef arg_types[6];
> +   LLVMTypeRef arg_types[7];
>     LLVMTypeRef func_type;
>     LLVMValueRef variant_func;
>     LLVMValueRef context_ptr;
> @@ -2105,6 +2105,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
>     arg_types[4] = int32_type;                          /* instance_id */
>     arg_types[5] = LLVMPointerType(
>        LLVMVectorType(int32_type, vector_length), 0);   /* prim_id_ptr */
> +   arg_types[6] = int32_type;
>  
>     func_type = LLVMFunctionType(int32_type, arg_types, Elements(arg_types), 0);
>  
> @@ -2125,6 +2126,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
>     num_prims                 = LLVMGetParam(variant_func, 3);
>     system_values.instance_id = LLVMGetParam(variant_func, 4);
>     prim_id_ptr               = LLVMGetParam(variant_func, 5);
> +   system_values.invocation_id = LLVMGetParam(variant_func, 6);
>  
>     lp_build_name(context_ptr, "context");
>     lp_build_name(input_array, "input");
> @@ -2132,6 +2134,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
>     lp_build_name(num_prims, "num_prims");
>     lp_build_name(system_values.instance_id, "instance_id");
>     lp_build_name(prim_id_ptr, "prim_id_ptr");
> +   lp_build_name(system_values.invocation_id, "invocation_id");
>  
>     variant->context_ptr = context_ptr;
>     variant->io_ptr = io_ptr;
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h
> index 9565fc6..d48ed72 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.h
> +++ b/src/gallium/auxiliary/draw/draw_llvm.h
> @@ -298,7 +298,8 @@ typedef int
>                      struct vertex_header *output,
>                      unsigned num_prims,
>                      unsigned instance_id,
> -                    int *prim_ids);
> +                    int *prim_ids,
> +                    unsigned invocation_id);
>  
>  struct draw_llvm_variant_key
>  {
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> index 3f76b79..967373c 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> @@ -165,6 +165,7 @@ struct lp_bld_tgsi_system_values {
>     LLVMValueRef vertex_id_nobase;
>     LLVMValueRef prim_id;
>     LLVMValueRef basevertex;
> +   LLVMValueRef invocation_id;
>  };
>  
>  
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index 092bd18..268379e 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -1532,6 +1532,11 @@ emit_fetch_system_value(
>        atype = TGSI_TYPE_UNSIGNED;
>        break;
>  
> +   case TGSI_SEMANTIC_INVOCATIONID:
> +      res = lp_build_broadcast_scalar(&bld_base->uint_bld, bld->system_values.invocation_id);
> +      atype = TGSI_TYPE_UNSIGNED;
> +      break;
> +
>     default:
>        assert(!"unexpected semantic in emit_fetch_system_value");
>        res = bld_base->base.zero;
> 



More information about the mesa-dev mailing list