[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