cogl/texture: Add API to check whether _get_data() will work

Currently, GL_TEXTURE_EXTERNAL_OES textures doesn't support getting pixel data.
Make it possible for texture users to know this.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
This commit is contained in:
Jonas Ådahl 2018-12-19 11:46:45 +01:00 committed by Ray Strode
parent 6dc7bacf08
commit e27c63e41b
16 changed files with 66 additions and 7 deletions

View File

@ -1043,5 +1043,6 @@ cogl_atlas_texture_vtable =
_cogl_atlas_texture_get_gl_format, _cogl_atlas_texture_get_gl_format,
_cogl_atlas_texture_get_type, _cogl_atlas_texture_get_type,
NULL, /* is_foreign */ NULL, /* is_foreign */
NULL /* set_auto_mipmap */ NULL, /* set_auto_mipmap */
NULL /* is_get_data_supported */
}; };

View File

@ -210,6 +210,9 @@ struct _CoglDriverVtable
int rowstride, int rowstride,
uint8_t *data); uint8_t *data);
CoglBool
(* texture_2d_is_get_data_supported) (CoglTexture2D *tex_2d);
/* Prepares for drawing by flushing the journal, framebuffer state, /* Prepares for drawing by flushing the journal, framebuffer state,
* pipeline state and attribute state. * pipeline state and attribute state.
*/ */

View File

@ -454,6 +454,14 @@ _cogl_sub_texture_get_type (CoglTexture *tex)
return _cogl_texture_get_type (sub_tex->full_texture); return _cogl_texture_get_type (sub_tex->full_texture);
} }
static CoglBool
_cogl_sub_texture_is_get_data_supported (CoglTexture *tex)
{
CoglSubTexture *sub_tex = COGL_SUB_TEXTURE (tex);
return cogl_texture_is_get_data_supported (sub_tex->full_texture);
}
static const CoglTextureVtable static const CoglTextureVtable
cogl_sub_texture_vtable = cogl_sub_texture_vtable =
{ {
@ -476,5 +484,6 @@ cogl_sub_texture_vtable =
_cogl_sub_texture_get_gl_format, _cogl_sub_texture_get_gl_format,
_cogl_sub_texture_get_type, _cogl_sub_texture_get_type,
NULL, /* is_foreign */ NULL, /* is_foreign */
NULL /* set_auto_mipmap */ NULL, /* set_auto_mipmap */
_cogl_sub_texture_is_get_data_supported
}; };

View File

@ -1542,5 +1542,6 @@ cogl_texture_2d_sliced_vtable =
_cogl_texture_2d_sliced_get_gl_format, _cogl_texture_2d_sliced_get_gl_format,
_cogl_texture_2d_sliced_get_type, _cogl_texture_2d_sliced_get_type,
_cogl_texture_2d_sliced_is_foreign, _cogl_texture_2d_sliced_is_foreign,
NULL /* set_auto_mipmap */ NULL, /* set_auto_mipmap */
NULL /* is_get_data_supported */
}; };

View File

@ -94,6 +94,15 @@ _cogl_texture_2d_set_auto_mipmap (CoglTexture *tex,
tex_2d->auto_mipmap = value; tex_2d->auto_mipmap = value;
} }
static CoglBool
_cogl_texture_2d_is_get_data_supported (CoglTexture *tex)
{
CoglTexture2D *tex_2d = COGL_TEXTURE_2D (tex);
CoglContext *ctx = tex->context;
return ctx->driver_vtable->texture_2d_is_get_data_supported (tex_2d);
}
CoglTexture2D * CoglTexture2D *
_cogl_texture_2d_create_base (CoglContext *ctx, _cogl_texture_2d_create_base (CoglContext *ctx,
int width, int width,
@ -693,5 +702,6 @@ cogl_texture_2d_vtable =
_cogl_texture_2d_get_gl_format, _cogl_texture_2d_get_gl_format,
_cogl_texture_2d_get_type, _cogl_texture_2d_get_type,
_cogl_texture_2d_is_foreign, _cogl_texture_2d_is_foreign,
_cogl_texture_2d_set_auto_mipmap _cogl_texture_2d_set_auto_mipmap,
_cogl_texture_2d_is_get_data_supported
}; };

View File

@ -755,5 +755,6 @@ cogl_texture_3d_vtable =
_cogl_texture_3d_get_gl_format, _cogl_texture_3d_get_gl_format,
_cogl_texture_3d_get_type, _cogl_texture_3d_get_type,
NULL, /* is_foreign */ NULL, /* is_foreign */
_cogl_texture_3d_set_auto_mipmap _cogl_texture_3d_set_auto_mipmap,
NULL /* is_get_data_supported */
}; };

View File

@ -149,6 +149,8 @@ struct _CoglTextureVtable
/* Only needs to be implemented if is_primitive == TRUE */ /* Only needs to be implemented if is_primitive == TRUE */
void (* set_auto_mipmap) (CoglTexture *texture, void (* set_auto_mipmap) (CoglTexture *texture,
CoglBool value); CoglBool value);
CoglBool (* is_get_data_supported) (CoglTexture *texture);
}; };
typedef enum _CoglTextureSoureType { typedef enum _CoglTextureSoureType {

View File

@ -773,5 +773,6 @@ cogl_texture_rectangle_vtable =
_cogl_texture_rectangle_get_gl_format, _cogl_texture_rectangle_get_gl_format,
_cogl_texture_rectangle_get_type, _cogl_texture_rectangle_get_type,
_cogl_texture_rectangle_is_foreign, _cogl_texture_rectangle_is_foreign,
_cogl_texture_rectangle_set_auto_mipmap _cogl_texture_rectangle_set_auto_mipmap,
NULL /* is_get_data_supported */
}; };

View File

@ -205,6 +205,15 @@ _cogl_texture_is_foreign (CoglTexture *texture)
return FALSE; return FALSE;
} }
CoglBool
cogl_texture_is_get_data_supported (CoglTexture *texture)
{
if (texture->vtable->is_get_data_supported)
return texture->vtable->is_get_data_supported (texture);
else
return TRUE;
}
unsigned int unsigned int
cogl_texture_get_width (CoglTexture *texture) cogl_texture_get_width (CoglTexture *texture)
{ {

View File

@ -511,6 +511,12 @@ CoglBool
cogl_texture_allocate (CoglTexture *texture, cogl_texture_allocate (CoglTexture *texture,
CoglError **error); CoglError **error);
/**
* cogl_texture_is_get_data_supported: (skip)
*/
CoglBool
cogl_texture_is_get_data_supported (CoglTexture *texture);
COGL_END_DECLS COGL_END_DECLS
#endif /* __COGL_TEXTURE_H__ */ #endif /* __COGL_TEXTURE_H__ */

View File

@ -116,4 +116,7 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
int rowstride, int rowstride,
uint8_t *data); uint8_t *data);
CoglBool
_cogl_texture_2d_gl_is_get_data_supported (CoglTexture2D *tex_2d);
#endif /* _COGL_TEXTURE_2D_GL_PRIVATE_H_ */ #endif /* _COGL_TEXTURE_2D_GL_PRIVATE_H_ */

View File

@ -869,3 +869,12 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
gl_type, gl_type,
data); data);
} }
CoglBool
_cogl_texture_2d_gl_is_get_data_supported (CoglTexture2D *tex_2d)
{
if (tex_2d->gl_target == GL_TEXTURE_EXTERNAL_OES)
return FALSE;
else
return TRUE;
}

View File

@ -714,6 +714,7 @@ _cogl_driver_gl =
_cogl_texture_2d_gl_generate_mipmap, _cogl_texture_2d_gl_generate_mipmap,
_cogl_texture_2d_gl_copy_from_bitmap, _cogl_texture_2d_gl_copy_from_bitmap,
_cogl_texture_2d_gl_get_data, _cogl_texture_2d_gl_get_data,
_cogl_texture_2d_gl_is_get_data_supported,
_cogl_gl_flush_attributes_state, _cogl_gl_flush_attributes_state,
_cogl_clip_stack_gl_flush, _cogl_clip_stack_gl_flush,
_cogl_buffer_gl_create, _cogl_buffer_gl_create,

View File

@ -493,6 +493,7 @@ _cogl_driver_gles =
_cogl_texture_2d_gl_generate_mipmap, _cogl_texture_2d_gl_generate_mipmap,
_cogl_texture_2d_gl_copy_from_bitmap, _cogl_texture_2d_gl_copy_from_bitmap,
NULL, /* texture_2d_get_data */ NULL, /* texture_2d_get_data */
NULL, /* texture_2d_is_get_data_supported */
_cogl_gl_flush_attributes_state, _cogl_gl_flush_attributes_state,
_cogl_clip_stack_gl_flush, _cogl_clip_stack_gl_flush,
_cogl_buffer_gl_create, _cogl_buffer_gl_create,

View File

@ -82,6 +82,7 @@ _cogl_driver_nop =
_cogl_texture_2d_nop_generate_mipmap, _cogl_texture_2d_nop_generate_mipmap,
_cogl_texture_2d_nop_copy_from_bitmap, _cogl_texture_2d_nop_copy_from_bitmap,
NULL, /* texture_2d_get_data */ NULL, /* texture_2d_get_data */
NULL, /* texture_2d_is_get_data_supported */
_cogl_nop_flush_attributes_state, _cogl_nop_flush_attributes_state,
_cogl_clip_stack_nop_flush, _cogl_clip_stack_nop_flush,
}; };

View File

@ -1180,5 +1180,6 @@ cogl_texture_pixmap_x11_vtable =
_cogl_texture_pixmap_x11_get_gl_format, _cogl_texture_pixmap_x11_get_gl_format,
_cogl_texture_pixmap_x11_get_type, _cogl_texture_pixmap_x11_get_type,
NULL, /* is_foreign */ NULL, /* is_foreign */
NULL /* set_auto_mipmap */ NULL, /* set_auto_mipmap */
NULL /* is_get_data_supported */
}; };