[Mesa-dev] [PATCH 2/2] gallivm: use texture target from shader instead of static state for size query

Zack Rusin zackr at vmware.com
Thu Aug 8 13:07:38 PDT 2013


Series looks good to me.

Reviewed-by: Zack Rusin <zackr at vmware.com>

----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
> 
> d3d10 has no notion of distinct array resources neither at the resource nor
> sampler view level. However, shader dcl of resources certainly has, and
> d3d10 expects resinfo to return the values according to that - in particular
> a resource might have been a 1d texture with some array layers, then the
> sampler view might have only used 1 layer so it can be accessed both as 1d
> or 1d array texture (I think - the former definitely works). resinfo of a
> resource decleared as array needs to return number of array layers but
> non-array resource needs to return 0 (and not 1). Hence fix this by passing
> the target from the shader decl to emit_size_query and use that (in case of
> OpenGL the target will come from the instruction itself).
> Could probably do the same for actual sampling, though it may not matter
> there
> (as the bogus components will essentially get clamped away), possibly could
> wreak havoc though if it REALLY doesn't match (which is of course an error
> but still).
> ---
>  src/gallium/auxiliary/draw/draw_llvm_sample.c     |    2 +
>  src/gallium/auxiliary/gallivm/lp_bld_sample.h     |    1 +
>  src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c |   32 ++++++++++++++-
>  src/gallium/auxiliary/gallivm/lp_bld_tgsi.h       |    1 +
>  src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c   |   43
>  ++++++++++++++++++++-
>  src/gallium/drivers/llvmpipe/lp_tex_sample.c      |    2 +
>  6 files changed, 77 insertions(+), 4 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/draw/draw_llvm_sample.c
> b/src/gallium/auxiliary/draw/draw_llvm_sample.c
> index 3016d7c..f10cba3 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm_sample.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm_sample.c
> @@ -270,6 +270,7 @@ draw_llvm_sampler_soa_emit_size_query(const struct
> lp_build_sampler_soa *base,
>                                        struct gallivm_state *gallivm,
>                                        struct lp_type type,
>                                        unsigned texture_unit,
> +                                      unsigned target,
>                                        boolean need_nr_mips,
>                                        boolean scalar_lod,
>                                        LLVMValueRef explicit_lod, /* optional
>                                        */
> @@ -284,6 +285,7 @@ draw_llvm_sampler_soa_emit_size_query(const struct
> lp_build_sampler_soa *base,
>                             &sampler->dynamic_state.base,
>                             type,
>                             texture_unit,
> +                           target,
>                             need_nr_mips,
>                             scalar_lod,
>                             explicit_lod,
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> b/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> index dff8be2..db3ea1d 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> @@ -497,6 +497,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
>                          struct lp_sampler_dynamic_state *dynamic_state,
>                          struct lp_type int_type,
>                          unsigned texture_unit,
> +                        unsigned target,
>                          boolean need_nr_mips,
>                          boolean scalar_lod,
>                          LLVMValueRef explicit_lod,
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index b0bb58b..e403ac8 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -1943,6 +1943,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
>                          struct lp_sampler_dynamic_state *dynamic_state,
>                          struct lp_type int_type,
>                          unsigned texture_unit,
> +                        unsigned target,
>                          boolean need_nr_mips,
>                          boolean scalar_lod,
>                          LLVMValueRef explicit_lod,
> @@ -1955,9 +1956,36 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
>     unsigned num_lods = 1;
>     struct lp_build_context bld_int_vec;
>  
> -   dims = texture_dims(static_state->target);
> +   /*
> +    * Do some sanity verification about bound texture and shader dcl target.
> +    * Not entirely sure what's possible but assume array/non-array
> +    * always compatible (probably not ok for OpenGL but d3d10 has no
> +    * distinction of arrays at the resource level).
> +    * Everything else looks bogus (though not entirely sure about rect/2d).
> +    * Currently disabled because it causes assertion failures if there's
> +    * nothing bound (or rather a dummy texture, not that this case would
> +    * return the right values).
> +    */
> +   if (0 && static_state->target != target) {
> +      if (static_state->target == PIPE_TEXTURE_1D)
> +         assert(target == PIPE_TEXTURE_1D_ARRAY);
> +      else if (static_state->target == PIPE_TEXTURE_1D_ARRAY)
> +         assert(target == PIPE_TEXTURE_1D);
> +      else if (static_state->target == PIPE_TEXTURE_2D)
> +         assert(target == PIPE_TEXTURE_2D_ARRAY);
> +      else if (static_state->target == PIPE_TEXTURE_2D_ARRAY)
> +         assert(target == PIPE_TEXTURE_2D);
> +      else if (static_state->target == PIPE_TEXTURE_CUBE)
> +         assert(target == PIPE_TEXTURE_CUBE_ARRAY);
> +      else if (static_state->target == PIPE_TEXTURE_CUBE_ARRAY)
> +         assert(target == PIPE_TEXTURE_CUBE);
> +      else
> +         assert(0);
> +   }
> +
> +   dims = texture_dims(target);
>  
> -   switch (static_state->target) {
> +   switch (target) {
>     case PIPE_TEXTURE_1D_ARRAY:
>     case PIPE_TEXTURE_2D_ARRAY:
>        has_array = TRUE;
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> index aec019a..9d27f5f 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> @@ -192,6 +192,7 @@ struct lp_build_sampler_soa
>                         struct gallivm_state *gallivm,
>                         struct lp_type type,
>                         unsigned unit,
> +                       unsigned target,
>                         boolean need_nr_mips,
>                         boolean scalar_lod,
>                         LLVMValueRef explicit_lod, /* optional */
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index 02d804a..affe059 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -1564,6 +1564,43 @@ emit_store(
>     }
>  }
>  
> +static unsigned
> +tgsi_to_pipe_tex_target(unsigned tgsi_target)
> +{
> +   switch (tgsi_target) {
> +   case TGSI_TEXTURE_BUFFER:
> +      return PIPE_BUFFER;
> +   case TGSI_TEXTURE_1D:
> +   case TGSI_TEXTURE_SHADOW1D:
> +      return PIPE_TEXTURE_1D;
> +   case TGSI_TEXTURE_2D:
> +   case TGSI_TEXTURE_SHADOW2D:
> +   case TGSI_TEXTURE_2D_MSAA:
> +      return PIPE_TEXTURE_2D;
> +   case TGSI_TEXTURE_3D:
> +      return PIPE_TEXTURE_3D;
> +   case TGSI_TEXTURE_CUBE:
> +   case TGSI_TEXTURE_SHADOWCUBE:
> +      return PIPE_TEXTURE_CUBE;
> +   case TGSI_TEXTURE_RECT:
> +   case TGSI_TEXTURE_SHADOWRECT:
> +      return PIPE_TEXTURE_RECT;
> +   case TGSI_TEXTURE_1D_ARRAY:
> +   case TGSI_TEXTURE_SHADOW1D_ARRAY:
> +      return PIPE_TEXTURE_1D_ARRAY;
> +   case TGSI_TEXTURE_2D_ARRAY:
> +   case TGSI_TEXTURE_SHADOW2D_ARRAY:
> +   case TGSI_TEXTURE_2D_ARRAY_MSAA:
> +      return PIPE_TEXTURE_2D_ARRAY;
> +   case TGSI_TEXTURE_CUBE_ARRAY:
> +   case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> +      return PIPE_TEXTURE_CUBE_ARRAY;
> +   default:
> +      assert(0);
> +      return PIPE_BUFFER;
> +   }
> +}
> +
>  /**
>   * High-level instruction translators.
>   */
> @@ -1994,7 +2031,7 @@ emit_size_query( struct lp_build_tgsi_soa_context *bld,
>     unsigned has_lod;
>     unsigned i;
>     unsigned unit = inst->Src[1].Register.Index;
> -   unsigned target;
> +   unsigned target, pipe_target;
>  
>     if (is_sviewinfo) {
>        target = bld->sv[unit].Resource;
> @@ -2025,13 +2062,15 @@ emit_size_query( struct lp_build_tgsi_soa_context
> *bld,
>     else
>        explicit_lod = NULL;
>  
> +   pipe_target = tgsi_to_pipe_tex_target(target);
> +
>     /* TODO: use scalar lod if explicit_lod is broadcasted scalar */
>     scalar_lod = bld->bld_base.info->processor == TGSI_PROCESSOR_FRAGMENT;
>  
>     bld->sampler->emit_size_query(bld->sampler,
>                                   bld->bld_base.base.gallivm,
>                                   bld->bld_base.int_bld.type,
> -                                 unit,
> +                                 unit, pipe_target,
>                                   is_sviewinfo,
>                                   scalar_lod,
>                                   explicit_lod,
> diff --git a/src/gallium/drivers/llvmpipe/lp_tex_sample.c
> b/src/gallium/drivers/llvmpipe/lp_tex_sample.c
> index 2aec6ea..5402de4 100644
> --- a/src/gallium/drivers/llvmpipe/lp_tex_sample.c
> +++ b/src/gallium/drivers/llvmpipe/lp_tex_sample.c
> @@ -280,6 +280,7 @@ lp_llvm_sampler_soa_emit_size_query(const struct
> lp_build_sampler_soa *base,
>                                      struct gallivm_state *gallivm,
>                                      struct lp_type type,
>                                      unsigned texture_unit,
> +                                    unsigned target,
>                                      boolean need_nr_mips,
>                                      boolean scalar_lod,
>                                      LLVMValueRef explicit_lod, /* optional
>                                      */
> @@ -294,6 +295,7 @@ lp_llvm_sampler_soa_emit_size_query(const struct
> lp_build_sampler_soa *base,
>                             &sampler->dynamic_state.base,
>                             type,
>                             texture_unit,
> +                           target,
>                             need_nr_mips,
>                             scalar_lod,
>                             explicit_lod,
> --
> 1.7.9.5
> 


More information about the mesa-dev mailing list