cogl: Adds _cogl_swap_buffers_notify for clutter backends
This adds a stop-gap mechanism for Cogl to know when the window system is requested to present the current backbuffer to the frontbuffer by adding a _cogl_swap_buffers_notify function that backends are now expected to call right after issuing the equivalent request to OpenGL vie the platforms OpenGL binding layer. This (blindly) updates all the backends to call this new function. For now Cogl doesn't do anything with the notification but the intention is to use it as part of a planned read-pixel optimization which will need to reset some state at the start of each new frame.
This commit is contained in:
parent
e150f474b3
commit
142b229c5c
@ -193,6 +193,9 @@ _cogl_framebuffer_flush_journal (CoglFramebuffer *framebuffer);
|
|||||||
void
|
void
|
||||||
_cogl_framebuffer_flush_dependency_journals (CoglFramebuffer *framebuffer);
|
_cogl_framebuffer_flush_dependency_journals (CoglFramebuffer *framebuffer);
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_framebuffer_swap_notify (CoglFramebuffer *framebuffer);
|
||||||
|
|
||||||
typedef enum _CoglFramebufferFlushFlags
|
typedef enum _CoglFramebufferFlushFlags
|
||||||
{
|
{
|
||||||
/* XXX: When using this, that imples you are going to manually load the
|
/* XXX: When using this, that imples you are going to manually load the
|
||||||
|
@ -313,6 +313,11 @@ _cogl_framebuffer_clear (CoglFramebuffer *framebuffer,
|
|||||||
cogl_color_get_alpha_float (color));
|
cogl_color_get_alpha_float (color));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_framebuffer_swap_notify (CoglFramebuffer *framebuffer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_cogl_framebuffer_get_width (CoglFramebuffer *framebuffer)
|
_cogl_framebuffer_get_width (CoglFramebuffer *framebuffer)
|
||||||
{
|
{
|
||||||
|
@ -1097,3 +1097,13 @@ _cogl_error_quark (void)
|
|||||||
return g_quark_from_static_string ("cogl-error-quark");
|
return g_quark_from_static_string ("cogl-error-quark");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Until Cogl becomes responsible for handling swap-buffer requests
|
||||||
|
* this API is used by Clutter to notify us when it issues a
|
||||||
|
* swap-buffer on our behalf. */
|
||||||
|
void
|
||||||
|
_cogl_swap_buffers_notify (void)
|
||||||
|
{
|
||||||
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
|
|
||||||
|
_cogl_framebuffer_swap_notify (_cogl_get_framebuffer ());
|
||||||
|
}
|
||||||
|
@ -1293,6 +1293,9 @@ _cogl_driver_error_quark (void);
|
|||||||
void
|
void
|
||||||
_cogl_onscreen_clutter_backend_set_size (int width, int height);
|
_cogl_onscreen_clutter_backend_set_size (int width, int height);
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_swap_buffers_notify (void);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#undef __COGL_H_INSIDE__
|
#undef __COGL_H_INSIDE__
|
||||||
|
@ -573,6 +573,7 @@ _clutter_stage_egl_redraw (ClutterStageEGL *stage_egl,
|
|||||||
CLUTTER_TIMER_START (_clutter_uprof_context, swapbuffers_timer);
|
CLUTTER_TIMER_START (_clutter_uprof_context, swapbuffers_timer);
|
||||||
eglSwapBuffers (backend_egl->edpy, egl_surface);
|
eglSwapBuffers (backend_egl->edpy, egl_surface);
|
||||||
CLUTTER_TIMER_STOP (_clutter_uprof_context, swapbuffers_timer);
|
CLUTTER_TIMER_STOP (_clutter_uprof_context, swapbuffers_timer);
|
||||||
|
_cogl_swap_buffers_notify ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reset the redraw clipping for the next paint... */
|
/* reset the redraw clipping for the next paint... */
|
||||||
|
@ -77,6 +77,7 @@ clutter_backend_egl_redraw (ClutterBackend *backend,
|
|||||||
cogl_flush ();
|
cogl_flush ();
|
||||||
eglWaitGL();
|
eglWaitGL();
|
||||||
eglSwapBuffers (backend_egl->edpy, stage_egl->egl_surface);
|
eglSwapBuffers (backend_egl->edpy, stage_egl->egl_surface);
|
||||||
|
_cogl_swap_buffers_notify ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClutterActor *
|
static ClutterActor *
|
||||||
|
@ -737,6 +737,7 @@ _clutter_stage_glx_redraw (ClutterStageGLX *stage_glx,
|
|||||||
CLUTTER_TIMER_START (_clutter_uprof_context, swapbuffers_timer);
|
CLUTTER_TIMER_START (_clutter_uprof_context, swapbuffers_timer);
|
||||||
glXSwapBuffers (backend_x11->xdpy, drawable);
|
glXSwapBuffers (backend_x11->xdpy, drawable);
|
||||||
CLUTTER_TIMER_STOP (_clutter_uprof_context, swapbuffers_timer);
|
CLUTTER_TIMER_STOP (_clutter_uprof_context, swapbuffers_timer);
|
||||||
|
_cogl_swap_buffers_notify ();
|
||||||
}
|
}
|
||||||
|
|
||||||
backend_glx->last_video_sync_count = video_sync_count;
|
backend_glx->last_video_sync_count = video_sync_count;
|
||||||
|
@ -152,6 +152,7 @@ clutter_stage_osx_get_wrapper (ClutterStageWindow *stage_window);
|
|||||||
_clutter_stage_do_paint (CLUTTER_STAGE (self->stage_osx->wrapper), NULL);
|
_clutter_stage_do_paint (CLUTTER_STAGE (self->stage_osx->wrapper), NULL);
|
||||||
cogl_flush ();
|
cogl_flush ();
|
||||||
[[self openGLContext] flushBuffer];
|
[[self openGLContext] flushBuffer];
|
||||||
|
_cogl_swap_buffers_notify ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In order to receive key events */
|
/* In order to receive key events */
|
||||||
|
@ -372,6 +372,8 @@ wayland_swap_buffers (ClutterStageWayland *stage_wayland)
|
|||||||
wl_display_frame_callback (backend_wayland->wayland_display,
|
wl_display_frame_callback (backend_wayland->wayland_display,
|
||||||
wayland_frame_callback,
|
wayland_frame_callback,
|
||||||
stage_wayland);
|
stage_wayland);
|
||||||
|
|
||||||
|
_cogl_swap_buffers_notify ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -498,7 +498,10 @@ clutter_backend_win32_redraw (ClutterBackend *backend,
|
|||||||
cogl_flush ();
|
cogl_flush ();
|
||||||
|
|
||||||
if (stage_win32->client_dc)
|
if (stage_win32->client_dc)
|
||||||
SwapBuffers (stage_win32->client_dc);
|
{
|
||||||
|
SwapBuffers (stage_win32->client_dc);
|
||||||
|
_cogl_swap_buffers_notify ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClutterStageWindow *
|
static ClutterStageWindow *
|
||||||
|
Loading…
Reference in New Issue
Block a user