Series looks good to me. Reviewed-by: Zack Rusin <[email protected]>
----- Original Message ----- > From: Roland Scheidegger <[email protected]> > > 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 > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
