gallivm: Always take the per-pixel LOD path for cubemaps.

The VK spec requires that derivatives are mapped to the face, and given
that the face is per pixel that implies that we need per-pixel
derivatives.  This also seems to match hardware behavior.

Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10219>
This commit is contained in:
Emma Anholt 2021-07-19 16:13:36 -07:00 committed by Marge Bot
parent 371cf5d06a
commit d413fd0219
3 changed files with 3 additions and 148 deletions

View File

@ -1826,7 +1826,7 @@ lp_build_cube_lookup(struct lp_build_sample_context *bld,
maxasat = lp_build_max(coord_bld, as, at);
ar_ge_as_at = lp_build_cmp(coord_bld, PIPE_FUNC_GEQUAL, ar, maxasat);
if (need_derivs && (derivs_in || (bld->no_quad_lod && bld->no_rho_approx))) {
if (need_derivs) {
/*
* XXX: This is really really complex.
* It is a bit overkill to use this for implicit derivatives as well,
@ -1983,70 +1983,7 @@ lp_build_cube_lookup(struct lp_build_sample_context *bld,
return;
}
else if (need_derivs) {
LLVMValueRef ddx_ddy[2], tmp[3], rho_vec;
static const unsigned char swizzle0[] = { /* no-op swizzle */
0, LP_BLD_SWIZZLE_DONTCARE,
LP_BLD_SWIZZLE_DONTCARE, LP_BLD_SWIZZLE_DONTCARE
};
static const unsigned char swizzle1[] = {
1, LP_BLD_SWIZZLE_DONTCARE,
LP_BLD_SWIZZLE_DONTCARE, LP_BLD_SWIZZLE_DONTCARE
};
static const unsigned char swizzle01[] = { /* no-op swizzle */
0, 1,
LP_BLD_SWIZZLE_DONTCARE, LP_BLD_SWIZZLE_DONTCARE
};
static const unsigned char swizzle23[] = {
2, 3,
LP_BLD_SWIZZLE_DONTCARE, LP_BLD_SWIZZLE_DONTCARE
};
static const unsigned char swizzle02[] = {
0, 2,
LP_BLD_SWIZZLE_DONTCARE, LP_BLD_SWIZZLE_DONTCARE
};
/*
* scale the s/t/r coords pre-select/mirror so we can calculate
* "reasonable" derivs.
*/
ma = lp_build_select3(coord_bld, as_ge_at, ar_ge_as_at, s, t, r);
imahalfpos = lp_build_cube_imapos(coord_bld, ma);
s = lp_build_mul(coord_bld, s, imahalfpos);
t = lp_build_mul(coord_bld, t, imahalfpos);
r = lp_build_mul(coord_bld, r, imahalfpos);
/*
* This isn't quite the same as the "ordinary" (3d deriv) path since we
* 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);
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);
rho_vec = lp_build_add(coord_bld, tmp[0], tmp[1]);
rho_vec = lp_build_add(coord_bld, rho_vec, tmp[2]);
tmp[0] = lp_build_swizzle_aos(coord_bld, rho_vec, swizzle0);
tmp[1] = lp_build_swizzle_aos(coord_bld, rho_vec, swizzle1);
*rho = lp_build_max(coord_bld, tmp[0], tmp[1]);
}
if (!need_derivs) {
ma = lp_build_select3(coord_bld, as_ge_at, ar_ge_as_at, s, t, r);
}
ma = lp_build_select3(coord_bld, as_ge_at, ar_ge_as_at, s, t, r);
mai = LLVMBuildBitCast(builder, ma, cint_vec_type, "");
signmabit = LLVMBuildAnd(builder, mai, signmask, "");

View File

@ -238,7 +238,7 @@ traces:
- path: supertuxkart/supertuxkart-mansion-egl-gles.trace
expectations:
- device: gl-virgl
checksum: cb918cbe6e2ff6cacdfc09a89e77c8a8
checksum: 74e9081b18e48c31f1755fadcb6fc068
# Sometimes crashes
# - path: xonotic/xonotic-keybench-high.trace
# expectations:

View File

@ -33,85 +33,3 @@ dEQP-VK.image.mismatched_formats.image_write.b8g8r8a8_srgb_with_rgba8,Crash
dEQP-VK.image.mismatched_formats.image_write.r8g8b8a8_srgb_with_rgb10a2,Crash
dEQP-VK.rasterization.primitives.static_stipple.rectangular_line_strip_wide,Fail
dEQP-VK.rasterization.primitives_multisample_4_bit.dynamic_stipple.line_strip_wide,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.clamp_to_border.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.clamp_to_edge.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.clamp_to_edge.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.mirror_clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.mirror_clamp_to_edge.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.mirror_clamp_to_edge.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.mirrored_repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.repeat.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.linear.repeat.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.clamp_to_border.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.clamp_to_border.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.clamp_to_border.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.mirror_clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.mirrored_repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.mirrored_repeat.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.mirrored_repeat.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear.nearest.repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.clamp_to_border.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.clamp_to_edge.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.clamp_to_edge.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.mirror_clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.mirror_clamp_to_edge.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.mirror_clamp_to_edge.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.mirrored_repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.repeat.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.linear.repeat.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.clamp_to_border.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.clamp_to_border.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.clamp_to_border.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.mirror_clamp_to_edge.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.mirrored_repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.mirrored_repeat.clamp_to_edge,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.mirrored_repeat.mirrored_repeat,Fail
dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear.nearest.repeat.clamp_to_border,Fail
dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm.linear_mipmap_linear,Fail
dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm.linear_mipmap_linear,Fail
dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm.nearest_mipmap_linear,Fail
dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm.linear_mipmap_linear,Fail
dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm.nearest_mipmap_linear,Fail
dEQP-VK.texture.filtering.cube.sizes.128x128.linear_mipmap_linear,Fail
dEQP-VK.texture.filtering.cube.sizes.128x128.nearest_mipmap_linear,Fail
dEQP-VK.texture.filtering.cube.sizes.63x63.nearest_mipmap_linear,Fail
dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_linear_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_nearest_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_linear_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_linear_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_nearest_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_linear_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_linear_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_linear_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_nearest_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_linear_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_nearest_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.max_level.linear_nearest,Fail
dEQP-VK.texture.mipmap.cubemap.max_level.nearest_linear,Fail
dEQP-VK.texture.mipmap.cubemap.max_lod.nearest_linear,Fail
dEQP-VK.texture.mipmap.cubemap.max_lod.nearest_nearest,Fail
dEQP-VK.texture.mipmap.cubemap.min_lod.linear_linear,Fail
dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_linear_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_nearest_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_linear_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_clamp,Fail
dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_linear_repeat,Fail
dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_mirror,Fail
dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_repeat,Fail