stage/glx: Code clean ups

This commit is contained in:
Emmanuele Bassi 2011-02-14 12:00:31 +00:00
parent 48f2cb1f09
commit 3a378b849b
2 changed files with 22 additions and 20 deletions

View File

@ -71,10 +71,9 @@ G_DEFINE_TYPE_WITH_CODE (ClutterStageGLX,
static void static void
clutter_stage_glx_unrealize (ClutterStageWindow *stage_window) clutter_stage_glx_unrealize (ClutterStageWindow *stage_window)
{ {
ClutterBackend *backend = clutter_get_default_backend ();
ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend);
ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window); ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (stage_window); ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (stage_window);
ClutterBackendX11 *backend_x11 = stage_x11->backend;
/* Note unrealize should free up any backend stage related resources */ /* Note unrealize should free up any backend stage related resources */
CLUTTER_NOTE (BACKEND, "Unrealizing GLX stage [%p]", stage_glx); CLUTTER_NOTE (BACKEND, "Unrealizing GLX stage [%p]", stage_glx);
@ -101,19 +100,17 @@ clutter_stage_glx_realize (ClutterStageWindow *stage_window)
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (stage_window); ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (stage_window);
ClutterBackendX11 *backend_x11; ClutterBackendX11 *backend_x11;
ClutterBackendGLX *backend_glx; ClutterBackendGLX *backend_glx;
ClutterBackend *backend;
CLUTTER_NOTE (ACTOR, "Realizing stage '%s' [%p]", CLUTTER_NOTE (ACTOR, "Realizing stage '%s' [%p]",
G_OBJECT_TYPE_NAME (stage_window), G_OBJECT_TYPE_NAME (stage_window),
stage_window); stage_window);
backend = clutter_get_default_backend ();
backend_glx = CLUTTER_BACKEND_GLX (backend);
backend_x11 = CLUTTER_BACKEND_X11 (backend);
if (!_clutter_stage_x11_create_window (stage_x11)) if (!_clutter_stage_x11_create_window (stage_x11))
return FALSE; return FALSE;
backend_x11 = stage_x11->backend;
backend_glx = CLUTTER_BACKEND_GLX (backend_x11);
if (stage_glx->glxwin == None) if (stage_glx->glxwin == None)
{ {
int major; int major;
@ -220,14 +217,12 @@ clutter_stage_glx_ignoring_redraw_clips (ClutterStageWindow *stage_window)
* - when we come to redraw; if the bounding box is smaller than the * - when we come to redraw; if the bounding box is smaller than the
* stage we scissor the redraw to that box and use * stage we scissor the redraw to that box and use
* GLX_MESA_copy_sub_buffer to present the redraw to the front * GLX_MESA_copy_sub_buffer to present the redraw to the front
* buffer. Some heuristics are used to decide when a clipped redraw * buffer.
* should be promoted into a full stage redraw.
* *
* Currently we simply check that the bounding box height is < 300 * XXX - In theory, we should have some sort of heuristics to promote
* pixels. * a clipped redraw to a full screen redraw; in reality, it turns out
* * that promotion is fairly expensive. See the Clutter bug described
* XXX: we don't have any empirical data telling us what a sensible * at: http://bugzilla.clutter-project.org/show_bug.cgi?id=2136 .
* thresholds is!
* *
* TODO - we should use different heuristics depending on whether the * TODO - we should use different heuristics depending on whether the
* framebuffer is on screen and not redirected by a compositor VS * framebuffer is on screen and not redirected by a compositor VS
@ -251,7 +246,6 @@ clutter_stage_glx_ignoring_redraw_clips (ClutterStageWindow *stage_window)
* By promoting to a full stage redraw we trade off the cost involved * By promoting to a full stage redraw we trade off the cost involved
* in rasterizing the extra pixels vs avoiding to use a blit to * in rasterizing the extra pixels vs avoiding to use a blit to
* present the back buffer. * present the back buffer.
*
*/ */
static void static void
clutter_stage_glx_add_redraw_clip (ClutterStageWindow *stage_window, clutter_stage_glx_add_redraw_clip (ClutterStageWindow *stage_window,
@ -286,7 +280,8 @@ clutter_stage_glx_add_redraw_clip (ClutterStageWindow *stage_window,
} }
else if (stage_glx->bounding_redraw_clip.width > 0) else if (stage_glx->bounding_redraw_clip.width > 0)
{ {
clutter_geometry_union (&stage_glx->bounding_redraw_clip, stage_clip, clutter_geometry_union (&stage_glx->bounding_redraw_clip,
stage_clip,
&stage_glx->bounding_redraw_clip); &stage_glx->bounding_redraw_clip);
} }
@ -299,6 +294,11 @@ clutter_stage_glx_add_redraw_clip (ClutterStageWindow *stage_window,
* expensive than redrawing the additional 30% to avoid the blit. * expensive than redrawing the additional 30% to avoid the blit.
* *
* FIXME: This threshold was plucked out of thin air! * FIXME: This threshold was plucked out of thin air!
*
* The threshold has been disabled after verifying that it indeed
* made redraws more expensive than intended; see bug reference:
*
* http://bugzilla.clutter-project.org/show_bug.cgi?id=2136
*/ */
if (redraw_area > (stage_area * 0.7f)) if (redraw_area > (stage_area * 0.7f))
{ {

View File

@ -48,18 +48,20 @@ struct _ClutterStageGLX
{ {
ClutterStageX11 parent_instance; ClutterStageX11 parent_instance;
int pending_swaps; gint pending_swaps;
GLXPixmap glxpixmap; GLXPixmap glxpixmap;
GLXWindow glxwin; GLXWindow glxwin;
/* We only enable clipped redraws after 2 frames, since we've seen /* We only enable clipped redraws after 2 frames, since we've seen
* a lot of drivers can struggle to get going and may output some * a lot of drivers can struggle to get going and may output some
* junk frames to start with. */ * junk frames to start with.
unsigned long frame_count; */
guint frame_count;
gboolean initialized_redraw_clip;
ClutterGeometry bounding_redraw_clip; ClutterGeometry bounding_redraw_clip;
guint initialized_redraw_clip : 1;
}; };
struct _ClutterStageGLXClass struct _ClutterStageGLXClass