[Mesa-dev] [PATCH 1/2] gallivm: pass jit_context pointer through to sampling
Jose Fonseca
jfonseca at vmware.com
Thu Mar 26 11:54:53 PDT 2015
On 25/03/15 15:41, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> The callbacks used for getting the dynamic texture/sampler state were using
> the jit_context from the generated jit function. This works just fine, however
> that way it's impossible to generate separate functions for texture sampling,
> as will be done in the next commit. Hence, pass this pointer through all
> interfaces so it can be passed to a separate function (technically, it would
> probably be possible to extract this pointer from the current function instead,
> but this feels hacky and would probably require some more hacks if we'd use
> real functions instead of inlining all shader functions at some point).
> There should be no difference in the generated code for now.
> ---
> src/gallium/auxiliary/draw/draw_llvm.c | 9 ++-
> src/gallium/auxiliary/draw/draw_llvm.h | 3 +-
> src/gallium/auxiliary/draw/draw_llvm_sample.c | 28 ++++----
> src/gallium/auxiliary/gallivm/lp_bld_sample.c | 39 ++++++-----
> src/gallium/auxiliary/gallivm/lp_bld_sample.h | 83 ++++++++++++++---------
> src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 74 +++++++++++++-------
> src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 4 ++
> src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 6 ++
> src/gallium/drivers/llvmpipe/lp_state_fs.c | 5 +-
> src/gallium/drivers/llvmpipe/lp_tex_sample.c | 28 ++++----
> src/gallium/drivers/llvmpipe/lp_tex_sample.h | 4 +-
> 11 files changed, 171 insertions(+), 112 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
> index 6e1fb40..1e6e699 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> @@ -620,6 +620,7 @@ generate_vs(struct draw_llvm_variant *variant,
> system_values,
> inputs,
> outputs,
> + context_ptr,
> draw_sampler,
> &llvm->draw->vs.vertex_shader->info,
> NULL);
> @@ -1630,9 +1631,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant,
> LLVMBuildStore(builder, lp_build_zero(gallivm, lp_int_type(vs_type)), clipmask_bool_ptr);
>
> /* code generated texture sampling */
> - sampler = draw_llvm_sampler_soa_create(
> - draw_llvm_variant_key_samplers(key),
> - context_ptr);
> + sampler = draw_llvm_sampler_soa_create(draw_llvm_variant_key_samplers(key));
>
> if (elts) {
> start = zero;
> @@ -2163,8 +2162,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
> draw_gs_jit_context_num_constants(variant->gallivm, context_ptr);
>
> /* code generated texture sampling */
> - sampler = draw_llvm_sampler_soa_create(variant->key.samplers,
> - context_ptr);
> + sampler = draw_llvm_sampler_soa_create(variant->key.samplers);
>
> mask_val = generate_mask_value(variant, gs_type);
> lp_build_mask_begin(&mask, gallivm, gs_type, mask_val);
> @@ -2187,6 +2185,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
> &system_values,
> NULL,
> outputs,
> + context_ptr,
> sampler,
> &llvm->draw->gs.geometry_shader->info,
> (const struct lp_build_tgsi_gs_iface *)&gs_iface);
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h
> index af1960e..9565fc6 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.h
> +++ b/src/gallium/auxiliary/draw/draw_llvm.h
> @@ -526,8 +526,7 @@ void
> draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key);
>
> struct lp_build_sampler_soa *
> -draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state,
> - LLVMValueRef context_ptr);
> +draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state);
>
> void
> draw_llvm_set_sampler_state(struct draw_context *draw, unsigned shader_stage);
> diff --git a/src/gallium/auxiliary/draw/draw_llvm_sample.c b/src/gallium/auxiliary/draw/draw_llvm_sample.c
> index a6341fa..16d075c 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm_sample.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm_sample.c
> @@ -59,8 +59,6 @@ struct draw_llvm_sampler_dynamic_state
> struct lp_sampler_dynamic_state base;
>
> const struct draw_sampler_static_state *static_state;
> -
> - LLVMValueRef context_ptr;
> };
>
>
> @@ -86,14 +84,13 @@ struct draw_llvm_sampler_soa
> static LLVMValueRef
> draw_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
> struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> unsigned texture_unit,
> unsigned member_index,
> const char *member_name,
> boolean emit_load)
> {
> LLVMBuilderRef builder = gallivm->builder;
> - struct draw_llvm_sampler_dynamic_state *state =
> - (struct draw_llvm_sampler_dynamic_state *)base;
> LLVMValueRef indices[4];
> LLVMValueRef ptr;
> LLVMValueRef res;
> @@ -109,7 +106,7 @@ draw_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
> /* context[0].textures[unit].member */
> indices[3] = lp_build_const_int32(gallivm, member_index);
>
> - ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), "");
> + ptr = LLVMBuildGEP(builder, context_ptr, indices, Elements(indices), "");
>
> if (emit_load)
> res = LLVMBuildLoad(builder, ptr, "");
> @@ -133,14 +130,13 @@ draw_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
> static LLVMValueRef
> draw_llvm_sampler_member(const struct lp_sampler_dynamic_state *base,
> struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> unsigned sampler_unit,
> unsigned member_index,
> const char *member_name,
> boolean emit_load)
> {
> LLVMBuilderRef builder = gallivm->builder;
> - struct draw_llvm_sampler_dynamic_state *state =
> - (struct draw_llvm_sampler_dynamic_state *)base;
> LLVMValueRef indices[4];
> LLVMValueRef ptr;
> LLVMValueRef res;
> @@ -156,7 +152,7 @@ draw_llvm_sampler_member(const struct lp_sampler_dynamic_state *base,
> /* context[0].samplers[unit].member */
> indices[3] = lp_build_const_int32(gallivm, member_index);
>
> - ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), "");
> + ptr = LLVMBuildGEP(builder, context_ptr, indices, Elements(indices), "");
>
> if (emit_load)
> res = LLVMBuildLoad(builder, ptr, "");
> @@ -182,9 +178,11 @@ draw_llvm_sampler_member(const struct lp_sampler_dynamic_state *base,
> static LLVMValueRef \
> draw_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \
> struct gallivm_state *gallivm, \
> + LLVMValueRef context_ptr, \
> unsigned texture_unit) \
> { \
> - return draw_llvm_texture_member(base, gallivm, texture_unit, _index, #_name, _emit_load ); \
> + return draw_llvm_texture_member(base, gallivm, context_ptr, \
> + texture_unit, _index, #_name, _emit_load ); \
> }
>
>
> @@ -203,9 +201,11 @@ DRAW_LLVM_TEXTURE_MEMBER(mip_offsets, DRAW_JIT_TEXTURE_MIP_OFFSETS, FALSE)
> static LLVMValueRef \
> draw_llvm_sampler_##_name( const struct lp_sampler_dynamic_state *base, \
> struct gallivm_state *gallivm, \
> + LLVMValueRef context_ptr, \
> unsigned sampler_unit) \
> { \
> - return draw_llvm_sampler_member(base, gallivm, sampler_unit, _index, #_name, _emit_load ); \
> + return draw_llvm_sampler_member(base, gallivm, context_ptr, \
> + sampler_unit, _index, #_name, _emit_load ); \
> }
>
>
> @@ -233,6 +233,7 @@ draw_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base,
> boolean is_fetch,
> unsigned texture_index,
> unsigned sampler_index,
> + LLVMValueRef context_ptr,
> const LLVMValueRef *coords,
> const LLVMValueRef *offsets,
> const struct lp_derivatives *derivs,
> @@ -254,6 +255,7 @@ draw_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base,
> is_fetch,
> texture_index,
> sampler_index,
> + context_ptr,
> coords,
> offsets,
> derivs,
> @@ -271,6 +273,7 @@ draw_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
> struct lp_type type,
> unsigned texture_unit,
> unsigned target,
> + LLVMValueRef context_ptr,
> boolean is_sviewinfo,
> enum lp_sampler_lod_property lod_property,
> LLVMValueRef explicit_lod, /* optional */
> @@ -286,6 +289,7 @@ draw_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
> type,
> texture_unit,
> target,
> + context_ptr,
> is_sviewinfo,
> lod_property,
> explicit_lod,
> @@ -293,8 +297,7 @@ draw_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
> }
>
> struct lp_build_sampler_soa *
> -draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state,
> - LLVMValueRef context_ptr)
> +draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state)
> {
> struct draw_llvm_sampler_soa *sampler;
>
> @@ -319,7 +322,6 @@ draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_stat
> sampler->dynamic_state.base.lod_bias = draw_llvm_sampler_lod_bias;
> sampler->dynamic_state.base.border_color = draw_llvm_sampler_border_color;
> sampler->dynamic_state.static_state = static_state;
> - sampler->dynamic_state.context_ptr = context_ptr;
>
> return &sampler->base;
> }
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.c b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> index 7d18ee5..5b22045 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> @@ -246,8 +246,8 @@ lp_build_rho(struct lp_build_sample_context *bld,
> * the messy cube maps for now) when requested.
> */
>
> - first_level = bld->dynamic_state->first_level(bld->dynamic_state,
> - bld->gallivm, texture_unit);
> + first_level = bld->dynamic_state->first_level(bld->dynamic_state, bld->gallivm,
> + bld->context_ptr, texture_unit);
> 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);
> @@ -714,6 +714,7 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
>
> {
> LLVMBuilderRef builder = bld->gallivm->builder;
> + struct lp_sampler_dynamic_state *dynamic_state = bld->dynamic_state;
> struct lp_build_context *lodf_bld = &bld->lodf_bld;
> LLVMValueRef lod;
>
> @@ -744,8 +745,8 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
> * This is hit during mipmap generation.
> */
> LLVMValueRef min_lod =
> - bld->dynamic_state->min_lod(bld->dynamic_state,
> - bld->gallivm, sampler_unit);
> + dynamic_state->min_lod(dynamic_state, bld->gallivm,
> + bld->context_ptr, sampler_unit);
>
> lod = lp_build_broadcast_scalar(lodf_bld, min_lod);
> }
> @@ -835,8 +836,8 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
> /* add sampler lod bias */
> if (bld->static_sampler_state->lod_bias_non_zero) {
> LLVMValueRef sampler_lod_bias =
> - bld->dynamic_state->lod_bias(bld->dynamic_state,
> - bld->gallivm, sampler_unit);
> + dynamic_state->lod_bias(dynamic_state, bld->gallivm,
> + bld->context_ptr, sampler_unit);
> sampler_lod_bias = lp_build_broadcast_scalar(lodf_bld,
> sampler_lod_bias);
> lod = LLVMBuildFAdd(builder, lod, sampler_lod_bias, "sampler_lod_bias");
> @@ -845,16 +846,16 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
> /* clamp lod */
> if (bld->static_sampler_state->apply_max_lod) {
> LLVMValueRef max_lod =
> - bld->dynamic_state->max_lod(bld->dynamic_state,
> - bld->gallivm, sampler_unit);
> + dynamic_state->max_lod(dynamic_state, bld->gallivm,
> + bld->context_ptr, sampler_unit);
> max_lod = lp_build_broadcast_scalar(lodf_bld, max_lod);
>
> lod = lp_build_min(lodf_bld, lod, max_lod);
> }
> if (bld->static_sampler_state->apply_min_lod) {
> LLVMValueRef min_lod =
> - bld->dynamic_state->min_lod(bld->dynamic_state,
> - bld->gallivm, sampler_unit);
> + dynamic_state->min_lod(dynamic_state, bld->gallivm,
> + bld->context_ptr, sampler_unit);
> min_lod = lp_build_broadcast_scalar(lodf_bld, min_lod);
>
> lod = lp_build_max(lodf_bld, lod, min_lod);
> @@ -901,12 +902,13 @@ lp_build_nearest_mip_level(struct lp_build_sample_context *bld,
> LLVMValueRef *out_of_bounds)
> {
> 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;
>
> - first_level = bld->dynamic_state->first_level(bld->dynamic_state,
> - bld->gallivm, texture_unit);
> - last_level = bld->dynamic_state->last_level(bld->dynamic_state,
> - bld->gallivm, texture_unit);
> + first_level = dynamic_state->first_level(dynamic_state, bld->gallivm,
> + bld->context_ptr, texture_unit);
> + last_level = dynamic_state->last_level(dynamic_state, bld->gallivm,
> + bld->context_ptr, texture_unit);
> first_level = lp_build_broadcast_scalar(leveli_bld, first_level);
> last_level = lp_build_broadcast_scalar(leveli_bld, last_level);
>
> @@ -956,6 +958,7 @@ lp_build_linear_mip_levels(struct lp_build_sample_context *bld,
> LLVMValueRef *level1_out)
> {
> LLVMBuilderRef builder = bld->gallivm->builder;
> + struct lp_sampler_dynamic_state *dynamic_state = bld->dynamic_state;
> struct lp_build_context *leveli_bld = &bld->leveli_bld;
> struct lp_build_context *levelf_bld = &bld->levelf_bld;
> LLVMValueRef first_level, last_level;
> @@ -964,10 +967,10 @@ lp_build_linear_mip_levels(struct lp_build_sample_context *bld,
>
> assert(bld->num_lods == bld->num_mips);
>
> - first_level = bld->dynamic_state->first_level(bld->dynamic_state,
> - bld->gallivm, texture_unit);
> - last_level = bld->dynamic_state->last_level(bld->dynamic_state,
> - bld->gallivm, texture_unit);
> + first_level = dynamic_state->first_level(dynamic_state, bld->gallivm,
> + bld->context_ptr, texture_unit);
> + last_level = dynamic_state->last_level(dynamic_state, bld->gallivm,
> + bld->context_ptr, texture_unit);
> 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 be05b13..be41ca0 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> @@ -138,79 +138,96 @@ struct lp_sampler_dynamic_state
>
> /** Obtain the base texture width (or number of elements) (returns int32) */
> LLVMValueRef
> - (*width)( const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm,
> - unsigned texture_unit);
> + (*width)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned texture_unit);
>
> /** Obtain the base texture height (returns int32) */
> LLVMValueRef
> - (*height)( const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm,
> - unsigned texture_unit);
> + (*height)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned 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,
> - unsigned texture_unit);
> + (*depth)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned 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,
> - unsigned texture_unit);
> + (*first_level)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned 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,
> - unsigned texture_unit);
> + (*last_level)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned 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,
> - unsigned texture_unit);
> + (*row_stride)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned 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,
> - unsigned texture_unit);
> + (*img_stride)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned texture_unit);
>
> /** Obtain pointer to base of texture */
> LLVMValueRef
> - (*base_ptr)( const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm,
> - unsigned texture_unit);
> + (*base_ptr)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned texture_unit);
>
> /** Obtain pointer to array of mipmap offsets */
> LLVMValueRef
> - (*mip_offsets)( const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm,
> - unsigned texture_unit);
> + (*mip_offsets)(const struct lp_sampler_dynamic_state *state,
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned texture_unit);
>
> /* These are callbacks for sampler state */
>
> /** Obtain texture min lod (returns float) */
> LLVMValueRef
> (*min_lod)(const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm, unsigned sampler_unit);
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned sampler_unit);
>
> /** Obtain texture max lod (returns float) */
> LLVMValueRef
> (*max_lod)(const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm, unsigned sampler_unit);
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned sampler_unit);
>
> /** Obtain texture lod bias (returns float) */
> LLVMValueRef
> (*lod_bias)(const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm, unsigned sampler_unit);
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned sampler_unit);
>
> /** Obtain texture border color (returns ptr to float[4]) */
> LLVMValueRef
> (*border_color)(const struct lp_sampler_dynamic_state *state,
> - struct gallivm_state *gallivm, unsigned sampler_unit);
> + struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> + unsigned sampler_unit);
> };
>
>
> @@ -305,6 +322,8 @@ struct lp_build_sample_context
> LLVMValueRef int_size;
>
> LLVMValueRef border_color_clamped;
> +
> + LLVMValueRef context_ptr;
> };
>
>
> @@ -520,6 +539,7 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
> boolean is_fetch,
> unsigned texture_index,
> unsigned sampler_index,
> + LLVMValueRef context_ptr,
> const LLVMValueRef *coords,
> const LLVMValueRef *offsets,
> const struct lp_derivatives *derivs,
> @@ -545,6 +565,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> struct lp_type int_type,
> unsigned texture_unit,
> unsigned target,
> + LLVMValueRef context_ptr,
> boolean is_sviewinfo,
> enum lp_sampler_lod_property lod_property,
> 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 99309fe..a90278e 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -1678,8 +1678,8 @@ lp_build_layer_coord(struct lp_build_sample_context *bld,
> LLVMValueRef num_layers;
> struct lp_build_context *int_coord_bld = &bld->int_coord_bld;
>
> - num_layers = bld->dynamic_state->depth(bld->dynamic_state,
> - bld->gallivm, texture_unit);
> + num_layers = bld->dynamic_state->depth(bld->dynamic_state, bld->gallivm,
> + bld->context_ptr, texture_unit);
>
> if (out_of_bounds) {
> LLVMValueRef out1, out;
> @@ -1815,7 +1815,8 @@ lp_build_sample_common(struct lp_build_sample_context *bld,
> case PIPE_TEX_MIPFILTER_NONE:
> /* always use mip level 0 */
> first_level = bld->dynamic_state->first_level(bld->dynamic_state,
> - bld->gallivm, texture_index);
> + bld->gallivm, bld->context_ptr,
> + texture_index);
> first_level = lp_build_broadcast_scalar(&bld->leveli_bld, first_level);
> *ilevel0 = first_level;
> break;
> @@ -1840,8 +1841,8 @@ lp_build_clamp_border_color(struct lp_build_sample_context *bld,
> struct gallivm_state *gallivm = bld->gallivm;
> LLVMBuilderRef builder = gallivm->builder;
> LLVMValueRef border_color_ptr =
> - bld->dynamic_state->border_color(bld->dynamic_state,
> - gallivm, sampler_unit);
> + bld->dynamic_state->border_color(bld->dynamic_state, gallivm,
> + bld->context_ptr, sampler_unit);
> LLVMValueRef border_color;
> const struct util_format_description *format_desc = bld->format_desc;
> struct lp_type vec4_type = bld->texel_type;
> @@ -2246,8 +2247,8 @@ lp_build_fetch_texel(struct lp_build_sample_context *bld,
> else {
> assert(bld->num_mips == 1);
> if (bld->static_texture_state->target != PIPE_BUFFER) {
> - ilevel = bld->dynamic_state->first_level(bld->dynamic_state,
> - bld->gallivm, texture_unit);
> + ilevel = bld->dynamic_state->first_level(bld->dynamic_state, bld->gallivm,
> + bld->context_ptr, texture_unit);
> }
> else {
> ilevel = lp_build_const_int32(bld->gallivm, 0);
> @@ -2372,6 +2373,7 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
> boolean is_fetch,
> unsigned texture_index,
> unsigned sampler_index,
> + LLVMValueRef context_ptr,
> const LLVMValueRef *coords,
> const LLVMValueRef *offsets,
> const struct lp_derivatives *derivs, /* optional */
> @@ -2413,6 +2415,7 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
> /* Setup our build context */
> memset(&bld, 0, sizeof bld);
> bld.gallivm = gallivm;
> + bld.context_ptr = context_ptr;
> bld.static_sampler_state = &derived_sampler_state;
> bld.static_texture_state = static_texture_state;
> bld.dynamic_state = dynamic_state;
> @@ -2578,11 +2581,16 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
> lp_build_context_init(&bld.lodi_bld, gallivm, bld.lodi_type);
>
> /* Get the dynamic state */
> - tex_width = dynamic_state->width(dynamic_state, gallivm, texture_index);
> - bld.row_stride_array = dynamic_state->row_stride(dynamic_state, gallivm, texture_index);
> - bld.img_stride_array = dynamic_state->img_stride(dynamic_state, gallivm, texture_index);
> - bld.base_ptr = dynamic_state->base_ptr(dynamic_state, gallivm, texture_index);
> - bld.mip_offsets = dynamic_state->mip_offsets(dynamic_state, gallivm, texture_index);
> + tex_width = dynamic_state->width(dynamic_state, gallivm,
> + context_ptr, texture_index);
> + bld.row_stride_array = dynamic_state->row_stride(dynamic_state, gallivm,
> + context_ptr, texture_index);
> + bld.img_stride_array = dynamic_state->img_stride(dynamic_state, gallivm,
> + context_ptr, texture_index);
> + bld.base_ptr = dynamic_state->base_ptr(dynamic_state, gallivm,
> + context_ptr, texture_index);
> + bld.mip_offsets = dynamic_state->mip_offsets(dynamic_state, gallivm,
> + context_ptr, texture_index);
> /* Note that mip_offsets is an array[level] of offsets to texture images */
>
> /* width, height, depth as single int vector */
> @@ -2591,17 +2599,22 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
> }
> else {
> bld.int_size = LLVMBuildInsertElement(builder, bld.int_size_in_bld.undef,
> - tex_width, LLVMConstInt(i32t, 0, 0), "");
> + tex_width,
> + LLVMConstInt(i32t, 0, 0), "");
> if (dims >= 2) {
> LLVMValueRef tex_height =
> - dynamic_state->height(dynamic_state, gallivm, texture_index);
> + dynamic_state->height(dynamic_state, gallivm,
> + context_ptr, texture_index);
> bld.int_size = LLVMBuildInsertElement(builder, bld.int_size,
> - tex_height, LLVMConstInt(i32t, 1, 0), "");
> + tex_height,
> + LLVMConstInt(i32t, 1, 0), "");
> if (dims >= 3) {
> LLVMValueRef tex_depth =
> - dynamic_state->depth(dynamic_state, gallivm, texture_index);
> + dynamic_state->depth(dynamic_state, gallivm, context_ptr,
> + texture_index);
> bld.int_size = LLVMBuildInsertElement(builder, bld.int_size,
> - tex_depth, LLVMConstInt(i32t, 2, 0), "");
> + tex_depth,
> + LLVMConstInt(i32t, 2, 0), "");
> }
> }
> }
> @@ -2717,6 +2730,7 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
> /* Setup our build context */
> memset(&bld4, 0, sizeof bld4);
> bld4.gallivm = bld.gallivm;
> + bld4.context_ptr = bld.context_ptr;
> bld4.static_texture_state = bld.static_texture_state;
> bld4.static_sampler_state = bld.static_sampler_state;
> bld4.dynamic_state = bld.dynamic_state;
> @@ -2876,6 +2890,7 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
> }
> }
>
> +
> void
> lp_build_size_query_soa(struct gallivm_state *gallivm,
> const struct lp_static_texture_state *static_state,
> @@ -2883,6 +2898,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> struct lp_type int_type,
> unsigned texture_unit,
> unsigned target,
> + LLVMValueRef context_ptr,
> boolean is_sviewinfo,
> enum lp_sampler_lod_property lod_property,
> LLVMValueRef explicit_lod,
> @@ -2954,8 +2970,10 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
>
> if (explicit_lod) {
> /* FIXME: this needs to honor per-element lod */
> - lod = LLVMBuildExtractElement(gallivm->builder, explicit_lod, lp_build_const_int32(gallivm, 0), "");
> - first_level = dynamic_state->first_level(dynamic_state, gallivm, texture_unit);
> + lod = LLVMBuildExtractElement(gallivm->builder, explicit_lod,
> + lp_build_const_int32(gallivm, 0), "");
> + first_level = dynamic_state->first_level(dynamic_state, gallivm,
> + context_ptr, texture_unit);
> level = LLVMBuildAdd(gallivm->builder, lod, first_level, "level");
> lod = lp_build_broadcast_scalar(&bld_int_vec4, level);
> } else {
> @@ -2965,25 +2983,29 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> size = bld_int_vec4.undef;
>
> size = LLVMBuildInsertElement(gallivm->builder, size,
> - dynamic_state->width(dynamic_state, gallivm, texture_unit),
> + dynamic_state->width(dynamic_state, gallivm,
> + context_ptr, texture_unit),
> lp_build_const_int32(gallivm, 0), "");
>
> if (dims >= 2) {
> size = LLVMBuildInsertElement(gallivm->builder, size,
> - dynamic_state->height(dynamic_state, gallivm, texture_unit),
> + dynamic_state->height(dynamic_state, gallivm,
> + context_ptr, texture_unit),
> lp_build_const_int32(gallivm, 1), "");
> }
>
> if (dims >= 3) {
> size = LLVMBuildInsertElement(gallivm->builder, size,
> - dynamic_state->depth(dynamic_state, gallivm, texture_unit),
> + dynamic_state->depth(dynamic_state, gallivm,
> + context_ptr, texture_unit),
> lp_build_const_int32(gallivm, 2), "");
> }
>
> size = lp_build_minify(&bld_int_vec4, size, lod, TRUE);
>
> if (has_array) {
> - LLVMValueRef layers = dynamic_state->depth(dynamic_state, gallivm, texture_unit);
> + LLVMValueRef layers = dynamic_state->depth(dynamic_state, gallivm,
> + context_ptr, texture_unit);
> if (target == PIPE_TEXTURE_CUBE_ARRAY) {
> /*
> * It looks like GL wants number of cubes, d3d10.1 has it undefined?
> @@ -3008,7 +3030,8 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
>
> /* everything is scalar for now */
> lp_build_context_init(&leveli_bld, gallivm, lp_type_int_vec(32, 32));
> - last_level = dynamic_state->last_level(dynamic_state, gallivm, texture_unit);
> + last_level = dynamic_state->last_level(dynamic_state, gallivm,
> + context_ptr, texture_unit);
>
> out = lp_build_cmp(&leveli_bld, PIPE_FUNC_LESS, level, first_level);
> out1 = lp_build_cmp(&leveli_bld, PIPE_FUNC_GREATER, level, last_level);
> @@ -3048,7 +3071,8 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> else {
> LLVMValueRef last_level;
>
> - last_level = dynamic_state->last_level(dynamic_state, gallivm, texture_unit);
> + last_level = dynamic_state->last_level(dynamic_state, gallivm,
> + context_ptr, texture_unit);
> 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/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> index b411f05..8d53607 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> @@ -188,6 +188,7 @@ struct lp_build_sampler_soa
> boolean is_fetch,
> unsigned texture_index,
> unsigned sampler_index,
> + LLVMValueRef context_ptr,
> const LLVMValueRef *coords,
> const LLVMValueRef *offsets,
> const struct lp_derivatives *derivs,
> @@ -202,6 +203,7 @@ struct lp_build_sampler_soa
> struct lp_type type,
> unsigned unit,
> unsigned target,
> + LLVMValueRef context_ptr,
> boolean need_nr_mips,
> enum lp_sampler_lod_property,
> LLVMValueRef explicit_lod, /* optional */
> @@ -237,6 +239,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
> const struct lp_bld_tgsi_system_values *system_values,
> const LLVMValueRef (*inputs)[4],
> LLVMValueRef (*outputs)[4],
> + LLVMValueRef context_ptr,
> struct lp_build_sampler_soa *sampler,
> const struct tgsi_shader_info *info,
> const struct lp_build_tgsi_gs_iface *gs_iface);
> @@ -449,6 +452,7 @@ struct lp_build_tgsi_soa_context
> LLVMValueRef consts_sizes[LP_MAX_TGSI_CONST_BUFFERS];
> const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS];
> LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS];
> + LLVMValueRef context_ptr;
>
> const struct lp_build_sampler_soa *sampler;
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index 3b2097f..3e82036 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -2151,6 +2151,7 @@ emit_tex( struct lp_build_tgsi_soa_context *bld,
> bld->bld_base.base.type,
> FALSE,
> unit, unit,
> + bld->context_ptr,
> coords,
> offsets,
> deriv_ptr,
> @@ -2314,6 +2315,7 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
> bld->bld_base.base.type,
> FALSE,
> texture_unit, sampler_unit,
> + bld->context_ptr,
> coords,
> offsets,
> deriv_ptr,
> @@ -2424,6 +2426,7 @@ emit_fetch_texels( struct lp_build_tgsi_soa_context *bld,
> bld->bld_base.base.type,
> TRUE,
> unit, unit,
> + bld->context_ptr,
> coords,
> offsets,
> NULL,
> @@ -2498,6 +2501,7 @@ emit_size_query( struct lp_build_tgsi_soa_context *bld,
> bld->bld_base.base.gallivm,
> bld->bld_base.int_bld.type,
> unit, pipe_target,
> + bld->context_ptr,
> TRUE,
> lod_property,
> explicit_lod,
> @@ -3656,6 +3660,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
> const struct lp_bld_tgsi_system_values *system_values,
> const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS],
> LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS],
> + LLVMValueRef context_ptr,
> struct lp_build_sampler_soa *sampler,
> const struct tgsi_shader_info *info,
> const struct lp_build_tgsi_gs_iface *gs_iface)
> @@ -3684,6 +3689,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
> bld.sampler = sampler;
> bld.bld_base.info = info;
> bld.indirect_files = info->indirect_files;
> + bld.context_ptr = context_ptr;
>
> /*
> * If the number of temporaries is rather large then we just
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 14fd6b9..35fe7b2 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -417,7 +417,8 @@ generate_fs_loop(struct gallivm_state *gallivm,
> lp_build_tgsi_soa(gallivm, tokens, type, &mask,
> consts_ptr, num_consts_ptr, &system_values,
> interp->inputs,
> - outputs, sampler, &shader->info.base, NULL);
> + outputs, context_ptr,
> + sampler, &shader->info.base, NULL);
>
> /* Alpha test */
> if (key->alpha.enabled) {
> @@ -2302,7 +2303,7 @@ generate_fragment(struct llvmpipe_context *lp,
> LLVMPositionBuilderAtEnd(builder, block);
>
> /* code generated texture sampling */
> - sampler = lp_llvm_sampler_soa_create(key->state, context_ptr);
> + sampler = lp_llvm_sampler_soa_create(key->state);
>
> num_fs = 16 / fs_type.length; /* number of loops per 4x4 stamp */
> /* for 1d resources only run "upper half" of stamp */
> diff --git a/src/gallium/drivers/llvmpipe/lp_tex_sample.c b/src/gallium/drivers/llvmpipe/lp_tex_sample.c
> index f0a4a34..1828069 100644
> --- a/src/gallium/drivers/llvmpipe/lp_tex_sample.c
> +++ b/src/gallium/drivers/llvmpipe/lp_tex_sample.c
> @@ -65,8 +65,6 @@ struct llvmpipe_sampler_dynamic_state
> struct lp_sampler_dynamic_state base;
>
> const struct lp_sampler_static_state *static_state;
> -
> - LLVMValueRef context_ptr;
> };
>
>
> @@ -92,13 +90,12 @@ struct lp_llvm_sampler_soa
> static LLVMValueRef
> lp_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
> struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> unsigned texture_unit,
> unsigned member_index,
> const char *member_name,
> boolean emit_load)
> {
> - struct llvmpipe_sampler_dynamic_state *state =
> - (struct llvmpipe_sampler_dynamic_state *)base;
> LLVMBuilderRef builder = gallivm->builder;
> LLVMValueRef indices[4];
> LLVMValueRef ptr;
> @@ -115,7 +112,7 @@ lp_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
> /* context[0].textures[unit].member */
> indices[3] = lp_build_const_int32(gallivm, member_index);
>
> - ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), "");
> + ptr = LLVMBuildGEP(builder, context_ptr, indices, Elements(indices), "");
>
> if (emit_load)
> res = LLVMBuildLoad(builder, ptr, "");
> @@ -141,9 +138,11 @@ lp_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
> static LLVMValueRef \
> lp_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \
> struct gallivm_state *gallivm, \
> + LLVMValueRef context_ptr, \
> unsigned texture_unit) \
> { \
> - return lp_llvm_texture_member(base, gallivm, texture_unit, _index, #_name, _emit_load ); \
> + return lp_llvm_texture_member(base, gallivm, context_ptr, \
> + texture_unit, _index, #_name, _emit_load ); \
> }
>
>
> @@ -169,13 +168,12 @@ LP_LLVM_TEXTURE_MEMBER(mip_offsets, LP_JIT_TEXTURE_MIP_OFFSETS, FALSE)
> static LLVMValueRef
> lp_llvm_sampler_member(const struct lp_sampler_dynamic_state *base,
> struct gallivm_state *gallivm,
> + LLVMValueRef context_ptr,
> unsigned sampler_unit,
> unsigned member_index,
> const char *member_name,
> boolean emit_load)
> {
> - struct llvmpipe_sampler_dynamic_state *state =
> - (struct llvmpipe_sampler_dynamic_state *)base;
> LLVMBuilderRef builder = gallivm->builder;
> LLVMValueRef indices[4];
> LLVMValueRef ptr;
> @@ -192,7 +190,7 @@ lp_llvm_sampler_member(const struct lp_sampler_dynamic_state *base,
> /* context[0].samplers[unit].member */
> indices[3] = lp_build_const_int32(gallivm, member_index);
>
> - ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), "");
> + ptr = LLVMBuildGEP(builder, context_ptr, indices, Elements(indices), "");
>
> if (emit_load)
> res = LLVMBuildLoad(builder, ptr, "");
> @@ -209,9 +207,11 @@ lp_llvm_sampler_member(const struct lp_sampler_dynamic_state *base,
> static LLVMValueRef \
> lp_llvm_sampler_##_name( const struct lp_sampler_dynamic_state *base, \
> struct gallivm_state *gallivm, \
> + LLVMValueRef context_ptr, \
> unsigned sampler_unit) \
> { \
> - return lp_llvm_sampler_member(base, gallivm, sampler_unit, _index, #_name, _emit_load ); \
> + return lp_llvm_sampler_member(base, gallivm, context_ptr, \
> + sampler_unit, _index, #_name, _emit_load ); \
> }
>
>
> @@ -239,6 +239,7 @@ lp_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base,
> boolean is_fetch,
> unsigned texture_index,
> unsigned sampler_index,
> + LLVMValueRef context_ptr,
> const LLVMValueRef *coords,
> const LLVMValueRef *offsets,
> const struct lp_derivatives *derivs,
> @@ -265,6 +266,7 @@ lp_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base,
> is_fetch,
> texture_index,
> sampler_index,
> + context_ptr,
> coords,
> offsets,
> derivs,
> @@ -281,6 +283,7 @@ lp_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
> struct lp_type type,
> unsigned texture_unit,
> unsigned target,
> + LLVMValueRef context_ptr,
> boolean is_sviewinfo,
> enum lp_sampler_lod_property lod_property,
> LLVMValueRef explicit_lod, /* optional */
> @@ -296,6 +299,7 @@ lp_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
> type,
> texture_unit,
> target,
> + context_ptr,
> is_sviewinfo,
> lod_property,
> explicit_lod,
> @@ -304,8 +308,7 @@ lp_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
>
>
> struct lp_build_sampler_soa *
> -lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
> - LLVMValueRef context_ptr)
> +lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state)
> {
> struct lp_llvm_sampler_soa *sampler;
>
> @@ -331,7 +334,6 @@ lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
> sampler->dynamic_state.base.border_color = lp_llvm_sampler_border_color;
>
> sampler->dynamic_state.static_state = static_state;
> - sampler->dynamic_state.context_ptr = context_ptr;
>
> return &sampler->base;
> }
> diff --git a/src/gallium/drivers/llvmpipe/lp_tex_sample.h b/src/gallium/drivers/llvmpipe/lp_tex_sample.h
> index bca92d9..f4aff22 100644
> --- a/src/gallium/drivers/llvmpipe/lp_tex_sample.h
> +++ b/src/gallium/drivers/llvmpipe/lp_tex_sample.h
> @@ -38,11 +38,9 @@ struct lp_sampler_static_state;
> /**
> * Pure-LLVM texture sampling code generator.
> *
> - * @param context_ptr LLVM value with the pointer to the struct lp_jit_context.
> */
> struct lp_build_sampler_soa *
> -lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *key,
> - LLVMValueRef context_ptr);
> +lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *key);
>
>
> #endif /* LP_TEX_SAMPLE_H */
>
This patch looks good.
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
More information about the mesa-dev
mailing list