1
0
Fork 0

cogl: Make FP16 and RGBA1010102 public features

Also be more strict about what we consider RGBA1010102 support. Before
GLES 3.0, using ReadPixels on a framebuffers with format RGB10_A2 was
not possible with type GL_UNSIGNED_INT_2_10_10_10_REV_EXT and thus our
code to read back pixels could fail.

Users of cogl should check those feature flags before using FP16 and
RGBA1010102 pixel formats via CoglFeatureIDs:
 * COGL_FEATURE_ID_TEXTURE_RGBA1010102
 * COGL_FEATURE_ID_TEXTURE_HALF_FLOAT

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3429>
This commit is contained in:
Sebastian Wick 2023-12-04 19:32:00 +01:00 committed by Marge Bot
parent 5d0fc6d8c1
commit f77d95c9ae
5 changed files with 24 additions and 28 deletions

View file

@ -158,6 +158,8 @@ cogl_context_get_renderer (CoglContext *context);
* @COGL_FEATURE_ID_TEXTURE_RG: Support for
* %COGL_TEXTURE_COMPONENTS_RG as the internal components of a
* texture.
* @COGL_FEATURE_ID_TEXTURE_RGBA1010102: Support for 10bpc RGBA formats
* @COGL_FEATURE_ID_TEXTURE_HALF_FLOAT: Support for half float formats
* @COGL_FEATURE_ID_UNSIGNED_INT_INDICES: Set if
* %COGL_INDICES_TYPE_UNSIGNED_INT is supported in
* cogl_indices_new().
@ -182,6 +184,8 @@ typedef enum _CoglFeatureID
COGL_FEATURE_ID_MAP_BUFFER_FOR_WRITE,
COGL_FEATURE_ID_FENCE,
COGL_FEATURE_ID_TEXTURE_RG,
COGL_FEATURE_ID_TEXTURE_RGBA1010102,
COGL_FEATURE_ID_TEXTURE_HALF_FLOAT,
COGL_FEATURE_ID_BUFFER_AGE,
COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
COGL_FEATURE_ID_BLIT_FRAMEBUFFER,

View file

@ -46,8 +46,6 @@ typedef enum
COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL,
COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT,
COGL_PRIVATE_FEATURE_UNPACK_SUBIMAGE,
COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS,
COGL_PRIVATE_FEATURE_READ_PIXELS_ANY_STRIDE,

View file

@ -487,11 +487,9 @@ _cogl_driver_update_features (CoglContext *ctx,
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TEXTURE_RG, TRUE);
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102, TRUE);
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TEXTURE_RGBA1010102, TRUE);
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT, TRUE);
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TEXTURE_HALF_FLOAT, TRUE);
if (ctx->glGenQueries && ctx->glQueryCounter && ctx->glGetInteger64v)
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TIMESTAMP_QUERY, TRUE);

View file

@ -138,8 +138,7 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
case COGL_PIXEL_FORMAT_ABGR_2101010:
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
{
glintformat = GL_RGB10_A2_EXT;
glformat = GL_RGBA;
@ -157,8 +156,7 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
case COGL_PIXEL_FORMAT_ARGB_2101010:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
{
glintformat = GL_RGB10_A2_EXT;
glformat = GL_RGBA;
@ -230,8 +228,7 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
case COGL_PIXEL_FORMAT_RGBX_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
if (!_cogl_has_private_feature
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT))
if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_HALF_FLOAT))
g_warning ("Missing 16 bpc half float extension");
glintformat = GL_RGBA;
@ -284,9 +281,8 @@ _cogl_driver_read_pixels_format_supported (CoglContext *context,
if (glintformat == GL_RGB10_A2_EXT &&
glformat == GL_RGBA &&
gltype == GL_UNSIGNED_INT_2_10_10_10_REV_EXT &&
_cogl_has_private_feature (context,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
gltype == GL_UNSIGNED_INT_2_10_10_10_REV &&
cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
return TRUE;
return FALSE;
@ -430,13 +426,15 @@ _cogl_driver_update_features (CoglContext *context,
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888, TRUE);
if (_cogl_check_extension ("GL_EXT_texture_type_2_10_10_10_REV", gl_extensions))
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102, TRUE);
if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 3, 0))
COGL_FLAGS_SET (context->features,
COGL_FEATURE_ID_TEXTURE_RGBA1010102, TRUE);
if (_cogl_check_extension ("GL_OES_texture_half_float", gl_extensions))
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT, TRUE);
if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 3, 2) ||
(_cogl_check_extension ("GL_OES_texture_half_float", gl_extensions) &&
_cogl_check_extension ("GL_EXT_color_buffer_half_float", gl_extensions)))
COGL_FLAGS_SET (context->features,
COGL_FEATURE_ID_TEXTURE_HALF_FLOAT, TRUE);
if (_cogl_check_extension ("GL_EXT_unpack_subimage", gl_extensions))
COGL_FLAGS_SET (private_features,

View file

@ -464,8 +464,7 @@ _cogl_texture_driver_upload_supported (CoglContext *ctx,
case COGL_PIXEL_FORMAT_ARGB_2101010:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature
(ctx, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
return TRUE;
else
return FALSE;
@ -500,8 +499,7 @@ _cogl_texture_driver_upload_supported (CoglContext *ctx,
case COGL_PIXEL_FORMAT_RGBX_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
if (_cogl_has_private_feature
(ctx, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT))
if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_HALF_FLOAT))
return TRUE;
else
return FALSE;