Am 18.04.2016 um 04:49 schrieb Dave Airlie: > From: Dave Airlie <[email protected]> > > Currently the texture member functions take a texture unit > number, in order for TXQ to work we want to use a dynamic > value here, so we need to pass in an value reference. > > This means we can't do the assert or add the llvm name. > > For most normal users they still pass a constant value here, > just for the TXQ paths do we actually care that it gets the > value. > > Signed-off-by: Dave Airlie <[email protected]> > --- > src/gallium/auxiliary/draw/draw_llvm_sample.c | 10 +++--- > src/gallium/auxiliary/gallivm/lp_bld_sample.c | 13 ++++--- > src/gallium/auxiliary/gallivm/lp_bld_sample.h | 18 +++++----- > src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 41 > ++++++++++++----------- > src/gallium/drivers/llvmpipe/lp_tex_sample.c | 10 +++--- > 5 files changed, 48 insertions(+), 44 deletions(-) > > diff --git a/src/gallium/auxiliary/draw/draw_llvm_sample.c > b/src/gallium/auxiliary/draw/draw_llvm_sample.c > index 1845c05..7e25918 100644 > --- a/src/gallium/auxiliary/draw/draw_llvm_sample.c > +++ b/src/gallium/auxiliary/draw/draw_llvm_sample.c > @@ -85,7 +85,7 @@ static LLVMValueRef > draw_llvm_texture_member(const struct lp_sampler_dynamic_state *base, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit, > + LLVMValueRef tex_unit_ref, > unsigned member_index, > const char *member_name, > boolean emit_load) > @@ -95,14 +95,12 @@ draw_llvm_texture_member(const struct > lp_sampler_dynamic_state *base, > LLVMValueRef ptr; > LLVMValueRef res; > > - debug_assert(texture_unit < PIPE_MAX_SHADER_SAMPLER_VIEWS); > - > /* context[0] */ > indices[0] = lp_build_const_int32(gallivm, 0); > /* context[0].textures */ > indices[1] = lp_build_const_int32(gallivm, DRAW_JIT_CTX_TEXTURES); > /* context[0].textures[unit] */ > - indices[2] = lp_build_const_int32(gallivm, texture_unit); > + indices[2] = tex_unit_ref; > /* context[0].textures[unit].member */ > indices[3] = lp_build_const_int32(gallivm, member_index); > > @@ -113,7 +111,7 @@ draw_llvm_texture_member(const struct > lp_sampler_dynamic_state *base, > else > res = ptr; > > - lp_build_name(res, "context.texture%u.%s", texture_unit, member_name); > +// lp_build_name(res, "context.texture%u.%s", texture_unit, member_name); > > return res; > } > @@ -179,7 +177,7 @@ draw_llvm_sampler_member(const struct > lp_sampler_dynamic_state *base, > draw_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \ > struct gallivm_state *gallivm, \ > LLVMValueRef context_ptr, \ > - unsigned texture_unit) \ > + LLVMValueRef texture_unit) > \ > { \ > return draw_llvm_texture_member(base, gallivm, context_ptr, \ > texture_unit, _index, #_name, > _emit_load ); \ > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.c > b/src/gallium/auxiliary/gallivm/lp_bld_sample.c > index 4befb3a..2f61cbf 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.c > +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.c > @@ -238,6 +238,7 @@ lp_build_rho(struct lp_build_sample_context *bld, > unsigned i; > LLVMValueRef i32undef = > LLVMGetUndef(LLVMInt32TypeInContext(gallivm->context)); > LLVMValueRef rho_xvec, rho_yvec; > + LLVMValueRef tunit = lp_build_const_int32(bld->gallivm, texture_unit); > > /* Note that all simplified calculations will only work for isotropic > filtering */ > > @@ -247,7 +248,7 @@ lp_build_rho(struct lp_build_sample_context *bld, > */ > > first_level = bld->dynamic_state->first_level(bld->dynamic_state, > bld->gallivm, > - bld->context_ptr, > texture_unit); > + bld->context_ptr, tunit); > first_level_vec = lp_build_broadcast_scalar(int_size_bld, first_level); > int_size = lp_build_minify(int_size_bld, bld->int_size, first_level_vec, > TRUE); > float_size = lp_build_int_to_float(float_size_bld, int_size); > @@ -904,11 +905,12 @@ lp_build_nearest_mip_level(struct > lp_build_sample_context *bld, > struct lp_build_context *leveli_bld = &bld->leveli_bld; > struct lp_sampler_dynamic_state *dynamic_state = bld->dynamic_state; > LLVMValueRef first_level, last_level, level; > + LLVMValueRef tunit = lp_build_const_int32(bld->gallivm, texture_unit); > > first_level = dynamic_state->first_level(dynamic_state, bld->gallivm, > - bld->context_ptr, texture_unit); > + bld->context_ptr, tunit); > last_level = dynamic_state->last_level(dynamic_state, bld->gallivm, > - bld->context_ptr, texture_unit); > + bld->context_ptr, tunit); > first_level = lp_build_broadcast_scalar(leveli_bld, first_level); > last_level = lp_build_broadcast_scalar(leveli_bld, last_level); > > @@ -964,13 +966,14 @@ lp_build_linear_mip_levels(struct > lp_build_sample_context *bld, > LLVMValueRef first_level, last_level; > LLVMValueRef clamp_min; > LLVMValueRef clamp_max; > + LLVMValueRef tunit = lp_build_const_int32(bld->gallivm, texture_unit); > > assert(bld->num_lods == bld->num_mips); > > first_level = dynamic_state->first_level(dynamic_state, bld->gallivm, > - bld->context_ptr, texture_unit); > + bld->context_ptr, tunit); > last_level = dynamic_state->last_level(dynamic_state, bld->gallivm, > - bld->context_ptr, texture_unit); > + bld->context_ptr, tunit); > first_level = lp_build_broadcast_scalar(leveli_bld, first_level); > last_level = lp_build_broadcast_scalar(leveli_bld, last_level); > > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.h > b/src/gallium/auxiliary/gallivm/lp_bld_sample.h > index 9ec051a..aecce14 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.h > +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.h > @@ -194,63 +194,63 @@ struct lp_sampler_dynamic_state > (*width)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain the base texture height (returns int32) */ > LLVMValueRef > (*height)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain the base texture depth (or array size) (returns int32) */ > LLVMValueRef > (*depth)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain the first mipmap level (base level) (returns int32) */ > LLVMValueRef > (*first_level)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain the number of mipmap levels minus one (returns int32) */ > LLVMValueRef > (*last_level)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain stride in bytes between image rows/blocks (returns int32) */ > LLVMValueRef > (*row_stride)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain stride in bytes between image slices (returns int32) */ > LLVMValueRef > (*img_stride)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain pointer to base of texture */ > LLVMValueRef > (*base_ptr)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /** Obtain pointer to array of mipmap offsets */ > LLVMValueRef > (*mip_offsets)(const struct lp_sampler_dynamic_state *state, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit); > + LLVMValueRef texture_unit); > > /* These are callbacks for sampler state */ > > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c > b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c > index c16b1c9..d39fb60 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c > +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c > @@ -1743,9 +1743,10 @@ lp_build_layer_coord(struct lp_build_sample_context > *bld, > { > LLVMValueRef num_layers; > struct lp_build_context *int_coord_bld = &bld->int_coord_bld; > + LLVMValueRef tunit = lp_build_const_int32(bld->gallivm, texture_unit); > > num_layers = bld->dynamic_state->depth(bld->dynamic_state, bld->gallivm, > - bld->context_ptr, texture_unit); > + bld->context_ptr, tunit); > > if (out_of_bounds) { > LLVMValueRef out1, out; > @@ -1790,7 +1791,7 @@ lp_build_sample_common(struct lp_build_sample_context > *bld, > LLVMValueRef first_level, cube_rho = NULL; > LLVMValueRef lod_ipart = NULL; > struct lp_derivatives cube_derivs; > - > + LLVMValueRef tunit = lp_build_const_int32(bld->gallivm, texture_index); > /* > printf("%s mip %d min %d mag %d\n", __FUNCTION__, > mip_filter, min_filter, mag_filter); > @@ -1882,7 +1883,7 @@ lp_build_sample_common(struct lp_build_sample_context > *bld, > /* always use mip level 0 */ > first_level = bld->dynamic_state->first_level(bld->dynamic_state, > bld->gallivm, > bld->context_ptr, > - texture_index); > + tunit); > first_level = lp_build_broadcast_scalar(&bld->leveli_bld, first_level); > *ilevel0 = first_level; > break; > @@ -2299,7 +2300,7 @@ lp_build_fetch_texel(struct lp_build_sample_context > *bld, > LLVMValueRef x = coords[0], y = coords[1], z = coords[2]; > LLVMValueRef width, height, depth, i, j; > LLVMValueRef offset, out_of_bounds, out1; > - > + LLVMValueRef tunit = lp_build_const_int32(bld->gallivm, texture_unit); > out_of_bounds = int_coord_bld->zero; > > if (explicit_lod && bld->static_texture_state->target != PIPE_BUFFER) { > @@ -2317,7 +2318,7 @@ lp_build_fetch_texel(struct lp_build_sample_context > *bld, > assert(bld->num_mips == 1); > if (bld->static_texture_state->target != PIPE_BUFFER) { > ilevel = bld->dynamic_state->first_level(bld->dynamic_state, > bld->gallivm, > - bld->context_ptr, > texture_unit); > + bld->context_ptr, tunit); > } > else { > ilevel = lp_build_const_int32(bld->gallivm, 0); > @@ -2466,6 +2467,7 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm, > LLVMValueRef lod_bias = NULL; > LLVMValueRef explicit_lod = NULL; > boolean op_is_tex; > + LLVMValueRef tunit = lp_build_const_int32(gallivm, texture_index); > > if (0) { > enum pipe_format fmt = static_texture_state->format; > @@ -2699,15 +2701,15 @@ lp_build_sample_soa_code(struct gallivm_state > *gallivm, > > /* Get the dynamic state */ > tex_width = dynamic_state->width(dynamic_state, gallivm, > - context_ptr, texture_index); > + context_ptr, tunit); > bld.row_stride_array = dynamic_state->row_stride(dynamic_state, gallivm, > - context_ptr, > texture_index); > + context_ptr, tunit); > bld.img_stride_array = dynamic_state->img_stride(dynamic_state, gallivm, > - context_ptr, > texture_index); > + context_ptr, tunit); > bld.base_ptr = dynamic_state->base_ptr(dynamic_state, gallivm, > - context_ptr, texture_index); > + context_ptr, tunit); > bld.mip_offsets = dynamic_state->mip_offsets(dynamic_state, gallivm, > - context_ptr, texture_index); > + context_ptr, tunit); > /* Note that mip_offsets is an array[level] of offsets to texture images > */ > > if (dynamic_state->cache_ptr && thread_data_ptr) { > @@ -2726,14 +2728,14 @@ lp_build_sample_soa_code(struct gallivm_state > *gallivm, > if (dims >= 2) { > LLVMValueRef tex_height = > dynamic_state->height(dynamic_state, gallivm, > - context_ptr, texture_index); > + context_ptr, tunit); > bld.int_size = LLVMBuildInsertElement(builder, bld.int_size, > tex_height, > LLVMConstInt(i32t, 1, 0), ""); > if (dims >= 3) { > LLVMValueRef tex_depth = > dynamic_state->depth(dynamic_state, gallivm, context_ptr, > - texture_index); > + tunit); > bld.int_size = LLVMBuildInsertElement(builder, bld.int_size, > tex_depth, > LLVMConstInt(i32t, 2, 0), > ""); > @@ -3447,6 +3449,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, > boolean has_array; > unsigned num_lods = 1; > struct lp_build_context bld_int_vec4; > + LLVMValueRef tunit = lp_build_const_int32(gallivm, params->texture_unit); > > if (static_state->format == PIPE_FORMAT_NONE) { > /* > @@ -3510,7 +3513,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, > lod = LLVMBuildExtractElement(gallivm->builder, params->explicit_lod, > lp_build_const_int32(gallivm, 0), ""); > first_level = dynamic_state->first_level(dynamic_state, gallivm, > - params->context_ptr, > params->texture_unit); > + params->context_ptr, tunit); > level = LLVMBuildAdd(gallivm->builder, lod, first_level, "level"); > lod = lp_build_broadcast_scalar(&bld_int_vec4, level); > } else { > @@ -3522,14 +3525,14 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, > size = LLVMBuildInsertElement(gallivm->builder, size, > dynamic_state->width(dynamic_state, gallivm, > params->context_ptr, > - params->texture_unit), > + tunit), > lp_build_const_int32(gallivm, 0), ""); > > if (dims >= 2) { > size = LLVMBuildInsertElement(gallivm->builder, size, > dynamic_state->height(dynamic_state, > gallivm, > > params->context_ptr, > - > params->texture_unit), > + tunit), > lp_build_const_int32(gallivm, 1), ""); > } > > @@ -3537,7 +3540,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, > size = LLVMBuildInsertElement(gallivm->builder, size, > dynamic_state->depth(dynamic_state, > gallivm, > params->context_ptr, > - > params->texture_unit), > + tunit), > lp_build_const_int32(gallivm, 2), ""); > } > > @@ -3546,7 +3549,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, > if (has_array) { > LLVMValueRef layers = dynamic_state->depth(dynamic_state, gallivm, > params->context_ptr, > - params->texture_unit); > + tunit); > if (params->target == PIPE_TEXTURE_CUBE_ARRAY) { > /* > * It looks like GL wants number of cubes, d3d10.1 has it undefined? > @@ -3573,7 +3576,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, > lp_build_context_init(&leveli_bld, gallivm, lp_type_int_vec(32, 32)); > last_level = dynamic_state->last_level(dynamic_state, gallivm, > params->context_ptr, > - params->texture_unit); > + tunit); > > out = lp_build_cmp(&leveli_bld, PIPE_FUNC_LESS, level, first_level); > out1 = lp_build_cmp(&leveli_bld, PIPE_FUNC_GREATER, level, last_level); > @@ -3615,7 +3618,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, > > last_level = dynamic_state->last_level(dynamic_state, gallivm, > params->context_ptr, > - params->texture_unit); > + tunit); > num_levels = lp_build_sub(&bld_int_scalar, last_level, first_level); > num_levels = lp_build_add(&bld_int_scalar, num_levels, > bld_int_scalar.one); > } > diff --git a/src/gallium/drivers/llvmpipe/lp_tex_sample.c > b/src/gallium/drivers/llvmpipe/lp_tex_sample.c > index 8adaa8e..f002347 100644 > --- a/src/gallium/drivers/llvmpipe/lp_tex_sample.c > +++ b/src/gallium/drivers/llvmpipe/lp_tex_sample.c > @@ -91,7 +91,7 @@ static LLVMValueRef > lp_llvm_texture_member(const struct lp_sampler_dynamic_state *base, > struct gallivm_state *gallivm, > LLVMValueRef context_ptr, > - unsigned texture_unit, > + LLVMValueRef tex_unit_ref, > unsigned member_index, > const char *member_name, > boolean emit_load) > @@ -101,14 +101,14 @@ lp_llvm_texture_member(const struct > lp_sampler_dynamic_state *base, > LLVMValueRef ptr; > LLVMValueRef res; > > - assert(texture_unit < PIPE_MAX_SHADER_SAMPLER_VIEWS); > +// assert(texture_unit < PIPE_MAX_SHADER_SAMPLER_VIEWS); I think it would be nice if this would be replaced by assertions in the places where the texture_unit number initially comes from (if it's an immediate), if those places don't already do that.
> > /* context[0] */ > indices[0] = lp_build_const_int32(gallivm, 0); > /* context[0].textures */ > indices[1] = lp_build_const_int32(gallivm, LP_JIT_CTX_TEXTURES); > /* context[0].textures[unit] */ > - indices[2] = lp_build_const_int32(gallivm, texture_unit); > + indices[2] = tex_unit_ref; > /* context[0].textures[unit].member */ > indices[3] = lp_build_const_int32(gallivm, member_index); > > @@ -119,7 +119,7 @@ lp_llvm_texture_member(const struct > lp_sampler_dynamic_state *base, > else > res = ptr; > > - lp_build_name(res, "context.texture%u.%s", texture_unit, member_name); > +// lp_build_name(res, "context.texture%u.%s", texture_unit, member_name); Hmm it's kind of sad to see this go, as these names are quite useful when examining the IR. I wonder if printing the LLVMGetValueName() instead of the texture_unit number would be useful? Otherwise, Reviewed-by: Roland Scheidegger <[email protected]> > > return res; > } > @@ -139,7 +139,7 @@ lp_llvm_texture_member(const struct > lp_sampler_dynamic_state *base, > lp_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \ > struct gallivm_state *gallivm, \ > LLVMValueRef context_ptr, \ > - unsigned texture_unit) \ > + LLVMValueRef texture_unit) \ > { \ > return lp_llvm_texture_member(base, gallivm, context_ptr, \ > texture_unit, _index, #_name, _emit_load > ); \ > _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
