mirror of
https://github.com/brl/mutter.git
synced 2025-03-03 11:58:09 +00:00
framebuffer: split out CoglOnscreen code
This factors out the CoglOnscreen code from cogl-framebuffer.c so we now have cogl-onscreen.c, cogl-onscreen.h and cogl-onscreen-private.h. Notably some of the functions pulled out are currently namespaced as cogl_framebuffer but we know we are planning on renaming them to be in the cogl_onscreen namespace; such as cogl_framebuffer_swap_buffers(). Reviewed-by: Neil Roberts <neil@linux.intel.com>
This commit is contained in:
parent
bfb69d32ab
commit
79719347c8
@ -88,6 +88,7 @@ cogl_public_h = \
|
|||||||
$(srcdir)/cogl-primitive.h \
|
$(srcdir)/cogl-primitive.h \
|
||||||
$(srcdir)/cogl-clip-state.h \
|
$(srcdir)/cogl-clip-state.h \
|
||||||
$(srcdir)/cogl-framebuffer.h \
|
$(srcdir)/cogl-framebuffer.h \
|
||||||
|
$(srcdir)/cogl-onscreen.h \
|
||||||
$(srcdir)/cogl-clutter.h \
|
$(srcdir)/cogl-clutter.h \
|
||||||
$(srcdir)/cogl.h \
|
$(srcdir)/cogl.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
@ -305,6 +306,7 @@ cogl_sources_c = \
|
|||||||
$(srcdir)/cogl-journal.c \
|
$(srcdir)/cogl-journal.c \
|
||||||
$(srcdir)/cogl-framebuffer-private.h \
|
$(srcdir)/cogl-framebuffer-private.h \
|
||||||
$(srcdir)/cogl-framebuffer.c \
|
$(srcdir)/cogl-framebuffer.c \
|
||||||
|
$(srcdir)/cogl-onscreen.c \
|
||||||
$(srcdir)/cogl-profile.h \
|
$(srcdir)/cogl-profile.h \
|
||||||
$(srcdir)/cogl-profile.c \
|
$(srcdir)/cogl-profile.c \
|
||||||
$(srcdir)/cogl-flags.h \
|
$(srcdir)/cogl-flags.h \
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "cogl-winsys-private.h"
|
#include "cogl-winsys-private.h"
|
||||||
#include "cogl-winsys-stub-private.h"
|
#include "cogl-winsys-stub-private.h"
|
||||||
#include "cogl-framebuffer-private.h"
|
#include "cogl-framebuffer-private.h"
|
||||||
|
#include "cogl-onscreen-private.h"
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
cogl_clutter_check_extension (const char *name, const char *ext)
|
cogl_clutter_check_extension (const char *name, const char *ext)
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
#include "cogl-pipeline-private.h"
|
#include "cogl-pipeline-private.h"
|
||||||
#include "cogl-pipeline-opengl-private.h"
|
#include "cogl-pipeline-opengl-private.h"
|
||||||
#include "cogl-framebuffer-private.h"
|
#include "cogl-framebuffer-private.h"
|
||||||
|
#include "cogl-onscreen-private.h"
|
||||||
#include "cogl2-path.h"
|
#include "cogl2-path.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "cogl-matrix-stack.h"
|
#include "cogl-matrix-stack.h"
|
||||||
#include "cogl-clip-state-private.h"
|
#include "cogl-clip-state-private.h"
|
||||||
#include "cogl-journal-private.h"
|
#include "cogl-journal-private.h"
|
||||||
|
#include "cogl-winsys-private.h"
|
||||||
|
|
||||||
#ifdef COGL_HAS_XLIB_SUPPORT
|
#ifdef COGL_HAS_XLIB_SUPPORT
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
@ -38,10 +39,6 @@
|
|||||||
#include <GL/glxext.h>
|
#include <GL/glxext.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef COGL_HAS_WIN32_SUPPORT
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum _CoglFramebufferType {
|
typedef enum _CoglFramebufferType {
|
||||||
COGL_FRAMEBUFFER_TYPE_ONSCREEN,
|
COGL_FRAMEBUFFER_TYPE_ONSCREEN,
|
||||||
COGL_FRAMEBUFFER_TYPE_OFFSCREEN
|
COGL_FRAMEBUFFER_TYPE_OFFSCREEN
|
||||||
@ -139,31 +136,18 @@ typedef struct _CoglOffscreen
|
|||||||
|
|
||||||
#define COGL_OFFSCREEN(X) ((CoglOffscreen *)(X))
|
#define COGL_OFFSCREEN(X) ((CoglOffscreen *)(X))
|
||||||
|
|
||||||
struct _CoglOnscreen
|
|
||||||
{
|
|
||||||
CoglFramebuffer _parent;
|
|
||||||
|
|
||||||
#ifdef COGL_HAS_X11_SUPPORT
|
|
||||||
guint32 foreign_xid;
|
|
||||||
CoglOnscreenX11MaskCallback foreign_update_mask_callback;
|
|
||||||
void *foreign_update_mask_data;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COGL_HAS_WIN32_SUPPORT
|
|
||||||
HWND foreign_hwnd;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gboolean swap_throttled;
|
|
||||||
|
|
||||||
void *winsys;
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_cogl_framebuffer_state_init (void);
|
_cogl_framebuffer_init (CoglFramebuffer *framebuffer,
|
||||||
|
CoglContext *ctx,
|
||||||
|
CoglFramebufferType type,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
int width,
|
||||||
|
int height);
|
||||||
|
|
||||||
void
|
void _cogl_framebuffer_free (CoglFramebuffer *framebuffer);
|
||||||
_cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
|
|
||||||
int width, int height);
|
const CoglWinsysVtable *
|
||||||
|
_cogl_framebuffer_get_winsys (CoglFramebuffer *framebuffer);
|
||||||
|
|
||||||
void
|
void
|
||||||
_cogl_framebuffer_clear_without_flush4f (CoglFramebuffer *framebuffer,
|
_cogl_framebuffer_clear_without_flush4f (CoglFramebuffer *framebuffer,
|
||||||
@ -348,8 +332,4 @@ _cogl_blit_framebuffer (unsigned int src_x,
|
|||||||
unsigned int width,
|
unsigned int width,
|
||||||
unsigned int height);
|
unsigned int height);
|
||||||
|
|
||||||
CoglOnscreen *
|
|
||||||
_cogl_onscreen_new (void);
|
|
||||||
|
|
||||||
#endif /* __COGL_FRAMEBUFFER_PRIVATE_H */
|
#endif /* __COGL_FRAMEBUFFER_PRIVATE_H */
|
||||||
|
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include "cogl-context-private.h"
|
#include "cogl-context-private.h"
|
||||||
#include "cogl-display-private.h"
|
#include "cogl-display-private.h"
|
||||||
#include "cogl-renderer-private.h"
|
#include "cogl-renderer-private.h"
|
||||||
#include "cogl-handle.h"
|
|
||||||
#include "cogl-object-private.h"
|
#include "cogl-object-private.h"
|
||||||
#include "cogl-util.h"
|
#include "cogl-util.h"
|
||||||
#include "cogl-texture-private.h"
|
#include "cogl-texture-private.h"
|
||||||
@ -106,11 +105,10 @@ typedef struct _CoglFramebufferStackEntry
|
|||||||
CoglFramebuffer *read_buffer;
|
CoglFramebuffer *read_buffer;
|
||||||
} CoglFramebufferStackEntry;
|
} CoglFramebufferStackEntry;
|
||||||
|
|
||||||
static void _cogl_framebuffer_free (CoglFramebuffer *framebuffer);
|
extern GQuark _cogl_object_onscreen_get_type (void);
|
||||||
static void _cogl_onscreen_free (CoglOnscreen *onscreen);
|
|
||||||
static void _cogl_offscreen_free (CoglOffscreen *offscreen);
|
static void _cogl_offscreen_free (CoglOffscreen *offscreen);
|
||||||
|
|
||||||
COGL_OBJECT_INTERNAL_DEFINE (Onscreen, onscreen);
|
|
||||||
COGL_OBJECT_DEFINE (Offscreen, offscreen);
|
COGL_OBJECT_DEFINE (Offscreen, offscreen);
|
||||||
COGL_OBJECT_DEFINE_DEPRECATED_REF_COUNTING (offscreen);
|
COGL_OBJECT_DEFINE_DEPRECATED_REF_COUNTING (offscreen);
|
||||||
|
|
||||||
@ -129,16 +127,16 @@ cogl_framebuffer_error_quark (void)
|
|||||||
gboolean
|
gboolean
|
||||||
_cogl_is_framebuffer (void *object)
|
_cogl_is_framebuffer (void *object)
|
||||||
{
|
{
|
||||||
CoglHandleObject *obj = object;
|
CoglObject *obj = object;
|
||||||
|
|
||||||
if (obj == NULL)
|
if (obj == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return obj->klass->type == _cogl_handle_onscreen_get_type ()
|
return obj->klass->type == _cogl_object_onscreen_get_type ()
|
||||||
|| obj->klass->type == _cogl_handle_offscreen_get_type ();
|
|| obj->klass->type == _cogl_object_offscreen_get_type ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
_cogl_framebuffer_init (CoglFramebuffer *framebuffer,
|
_cogl_framebuffer_init (CoglFramebuffer *framebuffer,
|
||||||
CoglContext *ctx,
|
CoglContext *ctx,
|
||||||
CoglFramebufferType type,
|
CoglFramebufferType type,
|
||||||
@ -225,7 +223,7 @@ _cogl_framebuffer_free (CoglFramebuffer *framebuffer)
|
|||||||
cogl_object_unref (ctx);
|
cogl_object_unref (ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const CoglWinsysVtable *
|
const CoglWinsysVtable *
|
||||||
_cogl_framebuffer_get_winsys (CoglFramebuffer *framebuffer)
|
_cogl_framebuffer_get_winsys (CoglFramebuffer *framebuffer)
|
||||||
{
|
{
|
||||||
return framebuffer->context->display->renderer->winsys_vtable;
|
return framebuffer->context->display->renderer->winsys_vtable;
|
||||||
@ -788,76 +786,6 @@ _cogl_offscreen_free (CoglOffscreen *offscreen)
|
|||||||
g_free (offscreen);
|
g_free (offscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_cogl_onscreen_init_from_template (CoglOnscreen *onscreen,
|
|
||||||
CoglOnscreenTemplate *onscreen_template)
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
|
|
||||||
framebuffer->config = onscreen_template->config;
|
|
||||||
cogl_object_ref (framebuffer->config.swap_chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX: While we still have backend in Clutter we need a dummy object
|
|
||||||
* to represent the CoglOnscreen framebuffer that the backend
|
|
||||||
* creates... */
|
|
||||||
CoglOnscreen *
|
|
||||||
_cogl_onscreen_new (void)
|
|
||||||
{
|
|
||||||
CoglOnscreen *onscreen = g_new0 (CoglOnscreen, 1);
|
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NULL);
|
|
||||||
|
|
||||||
_cogl_framebuffer_init (COGL_FRAMEBUFFER (onscreen),
|
|
||||||
ctx,
|
|
||||||
COGL_FRAMEBUFFER_TYPE_ONSCREEN,
|
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
|
||||||
0x1eadbeef, /* width */
|
|
||||||
0x1eadbeef); /* height */
|
|
||||||
/* NB: make sure to pass positive width/height numbers here
|
|
||||||
* because otherwise we'll hit input validation assertions!*/
|
|
||||||
|
|
||||||
_cogl_onscreen_init_from_template (onscreen, ctx->display->onscreen_template);
|
|
||||||
|
|
||||||
COGL_FRAMEBUFFER (onscreen)->allocated = TRUE;
|
|
||||||
|
|
||||||
/* XXX: Note we don't initialize onscreen->winsys in this case. */
|
|
||||||
|
|
||||||
return _cogl_onscreen_object_new (onscreen);
|
|
||||||
}
|
|
||||||
|
|
||||||
CoglOnscreen *
|
|
||||||
cogl_onscreen_new (CoglContext *ctx, int width, int height)
|
|
||||||
{
|
|
||||||
CoglOnscreen *onscreen;
|
|
||||||
|
|
||||||
/* FIXME: We are assuming onscreen buffers will always be
|
|
||||||
premultiplied so we'll set the premult flag on the bitmap
|
|
||||||
format. This will usually be correct because the result of the
|
|
||||||
default blending operations for Cogl ends up with premultiplied
|
|
||||||
data in the framebuffer. However it is possible for the
|
|
||||||
framebuffer to be in whatever format depending on what
|
|
||||||
CoglPipeline is used to render to it. Eventually we may want to
|
|
||||||
add a way for an application to inform Cogl that the framebuffer
|
|
||||||
is not premultiplied in case it is being used for some special
|
|
||||||
purpose. */
|
|
||||||
|
|
||||||
onscreen = g_new0 (CoglOnscreen, 1);
|
|
||||||
_cogl_framebuffer_init (COGL_FRAMEBUFFER (onscreen),
|
|
||||||
ctx,
|
|
||||||
COGL_FRAMEBUFFER_TYPE_ONSCREEN,
|
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
|
||||||
width, /* width */
|
|
||||||
height); /* height */
|
|
||||||
|
|
||||||
_cogl_onscreen_init_from_template (onscreen, ctx->display->onscreen_template);
|
|
||||||
|
|
||||||
/* FIXME: This should be configurable via the template too */
|
|
||||||
onscreen->swap_throttled = TRUE;
|
|
||||||
|
|
||||||
return _cogl_onscreen_object_new (onscreen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
try_creating_fbo (CoglOffscreen *offscreen,
|
try_creating_fbo (CoglOffscreen *offscreen,
|
||||||
TryFBOFlags flags)
|
TryFBOFlags flags)
|
||||||
@ -1099,38 +1027,6 @@ cogl_framebuffer_allocate (CoglFramebuffer *framebuffer,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_cogl_onscreen_free (CoglOnscreen *onscreen)
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
|
|
||||||
winsys->onscreen_deinit (onscreen);
|
|
||||||
g_return_if_fail (onscreen->winsys == NULL);
|
|
||||||
|
|
||||||
/* Chain up to parent */
|
|
||||||
_cogl_framebuffer_free (framebuffer);
|
|
||||||
|
|
||||||
g_free (onscreen);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
|
|
||||||
int width, int height)
|
|
||||||
{
|
|
||||||
CoglContext *ctx = framebuffer->context;
|
|
||||||
|
|
||||||
if (framebuffer->width == width && framebuffer->height == height)
|
|
||||||
return;
|
|
||||||
|
|
||||||
framebuffer->width = width;
|
|
||||||
framebuffer->height = height;
|
|
||||||
|
|
||||||
/* We'll need to recalculate the GL viewport state derived
|
|
||||||
* from the Cogl viewport */
|
|
||||||
ctx->dirty_gl_viewport = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static CoglFramebufferStackEntry *
|
static CoglFramebufferStackEntry *
|
||||||
create_stack_entry (CoglFramebuffer *draw_buffer,
|
create_stack_entry (CoglFramebuffer *draw_buffer,
|
||||||
CoglFramebuffer *read_buffer)
|
CoglFramebuffer *read_buffer)
|
||||||
@ -1164,20 +1060,10 @@ _cogl_free_framebuffer_stack (GSList *stack)
|
|||||||
CoglFramebufferStackEntry *entry = l->data;
|
CoglFramebufferStackEntry *entry = l->data;
|
||||||
|
|
||||||
if (entry->draw_buffer)
|
if (entry->draw_buffer)
|
||||||
{
|
cogl_object_unref (entry->draw_buffer);
|
||||||
if (entry->draw_buffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN)
|
|
||||||
_cogl_offscreen_free (COGL_OFFSCREEN (entry->draw_buffer));
|
|
||||||
else
|
|
||||||
_cogl_onscreen_free (COGL_ONSCREEN (entry->draw_buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entry->read_buffer)
|
if (entry->read_buffer)
|
||||||
{
|
cogl_object_unref (entry->draw_buffer);
|
||||||
if (entry->read_buffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN)
|
|
||||||
_cogl_offscreen_free (COGL_OFFSCREEN (entry->read_buffer));
|
|
||||||
else
|
|
||||||
_cogl_onscreen_free (COGL_ONSCREEN (entry->read_buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
g_slice_free (CoglFramebufferStackEntry, entry);
|
g_slice_free (CoglFramebufferStackEntry, entry);
|
||||||
}
|
}
|
||||||
@ -1860,215 +1746,9 @@ cogl_framebuffer_discard_buffers (CoglFramebuffer *framebuffer,
|
|||||||
_cogl_framebuffer_discard_buffers_real (framebuffer, buffers);
|
_cogl_framebuffer_discard_buffers_real (framebuffer, buffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
cogl_framebuffer_swap_buffers (CoglFramebuffer *framebuffer)
|
|
||||||
{
|
|
||||||
const CoglWinsysVtable *winsys;
|
|
||||||
|
|
||||||
g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN);
|
|
||||||
|
|
||||||
/* FIXME: we shouldn't need to flush *all* journals here! */
|
|
||||||
cogl_flush ();
|
|
||||||
winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
winsys->onscreen_swap_buffers (COGL_ONSCREEN (framebuffer));
|
|
||||||
cogl_framebuffer_discard_buffers (framebuffer,
|
|
||||||
COGL_BUFFER_BIT_COLOR |
|
|
||||||
COGL_BUFFER_BIT_DEPTH |
|
|
||||||
COGL_BUFFER_BIT_STENCIL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cogl_framebuffer_swap_region (CoglFramebuffer *framebuffer,
|
|
||||||
const int *rectangles,
|
|
||||||
int n_rectangles)
|
|
||||||
{
|
|
||||||
const CoglWinsysVtable *winsys;
|
|
||||||
|
|
||||||
g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN);
|
|
||||||
|
|
||||||
/* FIXME: we shouldn't need to flush *all* journals here! */
|
|
||||||
cogl_flush ();
|
|
||||||
|
|
||||||
winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
|
|
||||||
/* This should only be called if the winsys advertises
|
|
||||||
COGL_WINSYS_FEATURE_SWAP_REGION */
|
|
||||||
g_return_if_fail (winsys->onscreen_swap_region != NULL);
|
|
||||||
|
|
||||||
winsys->onscreen_swap_region (COGL_ONSCREEN (framebuffer),
|
|
||||||
rectangles,
|
|
||||||
n_rectangles);
|
|
||||||
|
|
||||||
cogl_framebuffer_discard_buffers (framebuffer,
|
|
||||||
COGL_BUFFER_BIT_COLOR |
|
|
||||||
COGL_BUFFER_BIT_DEPTH |
|
|
||||||
COGL_BUFFER_BIT_STENCIL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef COGL_HAS_X11_SUPPORT
|
|
||||||
void
|
|
||||||
cogl_x11_onscreen_set_foreign_window_xid (CoglOnscreen *onscreen,
|
|
||||||
guint32 xid,
|
|
||||||
CoglOnscreenX11MaskCallback update,
|
|
||||||
void *user_data)
|
|
||||||
{
|
|
||||||
/* We don't wan't applications to get away with being lazy here and not
|
|
||||||
* passing an update callback... */
|
|
||||||
g_return_if_fail (update);
|
|
||||||
|
|
||||||
onscreen->foreign_xid = xid;
|
|
||||||
onscreen->foreign_update_mask_callback = update;
|
|
||||||
onscreen->foreign_update_mask_data = user_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
guint32
|
|
||||||
cogl_x11_onscreen_get_window_xid (CoglOnscreen *onscreen)
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
|
|
||||||
if (onscreen->foreign_xid)
|
|
||||||
return onscreen->foreign_xid;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
|
|
||||||
/* This should only be called for x11 onscreens */
|
|
||||||
g_return_val_if_fail (winsys->onscreen_x11_get_window_xid != NULL, 0);
|
|
||||||
|
|
||||||
return winsys->onscreen_x11_get_window_xid (onscreen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
guint32
|
|
||||||
cogl_x11_onscreen_get_visual_xid (CoglOnscreen *onscreen)
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
XVisualInfo *visinfo;
|
|
||||||
guint32 id;
|
|
||||||
|
|
||||||
/* This should only be called for xlib based onscreens */
|
|
||||||
g_return_val_if_fail (winsys->xlib_get_visual_info != NULL, 0);
|
|
||||||
|
|
||||||
visinfo = winsys->xlib_get_visual_info ();
|
|
||||||
id = (guint32)visinfo->visualid;
|
|
||||||
|
|
||||||
XFree (visinfo);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
#endif /* COGL_HAS_X11_SUPPORT */
|
|
||||||
|
|
||||||
#ifdef COGL_HAS_WIN32_SUPPORT
|
|
||||||
|
|
||||||
void
|
|
||||||
cogl_win32_onscreen_set_foreign_window (CoglOnscreen *onscreen,
|
|
||||||
HWND hwnd)
|
|
||||||
{
|
|
||||||
onscreen->foreign_hwnd = hwnd;
|
|
||||||
}
|
|
||||||
|
|
||||||
HWND
|
|
||||||
cogl_win32_onscreen_get_window (CoglOnscreen *onscreen)
|
|
||||||
{
|
|
||||||
if (onscreen->foreign_hwnd)
|
|
||||||
return onscreen->foreign_hwnd;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
const CoglWinsysVtable *winsys =
|
|
||||||
_cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
|
|
||||||
/* This should only be called for win32 onscreens */
|
|
||||||
g_return_val_if_fail (winsys->onscreen_win32_get_window != NULL, 0);
|
|
||||||
|
|
||||||
return winsys->onscreen_win32_get_window (onscreen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* COGL_HAS_WIN32_SUPPORT */
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
cogl_framebuffer_add_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
|
||||||
CoglSwapBuffersNotify callback,
|
|
||||||
void *user_data)
|
|
||||||
{
|
|
||||||
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
|
|
||||||
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
|
|
||||||
/* Should this just be cogl_onscreen API instead? */
|
|
||||||
g_return_val_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN, 0);
|
|
||||||
|
|
||||||
/* This should only be called when
|
|
||||||
COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT is advertised */
|
|
||||||
g_return_val_if_fail (winsys->onscreen_add_swap_buffers_callback != NULL, 0);
|
|
||||||
|
|
||||||
return winsys->onscreen_add_swap_buffers_callback (onscreen,
|
|
||||||
callback,
|
|
||||||
user_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cogl_framebuffer_remove_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
|
||||||
unsigned int id)
|
|
||||||
{
|
|
||||||
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
|
|
||||||
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
|
|
||||||
/* This should only be called when
|
|
||||||
COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT is advertised */
|
|
||||||
g_return_if_fail (winsys->onscreen_remove_swap_buffers_callback != NULL);
|
|
||||||
|
|
||||||
winsys->onscreen_remove_swap_buffers_callback (onscreen, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_framebuffer_finish (CoglFramebuffer *framebuffer)
|
cogl_framebuffer_finish (CoglFramebuffer *framebuffer)
|
||||||
{
|
{
|
||||||
_cogl_framebuffer_flush_journal (framebuffer);
|
_cogl_framebuffer_flush_journal (framebuffer);
|
||||||
GE (framebuffer->context, glFinish ());
|
GE (framebuffer->context, glFinish ());
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
cogl_onscreen_set_swap_throttled (CoglOnscreen *onscreen,
|
|
||||||
gboolean throttled)
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
onscreen->swap_throttled = throttled;
|
|
||||||
if (framebuffer->allocated)
|
|
||||||
{
|
|
||||||
const CoglWinsysVtable *winsys =
|
|
||||||
_cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
winsys->onscreen_update_swap_throttled (onscreen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cogl_onscreen_show (CoglOnscreen *onscreen)
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
const CoglWinsysVtable *winsys;
|
|
||||||
|
|
||||||
if (!framebuffer->allocated)
|
|
||||||
{
|
|
||||||
if (!cogl_framebuffer_allocate (framebuffer, NULL))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
if (winsys->onscreen_set_visibility)
|
|
||||||
winsys->onscreen_set_visibility (onscreen, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cogl_onscreen_hide (CoglOnscreen *onscreen)
|
|
||||||
{
|
|
||||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
|
||||||
|
|
||||||
if (framebuffer->allocated)
|
|
||||||
{
|
|
||||||
const CoglWinsysVtable *winsys =
|
|
||||||
_cogl_framebuffer_get_winsys (framebuffer);
|
|
||||||
if (winsys->onscreen_set_visibility)
|
|
||||||
winsys->onscreen_set_visibility (onscreen, FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#ifndef __COGL_FRAMEBUFFER_H
|
#ifndef __COGL_FRAMEBUFFER_H
|
||||||
#define __COGL_FRAMEBUFFER_H
|
#define __COGL_FRAMEBUFFER_H
|
||||||
|
|
||||||
|
#include <cogl/cogl.h>
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#ifdef COGL_HAS_WIN32_SUPPORT
|
#ifdef COGL_HAS_WIN32_SUPPORT
|
||||||
@ -498,69 +500,6 @@ void
|
|||||||
cogl_framebuffer_discard_buffers (CoglFramebuffer *framebuffer,
|
cogl_framebuffer_discard_buffers (CoglFramebuffer *framebuffer,
|
||||||
unsigned long buffers);
|
unsigned long buffers);
|
||||||
|
|
||||||
/* XXX: Actually should this be renamed too cogl_onscreen_swap_buffers()? */
|
|
||||||
#define cogl_framebuffer_swap_buffers cogl_framebuffer_swap_buffers_EXP
|
|
||||||
/**
|
|
||||||
* cogl_framebuffer_swap_buffers:
|
|
||||||
* @framebuffer: A #CoglFramebuffer
|
|
||||||
*
|
|
||||||
* Swaps the current back buffer being rendered too, to the front for display.
|
|
||||||
*
|
|
||||||
* This function also implicitly discards the contents of the color, depth and
|
|
||||||
* stencil buffers as if cogl_framebuffer_discard_buffers() were used. The
|
|
||||||
* significance of the discard is that you should not expect to be able to
|
|
||||||
* start a new frame that incrementally builds on the contents of the previous
|
|
||||||
* frame.
|
|
||||||
*
|
|
||||||
* Since: 1.8
|
|
||||||
* Stability: unstable
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
cogl_framebuffer_swap_buffers (CoglFramebuffer *framebuffer);
|
|
||||||
|
|
||||||
#define cogl_framebuffer_swap_region cogl_framebuffer_swap_region_EXP
|
|
||||||
/**
|
|
||||||
* cogl_framebuffer_swap_region:
|
|
||||||
* @framebuffer: A #CoglFramebuffer
|
|
||||||
* @rectangles: An array of integer 4-tuples representing rectangles as
|
|
||||||
* (x, y, width, height) tuples.
|
|
||||||
* @n_rectangles: The number of 4-tuples to be read from @rectangles
|
|
||||||
*
|
|
||||||
* Swaps a region of the back buffer being rendered too, to the front for
|
|
||||||
* display. @rectangles represents the region as array of @n_rectangles each
|
|
||||||
* defined by 4 sequential (x, y, width, height) integers.
|
|
||||||
*
|
|
||||||
* This function also implicitly discards the contents of the color, depth and
|
|
||||||
* stencil buffers as if cogl_framebuffer_discard_buffers() were used. The
|
|
||||||
* significance of the discard is that you should not expect to be able to
|
|
||||||
* start a new frame that incrementally builds on the contents of the previous
|
|
||||||
* frame.
|
|
||||||
*
|
|
||||||
* Since: 1.8
|
|
||||||
* Stability: unstable
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
cogl_framebuffer_swap_region (CoglFramebuffer *framebuffer,
|
|
||||||
const int *rectangles,
|
|
||||||
int n_rectangles);
|
|
||||||
|
|
||||||
|
|
||||||
typedef void (*CoglSwapBuffersNotify) (CoglFramebuffer *framebuffer,
|
|
||||||
void *user_data);
|
|
||||||
|
|
||||||
#define cogl_framebuffer_add_swap_buffers_callback \
|
|
||||||
cogl_framebuffer_add_swap_buffers_callback_EXP
|
|
||||||
unsigned int
|
|
||||||
cogl_framebuffer_add_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
|
||||||
CoglSwapBuffersNotify callback,
|
|
||||||
void *user_data);
|
|
||||||
|
|
||||||
#define cogl_framebuffer_remove_swap_buffers_callback \
|
|
||||||
cogl_framebuffer_remove_swap_buffers_callback_EXP
|
|
||||||
void
|
|
||||||
cogl_framebuffer_remove_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
|
||||||
unsigned int id);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cogl_framebuffer_finish:
|
* cogl_framebuffer_finish:
|
||||||
* @framebuffer: A #CoglFramebuffer pointer
|
* @framebuffer: A #CoglFramebuffer pointer
|
||||||
@ -581,158 +520,6 @@ cogl_framebuffer_remove_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
|||||||
void
|
void
|
||||||
cogl_framebuffer_finish (CoglFramebuffer *framebuffer);
|
cogl_framebuffer_finish (CoglFramebuffer *framebuffer);
|
||||||
|
|
||||||
typedef struct _CoglOnscreen CoglOnscreen;
|
|
||||||
#define COGL_ONSCREEN(X) ((CoglOnscreen *)(X))
|
|
||||||
|
|
||||||
CoglOnscreen *
|
|
||||||
cogl_onscreen_new (CoglContext *context, int width, int height);
|
|
||||||
|
|
||||||
#ifdef COGL_HAS_X11
|
|
||||||
typedef void (*CoglOnscreenX11MaskCallback) (CoglOnscreen *onscreen,
|
|
||||||
guint32 event_mask,
|
|
||||||
void *user_data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cogl_x11_onscreen_set_foreign_window_xid:
|
|
||||||
* @onscreen: The unallocated framebuffer to associated with an X
|
|
||||||
* window.
|
|
||||||
* @xid: The XID of an existing X window
|
|
||||||
* @update: A callback that notifies of updates to what Cogl requires
|
|
||||||
* to be in the core X protocol event mask.
|
|
||||||
*
|
|
||||||
* Ideally we would recommend that you let Cogl be responsible for
|
|
||||||
* creating any X window required to back an onscreen framebuffer but
|
|
||||||
* if you really need to target a window created manually this
|
|
||||||
* function can be called before @onscreen has been allocated to set a
|
|
||||||
* foreign XID for your existing X window.
|
|
||||||
*
|
|
||||||
* Since Cogl needs, for example, to track changes to the size of an X
|
|
||||||
* window it requires that certain events be selected for via the core
|
|
||||||
* X protocol. This requirement may also be changed asynchronously so
|
|
||||||
* you must pass in an @update callback to inform you of Cogl's
|
|
||||||
* required event mask.
|
|
||||||
*
|
|
||||||
* For example if you are using Xlib you could use this API roughly
|
|
||||||
* as follows:
|
|
||||||
* [{
|
|
||||||
* static void
|
|
||||||
* my_update_cogl_x11_event_mask (CoglOnscreen *onscreen,
|
|
||||||
* guint32 event_mask,
|
|
||||||
* void *user_data)
|
|
||||||
* {
|
|
||||||
* XSetWindowAttributes attrs;
|
|
||||||
* MyData *data = user_data;
|
|
||||||
* attrs.event_mask = event_mask | data->my_event_mask;
|
|
||||||
* XChangeWindowAttributes (data->xdpy,
|
|
||||||
* data->xwin,
|
|
||||||
* CWEventMask,
|
|
||||||
* &attrs);
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* {
|
|
||||||
* *snip*
|
|
||||||
* cogl_x11_onscreen_set_foreign_window_xid (onscreen,
|
|
||||||
* data->xwin,
|
|
||||||
* my_update_cogl_x11_event_mask,
|
|
||||||
* data);
|
|
||||||
* *snip*
|
|
||||||
* }
|
|
||||||
* }]
|
|
||||||
*
|
|
||||||
* Since: 2.0
|
|
||||||
* Stability: Unstable
|
|
||||||
*/
|
|
||||||
#define cogl_x11_onscreen_set_foreign_window_xid \
|
|
||||||
cogl_x11_onscreen_set_foreign_window_xid_EXP
|
|
||||||
void
|
|
||||||
cogl_x11_onscreen_set_foreign_window_xid (CoglOnscreen *onscreen,
|
|
||||||
guint32 xid,
|
|
||||||
CoglOnscreenX11MaskCallback update,
|
|
||||||
void *user_data);
|
|
||||||
|
|
||||||
#define cogl_x11_onscreen_get_window_xid cogl_x11_onscreen_get_window_xid_EXP
|
|
||||||
guint32
|
|
||||||
cogl_x11_onscreen_get_window_xid (CoglOnscreen *onscreen);
|
|
||||||
|
|
||||||
#define cogl_x11_onscreen_get_visual_xid cogl_x11_onscreen_get_visual_xid_EXP
|
|
||||||
guint32
|
|
||||||
cogl_x11_onscreen_get_visual_xid (CoglOnscreen *onscreen);
|
|
||||||
#endif /* COGL_HAS_X11 */
|
|
||||||
|
|
||||||
#ifdef COGL_HAS_WIN32_SUPPORT
|
|
||||||
#define cogl_win32_onscreen_set_foreign_window \
|
|
||||||
cogl_win32_onscreen_set_foreign_window_EXP
|
|
||||||
void
|
|
||||||
cogl_win32_onscreen_set_foreign_window (CoglOnscreen *onscreen,
|
|
||||||
HWND hwnd);
|
|
||||||
|
|
||||||
#define cogl_win32_onscreen_get_window cogl_win32_onscreen_get_window_EXP
|
|
||||||
HWND
|
|
||||||
cogl_win32_onscreen_get_window (CoglOnscreen *onscreen);
|
|
||||||
#endif /* COGL_HAS_WIN32_SUPPORT */
|
|
||||||
|
|
||||||
#if defined (COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT)
|
|
||||||
struct wl_surface *
|
|
||||||
cogl_wayland_onscreen_get_surface (CoglOnscreen *onscreen);
|
|
||||||
#endif /* COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT */
|
|
||||||
|
|
||||||
#define cogl_onscreen_set_swap_throttled cogl_onscreen_set_swap_throttled_EXP
|
|
||||||
void
|
|
||||||
cogl_onscreen_set_swap_throttled (CoglOnscreen *onscreen,
|
|
||||||
gboolean throttled);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cogl_onscreen_show:
|
|
||||||
* @onscreen: The onscreen framebuffer to make visible
|
|
||||||
*
|
|
||||||
* This requests to make @onscreen visible to the user.
|
|
||||||
*
|
|
||||||
* Actually the precise semantics of this function depend on the
|
|
||||||
* window system currently in use, and if you don't have a
|
|
||||||
* multi-windowining system this function may in-fact do nothing.
|
|
||||||
*
|
|
||||||
* This function will implicitly allocate the given @onscreen
|
|
||||||
* framebuffer before showing it if it hasn't already been allocated.
|
|
||||||
*
|
|
||||||
* <note>Since Cogl doesn't explicitly track the visibility status of
|
|
||||||
* onscreen framebuffers it wont try to avoid redundant window system
|
|
||||||
* requests e.g. to show an already visible window. This also means
|
|
||||||
* that it's acceptable to alternatively use native APIs to show and
|
|
||||||
* hide windows without confusing Cogl.</note>
|
|
||||||
*
|
|
||||||
* Since: 2.0
|
|
||||||
* Stability: Unstable
|
|
||||||
*/
|
|
||||||
#define cogl_onscreen_show cogl_onscreen_show_EXP
|
|
||||||
void
|
|
||||||
cogl_onscreen_show (CoglOnscreen *onscreen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cogl_onscreen_hide:
|
|
||||||
* @onscreen: The onscreen framebuffer to make invisible
|
|
||||||
*
|
|
||||||
* This requests to make @onscreen invisible to the user.
|
|
||||||
*
|
|
||||||
* Actually the precise semantics of this function depend on the
|
|
||||||
* window system currently in use, and if you don't have a
|
|
||||||
* multi-windowining system this function may in-fact do nothing.
|
|
||||||
*
|
|
||||||
* This function does not implicitly allocate the given @onscreen
|
|
||||||
* framebuffer before hiding it.
|
|
||||||
*
|
|
||||||
* <note>Since Cogl doesn't explicitly track the visibility status of
|
|
||||||
* onscreen framebuffers it wont try to avoid redundant window system
|
|
||||||
* requests e.g. to show an already visible window. This also means
|
|
||||||
* that it's acceptable to alternatively use native APIs to show and
|
|
||||||
* hide windows without confusing Cogl.</note>
|
|
||||||
*
|
|
||||||
* Since: 2.0
|
|
||||||
* Stability: Unstable
|
|
||||||
*/
|
|
||||||
#define cogl_onscreen_hide cogl_onscreen_hide_EXP
|
|
||||||
void
|
|
||||||
cogl_onscreen_hide (CoglOnscreen *onscreen);
|
|
||||||
|
|
||||||
#define cogl_get_draw_framebuffer cogl_get_draw_framebuffer_EXP
|
#define cogl_get_draw_framebuffer cogl_get_draw_framebuffer_EXP
|
||||||
CoglFramebuffer *
|
CoglFramebuffer *
|
||||||
cogl_get_draw_framebuffer (void);
|
cogl_get_draw_framebuffer (void);
|
||||||
|
63
cogl/cogl-onscreen-private.h
Normal file
63
cogl/cogl-onscreen-private.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Cogl
|
||||||
|
*
|
||||||
|
* An object oriented GL/GLES Abstraction/Utility Layer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Intel Corporation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COGL_ONSCREEN_PRIVATE_H
|
||||||
|
#define __COGL_ONSCREEN_PRIVATE_H
|
||||||
|
|
||||||
|
#include "cogl-framebuffer-private.h"
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_WIN32_SUPPORT
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct _CoglOnscreen
|
||||||
|
{
|
||||||
|
CoglFramebuffer _parent;
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_X11_SUPPORT
|
||||||
|
guint32 foreign_xid;
|
||||||
|
CoglOnscreenX11MaskCallback foreign_update_mask_callback;
|
||||||
|
void *foreign_update_mask_data;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_WIN32_SUPPORT
|
||||||
|
HWND foreign_hwnd;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gboolean swap_throttled;
|
||||||
|
|
||||||
|
void *winsys;
|
||||||
|
};
|
||||||
|
CoglOnscreen *
|
||||||
|
_cogl_onscreen_new (void);
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
GQuark
|
||||||
|
_cogl_object_onscreen_get_type (void);
|
||||||
|
|
||||||
|
#endif /* __COGL_ONSCREEN_PRIVATE_H */
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "cogl-object-private.h"
|
#include "cogl-object-private.h"
|
||||||
#include "cogl-swap-chain.h"
|
#include "cogl-swap-chain.h"
|
||||||
|
#include "cogl-framebuffer-private.h"
|
||||||
|
|
||||||
struct _CoglOnscreenTemplate
|
struct _CoglOnscreenTemplate
|
||||||
{
|
{
|
||||||
|
344
cogl/cogl-onscreen.c
Normal file
344
cogl/cogl-onscreen.c
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
/*
|
||||||
|
* Cogl
|
||||||
|
*
|
||||||
|
* An object oriented GL/GLES Abstraction/Utility Layer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Intel Corporation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cogl-onscreen-private.h"
|
||||||
|
#include "cogl-framebuffer-private.h"
|
||||||
|
#include "cogl-onscreen-template-private.h"
|
||||||
|
#include "cogl-context-private.h"
|
||||||
|
#include "cogl-object-private.h"
|
||||||
|
|
||||||
|
static void _cogl_onscreen_free (CoglOnscreen *onscreen);
|
||||||
|
|
||||||
|
COGL_OBJECT_INTERNAL_DEFINE (Onscreen, onscreen);
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_onscreen_init_from_template (CoglOnscreen *onscreen,
|
||||||
|
CoglOnscreenTemplate *onscreen_template)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
|
||||||
|
framebuffer->config = onscreen_template->config;
|
||||||
|
cogl_object_ref (framebuffer->config.swap_chain);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX: While we still have backend in Clutter we need a dummy object
|
||||||
|
* to represent the CoglOnscreen framebuffer that the backend
|
||||||
|
* creates... */
|
||||||
|
CoglOnscreen *
|
||||||
|
_cogl_onscreen_new (void)
|
||||||
|
{
|
||||||
|
CoglOnscreen *onscreen = g_new0 (CoglOnscreen, 1);
|
||||||
|
|
||||||
|
_COGL_GET_CONTEXT (ctx, NULL);
|
||||||
|
|
||||||
|
_cogl_framebuffer_init (COGL_FRAMEBUFFER (onscreen),
|
||||||
|
ctx,
|
||||||
|
COGL_FRAMEBUFFER_TYPE_ONSCREEN,
|
||||||
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
|
0x1eadbeef, /* width */
|
||||||
|
0x1eadbeef); /* height */
|
||||||
|
/* NB: make sure to pass positive width/height numbers here
|
||||||
|
* because otherwise we'll hit input validation assertions!*/
|
||||||
|
|
||||||
|
_cogl_onscreen_init_from_template (onscreen, ctx->display->onscreen_template);
|
||||||
|
|
||||||
|
COGL_FRAMEBUFFER (onscreen)->allocated = TRUE;
|
||||||
|
|
||||||
|
/* XXX: Note we don't initialize onscreen->winsys in this case. */
|
||||||
|
|
||||||
|
return _cogl_onscreen_object_new (onscreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
CoglOnscreen *
|
||||||
|
cogl_onscreen_new (CoglContext *ctx, int width, int height)
|
||||||
|
{
|
||||||
|
CoglOnscreen *onscreen;
|
||||||
|
|
||||||
|
/* FIXME: We are assuming onscreen buffers will always be
|
||||||
|
premultiplied so we'll set the premult flag on the bitmap
|
||||||
|
format. This will usually be correct because the result of the
|
||||||
|
default blending operations for Cogl ends up with premultiplied
|
||||||
|
data in the framebuffer. However it is possible for the
|
||||||
|
framebuffer to be in whatever format depending on what
|
||||||
|
CoglPipeline is used to render to it. Eventually we may want to
|
||||||
|
add a way for an application to inform Cogl that the framebuffer
|
||||||
|
is not premultiplied in case it is being used for some special
|
||||||
|
purpose. */
|
||||||
|
|
||||||
|
onscreen = g_new0 (CoglOnscreen, 1);
|
||||||
|
_cogl_framebuffer_init (COGL_FRAMEBUFFER (onscreen),
|
||||||
|
ctx,
|
||||||
|
COGL_FRAMEBUFFER_TYPE_ONSCREEN,
|
||||||
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
|
width, /* width */
|
||||||
|
height); /* height */
|
||||||
|
|
||||||
|
_cogl_onscreen_init_from_template (onscreen, ctx->display->onscreen_template);
|
||||||
|
|
||||||
|
/* FIXME: This should be configurable via the template too */
|
||||||
|
onscreen->swap_throttled = TRUE;
|
||||||
|
|
||||||
|
return _cogl_onscreen_object_new (onscreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_onscreen_free (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
|
||||||
|
winsys->onscreen_deinit (onscreen);
|
||||||
|
g_return_if_fail (onscreen->winsys == NULL);
|
||||||
|
|
||||||
|
/* Chain up to parent */
|
||||||
|
_cogl_framebuffer_free (framebuffer);
|
||||||
|
|
||||||
|
g_free (onscreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_swap_buffers (CoglFramebuffer *framebuffer)
|
||||||
|
{
|
||||||
|
const CoglWinsysVtable *winsys;
|
||||||
|
|
||||||
|
g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN);
|
||||||
|
|
||||||
|
/* FIXME: we shouldn't need to flush *all* journals here! */
|
||||||
|
cogl_flush ();
|
||||||
|
winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
winsys->onscreen_swap_buffers (COGL_ONSCREEN (framebuffer));
|
||||||
|
cogl_framebuffer_discard_buffers (framebuffer,
|
||||||
|
COGL_BUFFER_BIT_COLOR |
|
||||||
|
COGL_BUFFER_BIT_DEPTH |
|
||||||
|
COGL_BUFFER_BIT_STENCIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_swap_region (CoglFramebuffer *framebuffer,
|
||||||
|
const int *rectangles,
|
||||||
|
int n_rectangles)
|
||||||
|
{
|
||||||
|
const CoglWinsysVtable *winsys;
|
||||||
|
|
||||||
|
g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN);
|
||||||
|
|
||||||
|
/* FIXME: we shouldn't need to flush *all* journals here! */
|
||||||
|
cogl_flush ();
|
||||||
|
|
||||||
|
winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
|
||||||
|
/* This should only be called if the winsys advertises
|
||||||
|
COGL_WINSYS_FEATURE_SWAP_REGION */
|
||||||
|
g_return_if_fail (winsys->onscreen_swap_region != NULL);
|
||||||
|
|
||||||
|
winsys->onscreen_swap_region (COGL_ONSCREEN (framebuffer),
|
||||||
|
rectangles,
|
||||||
|
n_rectangles);
|
||||||
|
|
||||||
|
cogl_framebuffer_discard_buffers (framebuffer,
|
||||||
|
COGL_BUFFER_BIT_COLOR |
|
||||||
|
COGL_BUFFER_BIT_DEPTH |
|
||||||
|
COGL_BUFFER_BIT_STENCIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_X11_SUPPORT
|
||||||
|
void
|
||||||
|
cogl_x11_onscreen_set_foreign_window_xid (CoglOnscreen *onscreen,
|
||||||
|
guint32 xid,
|
||||||
|
CoglOnscreenX11MaskCallback update,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
/* We don't wan't applications to get away with being lazy here and not
|
||||||
|
* passing an update callback... */
|
||||||
|
g_return_if_fail (update);
|
||||||
|
|
||||||
|
onscreen->foreign_xid = xid;
|
||||||
|
onscreen->foreign_update_mask_callback = update;
|
||||||
|
onscreen->foreign_update_mask_data = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
guint32
|
||||||
|
cogl_x11_onscreen_get_window_xid (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
|
||||||
|
if (onscreen->foreign_xid)
|
||||||
|
return onscreen->foreign_xid;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
|
||||||
|
/* This should only be called for x11 onscreens */
|
||||||
|
g_return_val_if_fail (winsys->onscreen_x11_get_window_xid != NULL, 0);
|
||||||
|
|
||||||
|
return winsys->onscreen_x11_get_window_xid (onscreen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
guint32
|
||||||
|
cogl_x11_onscreen_get_visual_xid (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
XVisualInfo *visinfo;
|
||||||
|
guint32 id;
|
||||||
|
|
||||||
|
/* This should only be called for xlib based onscreens */
|
||||||
|
g_return_val_if_fail (winsys->xlib_get_visual_info != NULL, 0);
|
||||||
|
|
||||||
|
visinfo = winsys->xlib_get_visual_info ();
|
||||||
|
id = (guint32)visinfo->visualid;
|
||||||
|
|
||||||
|
XFree (visinfo);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
#endif /* COGL_HAS_X11_SUPPORT */
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_WIN32_SUPPORT
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_win32_onscreen_set_foreign_window (CoglOnscreen *onscreen,
|
||||||
|
HWND hwnd)
|
||||||
|
{
|
||||||
|
onscreen->foreign_hwnd = hwnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND
|
||||||
|
cogl_win32_onscreen_get_window (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
if (onscreen->foreign_hwnd)
|
||||||
|
return onscreen->foreign_hwnd;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
const CoglWinsysVtable *winsys =
|
||||||
|
_cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
|
||||||
|
/* This should only be called for win32 onscreens */
|
||||||
|
g_return_val_if_fail (winsys->onscreen_win32_get_window != NULL, 0);
|
||||||
|
|
||||||
|
return winsys->onscreen_win32_get_window (onscreen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* COGL_HAS_WIN32_SUPPORT */
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
cogl_framebuffer_add_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
||||||
|
CoglSwapBuffersNotify callback,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
|
||||||
|
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
|
||||||
|
/* Should this just be cogl_onscreen API instead? */
|
||||||
|
g_return_val_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN, 0);
|
||||||
|
|
||||||
|
/* This should only be called when
|
||||||
|
COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT is advertised */
|
||||||
|
g_return_val_if_fail (winsys->onscreen_add_swap_buffers_callback != NULL, 0);
|
||||||
|
|
||||||
|
return winsys->onscreen_add_swap_buffers_callback (onscreen,
|
||||||
|
callback,
|
||||||
|
user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_remove_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
||||||
|
unsigned int id)
|
||||||
|
{
|
||||||
|
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
|
||||||
|
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
|
||||||
|
/* This should only be called when
|
||||||
|
COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT is advertised */
|
||||||
|
g_return_if_fail (winsys->onscreen_remove_swap_buffers_callback != NULL);
|
||||||
|
|
||||||
|
winsys->onscreen_remove_swap_buffers_callback (onscreen, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_onscreen_set_swap_throttled (CoglOnscreen *onscreen,
|
||||||
|
gboolean throttled)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
onscreen->swap_throttled = throttled;
|
||||||
|
if (framebuffer->allocated)
|
||||||
|
{
|
||||||
|
const CoglWinsysVtable *winsys =
|
||||||
|
_cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
winsys->onscreen_update_swap_throttled (onscreen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_onscreen_show (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
const CoglWinsysVtable *winsys;
|
||||||
|
|
||||||
|
if (!framebuffer->allocated)
|
||||||
|
{
|
||||||
|
if (!cogl_framebuffer_allocate (framebuffer, NULL))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
if (winsys->onscreen_set_visibility)
|
||||||
|
winsys->onscreen_set_visibility (onscreen, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_onscreen_hide (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
|
||||||
|
if (framebuffer->allocated)
|
||||||
|
{
|
||||||
|
const CoglWinsysVtable *winsys =
|
||||||
|
_cogl_framebuffer_get_winsys (framebuffer);
|
||||||
|
if (winsys->onscreen_set_visibility)
|
||||||
|
winsys->onscreen_set_visibility (onscreen, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
CoglContext *ctx = framebuffer->context;
|
||||||
|
|
||||||
|
if (framebuffer->width == width && framebuffer->height == height)
|
||||||
|
return;
|
||||||
|
|
||||||
|
framebuffer->width = width;
|
||||||
|
framebuffer->height = height;
|
||||||
|
|
||||||
|
/* We'll need to recalculate the GL viewport state derived
|
||||||
|
* from the Cogl viewport */
|
||||||
|
ctx->dirty_gl_viewport = 1;
|
||||||
|
}
|
258
cogl/cogl-onscreen.h
Normal file
258
cogl/cogl-onscreen.h
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
/*
|
||||||
|
* Cogl
|
||||||
|
*
|
||||||
|
* An object oriented GL/GLES Abstraction/Utility Layer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Intel Corporation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Robert Bragg <robert@linux.intel.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(__COGL_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
|
||||||
|
#error "Only <cogl/cogl.h> can be included directly."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __COGL_ONSCREEN_H
|
||||||
|
#define __COGL_ONSCREEN_H
|
||||||
|
|
||||||
|
#include <cogl/cogl-context.h>
|
||||||
|
#include <cogl/cogl-framebuffer.h>
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
typedef struct _CoglOnscreen CoglOnscreen;
|
||||||
|
#define COGL_ONSCREEN(X) ((CoglOnscreen *)(X))
|
||||||
|
|
||||||
|
CoglOnscreen *
|
||||||
|
cogl_onscreen_new (CoglContext *context, int width, int height);
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_X11
|
||||||
|
typedef void (*CoglOnscreenX11MaskCallback) (CoglOnscreen *onscreen,
|
||||||
|
guint32 event_mask,
|
||||||
|
void *user_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_x11_onscreen_set_foreign_window_xid:
|
||||||
|
* @onscreen: The unallocated framebuffer to associated with an X
|
||||||
|
* window.
|
||||||
|
* @xid: The XID of an existing X window
|
||||||
|
* @update: A callback that notifies of updates to what Cogl requires
|
||||||
|
* to be in the core X protocol event mask.
|
||||||
|
*
|
||||||
|
* Ideally we would recommend that you let Cogl be responsible for
|
||||||
|
* creating any X window required to back an onscreen framebuffer but
|
||||||
|
* if you really need to target a window created manually this
|
||||||
|
* function can be called before @onscreen has been allocated to set a
|
||||||
|
* foreign XID for your existing X window.
|
||||||
|
*
|
||||||
|
* Since Cogl needs, for example, to track changes to the size of an X
|
||||||
|
* window it requires that certain events be selected for via the core
|
||||||
|
* X protocol. This requirement may also be changed asynchronously so
|
||||||
|
* you must pass in an @update callback to inform you of Cogl's
|
||||||
|
* required event mask.
|
||||||
|
*
|
||||||
|
* For example if you are using Xlib you could use this API roughly
|
||||||
|
* as follows:
|
||||||
|
* [{
|
||||||
|
* static void
|
||||||
|
* my_update_cogl_x11_event_mask (CoglOnscreen *onscreen,
|
||||||
|
* guint32 event_mask,
|
||||||
|
* void *user_data)
|
||||||
|
* {
|
||||||
|
* XSetWindowAttributes attrs;
|
||||||
|
* MyData *data = user_data;
|
||||||
|
* attrs.event_mask = event_mask | data->my_event_mask;
|
||||||
|
* XChangeWindowAttributes (data->xdpy,
|
||||||
|
* data->xwin,
|
||||||
|
* CWEventMask,
|
||||||
|
* &attrs);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* *snip*
|
||||||
|
* cogl_x11_onscreen_set_foreign_window_xid (onscreen,
|
||||||
|
* data->xwin,
|
||||||
|
* my_update_cogl_x11_event_mask,
|
||||||
|
* data);
|
||||||
|
* *snip*
|
||||||
|
* }
|
||||||
|
* }]
|
||||||
|
*
|
||||||
|
* Since: 2.0
|
||||||
|
* Stability: Unstable
|
||||||
|
*/
|
||||||
|
#define cogl_x11_onscreen_set_foreign_window_xid \
|
||||||
|
cogl_x11_onscreen_set_foreign_window_xid_EXP
|
||||||
|
void
|
||||||
|
cogl_x11_onscreen_set_foreign_window_xid (CoglOnscreen *onscreen,
|
||||||
|
guint32 xid,
|
||||||
|
CoglOnscreenX11MaskCallback update,
|
||||||
|
void *user_data);
|
||||||
|
|
||||||
|
#define cogl_x11_onscreen_get_window_xid cogl_x11_onscreen_get_window_xid_EXP
|
||||||
|
guint32
|
||||||
|
cogl_x11_onscreen_get_window_xid (CoglOnscreen *onscreen);
|
||||||
|
|
||||||
|
#define cogl_x11_onscreen_get_visual_xid cogl_x11_onscreen_get_visual_xid_EXP
|
||||||
|
guint32
|
||||||
|
cogl_x11_onscreen_get_visual_xid (CoglOnscreen *onscreen);
|
||||||
|
#endif /* COGL_HAS_X11 */
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_WIN32_SUPPORT
|
||||||
|
#define cogl_win32_onscreen_set_foreign_window \
|
||||||
|
cogl_win32_onscreen_set_foreign_window_EXP
|
||||||
|
void
|
||||||
|
cogl_win32_onscreen_set_foreign_window (CoglOnscreen *onscreen,
|
||||||
|
HWND hwnd);
|
||||||
|
|
||||||
|
#define cogl_win32_onscreen_get_window cogl_win32_onscreen_get_window_EXP
|
||||||
|
HWND
|
||||||
|
cogl_win32_onscreen_get_window (CoglOnscreen *onscreen);
|
||||||
|
#endif /* COGL_HAS_WIN32_SUPPORT */
|
||||||
|
|
||||||
|
#if defined (COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT)
|
||||||
|
struct wl_surface *
|
||||||
|
cogl_wayland_onscreen_get_surface (CoglOnscreen *onscreen);
|
||||||
|
#endif /* COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT */
|
||||||
|
|
||||||
|
#define cogl_onscreen_set_swap_throttled cogl_onscreen_set_swap_throttled_EXP
|
||||||
|
void
|
||||||
|
cogl_onscreen_set_swap_throttled (CoglOnscreen *onscreen,
|
||||||
|
gboolean throttled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_onscreen_show:
|
||||||
|
* @onscreen: The onscreen framebuffer to make visible
|
||||||
|
*
|
||||||
|
* This requests to make @onscreen visible to the user.
|
||||||
|
*
|
||||||
|
* Actually the precise semantics of this function depend on the
|
||||||
|
* window system currently in use, and if you don't have a
|
||||||
|
* multi-windowining system this function may in-fact do nothing.
|
||||||
|
*
|
||||||
|
* This function will implicitly allocate the given @onscreen
|
||||||
|
* framebuffer before showing it if it hasn't already been allocated.
|
||||||
|
*
|
||||||
|
* <note>Since Cogl doesn't explicitly track the visibility status of
|
||||||
|
* onscreen framebuffers it wont try to avoid redundant window system
|
||||||
|
* requests e.g. to show an already visible window. This also means
|
||||||
|
* that it's acceptable to alternatively use native APIs to show and
|
||||||
|
* hide windows without confusing Cogl.</note>
|
||||||
|
*
|
||||||
|
* Since: 2.0
|
||||||
|
* Stability: Unstable
|
||||||
|
*/
|
||||||
|
#define cogl_onscreen_show cogl_onscreen_show_EXP
|
||||||
|
void
|
||||||
|
cogl_onscreen_show (CoglOnscreen *onscreen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_onscreen_hide:
|
||||||
|
* @onscreen: The onscreen framebuffer to make invisible
|
||||||
|
*
|
||||||
|
* This requests to make @onscreen invisible to the user.
|
||||||
|
*
|
||||||
|
* Actually the precise semantics of this function depend on the
|
||||||
|
* window system currently in use, and if you don't have a
|
||||||
|
* multi-windowining system this function may in-fact do nothing.
|
||||||
|
*
|
||||||
|
* This function does not implicitly allocate the given @onscreen
|
||||||
|
* framebuffer before hiding it.
|
||||||
|
*
|
||||||
|
* <note>Since Cogl doesn't explicitly track the visibility status of
|
||||||
|
* onscreen framebuffers it wont try to avoid redundant window system
|
||||||
|
* requests e.g. to show an already visible window. This also means
|
||||||
|
* that it's acceptable to alternatively use native APIs to show and
|
||||||
|
* hide windows without confusing Cogl.</note>
|
||||||
|
*
|
||||||
|
* Since: 2.0
|
||||||
|
* Stability: Unstable
|
||||||
|
*/
|
||||||
|
#define cogl_onscreen_hide cogl_onscreen_hide_EXP
|
||||||
|
void
|
||||||
|
cogl_onscreen_hide (CoglOnscreen *onscreen);
|
||||||
|
|
||||||
|
/* XXX: Actually should this be renamed too cogl_onscreen_swap_buffers()? */
|
||||||
|
#define cogl_framebuffer_swap_buffers cogl_framebuffer_swap_buffers_EXP
|
||||||
|
/**
|
||||||
|
* cogl_framebuffer_swap_buffers:
|
||||||
|
* @framebuffer: A #CoglFramebuffer
|
||||||
|
*
|
||||||
|
* Swaps the current back buffer being rendered too, to the front for display.
|
||||||
|
*
|
||||||
|
* This function also implicitly discards the contents of the color, depth and
|
||||||
|
* stencil buffers as if cogl_framebuffer_discard_buffers() were used. The
|
||||||
|
* significance of the discard is that you should not expect to be able to
|
||||||
|
* start a new frame that incrementally builds on the contents of the previous
|
||||||
|
* frame.
|
||||||
|
*
|
||||||
|
* Since: 1.8
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_framebuffer_swap_buffers (CoglFramebuffer *framebuffer);
|
||||||
|
|
||||||
|
#define cogl_framebuffer_swap_region cogl_framebuffer_swap_region_EXP
|
||||||
|
/**
|
||||||
|
* cogl_framebuffer_swap_region:
|
||||||
|
* @framebuffer: A #CoglFramebuffer
|
||||||
|
* @rectangles: An array of integer 4-tuples representing rectangles as
|
||||||
|
* (x, y, width, height) tuples.
|
||||||
|
* @n_rectangles: The number of 4-tuples to be read from @rectangles
|
||||||
|
*
|
||||||
|
* Swaps a region of the back buffer being rendered too, to the front for
|
||||||
|
* display. @rectangles represents the region as array of @n_rectangles each
|
||||||
|
* defined by 4 sequential (x, y, width, height) integers.
|
||||||
|
*
|
||||||
|
* This function also implicitly discards the contents of the color, depth and
|
||||||
|
* stencil buffers as if cogl_framebuffer_discard_buffers() were used. The
|
||||||
|
* significance of the discard is that you should not expect to be able to
|
||||||
|
* start a new frame that incrementally builds on the contents of the previous
|
||||||
|
* frame.
|
||||||
|
*
|
||||||
|
* Since: 1.8
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_framebuffer_swap_region (CoglFramebuffer *framebuffer,
|
||||||
|
const int *rectangles,
|
||||||
|
int n_rectangles);
|
||||||
|
|
||||||
|
|
||||||
|
typedef void (*CoglSwapBuffersNotify) (CoglFramebuffer *framebuffer,
|
||||||
|
void *user_data);
|
||||||
|
|
||||||
|
#define cogl_framebuffer_add_swap_buffers_callback \
|
||||||
|
cogl_framebuffer_add_swap_buffers_callback_EXP
|
||||||
|
unsigned int
|
||||||
|
cogl_framebuffer_add_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
||||||
|
CoglSwapBuffersNotify callback,
|
||||||
|
void *user_data);
|
||||||
|
|
||||||
|
#define cogl_framebuffer_remove_swap_buffers_callback \
|
||||||
|
cogl_framebuffer_remove_swap_buffers_callback_EXP
|
||||||
|
void
|
||||||
|
cogl_framebuffer_remove_swap_buffers_callback (CoglFramebuffer *framebuffer,
|
||||||
|
unsigned int id);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __COGL_ONSCREEN_H */
|
@ -36,6 +36,7 @@
|
|||||||
#include "cogl-pipeline-private.h"
|
#include "cogl-pipeline-private.h"
|
||||||
#include "cogl-context-private.h"
|
#include "cogl-context-private.h"
|
||||||
#include "cogl-texture-private.h"
|
#include "cogl-texture-private.h"
|
||||||
|
#include "cogl-framebuffer-private.h"
|
||||||
|
|
||||||
/* This is needed to set the color attribute on GLES2 */
|
/* This is needed to set the color attribute on GLES2 */
|
||||||
#ifdef HAVE_COGL_GLES2
|
#ifdef HAVE_COGL_GLES2
|
||||||
|
@ -93,6 +93,7 @@ typedef struct _CoglFramebuffer CoglFramebuffer;
|
|||||||
#include <cogl/cogl-pipeline-state.h>
|
#include <cogl/cogl-pipeline-state.h>
|
||||||
#include <cogl/cogl-pipeline-layer-state.h>
|
#include <cogl/cogl-pipeline-layer-state.h>
|
||||||
#include <cogl/cogl-framebuffer.h>
|
#include <cogl/cogl-framebuffer.h>
|
||||||
|
#include <cogl/cogl-onscreen.h>
|
||||||
#ifdef COGL_HAS_XLIB
|
#ifdef COGL_HAS_XLIB
|
||||||
#include <cogl/cogl-xlib.h>
|
#include <cogl/cogl-xlib.h>
|
||||||
#include <cogl/cogl-xlib-renderer.h>
|
#include <cogl/cogl-xlib-renderer.h>
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "cogl-feature-private.h"
|
#include "cogl-feature-private.h"
|
||||||
#include "cogl-context-private.h"
|
#include "cogl-context-private.h"
|
||||||
#include "cogl-framebuffer.h"
|
#include "cogl-framebuffer.h"
|
||||||
|
#include "cogl-onscreen-private.h"
|
||||||
#include "cogl-swap-chain-private.h"
|
#include "cogl-swap-chain-private.h"
|
||||||
#include "cogl-renderer-private.h"
|
#include "cogl-renderer-private.h"
|
||||||
#include "cogl-onscreen-template-private.h"
|
#include "cogl-onscreen-template-private.h"
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include "cogl-texture-rectangle-private.h"
|
#include "cogl-texture-rectangle-private.h"
|
||||||
#include "cogl-pipeline-opengl-private.h"
|
#include "cogl-pipeline-opengl-private.h"
|
||||||
#include "cogl-framebuffer-private.h"
|
#include "cogl-framebuffer-private.h"
|
||||||
|
#include "cogl-onscreen-private.h"
|
||||||
#include "cogl-swap-chain-private.h"
|
#include "cogl-swap-chain-private.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
#define __COGL_WINSYS_PRIVATE_H
|
#define __COGL_WINSYS_PRIVATE_H
|
||||||
|
|
||||||
#include "cogl-renderer.h"
|
#include "cogl-renderer.h"
|
||||||
|
#include "cogl-onscreen.h"
|
||||||
|
|
||||||
#include "cogl-framebuffer-private.h"
|
|
||||||
#ifdef COGL_HAS_XLIB_SUPPORT
|
#ifdef COGL_HAS_XLIB_SUPPORT
|
||||||
#include "cogl-texture-pixmap-x11-private.h"
|
#include "cogl-texture-pixmap-x11-private.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "cogl-winsys-private.h"
|
#include "cogl-winsys-private.h"
|
||||||
#include "cogl-context-private.h"
|
#include "cogl-context-private.h"
|
||||||
#include "cogl-framebuffer.h"
|
#include "cogl-framebuffer.h"
|
||||||
|
#include "cogl-onscreen-private.h"
|
||||||
#include "cogl-swap-chain-private.h"
|
#include "cogl-swap-chain-private.h"
|
||||||
#include "cogl-renderer-private.h"
|
#include "cogl-renderer-private.h"
|
||||||
#include "cogl-display-private.h"
|
#include "cogl-display-private.h"
|
||||||
|
@ -59,6 +59,7 @@ IGNORE_HFILES=\
|
|||||||
cogl-color-private.h \
|
cogl-color-private.h \
|
||||||
cogl-feature-private.h \
|
cogl-feature-private.h \
|
||||||
cogl-framebuffer-private.h \
|
cogl-framebuffer-private.h \
|
||||||
|
cogl-onscreen-private.h \
|
||||||
cogl-gtype-private.h \
|
cogl-gtype-private.h \
|
||||||
cogl-index-array-private.h \
|
cogl-index-array-private.h \
|
||||||
cogl-indices-private.h \
|
cogl-indices-private.h \
|
||||||
|
@ -59,6 +59,7 @@ IGNORE_HFILES=\
|
|||||||
cogl-color-private.h \
|
cogl-color-private.h \
|
||||||
cogl-feature-private.h \
|
cogl-feature-private.h \
|
||||||
cogl-framebuffer-private.h \
|
cogl-framebuffer-private.h \
|
||||||
|
cogl-onscreen-private.h \
|
||||||
cogl-gtype-private.h \
|
cogl-gtype-private.h \
|
||||||
cogl-index-buffer-private.h \
|
cogl-index-buffer-private.h \
|
||||||
cogl-indices-private.h \
|
cogl-indices-private.h \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user