diff --git a/cogl/cogl-framebuffer-private.h b/cogl/cogl-framebuffer-private.h index 137ba8765..6685d3102 100644 --- a/cogl/cogl-framebuffer-private.h +++ b/cogl/cogl-framebuffer-private.h @@ -30,6 +30,7 @@ #include "cogl-journal-private.h" #include "cogl-winsys-private.h" #include "cogl-attribute-private.h" +#include "cogl-offscreen.h" #ifdef COGL_HAS_XLIB_SUPPORT #include @@ -154,7 +155,7 @@ struct _CoglFramebuffer gboolean clear_clip_dirty; }; -typedef struct _CoglOffscreen +struct _CoglOffscreen { CoglFramebuffer _parent; GLuint fbo_handle; @@ -169,9 +170,7 @@ typedef struct _CoglOffscreen * fb->config to configure if we want a depth or stencil buffer so * we can get rid of these flags */ CoglOffscreenFlags create_flags; -} CoglOffscreen; - -#define COGL_OFFSCREEN(X) ((CoglOffscreen *)(X)) +}; void _cogl_framebuffer_init (CoglFramebuffer *framebuffer, @@ -280,7 +279,7 @@ _cogl_free_framebuffer_stack (GSList *stack); * * Return value: the new CoglOffscreen object. */ -CoglHandle +CoglOffscreen * _cogl_offscreen_new_to_texture_full (CoglTexture *texture, CoglOffscreenFlags create_flags, unsigned int level); diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c index 8f72e9709..5c7dbdbbb 100644 --- a/cogl/cogl-framebuffer.c +++ b/cogl/cogl-framebuffer.c @@ -704,7 +704,7 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) framebuffer->dirty_bitmasks = FALSE; } -CoglHandle +CoglOffscreen * _cogl_offscreen_new_to_texture_full (CoglTexture *texture, CoglOffscreenFlags create_flags, unsigned int level) @@ -774,7 +774,7 @@ _cogl_offscreen_new_to_texture_full (CoglTexture *texture, return ret; } -CoglHandle +CoglOffscreen * cogl_offscreen_new_to_texture (CoglTexture *texture) { return _cogl_offscreen_new_to_texture_full (texture, 0, 0); diff --git a/cogl/cogl-offscreen.h b/cogl/cogl-offscreen.h index cd77880d1..47298bd41 100644 --- a/cogl/cogl-offscreen.h +++ b/cogl/cogl-offscreen.h @@ -3,7 +3,7 @@ * * 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 * 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. */ +typedef struct _CoglOffscreen CoglOffscreen; + +#define COGL_OFFSCREEN(X) ((CoglOffscreen *)X) + /* Offscreen api */ /** @@ -54,50 +58,57 @@ G_BEGIN_DECLS * given texture. You don't need to destroy the offscreen buffer before * you can use the @texture again. * - * Note: This does not work with sliced Cogl textures. + * This only works with low-level #CoglTexture types such as + * #CoglTexture2D, #CoglTexture3D and #CoglTextureRectangle, and not + * with meta-texture types such as #CoglTexture2DSliced. * - * Return value: (transfer full): a #CoglHandle for the new offscreen - * buffer or %COGL_INVALID_HANDLE if it wasn't possible to create the + * Return value: (transfer full): a newly instantiated #CoglOffscreen + * framebuffer or %NULL if it wasn't possible to create the * buffer. */ -CoglHandle cogl_offscreen_new_to_texture (CoglTexture *texture); +CoglOffscreen * +cogl_offscreen_new_to_texture (CoglTexture *texture); /** * 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 - * object. + * Determines whether the given #CoglObject references an offscreen + * framebuffer object. * - * Returns: %TRUE if the handle references an offscreen buffer, - * %FALSE otherwise + * Returns: %TRUE if @object is a #CoglOffscreen framebuffer, + * %FALSE otherwise */ -gboolean cogl_is_offscreen (CoglHandle handle); +gboolean +cogl_is_offscreen (void *object); #ifndef COGL_DISABLE_DEPRECATED /** * 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: - * @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. * - * 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 */ diff --git a/cogl/cogl-texture.c b/cogl/cogl-texture.c index c50e732ac..b68fa8171 100644 --- a/cogl/cogl-texture.c +++ b/cogl/cogl-texture.c @@ -1019,6 +1019,7 @@ get_texture_bits_via_offscreen (CoglTexture *texture, unsigned int dst_rowstride, CoglPixelFormat dst_format) { + CoglOffscreen *offscreen; CoglFramebuffer *framebuffer; _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)) return FALSE; - framebuffer = _cogl_offscreen_new_to_texture_full + offscreen = _cogl_offscreen_new_to_texture_full (texture, COGL_OFFSCREEN_DISABLE_DEPTH_AND_STENCIL, 0); - if (framebuffer == NULL) + if (offscreen == NULL) return FALSE; + framebuffer = COGL_FRAMEBUFFER (offscreen); + if (!cogl_framebuffer_allocate (framebuffer, NULL)) { cogl_object_unref (framebuffer); diff --git a/tests/conform/test-backface-culling.c b/tests/conform/test-backface-culling.c index fc7caa457..dacc305d7 100644 --- a/tests/conform/test-backface-culling.c +++ b/tests/conform/test-backface-culling.c @@ -296,7 +296,7 @@ test_cogl_backface_culling (TestUtilsGTestFixture *fixture, tex = cogl_texture_new_with_size (state.width, state.height, COGL_TEXTURE_NO_SLICING, 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; paint (&state); diff --git a/tests/conform/test-color-mask.c b/tests/conform/test-color-mask.c index 75c8a05e9..deb9cdd93 100644 --- a/tests/conform/test-color-mask.c +++ b/tests/conform/test-color-mask.c @@ -87,7 +87,8 @@ test_cogl_color_mask (TestUtilsGTestFixture *fixture, 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 */ cogl_push_framebuffer (state.fbo[i]);