lima: add support for srgb textures

Add lowering pass to convert textures from srgb when using srgb formats.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39320>
This commit is contained in:
Erico Nunes 2025-08-01 17:04:55 +02:00 committed by Marge Bot
parent bcab449924
commit d18db3e33d
4 changed files with 46 additions and 20 deletions

View file

@ -94,7 +94,6 @@ spec@arb_point_sprite@arb_point_sprite-checkerboard,Fail
spec@arb_point_sprite@arb_point_sprite-mipmap,Fail
spec@arb_provoking_vertex@arb-provoking-vertex-clipped-geometry-flatshading,Fail
spec@arb_provoking_vertex@arb-provoking-vertex-render,Fail
spec@arb_sampler_objects@gl_ext_texture_srgb_decode,Fail
spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgradcube,Fail
spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgrad,Fail
spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-01,Fail
@ -187,33 +186,37 @@ spec@ext_packed_depth_stencil@fbo-stencil-gl_depth24_stencil8-copypixels,Fail
spec@ext_provoking_vertex@provoking-vertex,Fail
spec@ext_texture_format_bgra8888@api-errors,Fail
spec@ext_texture_lod_bias@lodbias,Fail
spec@ext_texture_srgb@tex-srgb,Fail
# srgb bordercolor tests fail only on the GL_CLAMP subtests, likely due to
# interpolating bordercolor in srgb before applying srgb->linear conversion
# in shader.
spec@ext_texture_srgb@texwrap formats bordercolor,Fail
spec@ext_texture_srgb@texwrap formats bordercolor@GL_SRGB8_ALPHA8- border color only,Fail
spec@ext_texture_srgb@texwrap formats bordercolor@GL_SRGB8- border color only,Fail
spec@ext_texture_srgb@texwrap formats bordercolor-swizzled,Fail
spec@ext_texture_srgb@texwrap formats bordercolor-swizzled@GL_SRGB8_ALPHA8- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats bordercolor-swizzled@GL_SRGB8- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats,Fail
spec@ext_texture_srgb@texwrap formats@GL_SRGB8_ALPHA8,Fail
spec@ext_texture_srgb@texwrap formats@GL_SRGB8_ALPHA8- NPOT,Fail
spec@ext_texture_srgb@texwrap formats@GL_SRGB8_ALPHA8- swizzled,Fail
spec@ext_texture_srgb@texwrap formats@GL_SRGB8,Fail
spec@ext_texture_srgb@texwrap formats@GL_SRGB8- NPOT,Fail
spec@ext_texture_srgb@texwrap formats@GL_SRGB8- swizzled,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SRGB_ALPHA- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SRGB- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc,Fail
spec@ext_texture_srgb@texwrap formats-s3tc@GL_COMPRESSED_SRGB_ALPHA- NPOT,Fail
spec@ext_texture_srgb@texwrap formats-s3tc@GL_COMPRESSED_SRGB_ALPHA- swizzled,Fail
spec@ext_texture_srgb@texwrap formats-s3tc@GL_COMPRESSED_SRGB_ALPHA,Fail
spec@ext_texture_srgb@texwrap formats-s3tc@GL_COMPRESSED_SRGB- NPOT,Fail
spec@ext_texture_srgb@texwrap formats-s3tc@GL_COMPRESSED_SRGB- swizzled,Fail
spec@ext_texture_srgb@texwrap formats-s3tc@GL_COMPRESSED_SRGB,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SLUMINANCE- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SLUMINANCE_ALPHA- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_S3TC_DXT1_EXT- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SLUMINANCE- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SLUMINANCE_ALPHA- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT- border color only,Fail
spec@ext_texture_srgb@texwrap formats-s3tc bordercolor@GL_COMPRESSED_SRGB_S3TC_DXT1_EXT- border color only,Fail
spec@ext_texture_srgb@texwrap formats bordercolor-swizzled@GL_SLUMINANCE8- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats bordercolor-swizzled@GL_SLUMINANCE8_ALPHA8- swizzled- border color only,Fail
spec@ext_texture_srgb@texwrap formats bordercolor@GL_SLUMINANCE8- border color only,Fail
spec@ext_texture_srgb@texwrap formats bordercolor@GL_SLUMINANCE8_ALPHA8- border color only,Fail
spec@glsl-1.10@execution@built-in-functions@fs-atan-float-float,Fail
spec@glsl-1.10@execution@built-in-functions@fs-atan-vec2-vec2,Fail
spec@glsl-1.10@execution@built-in-functions@fs-atan-vec3-vec3,Fail
@ -477,6 +480,8 @@ spec@intel_performance_query@intel_performance_query-issue_2235,Fail
spec@khr_texture_compression_astc@basic-gles,Fail
spec@khr_texture_compression_astc@miptree-gles srgb,Fail
spec@khr_texture_compression_astc@miptree-gles srgb-fp,Fail
spec@khr_texture_compression_astc@miptree-gl srgb-fp,Fail
spec@khr_texture_compression_astc@miptree-gl srgb-fp@sRGB decode full precision,Fail
spec@oes_point_sprite@arb_point_sprite-checkerboard_gles1,Fail
spec@!opengl 1.0@gl-1.0-dlist-bitmap,Fail
spec@!opengl 1.0@gl-1.0-dlist-materials,Fail

View file

@ -63,6 +63,7 @@ struct lima_fs_uncompiled_shader {
struct lima_fs_key {
unsigned char nir_sha1[SHA1_DIGEST_LENGTH];
struct {
enum pipe_format format;
uint8_t swizzle[4];
} tex[PIPE_MAX_SAMPLERS];

View file

@ -333,6 +333,12 @@ lima_fs_compile_shader(struct lima_context *ctx,
for (int i = 0; i < ARRAY_SIZE(key->tex); i++) {
for (int j = 0; j < 4; j++)
tex_options.swizzles[i][j] = key->tex[i].swizzle[j];
enum pipe_format format = key->tex[i].format;
if (!format)
continue;
if (util_format_is_srgb(format))
tex_options.lower_srgb |= (1 << i);
}
lima_program_optimize_fs_nir(nir, key, &tex_options);
@ -655,6 +661,9 @@ lima_update_fs_state(struct lima_context *ctx)
memcpy(key->tex[i].swizzle, identity, 4);
continue;
}
key->tex[i].format = sampler->base.format;
for (int j = 0; j < 4; j++)
key->tex[i].swizzle[j] = sampler->swizzle[j];
}

View file

@ -29,6 +29,7 @@
#include "util/u_math.h"
#include "util/u_debug.h"
#include "util/u_transfer.h"
#include "util/format_srgb.h"
#include "lima_bo.h"
#include "lima_context.h"
@ -226,10 +227,20 @@ lima_update_tex_desc(struct lima_context *ctx, struct lima_sampler_state *sample
desc.wrap_t = pipe_wrap_to_lima(sampler->base.wrap_t, using_nearest);
desc.wrap_r = pipe_wrap_to_lima(sampler->base.wrap_r, using_nearest);
desc.border_red = sampler->base.border_color.f[0];
desc.border_green = sampler->base.border_color.f[1];
desc.border_blue = sampler->base.border_color.f[2];
desc.border_alpha = sampler->base.border_color.f[3];
float border_color[4];
for (int i = 0; i < 4; i++)
border_color[i] = sampler->base.border_color.f[i];
if (util_format_is_srgb(texture->base.format)) {
for (int i = 0; i < 3; i++)
border_color[i] =
util_format_linear_to_srgb_float(border_color[i]);
}
desc.border_red = border_color[0];
desc.border_green = border_color[1];
desc.border_blue = border_color[2];
desc.border_alpha = border_color[3];
if (desc.min_img_filter_nearest && desc.mag_img_filter_nearest &&
desc.mipfilter == 0 &&