From f77d95c9aefa8fe7ced2bd7820e1b43f069091b7 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Mon, 4 Dec 2023 19:32:00 +0100 Subject: [PATCH] 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: --- cogl/cogl/cogl-context.h | 4 +++ cogl/cogl/cogl-private.h | 2 -- cogl/cogl/driver/gl/gl/cogl-driver-gl.c | 6 ++-- cogl/cogl/driver/gl/gles/cogl-driver-gles.c | 34 +++++++++---------- .../driver/gl/gles/cogl-texture-driver-gles.c | 6 ++-- 5 files changed, 24 insertions(+), 28 deletions(-) diff --git a/cogl/cogl/cogl-context.h b/cogl/cogl/cogl-context.h index bb4ab2a1f..e0e37961c 100644 --- a/cogl/cogl/cogl-context.h +++ b/cogl/cogl/cogl-context.h @@ -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, diff --git a/cogl/cogl/cogl-private.h b/cogl/cogl/cogl-private.h index 7aebd673f..7fcf7b087 100644 --- a/cogl/cogl/cogl-private.h +++ b/cogl/cogl/cogl-private.h @@ -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, diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c index c662b7b7a..80936e1f2 100644 --- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c +++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c @@ -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); diff --git a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c index f6dcca24f..111adb60e 100644 --- a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c +++ b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c @@ -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; @@ -366,9 +362,9 @@ _cogl_driver_update_features (CoglContext *context, if (!COGL_CHECK_GL_VERSION (gl_major, gl_minor, 2, 0)) { g_set_error (error, - COGL_DRIVER_ERROR, - COGL_DRIVER_ERROR_INVALID_VERSION, - "OpenGL ES 2.0 or better is required"); + COGL_DRIVER_ERROR, + COGL_DRIVER_ERROR_INVALID_VERSION, + "OpenGL ES 2.0 or better is required"); g_strfreev (gl_extensions); 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, diff --git a/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles.c index 795217d87..bdfac90b3 100644 --- a/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles.c +++ b/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles.c @@ -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;