cogl: Set LOD bias to -0.5 for single mipmap modes

So that whenever forced to choose between two levels of detail (two mipmaps)
we will land on the sharpest looking one (highest resolution). That's the
mipmap level equal to the floor of the current level of detail requested.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5920
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2644>
This commit is contained in:
Daniel van Vugt 2022-09-28 18:32:03 +08:00 committed by Marge Bot
parent 28982ade94
commit cc19547b8c
9 changed files with 56 additions and 0 deletions

View File

@ -57,6 +57,7 @@ typedef enum
COGL_PRIVATE_FEATURE_ALPHA_TEXTURES, COGL_PRIVATE_FEATURE_ALPHA_TEXTURES,
COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE,
COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL, COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL,
COGL_PRIVATE_FEATURE_TEXTURE_LOD_BIAS,
COGL_PRIVATE_FEATURE_OES_EGL_SYNC, COGL_PRIVATE_FEATURE_OES_EGL_SYNC,
/* If this is set then the winsys is responsible for queueing dirty /* If this is set then the winsys is responsible for queueing dirty
* events. Otherwise a dirty event will be queued when the onscreen * events. Otherwise a dirty event will be queued when the onscreen

View File

@ -682,6 +682,22 @@ _cogl_sampler_gl_init (CoglContext *context, CoglSamplerCacheEntry *entry)
GE (context, glSamplerParameteri (entry->sampler_object, GE (context, glSamplerParameteri (entry->sampler_object,
GL_TEXTURE_WRAP_T, GL_TEXTURE_WRAP_T,
entry->wrap_mode_t) ); entry->wrap_mode_t) );
/* While COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS implies support for
* GL_TEXTURE_LOD_BIAS in GL, the same is not true in GLES. So check,
* and also only apply GL_TEXTURE_LOD_BIAS in mipmap modes:
*/
if (_cogl_has_private_feature (context,
COGL_PRIVATE_FEATURE_TEXTURE_LOD_BIAS) &&
entry->min_filter != GL_NEAREST &&
entry->min_filter != GL_LINEAR)
{
GLfloat bias = _cogl_texture_min_filter_get_lod_bias (entry->min_filter);
GE (context, glSamplerParameterf (entry->sampler_object,
GL_TEXTURE_LOD_BIAS,
bias));
}
} }
else else
{ {

View File

@ -470,6 +470,15 @@ _cogl_texture_2d_gl_flush_legacy_texobj_filters (CoglTexture *tex,
tex_2d->gl_texture); tex_2d->gl_texture);
GE( ctx, glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter) ); GE( ctx, glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter) );
GE( ctx, glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter) ); GE( ctx, glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter) );
if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_LOD_BIAS) &&
min_filter != GL_NEAREST &&
min_filter != GL_LINEAR)
{
GLfloat bias = _cogl_texture_min_filter_get_lod_bias (min_filter);
GE (ctx, glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, bias));
}
} }
void void

View File

@ -62,4 +62,11 @@ _cogl_texture_gl_generate_mipmaps (CoglTexture *texture);
GLenum GLenum
_cogl_texture_gl_get_format (CoglTexture *texture); _cogl_texture_gl_get_format (CoglTexture *texture);
static inline GLfloat
_cogl_texture_min_filter_get_lod_bias (GLenum min_filter)
{
return (min_filter == GL_NEAREST_MIPMAP_NEAREST ||
min_filter == GL_LINEAR_MIPMAP_NEAREST) ? -0.5f : 0.0f;
}
#endif /* _COGL_TEXTURE_GL_PRIVATE_H_ */ #endif /* _COGL_TEXTURE_GL_PRIVATE_H_ */

View File

@ -250,4 +250,8 @@ cogl_gl_get_gpu_time_ns (CoglContext *context);
#define GL_QUERY_RESULT 0x8866 #define GL_QUERY_RESULT 0x8866
#endif #endif
#ifndef GL_TEXTURE_LOD_BIAS
#define GL_TEXTURE_LOD_BIAS 0x8501
#endif
#endif /* _COGL_UTIL_GL_PRIVATE_H_ */ #endif /* _COGL_UTIL_GL_PRIVATE_H_ */

View File

@ -526,6 +526,13 @@ _cogl_driver_update_features (CoglContext *ctx,
COGL_FLAGS_SET (private_features, COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL, TRUE); COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL, TRUE);
if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 3, 1) ||
_cogl_check_extension ("GL_EXT_texture_lod_bias", gl_extensions))
{
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_LOD_BIAS, TRUE);
}
if (ctx->glFenceSync) if (ctx->glFenceSync)
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_FENCE, TRUE); COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_FENCE, TRUE);

View File

@ -437,6 +437,12 @@ _cogl_driver_update_features (CoglContext *context,
COGL_FEATURE_ID_TEXTURE_RG, COGL_FEATURE_ID_TEXTURE_RG,
TRUE); TRUE);
if (_cogl_check_extension ("GL_EXT_texture_lod_bias", gl_extensions))
{
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_LOD_BIAS, TRUE);
}
if (context->glGenQueries && context->glQueryCounter && context->glGetInteger64v) if (context->glGenQueries && context->glQueryCounter && context->glGetInteger64v)
COGL_FLAGS_SET (context->features, COGL_FEATURE_ID_TIMESTAMP_QUERY, TRUE); COGL_FLAGS_SET (context->features, COGL_FEATURE_ID_TIMESTAMP_QUERY, TRUE);

View File

@ -178,6 +178,10 @@ COGL_EXT_FUNCTION (void, glSamplerParameteri,
(GLuint sampler, (GLuint sampler,
GLenum pname, GLenum pname,
GLint param)) GLint param))
COGL_EXT_FUNCTION (void, glSamplerParameterf,
(GLuint sampler,
GLenum pname,
GLfloat param))
COGL_EXT_END () COGL_EXT_END ()
COGL_EXT_BEGIN (only_gl3, 3, 0, COGL_EXT_BEGIN (only_gl3, 3, 0,

View File

@ -174,6 +174,8 @@ COGL_EXT_FUNCTION (void, glTexImage2D,
const GLvoid* pixels)) const GLvoid* pixels))
COGL_EXT_FUNCTION (void, glTexParameteri, COGL_EXT_FUNCTION (void, glTexParameteri,
(GLenum target, GLenum pname, GLint param)) (GLenum target, GLenum pname, GLint param))
COGL_EXT_FUNCTION (void, glTexParameterf,
(GLenum target, GLenum pname, GLfloat param))
COGL_EXT_FUNCTION (void, glTexParameteriv, COGL_EXT_FUNCTION (void, glTexParameteriv,
(GLenum target, GLenum pname, const GLint* params)) (GLenum target, GLenum pname, const GLint* params))
COGL_EXT_FUNCTION (void, glTexSubImage2D, COGL_EXT_FUNCTION (void, glTexSubImage2D,