cogl-buffer: Handle subclass registration like cogl-texture

Instead of having to extend cogl_is_buffer with new buffer types
manually this now adds a new COGL_BUFFER_DEFINE macro to be used instead
of COGL_OBJECT_DEFINE for CoglBuffer subclasses. This macro will
automatically register the new type with ctx->buffer_types which will
iterated by cogl_is_buffer. This is the same coding pattern used for
CoglTexture.
This commit is contained in:
Robert Bragg 2010-07-03 23:56:44 +01:00
parent 1b7e362189
commit 9ceb0edf26
5 changed files with 44 additions and 4 deletions

View File

@ -86,6 +86,18 @@ struct _CoglBuffer
* fallback paths */ * fallback paths */
}; };
/* This is used to register a type to the list of handle types that
will be considered a texture in cogl_is_texture() */
void
_cogl_buffer_register_buffer_type (GQuark type);
#define COGL_BUFFER_DEFINE(TypeName, type_name) \
COGL_OBJECT_DEFINE_WITH_CODE \
(TypeName, type_name, \
_cogl_buffer_register_buffer_type (_cogl_object_ \
## type_name ## _get_type ()))
void _cogl_buffer_initialize (CoglBuffer *buffer, void _cogl_buffer_initialize (CoglBuffer *buffer,
unsigned int size, unsigned int size,
CoglBufferUsageHint usage_hint, CoglBufferUsageHint usage_hint,

View File

@ -68,15 +68,37 @@
#endif #endif
/* XXX:
* The CoglHandle macros don't support any form of inheritance, so for
* now we implement the CoglObject support for the CoglBuffer
* abstract class manually.
*/
void
_cogl_buffer_register_buffer_type (GQuark type)
{
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
ctx->buffer_types = g_slist_prepend (ctx->buffer_types,
GINT_TO_POINTER (type));
}
gboolean gboolean
cogl_is_buffer (const void *object) cogl_is_buffer (const void *object)
{ {
CoglObject *obj = (CoglObject *)object; const CoglHandleObject *obj = object;
GSList *l;
if (obj == NULL) _COGL_GET_CONTEXT (ctx, FALSE);
if (object == NULL)
return FALSE; return FALSE;
return obj->klass->type == _cogl_handle_pixel_buffer_get_type (); for (l = ctx->buffer_types; l; l = l->next)
if (GPOINTER_TO_INT (l->data) == obj->klass->type)
return TRUE;
return FALSE;
} }
void void

View File

@ -70,6 +70,7 @@ cogl_create_context (void)
_context->features_cached = FALSE; _context->features_cached = FALSE;
_context->texture_types = NULL; _context->texture_types = NULL;
_context->buffer_types = NULL;
/* Initialise the driver specific state */ /* Initialise the driver specific state */
/* TODO: combine these two into one function */ /* TODO: combine these two into one function */
@ -262,6 +263,7 @@ _cogl_destroy_context (void)
_cogl_bitmask_destroy (&_context->texcoord_arrays_to_disable); _cogl_bitmask_destroy (&_context->texcoord_arrays_to_disable);
g_slist_free (_context->texture_types); g_slist_free (_context->texture_types);
g_slist_free (_context->buffer_types);
g_free (_context); g_free (_context);
} }

View File

@ -167,6 +167,10 @@ typedef struct
cogl_is_texture */ cogl_is_texture */
GSList *texture_types; GSList *texture_types;
/* List of types that will be considered a subclass of CoglBuffer in
cogl_is_buffer */
GSList *buffer_types;
CoglContextDriver drv; CoglContextDriver drv;
CoglContextWinsys winsys; CoglContextWinsys winsys;
} CoglContext; } CoglContext;

View File

@ -84,7 +84,7 @@ cogl_pixel_buffer_vtable;
static const CoglBufferVtable static const CoglBufferVtable
cogl_malloc_pixel_buffer_vtable; cogl_malloc_pixel_buffer_vtable;
COGL_OBJECT_DEFINE (PixelBuffer, pixel_buffer) COGL_BUFFER_DEFINE (PixelBuffer, pixel_buffer)
CoglPixelBuffer * CoglPixelBuffer *
cogl_pixel_buffer_new (unsigned int size) cogl_pixel_buffer_new (unsigned int size)