xwayland: Separate DamagePtr into separate window data
This will be dissociated in future commits to handle the cases where windows are being realized before there is a compositor handling redirection. In that case, we still want the DamagePtr to be registered upfront on RealizeWindowProc before a corresponding xwl_window might be created. Most notably, it cannot be lazily created on SetWindowPixmapProc as damage accounting gets broken. Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
This commit is contained in:
parent
07463a4045
commit
4e50440ae2
|
@ -161,6 +161,7 @@ ddxProcessArgument(int argc, char *argv[], int i)
|
|||
static DevPrivateKeyRec xwl_window_private_key;
|
||||
static DevPrivateKeyRec xwl_screen_private_key;
|
||||
static DevPrivateKeyRec xwl_pixmap_private_key;
|
||||
static DevPrivateKeyRec xwl_damage_private_key;
|
||||
|
||||
static struct xwl_window *
|
||||
xwl_window_get(WindowPtr window)
|
||||
|
@ -403,8 +404,14 @@ xwl_cursor_confined_to(DeviceIntPtr device,
|
|||
static void
|
||||
damage_report(DamagePtr pDamage, RegionPtr pRegion, void *data)
|
||||
{
|
||||
struct xwl_window *xwl_window = data;
|
||||
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
|
||||
WindowPtr window = data;
|
||||
struct xwl_window *xwl_window = xwl_window_get(window);
|
||||
struct xwl_screen *xwl_screen;
|
||||
|
||||
if (!xwl_window)
|
||||
return;
|
||||
|
||||
xwl_screen = xwl_window->xwl_screen;
|
||||
|
||||
#ifdef GLAMOR_HAS_GBM
|
||||
if (xwl_window->present_flipped) {
|
||||
|
@ -426,6 +433,47 @@ damage_destroy(DamagePtr pDamage, void *data)
|
|||
{
|
||||
}
|
||||
|
||||
static Bool
|
||||
register_damage(WindowPtr window)
|
||||
{
|
||||
DamagePtr damage;
|
||||
|
||||
damage = DamageCreate(damage_report, damage_destroy, DamageReportNonEmpty,
|
||||
FALSE, window->drawable.pScreen, window);
|
||||
if (damage == NULL) {
|
||||
ErrorF("Failed creating damage\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DamageRegister(&window->drawable, damage);
|
||||
DamageSetReportAfterOp(damage, TRUE);
|
||||
|
||||
dixSetPrivate(&window->devPrivates, &xwl_damage_private_key, damage);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
unregister_damage(WindowPtr window)
|
||||
{
|
||||
DamagePtr damage;
|
||||
|
||||
damage = dixLookupPrivate(&window->devPrivates, &xwl_damage_private_key);
|
||||
if (!damage)
|
||||
return;
|
||||
|
||||
DamageUnregister(damage);
|
||||
DamageDestroy(damage);
|
||||
|
||||
dixSetPrivate(&window->devPrivates, &xwl_damage_private_key, NULL);
|
||||
}
|
||||
|
||||
static DamagePtr
|
||||
window_get_damage(WindowPtr window)
|
||||
{
|
||||
return dixLookupPrivate(&window->devPrivates, &xwl_damage_private_key);
|
||||
}
|
||||
|
||||
static void
|
||||
shell_surface_ping(void *data,
|
||||
struct wl_shell_surface *shell_surface, uint32_t serial)
|
||||
|
@ -581,18 +629,10 @@ xwl_realize_window(WindowPtr window)
|
|||
|
||||
wl_surface_set_user_data(xwl_window->surface, xwl_window);
|
||||
|
||||
xwl_window->damage =
|
||||
DamageCreate(damage_report, damage_destroy, DamageReportNonEmpty,
|
||||
FALSE, screen, xwl_window);
|
||||
if (xwl_window->damage == NULL) {
|
||||
ErrorF("Failed creating damage\n");
|
||||
goto err_surf;
|
||||
}
|
||||
|
||||
compRedirectWindow(serverClient, window, CompositeRedirectManual);
|
||||
|
||||
DamageRegister(&window->drawable, xwl_window->damage);
|
||||
DamageSetReportAfterOp(xwl_window->damage, TRUE);
|
||||
if (!register_damage(window))
|
||||
goto err_surf;
|
||||
|
||||
dixSetPrivate(&window->devPrivates, &xwl_window_private_key, xwl_window);
|
||||
xorg_list_init(&xwl_window->link_damage);
|
||||
|
@ -656,8 +696,8 @@ xwl_unrealize_window(WindowPtr window)
|
|||
|
||||
wl_surface_destroy(xwl_window->surface);
|
||||
xorg_list_del(&xwl_window->link_damage);
|
||||
DamageUnregister(xwl_window->damage);
|
||||
DamageDestroy(xwl_window->damage);
|
||||
unregister_damage(window);
|
||||
|
||||
if (xwl_window->frame_callback)
|
||||
wl_callback_destroy(xwl_window->frame_callback);
|
||||
|
||||
|
@ -719,7 +759,7 @@ xwl_window_post_damage(struct xwl_window *xwl_window)
|
|||
|
||||
assert(!xwl_window->frame_callback);
|
||||
|
||||
region = DamageRegion(xwl_window->damage);
|
||||
region = DamageRegion(window_get_damage(xwl_window->window));
|
||||
pixmap = (*xwl_screen->screen->GetWindowPixmap) (xwl_window->window);
|
||||
|
||||
#ifdef XWL_HAS_GLAMOR
|
||||
|
@ -756,7 +796,7 @@ xwl_window_post_damage(struct xwl_window *xwl_window)
|
|||
wl_callback_add_listener(xwl_window->frame_callback, &frame_listener, xwl_window);
|
||||
|
||||
wl_surface_commit(xwl_window->surface);
|
||||
DamageEmpty(xwl_window->damage);
|
||||
DamageEmpty(window_get_damage(xwl_window->window));
|
||||
|
||||
xorg_list_del(&xwl_window->link_damage);
|
||||
}
|
||||
|
@ -993,6 +1033,8 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
|
|||
return FALSE;
|
||||
if (!dixRegisterPrivateKey(&xwl_pixmap_private_key, PRIVATE_PIXMAP, 0))
|
||||
return FALSE;
|
||||
if (!dixRegisterPrivateKey(&xwl_damage_private_key, PRIVATE_WINDOW, 0))
|
||||
return FALSE;
|
||||
|
||||
dixSetPrivate(&pScreen->devPrivates, &xwl_screen_private_key, xwl_screen);
|
||||
xwl_screen->screen = pScreen;
|
||||
|
|
|
@ -175,7 +175,6 @@ struct xwl_window {
|
|||
struct wl_surface *surface;
|
||||
struct wl_shell_surface *shell_surface;
|
||||
WindowPtr window;
|
||||
DamagePtr damage;
|
||||
struct xorg_list link_damage;
|
||||
struct wl_callback *frame_callback;
|
||||
Bool allow_commits;
|
||||
|
|
Loading…
Reference in New Issue