[Mesa-dev] [PATCH 6/8] egl/wayland: Pull color buffers from dri2_surf->color_buffers pool

Ander Conselvan de Oliveira conselvan2 at gmail.com
Thu Dec 20 08:56:13 PST 2012


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.

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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20121220/98f26f75/attachment-0001.html>


More information about the mesa-dev mailing list