gallivm/sample: move some first_level/last_level calcs out

There were a fair few instances of first/level dynamic state getting,
these could be moved up a level or two and made more common.

Reviewed-by: Brian Paul <brianp@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18264>
This commit is contained in:
Dave Airlie
2022-08-26 15:13:04 +10:00
parent 3052d30dc2
commit c457e1f0e4
3 changed files with 53 additions and 58 deletions
+12 -34
View File
@@ -244,7 +244,7 @@ lp_sampler_static_sampler_state(struct lp_static_sampler_state *state,
/* build aniso pmin value */
static LLVMValueRef
lp_build_pmin(struct lp_build_sample_context *bld,
unsigned texture_unit,
LLVMValueRef first_level,
LLVMValueRef s,
LLVMValueRef t,
LLVMValueRef max_aniso)
@@ -260,16 +260,12 @@ lp_build_pmin(struct lp_build_sample_context *bld,
LLVMValueRef index1 = LLVMConstInt(i32t, 1, 0);
LLVMValueRef ddx_ddy = lp_build_packed_ddx_ddy_twocoord(coord_bld, s, t);
LLVMValueRef int_size, float_size;
LLVMValueRef first_level, first_level_vec;
unsigned length = coord_bld->type.length;
unsigned num_quads = length / 4;
boolean pmin_per_quad = pmin_bld->type.length != length;
unsigned i;
first_level = bld->dynamic_state->first_level(bld->gallivm, bld->context_type,
bld->context_ptr, texture_unit, NULL);
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);
int_size = lp_build_minify(int_size_bld, bld->int_size, first_level, TRUE);
float_size = lp_build_int_to_float(float_size_bld, int_size);
max_aniso = lp_build_broadcast_scalar(coord_bld, max_aniso);
max_aniso = lp_build_mul(coord_bld, max_aniso, max_aniso);
@@ -338,7 +334,7 @@ lp_build_pmin(struct lp_build_sample_context *bld,
*/
static LLVMValueRef
lp_build_rho(struct lp_build_sample_context *bld,
unsigned texture_unit,
LLVMValueRef first_level,
LLVMValueRef s,
LLVMValueRef t,
LLVMValueRef r,
@@ -360,7 +356,6 @@ lp_build_rho(struct lp_build_sample_context *bld,
LLVMValueRef rho_vec;
LLVMValueRef int_size, float_size;
LLVMValueRef rho;
LLVMValueRef first_level, first_level_vec;
unsigned length = coord_bld->type.length;
unsigned num_quads = length / 4;
boolean rho_per_quad = rho_bld->type.length != length;
@@ -376,10 +371,7 @@ 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->gallivm, bld->context_type,
bld->context_ptr, texture_unit, NULL);
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);
int_size = lp_build_minify(int_size_bld, bld->int_size, first_level, TRUE);
float_size = lp_build_int_to_float(float_size_bld, int_size);
if (derivs) {
@@ -806,8 +798,8 @@ lp_build_ilog2_sqrt(struct lp_build_context *bld,
void
lp_build_lod_selector(struct lp_build_sample_context *bld,
boolean is_lodq,
unsigned texture_unit,
unsigned sampler_unit,
LLVMValueRef first_level,
LLVMValueRef s,
LLVMValueRef t,
LLVMValueRef r,
@@ -873,10 +865,10 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
if (bld->static_sampler_state->aniso &&
!explicit_lod) {
rho = lp_build_pmin(bld, texture_unit, s, t, max_aniso);
rho = lp_build_pmin(bld, first_level, s, t, max_aniso);
rho_squared = true;
} else
rho = lp_build_rho(bld, texture_unit, s, t, r, derivs);
rho = lp_build_rho(bld, first_level, s, t, r, derivs);
/*
* Compute lod = log2(rho)
@@ -1023,21 +1015,14 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
*/
void
lp_build_nearest_mip_level(struct lp_build_sample_context *bld,
unsigned texture_unit,
LLVMValueRef first_level,
LLVMValueRef last_level,
LLVMValueRef lod_ipart,
LLVMValueRef *level_out,
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 = dynamic_state->first_level(bld->gallivm, bld->context_type,
bld->context_ptr, texture_unit, NULL);
last_level = dynamic_state->last_level(bld->gallivm, bld->context_type,
bld->context_ptr, texture_unit, NULL);
first_level = lp_build_broadcast_scalar(leveli_bld, first_level);
last_level = lp_build_broadcast_scalar(leveli_bld, last_level);
LLVMValueRef level;
level = lp_build_add(leveli_bld, lod_ipart, first_level);
@@ -1079,28 +1064,21 @@ lp_build_nearest_mip_level(struct lp_build_sample_context *bld,
void
lp_build_linear_mip_levels(struct lp_build_sample_context *bld,
unsigned texture_unit,
LLVMValueRef first_level,
LLVMValueRef last_level,
LLVMValueRef lod_ipart,
LLVMValueRef *lod_fpart_inout,
LLVMValueRef *level0_out,
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;
LLVMValueRef clamp_min;
LLVMValueRef clamp_max;
assert(bld->num_lods == bld->num_mips);
first_level = dynamic_state->first_level(bld->gallivm, bld->context_type,
bld->context_ptr, texture_unit, NULL);
last_level = dynamic_state->last_level(bld->gallivm, bld->context_type,
bld->context_ptr, texture_unit, NULL);
first_level = lp_build_broadcast_scalar(leveli_bld, first_level);
last_level = lp_build_broadcast_scalar(leveli_bld, last_level);
*level0_out = lp_build_add(leveli_bld, lod_ipart, first_level);
*level1_out = lp_build_add(leveli_bld, *level0_out, leveli_bld->one);
@@ -598,8 +598,8 @@ lp_sampler_static_texture_state_image(struct lp_static_texture_state *state,
void
lp_build_lod_selector(struct lp_build_sample_context *bld,
boolean is_lodq,
unsigned texture_index,
unsigned sampler_index,
LLVMValueRef first_level,
LLVMValueRef s,
LLVMValueRef t,
LLVMValueRef r,
@@ -615,7 +615,8 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
void
lp_build_nearest_mip_level(struct lp_build_sample_context *bld,
unsigned texture_unit,
LLVMValueRef first_level,
LLVMValueRef last_level,
LLVMValueRef lod,
LLVMValueRef *level_out,
LLVMValueRef *out_of_bounds);
@@ -623,6 +624,8 @@ lp_build_nearest_mip_level(struct lp_build_sample_context *bld,
void
lp_build_linear_mip_levels(struct lp_build_sample_context *bld,
unsigned texture_unit,
LLVMValueRef first_level,
LLVMValueRef last_level,
LLVMValueRef lod_ipart,
LLVMValueRef *lod_fpart_inout,
LLVMValueRef *level0_out,
@@ -2539,7 +2539,7 @@ lp_build_sample_common(struct lp_build_sample_context *bld,
const unsigned mag_filter = bld->static_sampler_state->mag_img_filter;
const unsigned target = bld->static_texture_state->target;
const bool aniso = bld->static_sampler_state->aniso;
LLVMValueRef first_level = NULL;
LLVMValueRef first_level, last_level;
LLVMValueRef lod_ipart = NULL;
struct lp_derivatives cube_derivs;
@@ -2548,6 +2548,15 @@ lp_build_sample_common(struct lp_build_sample_context *bld,
mip_filter, min_filter, mag_filter);
*/
first_level = bld->dynamic_state->first_level(bld->gallivm,
bld->context_type,
bld->context_ptr,
texture_index, NULL);
last_level = bld->dynamic_state->last_level(bld->gallivm,
bld->context_type,
bld->context_ptr,
texture_index, NULL);
/*
* Choose cube face, recompute texcoords for the chosen face and
* calculate / transform derivatives.
@@ -2618,21 +2627,14 @@ lp_build_sample_common(struct lp_build_sample_context *bld,
/* Need to compute lod either to choose mipmap levels or to
* distinguish between minification/magnification with one mipmap level.
*/
lp_build_lod_selector(bld, is_lodq, texture_index, sampler_index,
LLVMValueRef first_level_vec = lp_build_broadcast_scalar(&bld->int_size_in_bld, first_level);
lp_build_lod_selector(bld, is_lodq, sampler_index,
first_level_vec,
coords[0], coords[1], coords[2],
derivs, lod_bias, explicit_lod,
mip_filter, max_aniso, lod,
&lod_ipart, lod_fpart, lod_pos_or_zero);
if (is_lodq) {
LLVMValueRef last_level;
last_level = bld->dynamic_state->last_level(bld->gallivm,
bld->context_type,
bld->context_ptr,
texture_index, NULL);
first_level = bld->dynamic_state->first_level(bld->gallivm,
bld->context_type,
bld->context_ptr,
texture_index, NULL);
last_level = lp_build_sub(&bld->int_bld, last_level, first_level);
last_level = lp_build_int_to_float(&bld->float_bld, last_level);
last_level = lp_build_broadcast_scalar(&bld->lodf_bld, last_level);
@@ -2663,12 +2665,17 @@ lp_build_sample_common(struct lp_build_sample_context *bld,
lod_ipart = lp_build_extract_range(bld->gallivm, lod_ipart, 0, 1);
}
first_level = lp_build_broadcast_scalar(&bld->leveli_bld, first_level);
last_level = lp_build_broadcast_scalar(&bld->leveli_bld, last_level);
/*
* Compute integer mipmap level(s) to fetch texels from: ilevel0, ilevel1
*/
if (aniso) {
lp_build_nearest_mip_level(bld, texture_index, lod_ipart, ilevel0, NULL);
lp_build_nearest_mip_level(bld,
first_level, last_level,
lod_ipart, ilevel0, NULL);
return;
}
@@ -2677,21 +2684,20 @@ lp_build_sample_common(struct lp_build_sample_context *bld,
unreachable("Bad mip_filter value in lp_build_sample_soa()");
case PIPE_TEX_MIPFILTER_NONE:
/* always use mip level 0 */
first_level = bld->dynamic_state->first_level(bld->gallivm,
bld->context_type,
bld->context_ptr,
texture_index, NULL);
first_level = lp_build_broadcast_scalar(&bld->leveli_bld, first_level);
*ilevel0 = first_level;
break;
case PIPE_TEX_MIPFILTER_NEAREST:
assert(lod_ipart);
lp_build_nearest_mip_level(bld, texture_index, lod_ipart, ilevel0, NULL);
lp_build_nearest_mip_level(bld,
first_level, last_level,
lod_ipart, ilevel0, NULL);
break;
case PIPE_TEX_MIPFILTER_LINEAR:
assert(lod_ipart);
assert(*lod_fpart);
lp_build_linear_mip_levels(bld, texture_index,
first_level, last_level,
lod_ipart, lod_fpart,
ilevel0, ilevel1);
break;
@@ -3116,6 +3122,9 @@ 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 first_level = bld->dynamic_state->first_level(bld->gallivm,
bld->context_type,
bld->context_ptr, texture_unit, NULL);
out_of_bounds = int_coord_bld->zero;
@@ -3127,15 +3136,20 @@ lp_build_fetch_texel(struct lp_build_sample_context *bld,
else {
ilevel = explicit_lod;
}
lp_build_nearest_mip_level(bld, texture_unit, ilevel, &ilevel,
LLVMValueRef last_level = bld->dynamic_state->last_level(bld->gallivm,
bld->context_type,
bld->context_ptr, texture_unit, NULL);
first_level = lp_build_broadcast_scalar(&bld->leveli_bld, first_level);
last_level = lp_build_broadcast_scalar(&bld->leveli_bld, last_level);
lp_build_nearest_mip_level(bld,
first_level, last_level,
ilevel, &ilevel,
out_of_bound_ret_zero ? &out_of_bounds : NULL);
}
else {
assert(bld->num_mips == 1);
if (bld->static_texture_state->target != PIPE_BUFFER) {
ilevel = bld->dynamic_state->first_level(bld->gallivm,
bld->context_type,
bld->context_ptr, texture_unit, NULL);
ilevel = first_level;
}
else {
ilevel = lp_build_const_int32(bld->gallivm, 0);