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:
parent
5d0fc6d8c1
commit
f77d95c9ae
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user