[x11] Fix the race between resize and glViewport calls

The race we were experiencing in the X11 backends is apparently
back after the fix in commit 00a3c698.

This time, just delaying the setting of the SYNC_MATRICES flag
is not enough, so we can resume the use of a STAGE_IN_RESIZE
private flag.

This should also fix bug:

  http://bugzilla.openedhand.com/show_bug.cgi?id=1668
This commit is contained in:
Emmanuele Bassi 2009-06-25 14:41:25 +01:00
parent 3726213291
commit 250b775926
4 changed files with 38 additions and 13 deletions

View File

@ -153,12 +153,15 @@ _clutter_stage_maybe_relayout (ClutterActor *stage)
void
_clutter_stage_maybe_setup_viewport (ClutterStage *stage)
{
if (CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_ACTOR_SYNC_MATRICES)
if ((CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_ACTOR_SYNC_MATRICES) &&
!(CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_STAGE_IN_RESIZE))
{
ClutterPerspective perspective;
gfloat width, height;
clutter_actor_get_size (CLUTTER_ACTOR (stage), &width, &height);
clutter_actor_get_preferred_size (CLUTTER_ACTOR (stage),
NULL, NULL,
&width, &height);
clutter_stage_get_perspective (stage, &perspective);
CLUTTER_NOTE (PAINT,

View File

@ -64,7 +64,8 @@ typedef enum {
*/
CLUTTER_ACTOR_IN_PAINT = 1 << 4, /* Used to avoid recursion */
CLUTTER_ACTOR_IN_RELAYOUT = 1 << 5, /* Used to avoid recursion */
CLUTTER_TEXTURE_IN_CLONE_PAINT = 1 << 6 /* Used for safety in clones */
CLUTTER_TEXTURE_IN_CLONE_PAINT = 1 << 6, /* Used for safety in clones */
CLUTTER_STAGE_IN_RESIZE = 1 << 7
} ClutterPrivateFlags;
struct _ClutterInputDevice

View File

@ -482,11 +482,13 @@ event_translate (ClutterBackend *backend,
stage_x11->xwin_width = xevent->xconfigure.width;
stage_x11->xwin_height = xevent->xconfigure.height;
CLUTTER_UNSET_PRIVATE_FLAGS (stage_x11->wrapper,
CLUTTER_STAGE_IN_RESIZE);
/* the resize process is complete, so we can ask the stage
* to set up the GL viewport with the new size
*/
CLUTTER_SET_PRIVATE_FLAGS (CLUTTER_ACTOR (stage_x11->wrapper),
CLUTTER_ACTOR_SYNC_MATRICES);
clutter_stage_ensure_viewport (stage);
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_x11->wrapper));
}

View File

@ -280,6 +280,9 @@ clutter_stage_x11_allocate (ClutterActor *self,
stage_x11->xwin_width,
stage_x11->xwin_height);
CLUTTER_SET_PRIVATE_FLAGS (stage_x11->wrapper,
CLUTTER_STAGE_IN_RESIZE);
XResizeWindow (stage_x11->xdpy,
stage_x11->xwin,
stage_x11->xwin_width,
@ -472,7 +475,8 @@ clutter_stage_x11_set_fullscreen (ClutterStageWindow *stage_window,
}
}
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage));
clutter_stage_ensure_viewport (CLUTTER_STAGE (stage_x11->wrapper));
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_x11->wrapper));
}
static void
@ -547,14 +551,31 @@ clutter_stage_x11_show (ClutterStageWindow *stage_window,
if (stage_x11->xwin != None)
{
if (do_raise)
XRaiseWindow (stage_x11->xdpy, stage_x11->xwin);
{
CLUTTER_NOTE (BACKEND, "Raising stage[%lu]",
(unsigned long) stage_x11->xwin);
XRaiseWindow (stage_x11->xdpy, stage_x11->xwin);
}
if (!STAGE_X11_IS_MAPPED (stage_x11))
{
CLUTTER_NOTE (BACKEND, "Mapping stage[%lu] (%d, %d)",
(unsigned long) stage_x11->xwin,
stage_x11->xwin_width,
stage_x11->xwin_height);
CLUTTER_NOTE (BACKEND, "Mapping stage[%lu]",
(unsigned long) stage_x11->xwin);
if (!stage_x11->is_foreign_xwin)
{
CLUTTER_NOTE (BACKEND, "Resizing stage[%lu] (%d, %d)",
(unsigned long) stage_x11->xwin,
stage_x11->xwin_width,
stage_x11->xwin_height);
CLUTTER_SET_PRIVATE_FLAGS (stage_x11->wrapper,
CLUTTER_STAGE_IN_RESIZE);
XResizeWindow (stage_x11->xdpy, stage_x11->xwin,
stage_x11->xwin_width,
stage_x11->xwin_height);
}
update_wm_hints (stage_x11);
@ -564,8 +585,6 @@ clutter_stage_x11_show (ClutterStageWindow *stage_window,
clutter_stage_x11_set_fullscreen (stage_window, FALSE);
set_stage_state (stage_x11, STAGE_X11_WITHDRAWN, 0);
clutter_stage_ensure_viewport (CLUTTER_STAGE (stage_x11->wrapper));
}
g_assert (STAGE_X11_IS_MAPPED (stage_x11));