On 01/09/2013 04:45 PM, Kristian Høgsberg wrote:
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.
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 | 379 +++++++++++--------------------
2 files changed, 150 insertions(+), 252 deletions(-)
[...]
diff --git a/src/egl/drivers/dri2/platform_wayland.c
b/src/egl/drivers/dri2/platform_wayland.c
index a8069ba..5b5c849 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
[...]
@@ -243,173 +228,95 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *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++) {
+ /* Get an unlocked buffer, preferrably one with a dri_buffer already
+ * allocated. */
+ if (dri2_surf->color_buffers[i].locked)
+ continue;
+ if (dri2_surf->back == NULL)
+ dri2_surf->back = &dri2_surf->color_buffers[i];
+ else if (dri2_surf->back->dri_buffer == NULL)
+ dri2_surf->back = &dri2_surf->color_buffers[i];
Some lines in this hunk are indented with only spaces and others with
tabs and spaces.
}
}
-}
-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 =
The line above has trailing white space.
Anyway,
Reviewed-by: Ander Conselvan de Oliveira <conselv...@gmail.com>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev