[Mesa-dev] [PATCH 6/8] egl/wayland: Pull color buffers from dri2_surf->color_buffers pool
Kristian Høgsberg
hoegsberg at gmail.com
Thu Jan 3 14:50:35 PST 2013
On Thu, Dec 20, 2012 at 02:56:13PM -0200, Ander Conselvan de Oliveira wrote:
> 2012/12/14 Kristian Høgsberg <krh at bitplanet.net>
>
> > We used to keep the color buffers in the dri_buffers array and
> > swap __DRI_BUFFER_BACK_LEFT and __DRI_BUFFER_FRONT_LEFT around there
> > and swap third_buffer in in case we needed to triple buffer. That
> > gets a little fidgety with all the swaps, so lets use the
> > color_buffers pool like the gbm platform does. We track the color buffers,
> > their corresponding wl_buffer and locked status here and just plug
> > a free one into dri2_surf->buffers when we need to.
> >
>
> Doesn't this change the triple buffering behaviour? Before we would release
> the dri_buffer once the third buffer wasn't necessary. With this patch, we
> release the wl_buffer but keep the dri_buffer around.
Right, we used to do that... I think we should be able to add
/* If we have an extra unlocked buffer at this point, we had to do triple
* buffering for a while, but now can go back to just double buffering.
* That means we can free any unlocked buffer now. */
for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
if (!dri2_surf->color_buffers[i].locked &&
dri2_surf->color_buffers[i].wl_buffer) {
wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
dri2_surf->color_buffers[i].dri_buffer);
dri2_surf->color_buffers[i].wl_buffer = NULL;
dri2_surf->color_buffers[i].dri_buffer = NULL;
}
}
in dri2_get_buffers_with_format() right after allocating the new
buffers, if we also set locked = 1 already in get_back_bo() instead of
when we later attach it to the wayland surface.
Kristian
> Cheers,
> Ander
>
> This is a nice clean-up in itself, but it also sets us up to track
> > buffer age in the color_buffers structs.
> > ---
> > src/egl/drivers/dri2/egl_dri2.h | 23 +-
> > src/egl/drivers/dri2/platform_wayland.c | 367
> > +++++++++++--------------------
> > 2 files changed, 135 insertions(+), 255 deletions(-)
> >
> > diff --git a/src/egl/drivers/dri2/egl_dri2.h
> > b/src/egl/drivers/dri2/egl_dri2.h
> > index eb8c06e..84ea2a6 100644
> > --- a/src/egl/drivers/dri2/egl_dri2.h
> > +++ b/src/egl/drivers/dri2/egl_dri2.h
> > @@ -172,28 +172,29 @@ struct dri2_egl_surface
> >
> > #ifdef HAVE_WAYLAND_PLATFORM
> > struct wl_egl_window *wl_win;
> > - struct wl_egl_pixmap *wl_pix;
> > - struct wl_buffer *wl_drm_buffer[WL_BUFFER_COUNT];
> > - int wl_buffer_lock[WL_BUFFER_COUNT];
> > int dx;
> > int dy;
> > - __DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT];
> > - __DRIbuffer *third_buffer;
> > - __DRIbuffer *pending_buffer;
> > struct wl_callback *frame_callback;
> > int format;
> > #endif
> >
> > #ifdef HAVE_DRM_PLATFORM
> > struct gbm_dri_surface *gbm_surf;
> > +#endif
> > +
> > +#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM)
> > + __DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT];
> > struct {
> > +#ifdef HAVE_WAYLAND_PLATFORM
> > + struct wl_buffer *wl_buffer;
> > + __DRIbuffer *dri_buffer;
> > +#endif
> > +#ifdef HAVE_DRM_PLATFORM
> > struct gbm_bo *bo;
> > - int locked;
> > - int age;
> > - } color_buffers[3], *back, *current;
> > -#ifndef HAVE_WAYLAND_PLATFORM
> > - __DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT];
> > #endif
> > + int locked;
> > + int age;
> > + } color_buffers[3], *back, *current;
> > #endif
> >
> > #ifdef HAVE_ANDROID_PLATFORM
> > diff --git a/src/egl/drivers/dri2/platform_wayland.c
> > b/src/egl/drivers/dri2/platform_wayland.c
> > index 260a80d..3c6bdd9 100644
> > --- a/src/egl/drivers/dri2/platform_wayland.c
> > +++ b/src/egl/drivers/dri2/platform_wayland.c
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright © 2011 Intel Corporation
> > + * Copyright © 2011-2012 Intel Corporation
> > *
> > * Permission is hereby granted, free of charge, to any person obtaining a
> > * copy of this software and associated documentation files (the
> > "Software"),
> > @@ -79,18 +79,16 @@ wl_buffer_release(void *data, struct wl_buffer *buffer)
> > struct dri2_egl_surface *dri2_surf = data;
> > int i;
> >
> > - for (i = 0; i < WL_BUFFER_COUNT; ++i)
> > - if (dri2_surf->wl_drm_buffer[i] == buffer)
> > + for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); ++i)
> > + if (dri2_surf->color_buffers[i].wl_buffer == buffer)
> > break;
> >
> > - assert(i <= WL_BUFFER_COUNT);
> > -
> > - /* not found? */
> > - if (i == WL_BUFFER_COUNT)
> > + if (i == ARRAY_SIZE(dri2_surf->color_buffers)) {
> > + wl_buffer_destroy(buffer);
> > return;
> > + }
> >
> > - dri2_surf->wl_buffer_lock[i] = 0;
> > -
> > + dri2_surf->color_buffers[i].locked = 0;
> > }
> >
> > static struct wl_buffer_listener wl_buffer_listener = {
> > @@ -118,7 +116,6 @@ dri2_create_surface(_EGLDriver *drv, _EGLDisplay
> > *disp, EGLint type,
> > struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> > struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);
> > struct dri2_egl_surface *dri2_surf;
> > - int i;
> >
> > (void) drv;
> >
> > @@ -128,21 +125,10 @@ dri2_create_surface(_EGLDriver *drv, _EGLDisplay
> > *disp, EGLint type,
> > return NULL;
> > }
> >
> > + memset(dri2_surf, 0, sizeof *dri2_surf);
> > if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list))
> > goto cleanup_surf;
> >
> > - for (i = 0; i < WL_BUFFER_COUNT; ++i) {
> > - dri2_surf->wl_drm_buffer[i] = NULL;
> > - dri2_surf->wl_buffer_lock[i] = 0;
> > - }
> > -
> > - for (i = 0; i < __DRI_BUFFER_COUNT; ++i)
> > - dri2_surf->dri_buffers[i] = NULL;
> > -
> > - dri2_surf->pending_buffer = NULL;
> > - dri2_surf->third_buffer = NULL;
> > - dri2_surf->frame_callback = NULL;
> > -
> > if (conf->AlphaSize == 0)
> > dri2_surf->format = WL_DRM_FORMAT_XRGB8888;
> > else
> > @@ -212,24 +198,23 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay
> > *disp, _EGLSurface *surf)
> >
> > (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable);
> >
> > - for (i = 0; i < WL_BUFFER_COUNT; ++i)
> > - if (dri2_surf->wl_drm_buffer[i])
> > - wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]);
> > + for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> > + if (dri2_surf->color_buffers[i].wl_buffer)
> > + wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
> > + if (dri2_surf->color_buffers[i].dri_buffer)
> > + dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > +
> > dri2_surf->color_buffers[i].dri_buffer);
> > + }
> >
> > - for (i = 0; i < __DRI_BUFFER_COUNT; ++i)
> > - if (dri2_surf->dri_buffers[i])
> > + for (i = 0; i < __DRI_BUFFER_COUNT; i++)
> > + if (dri2_surf->dri_buffers[i] &&
> > + dri2_surf->dri_buffers[i]->attachment != __DRI_BUFFER_BACK_LEFT)
> > dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > dri2_surf->dri_buffers[i]);
> >
> > - if (dri2_surf->third_buffer) {
> > - dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > - dri2_surf->third_buffer);
> > - }
> > -
> > if (dri2_surf->frame_callback)
> > wl_callback_destroy(dri2_surf->frame_callback);
> >
> > -
> > if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> > dri2_surf->wl_win->private = NULL;
> > dri2_surf->wl_win->resize_callback = NULL;
> > @@ -240,173 +225,90 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay
> > *disp, _EGLSurface *surf)
> > return EGL_TRUE;
> > }
> >
> > -static struct wl_buffer *
> > -wayland_create_buffer(struct dri2_egl_surface *dri2_surf,
> > - __DRIbuffer *buffer)
> > -{
> > - struct dri2_egl_display *dri2_dpy =
> > - dri2_egl_display(dri2_surf->base.Resource.Display);
> > - struct wl_buffer *buf;
> > -
> > - buf = wl_drm_create_buffer(dri2_dpy->wl_drm, buffer->name,
> > - dri2_surf->base.Width,
> > dri2_surf->base.Height,
> > - buffer->pitch, dri2_surf->format);
> > - wl_buffer_add_listener(buf, &wl_buffer_listener, dri2_surf);
> > -
> > - return buf;
> > -}
> > -
> > static void
> > -dri2_process_back_buffer(struct dri2_egl_surface *dri2_surf, unsigned
> > format)
> > +dri2_release_buffers(struct dri2_egl_surface *dri2_surf)
> > {
> > struct dri2_egl_display *dri2_dpy =
> > dri2_egl_display(dri2_surf->base.Resource.Display);
> > + int i;
> >
> > - (void) format;
> > + for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> > + if (dri2_surf->color_buffers[i].wl_buffer &&
> > + !dri2_surf->color_buffers[i].locked)
> > + wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
> > + if (dri2_surf->color_buffers[i].dri_buffer)
> > + dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > +
> > dri2_surf->color_buffers[i].dri_buffer);
> >
> > - switch (dri2_surf->base.Type) {
> > - case EGL_WINDOW_BIT:
> > - /* allocate a front buffer for our double-buffered window*/
> > - if (dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] != NULL)
> > - break;
> > - dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] =
> > - dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen,
> > - __DRI_BUFFER_FRONT_LEFT, format,
> > - dri2_surf->base.Width, dri2_surf->base.Height);
> > - break;
> > - default:
> > - break;
> > + dri2_surf->color_buffers[i].wl_buffer = NULL;
> > + dri2_surf->color_buffers[i].dri_buffer = NULL;
> > + dri2_surf->color_buffers[i].locked = 0;
> > }
> > -}
> > -
> > -static void
> > -dri2_release_pending_buffer(void *data,
> > - struct wl_callback *callback, uint32_t time)
> > -{
> > - struct dri2_egl_surface *dri2_surf = data;
> > - struct dri2_egl_display *dri2_dpy =
> > - dri2_egl_display(dri2_surf->base.Resource.Display);
> > -
> > - /* FIXME: print internal error */
> > - if (!dri2_surf->pending_buffer)
> > - return;
> > -
> > - dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > - dri2_surf->pending_buffer);
> > - dri2_surf->pending_buffer = NULL;
> >
> > - wl_callback_destroy(callback);
> > + for (i = 0; i < __DRI_BUFFER_COUNT; i++)
> > + if (dri2_surf->dri_buffers[i] &&
> > + dri2_surf->dri_buffers[i]->attachment != __DRI_BUFFER_BACK_LEFT)
> > + dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > + dri2_surf->dri_buffers[i]);
> > }
> >
> > -static const struct wl_callback_listener release_buffer_listener = {
> > - dri2_release_pending_buffer
> > -};
> > -
> > -static void
> > -dri2_release_buffers(struct dri2_egl_surface *dri2_surf)
> > +static int
> > +get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
> > {
> > struct dri2_egl_display *dri2_dpy =
> > dri2_egl_display(dri2_surf->base.Resource.Display);
> > - struct wl_callback *callback;
> > int i;
> >
> > - if (dri2_surf->third_buffer) {
> > - dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > - dri2_surf->third_buffer);
> > - dri2_surf->third_buffer = NULL;
> > - }
> > + /* There might be a buffer release already queued that wasn't
> > processed */
> > + wl_display_dispatch_queue_pending(dri2_dpy->wl_dpy,
> > dri2_dpy->wl_queue);
> >
> > - for (i = 0; i < __DRI_BUFFER_COUNT; ++i) {
> > - if (dri2_surf->dri_buffers[i]) {
> > - switch (i) {
> > - case __DRI_BUFFER_FRONT_LEFT:
> > - if (dri2_surf->pending_buffer)
> > - roundtrip(dri2_dpy);
> > - dri2_surf->pending_buffer = dri2_surf->dri_buffers[i];
> > - callback = wl_display_sync(dri2_dpy->wl_dpy);
> > - wl_callback_add_listener(callback,
> > - &release_buffer_listener, dri2_surf);
> > - wl_proxy_set_queue((struct wl_proxy *) callback,
> > - dri2_dpy->wl_queue);
> > - break;
> > - default:
> > - dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > - dri2_surf->dri_buffers[i]);
> > - break;
> > - }
> > - dri2_surf->dri_buffers[i] = NULL;
> > + if (dri2_surf->back == NULL) {
> > + for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> > + if (!dri2_surf->color_buffers[i].locked) {
> > + dri2_surf->back = &dri2_surf->color_buffers[i];
> > + break;
> > + }
> > }
> > }
> > -}
> >
> > -static inline void
> > -pointer_swap(const void **p1, const void **p2)
> > -{
> > - const void *tmp = *p1;
> > - *p1 = *p2;
> > - *p2 = tmp;
> > -}
> > -
> > -static void
> > -destroy_third_buffer(struct dri2_egl_surface *dri2_surf)
> > -{
> > - struct dri2_egl_display *dri2_dpy =
> > - dri2_egl_display(dri2_surf->base.Resource.Display);
> > -
> > - if (dri2_surf->third_buffer == NULL)
> > - return;
> > -
> > - dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
> > - dri2_surf->third_buffer);
> > - dri2_surf->third_buffer = NULL;
> > -
> > - if (dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD])
> > - wl_buffer_destroy(dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD]);
> > - dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD] = NULL;
> > - dri2_surf->wl_buffer_lock[WL_BUFFER_THIRD] = 0;
> > -}
> > + if (dri2_surf->back == NULL)
> > + return -1;
> > + if (dri2_surf->back->dri_buffer == NULL) {
> > + dri2_surf->back->dri_buffer =
> > + dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen,
> > + __DRI_BUFFER_BACK_LEFT, 32,
> > + dri2_surf->base.Width,
> > + dri2_surf->base.Height);
> > + }
> > + if (dri2_surf->back->dri_buffer == NULL)
> > + return -1;
> >
> > -static void
> > -swap_wl_buffers(struct dri2_egl_surface *dri2_surf,
> > - enum wayland_buffer_type a, enum wayland_buffer_type b)
> > -{
> > - int tmp;
> > + memcpy(buffer, dri2_surf->back->dri_buffer, sizeof *buffer);
> >
> > - tmp = dri2_surf->wl_buffer_lock[a];
> > - dri2_surf->wl_buffer_lock[a] = dri2_surf->wl_buffer_lock[b];
> > - dri2_surf->wl_buffer_lock[b] = tmp;
> > -
> > - pointer_swap((const void **) &dri2_surf->wl_drm_buffer[a],
> > - (const void **) &dri2_surf->wl_drm_buffer[b]);
> > + return 0;
> > }
> >
> > -static void
> > -swap_back_and_third(struct dri2_egl_surface *dri2_surf)
> > +static int
> > +get_aux_bo(struct dri2_egl_surface *dri2_surf,
> > + unsigned int attachment, unsigned int format, __DRIbuffer
> > *buffer)
> > {
> > - if (dri2_surf->wl_buffer_lock[WL_BUFFER_THIRD])
> > - destroy_third_buffer(dri2_surf);
> > -
> > - pointer_swap((const void **)
> > &dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT],
> > - (const void **) &dri2_surf->third_buffer);
> > -
> > - swap_wl_buffers(dri2_surf, WL_BUFFER_BACK, WL_BUFFER_THIRD);
> > -}
> > + struct dri2_egl_display *dri2_dpy =
> > + dri2_egl_display(dri2_surf->base.Resource.Display);
> > + __DRIbuffer *b = dri2_surf->dri_buffers[attachment];
> > +
> > + if (b == NULL) {
> > + b = dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen,
> > + attachment, format,
> > + dri2_surf->base.Width,
> > + dri2_surf->base.Height);
> > + dri2_surf->dri_buffers[attachment] = b;
> > + }
> > + if (b == NULL)
> > + return -1;
> >
> > -static void
> > -dri2_prior_buffer_creation(struct dri2_egl_surface *dri2_surf,
> > - unsigned int type)
> > -{
> > - switch (type) {
> > - case __DRI_BUFFER_BACK_LEFT:
> > - if (dri2_surf->wl_buffer_lock[WL_BUFFER_BACK])
> > - swap_back_and_third(dri2_surf);
> > - else if (dri2_surf->third_buffer)
> > - destroy_third_buffer(dri2_surf);
> > - break;
> > - default:
> > - break;
> > + memcpy(buffer, b, sizeof *buffer);
> >
> > - }
> > + return 0;
> > }
> >
> > static __DRIbuffer *
> > @@ -418,10 +320,7 @@ dri2_get_buffers_with_format(__DRIdrawable *
> > driDrawable,
> > struct dri2_egl_surface *dri2_surf = loaderPrivate;
> > struct dri2_egl_display *dri2_dpy =
> > dri2_egl_display(dri2_surf->base.Resource.Display);
> > - int i;
> > -
> > - /* There might be a buffer release already queued that wasn't
> > processed */
> > - wl_display_dispatch_queue_pending(dri2_dpy->wl_dpy,
> > dri2_dpy->wl_queue);
> > + int i, j;
> >
> > if (dri2_surf->base.Type == EGL_WINDOW_BIT &&
> > (dri2_surf->base.Width != dri2_surf->wl_win->width ||
> > @@ -433,47 +332,28 @@ dri2_get_buffers_with_format(__DRIdrawable *
> > driDrawable,
> > dri2_surf->base.Height = dri2_surf->wl_win->height;
> > dri2_surf->dx = dri2_surf->wl_win->dx;
> > dri2_surf->dy = dri2_surf->wl_win->dy;
> > -
> > - for (i = 0; i < WL_BUFFER_COUNT; ++i) {
> > - if (dri2_surf->wl_drm_buffer[i])
> > - wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]);
> > - dri2_surf->wl_drm_buffer[i] = NULL;
> > - dri2_surf->wl_buffer_lock[i] = 0;
> > - }
> > }
> >
> > - dri2_surf->buffer_count = 0;
> > - for (i = 0; i < 2*count; i+=2) {
> > - assert(attachments[i] < __DRI_BUFFER_COUNT);
> > - assert(dri2_surf->buffer_count < 5);
> > -
> > - dri2_prior_buffer_creation(dri2_surf, attachments[i]);
> > -
> > - if (dri2_surf->dri_buffers[attachments[i]] == NULL) {
> > -
> > - dri2_surf->dri_buffers[attachments[i]] =
> > - dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen,
> > - attachments[i], attachments[i+1],
> > - dri2_surf->base.Width, dri2_surf->base.Height);
> > -
> > - if (!dri2_surf->dri_buffers[attachments[i]])
> > - continue;
> > -
> > - if (attachments[i] == __DRI_BUFFER_BACK_LEFT)
> > - dri2_process_back_buffer(dri2_surf, attachments[i+1]);
> > + for (i = 0, j = 0; i < 2 * count; i += 2, j++) {
> > + switch (attachments[i]) {
> > + case __DRI_BUFFER_BACK_LEFT:
> > + if (get_back_bo(dri2_surf, &dri2_surf->buffers[j]) < 0) {
> > + _eglError(EGL_BAD_ALLOC, "failed to allocate color buffer");
> > + return NULL;
> > + }
> > + break;
> > + default:
> > + if (get_aux_bo(dri2_surf, attachments[i], attachments[i + 1],
> > + &dri2_surf->buffers[j]) < 0) {
> > + _eglError(EGL_BAD_ALLOC, "failed to allocate aux buffer");
> > + return NULL;
> > + }
> > + break;
> > }
> > -
> > - memcpy(&dri2_surf->buffers[dri2_surf->buffer_count],
> > - dri2_surf->dri_buffers[attachments[i]],
> > - sizeof(__DRIbuffer));
> > -
> > - dri2_surf->buffer_count++;
> > }
> >
> > - assert(dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]);
> > -
> > - *out_count = dri2_surf->buffer_count;
> > - if (dri2_surf->buffer_count == 0)
> > + *out_count = j;
> > + if (j == 0)
> > return NULL;
> >
> > *width = dri2_surf->base.Width;
> > @@ -542,7 +422,7 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp,
> > _EGLSurface *draw)
> > struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> > struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
> > struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
> > - int ret = 0;
> > + int i, ret = 0;
> >
> > while (dri2_surf->frame_callback && ret != -1)
> > ret = wl_display_dispatch_queue(dri2_dpy->wl_dpy,
> > dri2_dpy->wl_queue);
> > @@ -555,39 +435,39 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay
> > *disp, _EGLSurface *draw)
> > wl_proxy_set_queue((struct wl_proxy *) dri2_surf->frame_callback,
> > dri2_dpy->wl_queue);
> >
> > - if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> > - pointer_swap(
> > - (const void **)
> > &dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT],
> > - (const void **)
> > &dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]);
> > -
> > - dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]->attachment =
> > - __DRI_BUFFER_FRONT_LEFT;
> > - dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->attachment =
> > - __DRI_BUFFER_BACK_LEFT;
> > -
> > - swap_wl_buffers(dri2_surf, WL_BUFFER_FRONT, WL_BUFFER_BACK);
> > + if (dri2_surf->back->wl_buffer == NULL) {
> > + dri2_surf->back->wl_buffer =
> > + wl_drm_create_buffer(dri2_dpy->wl_drm,
> > + dri2_surf->back->dri_buffer->name,
> > + dri2_surf->base.Width,
> > + dri2_surf->base.Height,
> > + dri2_surf->back->dri_buffer->pitch,
> > + dri2_surf->format);
> > + wl_proxy_set_queue((struct wl_proxy *) dri2_surf->back->wl_buffer,
> > + dri2_dpy->wl_queue);
> > + wl_buffer_add_listener(dri2_surf->back->wl_buffer,
> > + &wl_buffer_listener, dri2_surf);
> > + }
> >
> > - if (!dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT])
> > - dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT] =
> > - wayland_create_buffer(dri2_surf,
> > - dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]);
> > + dri2_surf->back->locked = 1;
> > + dri2_surf->current = dri2_surf->back;
> > + dri2_surf->current->age = 1;
> > + dri2_surf->back = NULL;
> >
> > - wl_surface_attach(dri2_surf->wl_win->surface,
> > - dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT],
> > - dri2_surf->dx, dri2_surf->dy);
> > - dri2_surf->wl_buffer_lock[WL_BUFFER_FRONT] = 1;
> > + wl_surface_attach(dri2_surf->wl_win->surface,
> > + dri2_surf->current->wl_buffer,
> > + dri2_surf->dx, dri2_surf->dy);
> >
> > - dri2_surf->wl_win->attached_width = dri2_surf->base.Width;
> > - dri2_surf->wl_win->attached_height = dri2_surf->base.Height;
> > - /* reset resize growing parameters */
> > - dri2_surf->dx = 0;
> > - dri2_surf->dy = 0;
> > + dri2_surf->wl_win->attached_width = dri2_surf->base.Width;
> > + dri2_surf->wl_win->attached_height = dri2_surf->base.Height;
> > + /* reset resize growing parameters */
> > + dri2_surf->dx = 0;
> > + dri2_surf->dy = 0;
> >
> > - wl_surface_damage(dri2_surf->wl_win->surface, 0, 0,
> > - dri2_surf->base.Width, dri2_surf->base.Height);
> > + wl_surface_damage(dri2_surf->wl_win->surface, 0, 0,
> > + dri2_surf->base.Width, dri2_surf->base.Height);
> >
> > - wl_surface_commit(dri2_surf->wl_win->surface);
> > - }
> > + wl_surface_commit(dri2_surf->wl_win->surface);
> >
> > _EGLContext *ctx;
> > if (dri2_drv->glFlush) {
> > @@ -595,7 +475,6 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp,
> > _EGLSurface *draw)
> > if (ctx && ctx->DrawSurface == &dri2_surf->base)
> > dri2_drv->glFlush();
> > }
> > -
> > (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
> > (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable);
> >
> > --
> > 1.7.10.2
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> >
More information about the mesa-dev
mailing list