From bf3027c3916ad5be172c22851e7172671709a9bc Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 11 Mar 2023 18:58:34 -0500 Subject: [PATCH] mesa/st: Normalize wrap modes for seamless cubes MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The OpenGL specification requires that seamless cube maps ignore the wrap mode, but some hardware may try to respect the wrap mode even for seamless cubes contrary to the spec. Since OpenGL maps samplers 1:1 to textures (at least without bindless texture support...), it's easy to override the wrap mode for seamless cubes to something that works for the hardware. I'm not sure if there is value in gating this behaviour behind a CAP. On one hand, there is a tiny bit of extra CPU overhead added to change samplers. On the other hand, normalizing wrap modes might improve CSO caching, and normalizing to a non-BORDER mode avoids the expensive border colour code later in the function. We will need a different workaround in our Vulkan driver. Potentially, we'll have to duplicate *every* sampler to have a cubemap version and a non-cubemap version, selecting a sampler in the shader based on the texture opcode. That sucks and implementing it would depend on subtle details of how we implement descriptor sets, so it's not like we would share that code with the GL driver anyway. In the mean time, let's get this right for GL without the performance hit of duplication. Fixes dEQP-GLES3.functional.texture.filtering.cube.* on Asahi, as well as a smattering of dEQP-GLES31.functional.texture.filtering.cube_array.* fails on softpipe. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Erik Faye-Lund Reviewed-by: Marek Olšák Reviewed-by: Iago Toral Quiroga Reviewed-by: Juan A. Suarez Reviewed-by: Kenneth Graunke Reviewed-by: Emma Anholt Part-of: --- .../drivers/softpipe/ci/softpipe-asan-fails.txt | 8 ---- src/gallium/drivers/softpipe/ci/softpipe-fails.txt | 46 ---------------------- src/mesa/state_tracker/st_atom_sampler.c | 14 +++++++ 3 files changed, 14 insertions(+), 54 deletions(-) diff --git a/src/gallium/drivers/softpipe/ci/softpipe-asan-fails.txt b/src/gallium/drivers/softpipe/ci/softpipe-asan-fails.txt index 50b6e38..5d9ab75 100644 --- a/src/gallium/drivers/softpipe/ci/softpipe-asan-fails.txt +++ b/src/gallium/drivers/softpipe/ci/softpipe-asan-fails.txt @@ -17,19 +17,11 @@ dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immuta dEQP-GLES31.functional.state_query.texture.texture_2d_multisample_array.texture_immutable_levels_float,Fail dEQP-GLES31.functional.state_query.texture.texture_2d_multisample_array.texture_immutable_levels_integer,Fail dEQP-GLES31.functional.state_query.texture.texture_2d_multisample_array.texture_immutable_levels_pure_int,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_linear_clamp_repeat,Fail dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_linear_mirror_repeat,Fail dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_linear_clamp_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_linear_repeat_mirror,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_nearest_repeat_repeat,Fail dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb10_a2_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb5_a1_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba16f_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba8_nearest_mipmap_linear,Fail dEQP-GLES31.functional.texture.filtering.cube_array.sizes.128x128x12_nearest_mipmap_linear,Fail dEQP-GLES31.functional.texture.filtering.cube_array.sizes.63x63x18_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.sizes.64x64x12_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.sizes.8x8x6_nearest,Fail dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.repeat_mirrored_repeat,Fail dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_pot.mirrored_repeat_clamp_to_edge,Fail dEQP-GLES31.functional.texture.gather.offset_dynamic.implementation_offset.2d.depth32f.base_level.level_1,Fail diff --git a/src/gallium/drivers/softpipe/ci/softpipe-fails.txt b/src/gallium/drivers/softpipe/ci/softpipe-fails.txt index 1f4ef9b..af050b4 100644 --- a/src/gallium/drivers/softpipe/ci/softpipe-fails.txt +++ b/src/gallium/drivers/softpipe/ci/softpipe-fails.txt @@ -514,60 +514,14 @@ dEQP-GLES31.functional.state_query.texture.texture_2d_multisample_array.texture_ dEQP-GLES31.functional.state_query.texture.texture_2d_multisample_array.texture_immutable_levels_pure_uint,Fail dEQP-GLES31.functional.texture.border_clamp.depth_compare_mode.depth32f_stencil8.linear_size_npot,Fail dEQP-GLES31.functional.texture.border_clamp.depth_compare_mode.depth32f_stencil8.linear_size_pot,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_linear_clamp_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_linear_mirror_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_linear_repeat_clamp,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_linear_repeat_mirror,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_linear_repeat_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_linear_clamp_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_linear_mirror_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_linear_repeat_clamp,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_linear_repeat_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_nearest_clamp_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_nearest_mirror_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_nearest_repeat_clamp,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_linear_nearest_repeat_mirror,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_linear_clamp_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_linear_mirror_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_linear_repeat_clamp,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_linear_repeat_mirror,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_nearest_repeat_clamp,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_nearest_repeat_mirror,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_nearest_nearest_repeat_repeat,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_nearest_repeat_mirror,Fail dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb10_a2_linear_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb10_a2_nearest,Fail dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb10_a2_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb10_a2_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb565_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb565_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb5_a1_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb5_a1_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb9_e5_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgb9_e5_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba16f_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba16f_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba4_nearest,Fail dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba4_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba8_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba8_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba8_snorm_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.rgba8_snorm_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.sr8_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.srg8_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.srg8_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.srg8_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.srgb8_alpha8_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.formats.srgb8_alpha8_nearest_mipmap_linear,Fail dEQP-GLES31.functional.texture.filtering.cube_array.sizes.128x128x12_linear,Fail dEQP-GLES31.functional.texture.filtering.cube_array.sizes.128x128x12_linear_mipmap_linear,Fail dEQP-GLES31.functional.texture.filtering.cube_array.sizes.128x128x12_linear_mipmap_nearest,Fail dEQP-GLES31.functional.texture.filtering.cube_array.sizes.128x128x12_nearest_mipmap_linear,Fail dEQP-GLES31.functional.texture.filtering.cube_array.sizes.128x128x12_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.sizes.63x63x18_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.sizes.64x64x12_nearest_mipmap_linear,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.sizes.64x64x12_nearest_mipmap_nearest,Fail -dEQP-GLES31.functional.texture.filtering.cube_array.sizes.8x8x6_nearest,Fail dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.clamp_to_edge_repeat,Fail dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.mirrored_repeat_clamp_to_edge,Fail dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.repeat_mirrored_repeat,Fail diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index e0d3215..826c42d 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -80,6 +80,20 @@ st_convert_sampler(const struct st_context *st, if (texobj->Target == GL_TEXTURE_RECTANGLE_ARB && !st->lower_rect_tex) sampler->unnormalized_coords = 1; + /* + * The spec says that "texture wrap modes are ignored" for seamless cube + * maps, so normalize the CSO. This works around Apple hardware which honours + * REPEAT modes even for seamless cube maps. + */ + if ((texobj->Target == GL_TEXTURE_CUBE_MAP || + texobj->Target == GL_TEXTURE_CUBE_MAP_ARRAY) && + sampler->seamless_cube_map) { + + sampler->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; + sampler->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; + sampler->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; + } + sampler->lod_bias += tex_unit_lod_bias; /* Check that only wrap modes using the border color have the first bit -- 2.7.4