offscreen: Replace use of CoglHandle with CoglOffscreen

This updates cogl_offscreen_new_to_texture to return a CoglOffscreen
pointer instead of a CoglHandle.

Reviewed-by: Neil Roberts <neil@linux.intel.com>
This commit is contained in:
Robert Bragg 2012-02-18 15:22:15 +00:00
parent 0a2a3d7c80
commit 13c36fff0d
6 changed files with 45 additions and 31 deletions

View File

@ -30,6 +30,7 @@
#include "cogl-journal-private.h" #include "cogl-journal-private.h"
#include "cogl-winsys-private.h" #include "cogl-winsys-private.h"
#include "cogl-attribute-private.h" #include "cogl-attribute-private.h"
#include "cogl-offscreen.h"
#ifdef COGL_HAS_XLIB_SUPPORT #ifdef COGL_HAS_XLIB_SUPPORT
#include <X11/Xlib.h> #include <X11/Xlib.h>
@ -154,7 +155,7 @@ struct _CoglFramebuffer
gboolean clear_clip_dirty; gboolean clear_clip_dirty;
}; };
typedef struct _CoglOffscreen struct _CoglOffscreen
{ {
CoglFramebuffer _parent; CoglFramebuffer _parent;
GLuint fbo_handle; GLuint fbo_handle;
@ -169,9 +170,7 @@ typedef struct _CoglOffscreen
* fb->config to configure if we want a depth or stencil buffer so * fb->config to configure if we want a depth or stencil buffer so
* we can get rid of these flags */ * we can get rid of these flags */
CoglOffscreenFlags create_flags; CoglOffscreenFlags create_flags;
} CoglOffscreen; };
#define COGL_OFFSCREEN(X) ((CoglOffscreen *)(X))
void void
_cogl_framebuffer_init (CoglFramebuffer *framebuffer, _cogl_framebuffer_init (CoglFramebuffer *framebuffer,
@ -280,7 +279,7 @@ _cogl_free_framebuffer_stack (GSList *stack);
* *
* Return value: the new CoglOffscreen object. * Return value: the new CoglOffscreen object.
*/ */
CoglHandle CoglOffscreen *
_cogl_offscreen_new_to_texture_full (CoglTexture *texture, _cogl_offscreen_new_to_texture_full (CoglTexture *texture,
CoglOffscreenFlags create_flags, CoglOffscreenFlags create_flags,
unsigned int level); unsigned int level);

View File

@ -704,7 +704,7 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer)
framebuffer->dirty_bitmasks = FALSE; framebuffer->dirty_bitmasks = FALSE;
} }
CoglHandle CoglOffscreen *
_cogl_offscreen_new_to_texture_full (CoglTexture *texture, _cogl_offscreen_new_to_texture_full (CoglTexture *texture,
CoglOffscreenFlags create_flags, CoglOffscreenFlags create_flags,
unsigned int level) unsigned int level)
@ -774,7 +774,7 @@ _cogl_offscreen_new_to_texture_full (CoglTexture *texture,
return ret; return ret;
} }
CoglHandle CoglOffscreen *
cogl_offscreen_new_to_texture (CoglTexture *texture) cogl_offscreen_new_to_texture (CoglTexture *texture)
{ {
return _cogl_offscreen_new_to_texture_full (texture, 0, 0); return _cogl_offscreen_new_to_texture_full (texture, 0, 0);

View File

@ -3,7 +3,7 @@
* *
* An object oriented GL/GLES Abstraction/Utility Layer * An object oriented GL/GLES Abstraction/Utility Layer
* *
* Copyright (C) 2007,2008,2009 Intel Corporation. * Copyright (C) 2007,2008,2009,2012 Intel Corporation.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -41,6 +41,10 @@ G_BEGIN_DECLS
* Cogl allows creating and operating on offscreen framebuffers. * Cogl allows creating and operating on offscreen framebuffers.
*/ */
typedef struct _CoglOffscreen CoglOffscreen;
#define COGL_OFFSCREEN(X) ((CoglOffscreen *)X)
/* Offscreen api */ /* Offscreen api */
/** /**
@ -54,50 +58,57 @@ G_BEGIN_DECLS
* given texture. You don't need to destroy the offscreen buffer before * given texture. You don't need to destroy the offscreen buffer before
* you can use the @texture again. * you can use the @texture again.
* *
* Note: This does not work with sliced Cogl textures. * <note>This only works with low-level #CoglTexture types such as
* #CoglTexture2D, #CoglTexture3D and #CoglTextureRectangle, and not
* with meta-texture types such as #CoglTexture2DSliced.</note>
* *
* Return value: (transfer full): a #CoglHandle for the new offscreen * Return value: (transfer full): a newly instantiated #CoglOffscreen
* buffer or %COGL_INVALID_HANDLE if it wasn't possible to create the * framebuffer or %NULL if it wasn't possible to create the
* buffer. * buffer.
*/ */
CoglHandle cogl_offscreen_new_to_texture (CoglTexture *texture); CoglOffscreen *
cogl_offscreen_new_to_texture (CoglTexture *texture);
/** /**
* cogl_is_offscreen: * cogl_is_offscreen:
* @handle: A CoglHandle for an offscreen buffer * @object: A pointer to a #CoglObject
* *
* Determines whether the given #CoglHandle references an offscreen buffer * Determines whether the given #CoglObject references an offscreen
* object. * framebuffer object.
* *
* Returns: %TRUE if the handle references an offscreen buffer, * Returns: %TRUE if @object is a #CoglOffscreen framebuffer,
* %FALSE otherwise * %FALSE otherwise
*/ */
gboolean cogl_is_offscreen (CoglHandle handle); gboolean
cogl_is_offscreen (void *object);
#ifndef COGL_DISABLE_DEPRECATED #ifndef COGL_DISABLE_DEPRECATED
/** /**
* cogl_offscreen_ref: * cogl_offscreen_ref:
* @handle: A CoglHandle for an offscreen buffer * @offscreen: A pointer to a #CoglOffscreen framebuffer
* *
* Increments the reference count on the offscreen buffer. * Increments the reference count on the @offscreen framebuffer.
* *
* Return value: (transfer none): For convenience it returns the given CoglHandle * Return value: (transfer none): For convenience it returns the
* given @offscreen
* *
* Deprecated: 1.2: cogl_handle_ref() should be used in new code. * Deprecated: 1.2: cogl_object_ref() should be used in new code.
*/ */
CoglHandle cogl_offscreen_ref (CoglHandle handle) G_GNUC_DEPRECATED; void *
cogl_offscreen_ref (void *offscreen) G_GNUC_DEPRECATED;
/** /**
* cogl_offscreen_unref: * cogl_offscreen_unref:
* @handle: A CoglHandle for an offscreen buffer * @offscreen: A pointer to a #CoglOffscreen framebuffer
* *
* Decreases the reference count for the offscreen buffer and frees it when * Decreases the reference count for the @offscreen buffer and frees it when
* the count reaches 0. * the count reaches 0.
* *
* Deprecated: 1.2: cogl_handle_unref() should be used in new code. * Deprecated: 1.2: cogl_object_unref() should be used in new code.
*/ */
void cogl_offscreen_unref (CoglHandle handle) G_GNUC_DEPRECATED; void
cogl_offscreen_unref (void *offscreen) G_GNUC_DEPRECATED;
#endif /* COGL_DISABLE_DEPRECATED */ #endif /* COGL_DISABLE_DEPRECATED */

View File

@ -1019,6 +1019,7 @@ get_texture_bits_via_offscreen (CoglTexture *texture,
unsigned int dst_rowstride, unsigned int dst_rowstride,
CoglPixelFormat dst_format) CoglPixelFormat dst_format)
{ {
CoglOffscreen *offscreen;
CoglFramebuffer *framebuffer; CoglFramebuffer *framebuffer;
_COGL_GET_CONTEXT (ctx, FALSE); _COGL_GET_CONTEXT (ctx, FALSE);
@ -1026,14 +1027,16 @@ get_texture_bits_via_offscreen (CoglTexture *texture,
if (!cogl_has_feature (ctx, COGL_FEATURE_ID_OFFSCREEN)) if (!cogl_has_feature (ctx, COGL_FEATURE_ID_OFFSCREEN))
return FALSE; return FALSE;
framebuffer = _cogl_offscreen_new_to_texture_full offscreen = _cogl_offscreen_new_to_texture_full
(texture, (texture,
COGL_OFFSCREEN_DISABLE_DEPTH_AND_STENCIL, COGL_OFFSCREEN_DISABLE_DEPTH_AND_STENCIL,
0); 0);
if (framebuffer == NULL) if (offscreen == NULL)
return FALSE; return FALSE;
framebuffer = COGL_FRAMEBUFFER (offscreen);
if (!cogl_framebuffer_allocate (framebuffer, NULL)) if (!cogl_framebuffer_allocate (framebuffer, NULL))
{ {
cogl_object_unref (framebuffer); cogl_object_unref (framebuffer);

View File

@ -296,7 +296,7 @@ test_cogl_backface_culling (TestUtilsGTestFixture *fixture,
tex = cogl_texture_new_with_size (state.width, state.height, tex = cogl_texture_new_with_size (state.width, state.height,
COGL_TEXTURE_NO_SLICING, COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_ANY); /* internal fmt */ COGL_PIXEL_FORMAT_ANY); /* internal fmt */
state.offscreen = cogl_offscreen_new_to_texture (tex); state.offscreen = COGL_FRAMEBUFFER (cogl_offscreen_new_to_texture (tex));
state.offscreen_tex = tex; state.offscreen_tex = tex;
paint (&state); paint (&state);

View File

@ -87,7 +87,8 @@ test_cogl_color_mask (TestUtilsGTestFixture *fixture,
COGL_PIXEL_FORMAT_RGB_888); COGL_PIXEL_FORMAT_RGB_888);
state.fbo[i] = cogl_offscreen_new_to_texture (state.tex[i]); state.fbo[i] = COGL_FRAMEBUFFER (
cogl_offscreen_new_to_texture (state.tex[i]));
/* Clear the texture color bits */ /* Clear the texture color bits */
cogl_push_framebuffer (state.fbo[i]); cogl_push_framebuffer (state.fbo[i]);