[cogl-handle] Optimize how we define cogl handles

The cogl_is_* functions were showing up quite high on profiles due to
iterating through arrays of cogl handles.

This does away with all the handle arrays and implements a simple struct
inheritance scheme. All cogl objects now add a CoglHandleObject _parent;
member to their main structures. The base object includes 2 members a.t.m; a
ref_count, and a klass pointer. The klass in turn gives you a type and
virtual function for freeing objects of that type.

Each handle type has a _cogl_##handle_type##_get_type () function
automatically defined which returns a GQuark of the handle type, so now
implementing the cogl_is_* funcs is just a case of comparing with
obj->klass->type.

Another outcome of the re-work is that cogl_handle_{ref,unref} are also much
more efficient, and no longer need extending for each handle type added to
cogl. The cogl_##handle_type##_{ref,unref} functions are now deprecated and
are no longer used internally to Clutter or Cogl. Potentially we can remove
them completely before 1.0.
This commit is contained in:
Robert Bragg
2009-04-01 17:16:44 +01:00
parent 4b484d6496
commit ed272213f0
26 changed files with 162 additions and 273 deletions

View File

@ -26,11 +26,13 @@
#ifndef __COGL_SHADER_H
#define __COGL_SHADER_H
#include "cogl-handle.h"
typedef struct _CoglShader CoglShader;
struct _CoglShader
{
guint ref_count;
CoglHandleObject _parent;
GLhandleARB gl_handle;
};