[Mesa-dev] [PATCH 1/3] gallivm: ignore rho approximation for cube maps
Brian Paul
brianp at vmware.com
Thu Oct 3 12:40:40 PDT 2013
On 10/03/2013 09:42 AM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> There's two reasons for this:
> 1) even when ignoring rho approximation for cube maps, the result is still
> not correct, but it's better as the max error at edges is now sqrt(2) instead
> of 2 (which was a full mip level), same as it is for ordinary 2d maps when
> doing rho approximations (so the error actually goes from factor 2 at edges and
> sqrt(2) completely inside a face to sqrt(2) at edges and 0 inside a face).
> 2) I want to repurpose rho_no_approx for cubemaps for fully correct cubemap
> derivatives (so don't need yet another debug var).
> ---
> src/gallium/auxiliary/gallivm/lp_bld_sample.c | 34 +++++++++----------------
> 1 file changed, 12 insertions(+), 22 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.c b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> index c775382..ea6bec7 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> @@ -269,10 +269,8 @@ lp_build_rho(struct lp_build_sample_context *bld,
> /* Could optimize this for single quad just skip the broadcast */
> cubesize = lp_build_extract_broadcast(gallivm, bld->float_size_in_type,
> rho_bld->type, float_size, index0);
> - if (no_rho_opt) {
> - /* skipping sqrt hence returning rho squared */
> - cubesize = lp_build_mul(rho_bld, cubesize, cubesize);
> - }
> + /* skipping sqrt hence returning rho squared */
> + cubesize = lp_build_mul(rho_bld, cubesize, cubesize);
> rho = lp_build_mul(rho_bld, cubesize, rho);
> }
> else if (derivs && !(bld->static_texture_state->target == PIPE_TEXTURE_CUBE)) {
> @@ -757,8 +755,8 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
> }
> else {
> LLVMValueRef rho;
> - boolean rho_squared = (gallivm_debug & GALLIVM_DEBUG_NO_RHO_APPROX) &&
> - (bld->dims > 1);
> + boolean rho_squared = ((gallivm_debug & GALLIVM_DEBUG_NO_RHO_APPROX) &&
> + (bld->dims > 1)) || cube_rho;
>
> rho = lp_build_rho(bld, texture_unit, s, t, r, cube_rho, derivs);
>
> @@ -1602,31 +1600,23 @@ lp_build_cube_lookup(struct lp_build_sample_context *bld,
> * know the texture is square which simplifies things (we can omit the
> * size mul which happens very early completely here and do it at the
> * very end).
> + * Also always do calculations according to GALLIVM_DEBUG_NO_RHO_APPROX
> + * since the error can get quite big otherwise at edges.
> + * (With no_rho_approx max error is sqrt(2) at edges, same as it is
> + * without no_rho_approx for 2d textures, otherwise it would be factor 2.)
> */
> ddx_ddy[0] = lp_build_packed_ddx_ddy_twocoord(coord_bld, s, t);
> ddx_ddy[1] = lp_build_packed_ddx_ddy_onecoord(coord_bld, r);
>
> - if (gallivm_debug & GALLIVM_DEBUG_NO_RHO_APPROX) {
> - ddx_ddy[0] = lp_build_mul(coord_bld, ddx_ddy[0], ddx_ddy[0]);
> - ddx_ddy[1] = lp_build_mul(coord_bld, ddx_ddy[1], ddx_ddy[1]);
> - }
> - else {
> - ddx_ddy[0] = lp_build_abs(coord_bld, ddx_ddy[0]);
> - ddx_ddy[1] = lp_build_abs(coord_bld, ddx_ddy[1]);
> - }
> + ddx_ddy[0] = lp_build_mul(coord_bld, ddx_ddy[0], ddx_ddy[0]);
> + ddx_ddy[1] = lp_build_mul(coord_bld, ddx_ddy[1], ddx_ddy[1]);
>
> tmp[0] = lp_build_swizzle_aos(coord_bld, ddx_ddy[0], swizzle01);
> tmp[1] = lp_build_swizzle_aos(coord_bld, ddx_ddy[0], swizzle23);
> tmp[2] = lp_build_swizzle_aos(coord_bld, ddx_ddy[1], swizzle02);
>
> - if (gallivm_debug & GALLIVM_DEBUG_NO_RHO_APPROX) {
> - rho_vec = lp_build_add(coord_bld, tmp[0], tmp[1]);
> - rho_vec = lp_build_add(coord_bld, rho_vec, tmp[2]);
> - }
> - else {
> - rho_vec = lp_build_max(coord_bld, tmp[0], tmp[1]);
> - rho_vec = lp_build_max(coord_bld, rho_vec, tmp[2]);
> - }
> + rho_vec = lp_build_add(coord_bld, tmp[0], tmp[1]);
> + rho_vec = lp_build_add(coord_bld, rho_vec, tmp[2]);
I don't know how often we have these 3-way lp_build_add() sequences, but
would an lp_build_add3(bld, a, b, c) be useful?
>
> tmp[0] = lp_build_swizzle_aos(coord_bld, rho_vec, swizzle0);
> tmp[1] = lp_build_swizzle_aos(coord_bld, rho_vec, swizzle1);
>
More information about the mesa-dev
mailing list