xwayland/window-buffers: Use synchronization from GLAMOR/GBM
Now that we have the buffer synchronization implemented in the GLAMOR/GBM code, switch to use that code. At this point, there is still not functional change intended, this is still preparation work for a fix that is still to come. Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1571>
This commit is contained in:
parent
cc021aca99
commit
256cef8b20
|
@ -31,6 +31,7 @@
|
||||||
#include "xwayland-window.h"
|
#include "xwayland-window.h"
|
||||||
#include "xwayland-pixmap.h"
|
#include "xwayland-pixmap.h"
|
||||||
#include "xwayland-screen.h"
|
#include "xwayland-screen.h"
|
||||||
|
#include "xwayland-glamor-gbm.h"
|
||||||
#include "xwayland-window-buffers.h"
|
#include "xwayland-window-buffers.h"
|
||||||
#ifdef XWL_HAS_GLAMOR
|
#ifdef XWL_HAS_GLAMOR
|
||||||
#include "glamor.h"
|
#include "glamor.h"
|
||||||
|
@ -47,11 +48,6 @@ struct xwl_window_buffer {
|
||||||
struct xwl_window *xwl_window;
|
struct xwl_window *xwl_window;
|
||||||
PixmapPtr pixmap;
|
PixmapPtr pixmap;
|
||||||
RegionPtr damage_region;
|
RegionPtr damage_region;
|
||||||
#ifdef XWL_HAS_GLAMOR
|
|
||||||
struct dri3_syncobj *syncobj;
|
|
||||||
uint64_t timeline_point;
|
|
||||||
int efd;
|
|
||||||
#endif /* XWL_HAS_GLAMOR */
|
|
||||||
int refcnt;
|
int refcnt;
|
||||||
uint32_t time;
|
uint32_t time;
|
||||||
struct xorg_list link_buffer;
|
struct xorg_list link_buffer;
|
||||||
|
@ -90,9 +86,6 @@ xwl_window_buffer_new(struct xwl_window *xwl_window)
|
||||||
xwl_window_buffer->damage_region = RegionCreate(NullBox, 1);
|
xwl_window_buffer->damage_region = RegionCreate(NullBox, 1);
|
||||||
xwl_window_buffer->pixmap = NullPixmap;
|
xwl_window_buffer->pixmap = NullPixmap;
|
||||||
xwl_window_buffer->refcnt = 1;
|
xwl_window_buffer->refcnt = 1;
|
||||||
#ifdef XWL_HAS_GLAMOR
|
|
||||||
xwl_window_buffer->efd = -1;
|
|
||||||
#endif /* XWL_HAS_GLAMOR */
|
|
||||||
|
|
||||||
xorg_list_init(&xwl_window_buffer->link_buffer);
|
xorg_list_init(&xwl_window_buffer->link_buffer);
|
||||||
|
|
||||||
|
@ -119,18 +112,12 @@ xwl_window_buffer_maybe_dispose(struct xwl_window_buffer *xwl_window_buffer)
|
||||||
|
|
||||||
RegionDestroy(xwl_window_buffer->damage_region);
|
RegionDestroy(xwl_window_buffer->damage_region);
|
||||||
|
|
||||||
if (xwl_window_buffer->pixmap)
|
if (xwl_window_buffer->pixmap) {
|
||||||
xwl_window_buffer_destroy_pixmap (xwl_window_buffer);
|
|
||||||
|
|
||||||
#ifdef XWL_HAS_GLAMOR
|
#ifdef XWL_HAS_GLAMOR
|
||||||
if (xwl_window_buffer->syncobj)
|
xwl_glamor_gbm_dispose_syncpts(xwl_window_buffer->pixmap);
|
||||||
xwl_window_buffer->syncobj->free(xwl_window_buffer->syncobj);
|
|
||||||
|
|
||||||
if (xwl_window_buffer->efd >= 0) {
|
|
||||||
SetNotifyFd(xwl_window_buffer->efd, NULL, 0, NULL);
|
|
||||||
close(xwl_window_buffer->efd);
|
|
||||||
}
|
|
||||||
#endif /* XWL_HAS_GLAMOR */
|
#endif /* XWL_HAS_GLAMOR */
|
||||||
|
xwl_window_buffer_destroy_pixmap (xwl_window_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
xorg_list_del(&xwl_window_buffer->link_buffer);
|
xorg_list_del(&xwl_window_buffer->link_buffer);
|
||||||
free(xwl_window_buffer);
|
free(xwl_window_buffer);
|
||||||
|
@ -244,20 +231,6 @@ xwl_window_buffer_release(struct xwl_window_buffer *xwl_window_buffer)
|
||||||
xwl_window_buffer_release_callback(xwl_window_buffer);
|
xwl_window_buffer_release_callback(xwl_window_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XWL_HAS_GLAMOR
|
|
||||||
static void
|
|
||||||
xwl_window_buffers_release_fence_avail(int fd, int xevents, void *data)
|
|
||||||
{
|
|
||||||
struct xwl_window_buffer *xwl_window_buffer = data;
|
|
||||||
|
|
||||||
SetNotifyFd(fd, NULL, 0, NULL);
|
|
||||||
close(fd);
|
|
||||||
xwl_window_buffer->efd = -1;
|
|
||||||
|
|
||||||
xwl_window_buffer_release_callback(data);
|
|
||||||
}
|
|
||||||
#endif /* XWL_HAS_GLAMOR */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
xwl_window_buffers_init(struct xwl_window *xwl_window)
|
xwl_window_buffers_init(struct xwl_window *xwl_window)
|
||||||
{
|
{
|
||||||
|
@ -376,46 +349,6 @@ xwl_window_realloc_pixmap(struct xwl_window *xwl_window)
|
||||||
screen->DestroyPixmap(window_pixmap);
|
screen->DestroyPixmap(window_pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XWL_HAS_GLAMOR
|
|
||||||
static Bool
|
|
||||||
xwl_window_buffers_set_syncpts(struct xwl_window_buffer *xwl_window_buffer)
|
|
||||||
{
|
|
||||||
struct xwl_window *xwl_window = xwl_window_buffer->xwl_window;
|
|
||||||
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
|
|
||||||
uint64_t acquire_point = ++xwl_window_buffer->timeline_point;
|
|
||||||
uint64_t release_point = ++xwl_window_buffer->timeline_point;
|
|
||||||
|
|
||||||
if (!xwl_window_buffer->syncobj) {
|
|
||||||
struct dri3_syncobj *syncobj = xwl_glamor_dri3_syncobj_create(xwl_screen);
|
|
||||||
if (!syncobj)
|
|
||||||
goto fail;
|
|
||||||
xwl_window_buffer->syncobj = syncobj;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fence_fd = xwl_glamor_get_fence(xwl_screen);
|
|
||||||
if (fence_fd >= 0)
|
|
||||||
xwl_window_buffer->syncobj->import_fence(xwl_window_buffer->syncobj,
|
|
||||||
acquire_point, fence_fd);
|
|
||||||
else
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
xwl_glamor_dri3_syncobj_passthrough(xwl_window,
|
|
||||||
xwl_window_buffer->syncobj,
|
|
||||||
xwl_window_buffer->syncobj,
|
|
||||||
acquire_point,
|
|
||||||
release_point);
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
/* can't use explicit sync, we will do a glFinish() before presenting */
|
|
||||||
if (xwl_window_buffer->syncobj) {
|
|
||||||
xwl_window_buffer->syncobj->free(xwl_window_buffer->syncobj);
|
|
||||||
xwl_window_buffer->syncobj = NULL;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif /* XWL_HAS_GLAMOR */
|
|
||||||
|
|
||||||
PixmapPtr
|
PixmapPtr
|
||||||
xwl_window_swap_pixmap(struct xwl_window *xwl_window)
|
xwl_window_swap_pixmap(struct xwl_window *xwl_window)
|
||||||
{
|
{
|
||||||
|
@ -434,17 +367,9 @@ xwl_window_swap_pixmap(struct xwl_window *xwl_window)
|
||||||
RegionPtr full_damage = xwl_window_buffer->damage_region;
|
RegionPtr full_damage = xwl_window_buffer->damage_region;
|
||||||
BoxPtr pBox = RegionRects(full_damage);
|
BoxPtr pBox = RegionRects(full_damage);
|
||||||
int nBox = RegionNumRects(full_damage);
|
int nBox = RegionNumRects(full_damage);
|
||||||
|
|
||||||
#ifdef XWL_HAS_GLAMOR
|
#ifdef XWL_HAS_GLAMOR
|
||||||
if (xwl_window_buffer->syncobj) {
|
xwl_glamor_gbm_wait_syncpts(xwl_window_buffer->pixmap);
|
||||||
int fence_fd =
|
|
||||||
xwl_window_buffer->syncobj->export_fence(xwl_window_buffer->syncobj,
|
|
||||||
xwl_window_buffer->timeline_point);
|
|
||||||
xwl_glamor_wait_fence(xwl_screen, fence_fd);
|
|
||||||
close(fence_fd);
|
|
||||||
}
|
|
||||||
#endif /* XWL_HAS_GLAMOR */
|
#endif /* XWL_HAS_GLAMOR */
|
||||||
|
|
||||||
while (nBox--) {
|
while (nBox--) {
|
||||||
copy_pixmap_area(window_pixmap,
|
copy_pixmap_area(window_pixmap,
|
||||||
xwl_window_buffer->pixmap,
|
xwl_window_buffer->pixmap,
|
||||||
|
@ -485,21 +410,17 @@ xwl_window_swap_pixmap(struct xwl_window *xwl_window)
|
||||||
|
|
||||||
#ifdef XWL_HAS_GLAMOR
|
#ifdef XWL_HAS_GLAMOR
|
||||||
if (!xwl_glamor_supports_implicit_sync(xwl_screen)) {
|
if (!xwl_glamor_supports_implicit_sync(xwl_screen)) {
|
||||||
if (xwl_screen->explicit_sync && xwl_window_buffers_set_syncpts(xwl_window_buffer)) {
|
if (xwl_screen->explicit_sync && xwl_glamor_gbm_set_syncpts(xwl_window, window_pixmap)) {
|
||||||
implicit_sync = FALSE;
|
implicit_sync = FALSE;
|
||||||
/* wait until the release fence is available before re-using this buffer */
|
/* wait until the release fence is available before re-using this buffer */
|
||||||
xwl_window_buffer->efd = eventfd(0, EFD_CLOEXEC);
|
xwl_glamor_gbm_wait_release_fence(xwl_window, window_pixmap, xwl_window_buffer);
|
||||||
SetNotifyFd(xwl_window_buffer->efd, xwl_window_buffers_release_fence_avail,
|
} else {
|
||||||
X_NOTIFY_READ, xwl_window_buffer);
|
|
||||||
xwl_window_buffer->syncobj->submitted_eventfd(xwl_window_buffer->syncobj,
|
|
||||||
xwl_window_buffer->timeline_point,
|
|
||||||
xwl_window_buffer->efd);
|
|
||||||
} else
|
|
||||||
/* If glamor does not support implicit sync and we can't use
|
/* If glamor does not support implicit sync and we can't use
|
||||||
* explicit sync, wait for the GPU to be idle before presenting.
|
* explicit sync, wait for the GPU to be idle before presenting.
|
||||||
* Note that buffer re-use will still be unsynchronized :(
|
* Note that buffer re-use will still be unsynchronized :(
|
||||||
*/
|
*/
|
||||||
glamor_finish(xwl_screen->screen);
|
glamor_finish(xwl_screen->screen);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* XWL_HAS_GLAMOR */
|
#endif /* XWL_HAS_GLAMOR */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue