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_FEATURE_ID_TEXTURE_RG: Support for
* %COGL_TEXTURE_COMPONENTS_RG as the internal components of a * %COGL_TEXTURE_COMPONENTS_RG as the internal components of a
* texture. * 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_FEATURE_ID_UNSIGNED_INT_INDICES: Set if
* %COGL_INDICES_TYPE_UNSIGNED_INT is supported in * %COGL_INDICES_TYPE_UNSIGNED_INT is supported in
* cogl_indices_new(). * cogl_indices_new().
@ -182,6 +184,8 @@ typedef enum _CoglFeatureID
COGL_FEATURE_ID_MAP_BUFFER_FOR_WRITE, COGL_FEATURE_ID_MAP_BUFFER_FOR_WRITE,
COGL_FEATURE_ID_FENCE, COGL_FEATURE_ID_FENCE,
COGL_FEATURE_ID_TEXTURE_RG, COGL_FEATURE_ID_TEXTURE_RG,
COGL_FEATURE_ID_TEXTURE_RGBA1010102,
COGL_FEATURE_ID_TEXTURE_HALF_FLOAT,
COGL_FEATURE_ID_BUFFER_AGE, COGL_FEATURE_ID_BUFFER_AGE,
COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL, COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
COGL_FEATURE_ID_BLIT_FRAMEBUFFER, COGL_FEATURE_ID_BLIT_FRAMEBUFFER,

View File

@ -46,8 +46,6 @@ typedef enum
COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL, COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL,
COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL, COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888, 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_UNPACK_SUBIMAGE,
COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS, COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS,
COGL_PRIVATE_FEATURE_READ_PIXELS_ANY_STRIDE, 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 (ctx->features, COGL_FEATURE_ID_TEXTURE_RG, TRUE);
COGL_FLAGS_SET (private_features, COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TEXTURE_RGBA1010102, TRUE);
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102, TRUE);
COGL_FLAGS_SET (private_features, COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TEXTURE_HALF_FLOAT, TRUE);
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT, TRUE);
if (ctx->glGenQueries && ctx->glQueryCounter && ctx->glGetInteger64v) if (ctx->glGenQueries && ctx->glQueryCounter && ctx->glGetInteger64v)
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TIMESTAMP_QUERY, TRUE); 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:
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE: case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN #if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
{ {
glintformat = GL_RGB10_A2_EXT; glintformat = GL_RGB10_A2_EXT;
glformat = GL_RGBA; 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:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE: case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN #if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
{ {
glintformat = GL_RGB10_A2_EXT; glintformat = GL_RGB10_A2_EXT;
glformat = GL_RGBA; 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_RGBX_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616: case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
if (!_cogl_has_private_feature if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_HALF_FLOAT))
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT))
g_warning ("Missing 16 bpc half float extension"); g_warning ("Missing 16 bpc half float extension");
glintformat = GL_RGBA; glintformat = GL_RGBA;
@ -284,9 +281,8 @@ _cogl_driver_read_pixels_format_supported (CoglContext *context,
if (glintformat == GL_RGB10_A2_EXT && if (glintformat == GL_RGB10_A2_EXT &&
glformat == GL_RGBA && glformat == GL_RGBA &&
gltype == GL_UNSIGNED_INT_2_10_10_10_REV_EXT && gltype == GL_UNSIGNED_INT_2_10_10_10_REV &&
_cogl_has_private_feature (context, cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
return TRUE; return TRUE;
return FALSE; return FALSE;
@ -366,9 +362,9 @@ _cogl_driver_update_features (CoglContext *context,
if (!COGL_CHECK_GL_VERSION (gl_major, gl_minor, 2, 0)) if (!COGL_CHECK_GL_VERSION (gl_major, gl_minor, 2, 0))
{ {
g_set_error (error, g_set_error (error,
COGL_DRIVER_ERROR, COGL_DRIVER_ERROR,
COGL_DRIVER_ERROR_INVALID_VERSION, COGL_DRIVER_ERROR_INVALID_VERSION,
"OpenGL ES 2.0 or better is required"); "OpenGL ES 2.0 or better is required");
g_strfreev (gl_extensions); g_strfreev (gl_extensions);
return FALSE; return FALSE;
} }
@ -430,13 +426,15 @@ _cogl_driver_update_features (CoglContext *context,
COGL_FLAGS_SET (private_features, COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888, TRUE); COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888, TRUE);
if (_cogl_check_extension ("GL_EXT_texture_type_2_10_10_10_REV", gl_extensions)) if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 3, 0))
COGL_FLAGS_SET (private_features, COGL_FLAGS_SET (context->features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102, TRUE); COGL_FEATURE_ID_TEXTURE_RGBA1010102, TRUE);
if (_cogl_check_extension ("GL_OES_texture_half_float", gl_extensions)) if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 3, 2) ||
COGL_FLAGS_SET (private_features, (_cogl_check_extension ("GL_OES_texture_half_float", gl_extensions) &&
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT, TRUE); _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)) if (_cogl_check_extension ("GL_EXT_unpack_subimage", gl_extensions))
COGL_FLAGS_SET (private_features, 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:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE: case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN #if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_RGBA1010102))
(ctx, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
@ -500,8 +499,7 @@ _cogl_texture_driver_upload_supported (CoglContext *ctx,
case COGL_PIXEL_FORMAT_RGBX_FP_16161616: case COGL_PIXEL_FORMAT_RGBX_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616: case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
if (_cogl_has_private_feature if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_HALF_FLOAT))
(ctx, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT))
return TRUE; return TRUE;
else else
return FALSE; return FALSE;