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_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,
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user