platform_wayland.c revision a5776ac0b8c015bf5d6a8513cefec5920895cc8e
193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/* 293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Copyright © 2011 Intel Corporation 393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * 493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Permission is hereby granted, free of charge, to any person obtaining a 593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * copy of this software and associated documentation files (the "Software"), 693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * to deal in the Software without restriction, including without limitation 793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * the rights to use, copy, modify, merge, publish, distribute, sublicense, 893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * and/or sell copies of the Software, and to permit persons to whom the 993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Software is furnished to do so, subject to the following conditions: 1093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * 1193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * The above copyright notice and this permission notice (including the next 1293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * paragraph) shall be included in all copies or substantial portions of the 1393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Software. 1493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * 1593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 1893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 1993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 2093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * DEALINGS IN THE SOFTWARE. 2393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * 2493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Authors: 2593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Kristian Høgsberg <krh@bitplanet.net> 2693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Benjamin Franzke <benjaminfranzke@googlemail.com> 2793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 2893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 2993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include <stdlib.h> 3093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include <string.h> 3193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include <limits.h> 3293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include <dlfcn.h> 3393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include <errno.h> 3493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include <unistd.h> 35c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg#include <fcntl.h> 36c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg#include <xf86drm.h> 3793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 3893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include "egl_dri2.h" 3993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 406b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#include <wayland-client.h> 416b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#include "wayland-drm-client-protocol.h" 426b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 437b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsbergenum wl_drm_format_flags { 4458dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg HAS_ARGB8888 = 1, 4558dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg HAS_XRGB8888 = 2 467b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg}; 477b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg 4851f2820922b669af3947fcedd17109524644bb94Benjamin Franzkestatic void 49a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergsync_callback(void *data, struct wl_callback *callback, uint32_t serial) 50a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg{ 51a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg int *done = data; 52a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 53a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg *done = 1; 54a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_callback_destroy(callback); 55a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg} 56a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 57a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic const struct wl_callback_listener sync_listener = { 58a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg sync_callback 59a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg}; 60a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 61a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic int 62a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergroundtrip(struct dri2_egl_display *dri2_dpy) 63a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg{ 64a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg struct wl_callback *callback; 65a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg int done = 0, ret = 0; 66a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 67a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg callback = wl_display_sync(dri2_dpy->wl_dpy); 68a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_callback_add_listener(callback, &sync_listener, &done); 69a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_proxy_set_queue((struct wl_proxy *) callback, dri2_dpy->wl_queue); 70a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg while (ret != -1 && !done) 71a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg ret = wl_display_dispatch_queue(dri2_dpy->wl_dpy, dri2_dpy->wl_queue); 72a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 73a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg return ret; 74a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg} 75a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 76a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic void 770cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkewl_buffer_release(void *data, struct wl_buffer *buffer) 780cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 790cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke struct dri2_egl_surface *dri2_surf = data; 800cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke int i; 810cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 820cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) 830cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_drm_buffer[i] == buffer) 840cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 850cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 860cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke assert(i <= WL_BUFFER_COUNT); 870cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 880cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke /* not found? */ 890cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (i == WL_BUFFER_COUNT) 900cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke return; 910cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 920cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[i] = 0; 930cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 940cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 950cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 960cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic struct wl_buffer_listener wl_buffer_listener = { 970cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke wl_buffer_release 980cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke}; 9951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 10093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 10193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 10293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 10393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 10493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, 10593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativeWindowType window, 10693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 10793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 10893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 10993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); 11093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf; 11193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_buffer *dri2_buf; 11293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 11393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 11493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 11593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 11693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf = malloc(sizeof *dri2_surf); 11793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf) { 11893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2_create_surface"); 11993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 12093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 12193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 12293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list)) 12393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_surf; 12493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 1250cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) { 12693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[i] = NULL; 1270cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[i] = 0; 1280cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 12993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 13093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) 13193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i] = NULL; 13293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 13351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer = NULL; 1340cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer = NULL; 135a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_surf->frame_callback = NULL; 13693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 1377b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg if (conf->AlphaSize == 0) 13858dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_surf->format = WL_DRM_FORMAT_XRGB8888; 1397b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg else 14058dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_surf->format = WL_DRM_FORMAT_ARGB8888; 1417b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg 14293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke switch (type) { 14393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case EGL_WINDOW_BIT: 14493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win = (struct wl_egl_window *) window; 14593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 14693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = -1; 14793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = -1; 14893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 14993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case EGL_PIXMAP_BIT: 15093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix = (struct wl_egl_pixmap *) window; 15193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 15293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = dri2_surf->wl_pix->width; 15393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = dri2_surf->wl_pix->height; 15493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 155c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg if (dri2_surf->wl_pix->driver_private) { 15693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf = dri2_surf->wl_pix->driver_private; 15793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] = dri2_buf->dri_buffer; 15893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 15993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 16093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke default: 16193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_surf; 16293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 16393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 16493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_drawable = 16593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen, 16687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke type == EGL_WINDOW_BIT ? 16787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_conf->dri_double_config : 16887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_conf->dri_single_config, 16987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_surf); 17093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_drawable == NULL) { 17193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); 17293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_dri_drawable; 17393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 17493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 17593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return &dri2_surf->base; 17693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 17793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_dri_drawable: 17893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable); 17993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_surf: 18093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_surf); 18193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 18293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 18393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 18493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 18593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 18693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 18793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 18893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 18993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, 19093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativeWindowType window, 19193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 19293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 19393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf, 19493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke window, attrib_list); 19593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 19693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 19793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 19893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *disp, 19993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativePixmapType pixmap, 20093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 20193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 20293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_surface(drv, disp, EGL_PIXMAP_BIT, conf, 20393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke pixmap, attrib_list); 20493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 20593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 20693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 20793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglDestroySurface(), drv->API.DestroySurface(). 20893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 20993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 21093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) 21193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 21293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 21393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 21493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 21593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 21693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 21793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 21893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!_eglPutSurface(surf)) 21993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 22093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 22193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); 22293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 22393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) 22493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->wl_drm_buffer[i]) 22593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]); 22693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 22793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) 22893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_buffers[i] && !(i == __DRI_BUFFER_FRONT_LEFT && 229f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke dri2_surf->base.Type == EGL_PIXMAP_BIT)) 23093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 23193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i]); 23293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 2330cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->third_buffer) { 2340cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 2350cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer); 2360cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 2370cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 23893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(surf); 23993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 24093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 24193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 24293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 24393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 24493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_wl_egl_pixmap_destroy(struct wl_egl_pixmap *egl_pixmap) 24593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 24693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_buffer *dri2_buf = egl_pixmap->driver_private; 24793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 24893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(dri2_buf); 24993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 25093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri2_dpy->dri2->releaseBuffer(dri2_buf->dri2_dpy->dri_screen, 25193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri_buffer); 25293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 25393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_buf); 25493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 25593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke egl_pixmap->driver_private = NULL; 25693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke egl_pixmap->destroy = NULL; 25793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 25893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 259f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzkestatic struct wl_buffer * 260f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzkewayland_create_buffer(struct dri2_egl_surface *dri2_surf, 2617b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg __DRIbuffer *buffer) 262f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke{ 263f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke struct dri2_egl_display *dri2_dpy = 264f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 2650cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke struct wl_buffer *buf; 266f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke 2670cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke buf = wl_drm_create_buffer(dri2_dpy->wl_drm, buffer->name, 2680cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height, 2697b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg buffer->pitch, dri2_surf->format); 2700cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke wl_buffer_add_listener(buf, &wl_buffer_listener, dri2_surf); 2710cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 2720cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke return buf; 273f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke} 274f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke 27593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 27687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkedri2_process_back_buffer(struct dri2_egl_surface *dri2_surf, unsigned format) 27793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 27893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = 27993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 28093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 28187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke (void) format; 28287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 283f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke switch (dri2_surf->base.Type) { 284f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke case EGL_WINDOW_BIT: 28587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke /* allocate a front buffer for our double-buffered window*/ 2860cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] != NULL) 2870cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 28887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] = 28993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 29087dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke __DRI_BUFFER_FRONT_LEFT, format, 29193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 29293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 29387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke default: 29487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke break; 29587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke } 29687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke} 29787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 29887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkestatic void 29987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkedri2_process_front_buffer(struct dri2_egl_surface *dri2_surf, unsigned format) 30087dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke{ 30187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke struct dri2_egl_display *dri2_dpy = 30287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 30387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke struct dri2_egl_buffer *dri2_buf; 30487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 305f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke switch (dri2_surf->base.Type) { 306f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke case EGL_PIXMAP_BIT: 30793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf = malloc(sizeof *dri2_buf); 30893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_buf) 30993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return; 31093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 31193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri_buffer = dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]; 31293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri2_dpy = dri2_dpy; 31393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 31493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix->driver_private = dri2_buf; 31593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix->destroy = dri2_wl_egl_pixmap_destroy; 31693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 31793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke default: 31893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 31993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 32093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 32193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 32251f2820922b669af3947fcedd17109524644bb94Benjamin Franzkestatic void 3236602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergdri2_release_pending_buffer(void *data, 3246602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg struct wl_callback *callback, uint32_t time) 32551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke{ 32651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke struct dri2_egl_surface *dri2_surf = data; 32751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke struct dri2_egl_display *dri2_dpy = 32851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 32951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 33051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke /* FIXME: print internal error */ 33151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke if (!dri2_surf->pending_buffer) 33251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke return; 33351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 33451f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 33551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer); 33651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer = NULL; 33711f64668a91259b876d6b6bccd902f875531502dBenjamin Franzke 33811f64668a91259b876d6b6bccd902f875531502dBenjamin Franzke wl_callback_destroy(callback); 33951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke} 34051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 3416602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergstatic const struct wl_callback_listener release_buffer_listener = { 3426602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg dri2_release_pending_buffer 3436602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg}; 3446602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg 34551f2820922b669af3947fcedd17109524644bb94Benjamin Franzkestatic void 34651f2820922b669af3947fcedd17109524644bb94Benjamin Franzkedri2_release_buffers(struct dri2_egl_surface *dri2_surf) 34751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke{ 34851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke struct dri2_egl_display *dri2_dpy = 34951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 3506602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg struct wl_callback *callback; 35151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke int i; 35251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 3530cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->third_buffer) { 3540cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 3550cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer); 3560cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer = NULL; 3570cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 3580cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 35951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) { 36051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke if (dri2_surf->dri_buffers[i]) { 36151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke switch (i) { 36251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke case __DRI_BUFFER_FRONT_LEFT: 36351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke if (dri2_surf->pending_buffer) 364a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg roundtrip(dri2_dpy); 36551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer = dri2_surf->dri_buffers[i]; 3666602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg callback = wl_display_sync(dri2_dpy->wl_dpy); 3676602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg wl_callback_add_listener(callback, 3686602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg &release_buffer_listener, dri2_surf); 369a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_proxy_set_queue((struct wl_proxy *) callback, 370a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue); 37151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke break; 37251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke default: 37351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 37451f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->dri_buffers[i]); 37551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke break; 37651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke } 37751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->dri_buffers[i] = NULL; 37851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke } 37951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke } 38051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke} 38151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 3820cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic inline void 3830cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkepointer_swap(const void **p1, const void **p2) 3840cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 3850cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke const void *tmp = *p1; 3860cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke *p1 = *p2; 3870cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke *p2 = tmp; 3880cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 3890cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3900cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 3910cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkedestroy_third_buffer(struct dri2_egl_surface *dri2_surf) 3920cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 3930cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke struct dri2_egl_display *dri2_dpy = 3940cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 3950cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3960cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->third_buffer == NULL) 3970cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke return; 3980cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3990cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 4000cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer); 4010cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer = NULL; 4020cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4030cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD]) 4040cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD]); 4050cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD] = NULL; 4060cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[WL_BUFFER_THIRD] = 0; 4070cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 4080cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4090cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 4100cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkeswap_wl_buffers(struct dri2_egl_surface *dri2_surf, 4110cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke enum wayland_buffer_type a, enum wayland_buffer_type b) 4120cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 4130cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke int tmp; 4140cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4150cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke tmp = dri2_surf->wl_buffer_lock[a]; 4160cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[a] = dri2_surf->wl_buffer_lock[b]; 4170cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[b] = tmp; 4180cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4190cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke pointer_swap((const void **) &dri2_surf->wl_drm_buffer[a], 4200cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke (const void **) &dri2_surf->wl_drm_buffer[b]); 4210cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 4220cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4230cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 4240cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkeswap_back_and_third(struct dri2_egl_surface *dri2_surf) 4250cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 4260cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_buffer_lock[WL_BUFFER_THIRD]) 4270cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke destroy_third_buffer(dri2_surf); 4280cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4290cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke pointer_swap((const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT], 4300cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke (const void **) &dri2_surf->third_buffer); 4310cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4320cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke swap_wl_buffers(dri2_surf, WL_BUFFER_BACK, WL_BUFFER_THIRD); 4330cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 4340cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4350cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 4360cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkedri2_prior_buffer_creation(struct dri2_egl_surface *dri2_surf, 4370cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke unsigned int type) 4380cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 4390cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke switch (type) { 4400cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke case __DRI_BUFFER_BACK_LEFT: 4410cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_buffer_lock[WL_BUFFER_BACK]) 4420cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke swap_back_and_third(dri2_surf); 4430cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke else if (dri2_surf->third_buffer) 4440cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke destroy_third_buffer(dri2_surf); 4450cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 4460cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke default: 4470cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 4480cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4490cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 4500cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 4510cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 45293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic __DRIbuffer * 45393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_get_buffers_with_format(__DRIdrawable * driDrawable, 45493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *width, int *height, 45593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments, int count, 45693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *out_count, void *loaderPrivate) 45793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 45893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = loaderPrivate; 45993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = 46093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 46193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 46293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 463f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke if (dri2_surf->base.Type == EGL_WINDOW_BIT && 46493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (dri2_surf->base.Width != dri2_surf->wl_win->width || 46593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height != dri2_surf->wl_win->height)) { 46651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 46751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_release_buffers(dri2_surf); 46893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 46993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = dri2_surf->wl_win->width; 47093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = dri2_surf->wl_win->height; 47193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx = dri2_surf->wl_win->dx; 47293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dy = dri2_surf->wl_win->dy; 47393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 47493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) { 47593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->wl_drm_buffer[i]) 47693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]); 47793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[i] = NULL; 4780cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[i] = 0; 47993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 48093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 48193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 48293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->buffer_count = 0; 48393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < 2*count; i+=2) { 48493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(attachments[i] < __DRI_BUFFER_COUNT); 48593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(dri2_surf->buffer_count < 5); 48693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 4870cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_prior_buffer_creation(dri2_surf, attachments[i]); 4880cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 48993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_buffers[attachments[i]] == NULL) { 49093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 49193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[attachments[i]] = 49293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 49393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments[i], attachments[i+1], 49493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 49593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 49693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf->dri_buffers[attachments[i]]) 49793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke continue; 49893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 49993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (attachments[i] == __DRI_BUFFER_FRONT_LEFT) 50093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_process_front_buffer(dri2_surf, attachments[i+1]); 50187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke else if (attachments[i] == __DRI_BUFFER_BACK_LEFT) 50287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_process_back_buffer(dri2_surf, attachments[i+1]); 50393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 50493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 50593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke memcpy(&dri2_surf->buffers[dri2_surf->buffer_count], 50693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[attachments[i]], 50793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke sizeof(__DRIbuffer)); 50893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 50993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->buffer_count++; 51093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 51193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 512f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke assert(dri2_surf->base.Type == EGL_PIXMAP_BIT || 51393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]); 51493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 515f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke if (dri2_surf->base.Type == EGL_PIXMAP_BIT && !dri2_surf->wl_pix->buffer) 516f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke dri2_surf->wl_pix->buffer = 517f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke wayland_create_buffer(dri2_surf, 5187b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]); 519f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke 52093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *out_count = dri2_surf->buffer_count; 52193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->buffer_count == 0) 52293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 52393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *width = dri2_surf->base.Width; 52593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *height = dri2_surf->base.Height; 52693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_surf->buffers; 52893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 52993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 53093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic __DRIbuffer * 53193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_get_buffers(__DRIdrawable * driDrawable, 53293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *width, int *height, 53393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments, int count, 53493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *out_count, void *loaderPrivate) 53593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 53693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments_with_format; 53793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRIbuffer *buffer; 53893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const unsigned int format = 32; 53993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 54093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 54193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format = calloc(count * 2, sizeof(unsigned int)); 54293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!attachments_with_format) { 54393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *out_count = 0; 54493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 54593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 54693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 54793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < count; ++i) { 54893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format[2*i] = attachments[i]; 54993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format[2*i + 1] = format; 55093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 55193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 55293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke buffer = 55393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_get_buffers_with_format(driDrawable, 55493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke width, height, 55593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format, count, 55693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke out_count, loaderPrivate); 55793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 55893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(attachments_with_format); 55993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 56093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return buffer; 56193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 56293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 56393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 56493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 56593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) 56693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 56793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) driDrawable; 56893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 56993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* FIXME: Does EGL support front buffer rendering at all? */ 57093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 57193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#if 0 57293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = loaderPrivate; 57393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 57493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2WaitGL(dri2_surf); 57593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#else 57693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) loaderPrivate; 57793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#endif 57893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 57993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 58093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 5816602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergwayland_frame_callback(void *data, struct wl_callback *callback, uint32_t time) 58293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 58393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = data; 58493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 585a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_surf->frame_callback = NULL; 5866602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg wl_callback_destroy(callback); 58793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 58893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 5896602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergstatic const struct wl_callback_listener frame_listener = { 5906602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg wayland_frame_callback 5916602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg}; 5926602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg 59393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 59493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglSwapBuffers(), drv->API.SwapBuffers(). 59593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 59693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 59793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) 59893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 59993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 60093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 60193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); 602a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg int ret = 0; 60393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 604a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg while (dri2_surf->frame_callback && ret != -1) 605a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg ret = wl_display_dispatch_queue(dri2_dpy->wl_dpy, dri2_dpy->wl_queue); 606a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (ret < 0) 607a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg return EGL_FALSE; 60893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 609a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_surf->frame_callback = wl_surface_frame(dri2_surf->wl_win->surface); 610a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_callback_add_listener(dri2_surf->frame_callback, 611a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg &frame_listener, dri2_surf); 612a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_proxy_set_queue((struct wl_proxy *) dri2_surf->frame_callback, 613a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue); 61493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 615f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke if (dri2_surf->base.Type == EGL_WINDOW_BIT) { 61693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke pointer_swap( 61793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT], 61893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]); 61993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 62093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]->attachment = 62193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_FRONT_LEFT; 62293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->attachment = 62393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_BACK_LEFT; 62493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 6250cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke swap_wl_buffers(dri2_surf, WL_BUFFER_FRONT, WL_BUFFER_BACK); 62693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 62793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT]) 62893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT] = 62993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wayland_create_buffer(dri2_surf, 6307b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]); 63193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 63293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_surface_attach(dri2_surf->wl_win->surface, 63393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT], 63493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx, dri2_surf->dy); 6350cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[WL_BUFFER_FRONT] = 1; 63693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 63793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win->attached_width = dri2_surf->base.Width; 63893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win->attached_height = dri2_surf->base.Height; 63993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* reset resize growing parameters */ 64093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx = 0; 64193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dy = 0; 64293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 64393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_surface_damage(dri2_surf->wl_win->surface, 0, 0, 64493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 645a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 646a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_surface_commit(dri2_surf->wl_win->surface); 64793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 64893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 64993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLContext *ctx; 65093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_drv->glFlush) { 65193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke ctx = _eglGetCurrentContext(); 65293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (ctx && ctx->DrawSurface == &dri2_surf->base) 65393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_drv->glFlush(); 65493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 65593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 65693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 65793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); 65893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 65993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 66093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 66193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 66293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 66393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateImageKHR(), drv->API.CreateImageKHR(). 66493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 66593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLImage * 66693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx, 66793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGLClientBuffer buffer, const EGLint *attr_list) 66893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 66993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 67093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct wl_egl_pixmap *wl_egl_pixmap = (struct wl_egl_pixmap *) buffer; 67193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_buffer *dri2_buf; 67293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGLint wl_attr_list[] = { 67393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_WIDTH, 0, 67493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_HEIGHT, 0, 67593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_DRM_BUFFER_STRIDE_MESA, 0, 67693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, 67793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_NONE 67893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke }; 67993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 68093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf = malloc(sizeof *dri2_buf); 68193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_buf) 68293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 68393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 68493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri2_dpy = dri2_dpy; 68593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri_buffer = 68693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 68793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_FRONT_LEFT, 32, 68893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->width, 68993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->height); 69093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 69193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->destroy = dri2_wl_egl_pixmap_destroy; 69293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->driver_private = dri2_buf; 69393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 6947b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg /* FIXME: Get buffer format from attr_list somehow... or from the 6957b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg wl_egl_piaxmap. */ 696c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_egl_pixmap->buffer = 697c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_drm_create_buffer(dri2_dpy->wl_drm, 698c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg dri2_buf->dri_buffer->name, 699c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_egl_pixmap->width, 700c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_egl_pixmap->height, 701c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg dri2_buf->dri_buffer->pitch, 70258dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg WL_DRM_FORMAT_ARGB8888); 703c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 70493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_attr_list[1] = wl_egl_pixmap->width; 70593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_attr_list[3] = wl_egl_pixmap->height; 706c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_attr_list[5] = dri2_buf->dri_buffer->pitch / 4; 70793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 70893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_image_khr(disp->Driver, disp, ctx, EGL_DRM_BUFFER_MESA, 709c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg (EGLClientBuffer)(intptr_t) dri2_buf->dri_buffer->name, wl_attr_list); 71093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 71193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 71293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLImage * 71393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_wayland_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, 71493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLContext *ctx, EGLenum target, 71593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGLClientBuffer buffer, const EGLint *attr_list) 71693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 71793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 71893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 71993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke switch (target) { 72093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case EGL_NATIVE_PIXMAP_KHR: 72193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list); 72293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke default: 72393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list); 72493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 72593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 72693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 7276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestatic int 7286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkedri2_wayland_authenticate(_EGLDisplay *disp, uint32_t id) 7296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{ 7306b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 7316b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke int ret = 0; 7326b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 733aa87a938fb4cec30dad48642e8d12810e947bc8bBenjamin Franzke dri2_dpy->authenticated = 0; 7346b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 735c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_drm_authenticate(dri2_dpy->wl_drm, id); 736a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0) 737a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg ret = -1; 7386b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 739c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg if (!dri2_dpy->authenticated) 7406b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke ret = -1; 7416b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 7426b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke /* reset authenticated */ 743aa87a938fb4cec30dad48642e8d12810e947bc8bBenjamin Franzke dri2_dpy->authenticated = 1; 7446b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 7456b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke return ret; 7466b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke} 7476b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 74893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 74993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglTerminate(), drv->API.Terminate(). 75093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 75193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 75293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_terminate(_EGLDriver *drv, _EGLDisplay *disp) 75393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 75493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 75593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 75693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglReleaseDisplayResources(drv, disp); 75793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglCleanupDisplay(disp); 75893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 75993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); 76093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke close(dri2_dpy->fd); 76193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dlclose(dri2_dpy->driver); 76293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy->driver_name); 7632a58453e25899e726f02db005de0e1296c326845Benjamin Franzke free(dri2_dpy->device_name); 7642a58453e25899e726f02db005de0e1296c326845Benjamin Franzke wl_drm_destroy(dri2_dpy->wl_drm); 7652a58453e25899e726f02db005de0e1296c326845Benjamin Franzke if (dri2_dpy->own_device) 766e6aa32ac7f8d7b843f4d4f8bf9d8e9db790b0868Benjamin Franzke wl_display_disconnect(dri2_dpy->wl_dpy); 76793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy); 76893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->DriverData = NULL; 76993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 77093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 77193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 77293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 773c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergstatic void 774c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergdrm_handle_device(void *data, struct wl_drm *drm, const char *device) 775c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg{ 776c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 777c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drm_magic_t magic; 778c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 779c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg dri2_dpy->device_name = strdup(device); 780c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg if (!dri2_dpy->device_name) 781c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg return; 782c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 783b60120608f6ddf4098bc324363197c979ee04cb7David Fries#ifdef O_CLOEXEC 784b60120608f6ddf4098bc324363197c979ee04cb7David Fries dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR | O_CLOEXEC); 785b60120608f6ddf4098bc324363197c979ee04cb7David Fries if (dri2_dpy->fd == -1 && errno == EINVAL) 786b60120608f6ddf4098bc324363197c979ee04cb7David Fries#endif 787b60120608f6ddf4098bc324363197c979ee04cb7David Fries { 788b60120608f6ddf4098bc324363197c979ee04cb7David Fries dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR); 789b60120608f6ddf4098bc324363197c979ee04cb7David Fries if (dri2_dpy->fd != -1) 790b60120608f6ddf4098bc324363197c979ee04cb7David Fries fcntl(dri2_dpy->fd, F_SETFD, fcntl(dri2_dpy->fd, F_GETFD) | 791b60120608f6ddf4098bc324363197c979ee04cb7David Fries FD_CLOEXEC); 792b60120608f6ddf4098bc324363197c979ee04cb7David Fries } 793c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg if (dri2_dpy->fd == -1) { 794c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg _eglLog(_EGL_WARNING, "wayland-egl: could not open %s (%s)", 795c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg dri2_dpy->device_name, strerror(errno)); 796c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg return; 797c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg } 798c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 799c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drmGetMagic(dri2_dpy->fd, &magic); 800c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_drm_authenticate(dri2_dpy->wl_drm, magic); 801c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg} 802c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 803c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergstatic void 8047b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsbergdrm_handle_format(void *data, struct wl_drm *drm, uint32_t format) 8057b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg{ 8067b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 8077b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg 8087b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg switch (format) { 80958dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg case WL_DRM_FORMAT_ARGB8888: 81058dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_dpy->formats |= HAS_ARGB8888; 8117b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg break; 81258dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg case WL_DRM_FORMAT_XRGB8888: 81358dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_dpy->formats |= HAS_XRGB8888; 8147b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg break; 8157b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg } 8167b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg} 8177b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg 8187b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsbergstatic void 819c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergdrm_handle_authenticated(void *data, struct wl_drm *drm) 820c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg{ 821c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 822c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 823aa87a938fb4cec30dad48642e8d12810e947bc8bBenjamin Franzke dri2_dpy->authenticated = 1; 824c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg} 825c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 826c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergstatic const struct wl_drm_listener drm_listener = { 827c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drm_handle_device, 8287b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg drm_handle_format, 829c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drm_handle_authenticated 830c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg}; 831c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 832a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic void 833a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergregistry_handle_global(void *data, struct wl_registry *registry, uint32_t name, 834a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg const char *interface, uint32_t version) 835a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg{ 836a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 837a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 838a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (strcmp(interface, "wl_drm") == 0) { 839a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_drm = 840a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_registry_bind(registry, name, &wl_drm_interface, 1); 841a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_drm_add_listener(dri2_dpy->wl_drm, &drm_listener, dri2_dpy); 842a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg } 843a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg} 844a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 845a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic const struct wl_registry_listener registry_listener = { 846a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg registry_handle_global 847a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg}; 848a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 84993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin FranzkeEGLBoolean 85093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp) 85193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 85293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy; 8537b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg const __DRIconfig *config; 854a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg uint32_t types; 85593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 8567b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg static const unsigned int argb_masks[4] = 8577b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg { 0xff0000, 0xff00, 0xff, 0xff000000 }; 8587b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg static const unsigned int rgb_masks[4] = { 0xff0000, 0xff00, 0xff, 0 }; 85993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 86093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.CreateWindowSurface = dri2_create_window_surface; 86193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.CreatePixmapSurface = dri2_create_pixmap_surface; 86293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.DestroySurface = dri2_destroy_surface; 86393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.SwapBuffers = dri2_swap_buffers; 86493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.CreateImageKHR = dri2_wayland_create_image_khr; 86593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.Terminate = dri2_terminate; 86693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 86793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy = malloc(sizeof *dri2_dpy); 86893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_dpy) 86993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return _eglError(EGL_BAD_ALLOC, "eglInitialize"); 87093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 871f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng memset(dri2_dpy, 0, sizeof *dri2_dpy); 872f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng 87393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->DriverData = (void *) dri2_dpy; 874b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke if (disp->PlatformDisplay == NULL) { 875b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke dri2_dpy->wl_dpy = wl_display_connect(NULL); 876b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke if (dri2_dpy->wl_dpy == NULL) 877b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke goto cleanup_dpy; 8782a58453e25899e726f02db005de0e1296c326845Benjamin Franzke dri2_dpy->own_device = 1; 879b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke } else { 880b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke dri2_dpy->wl_dpy = disp->PlatformDisplay; 881b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke } 88293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 883a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue = wl_display_create_queue(dri2_dpy->wl_dpy); 884a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_registry = wl_display_get_registry(dri2_dpy->wl_dpy); 885a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_proxy_set_queue((struct wl_proxy *) dri2_dpy->wl_registry, 886a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue); 887a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_registry_add_listener(dri2_dpy->wl_registry, 888a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg ®istry_listener, dri2_dpy); 889a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_drm == NULL) 89093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_dpy; 891a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 892a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0 || dri2_dpy->fd == -1) 893c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg goto cleanup_drm; 89456758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg 895a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0 || !dri2_dpy->authenticated) 896c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg goto cleanup_fd; 89793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 89893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->driver_name = dri2_get_driver_for_fd(dri2_dpy->fd); 89993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_dpy->driver_name == NULL) { 90093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "DRI2: failed to get driver name"); 90193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_fd; 90293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 90393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 9046b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke if (!dri2_load_driver(disp)) 905c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg goto cleanup_driver_name; 90693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 9073104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER; 9083104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.base.version = 3; 9093104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers; 9103104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer; 9113104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.getBuffersWithFormat = 91293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_get_buffers_with_format; 91393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 9143104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base; 91593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->extensions[1] = &image_lookup_extension.base; 91616a04e019dcb0f1d50ceab5c8c2eafb56fa60853Kristian Høgsberg dri2_dpy->extensions[2] = &use_invalidate.base; 91716a04e019dcb0f1d50ceab5c8c2eafb56fa60853Kristian Høgsberg dri2_dpy->extensions[3] = NULL; 91893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 91993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_create_screen(disp)) 92093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_driver; 92193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 9227b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg types = EGL_WINDOW_BIT | EGL_PIXMAP_BIT; 9237b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg for (i = 0; dri2_dpy->driver_configs[i]; i++) { 9247b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg config = dri2_dpy->driver_configs[i]; 92558dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg if (dri2_dpy->formats & HAS_XRGB8888) 9267b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg dri2_add_config(disp, config, i + 1, 0, types, NULL, rgb_masks); 92758dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg if (dri2_dpy->formats & HAS_ARGB8888) 9287b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg dri2_add_config(disp, config, i + 1, 0, types, NULL, argb_masks); 9297b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg } 93093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 93193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->Extensions.KHR_image_pixmap = EGL_TRUE; 93293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 9336b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke disp->Extensions.WL_bind_wayland_display = EGL_TRUE; 9346b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke dri2_dpy->authenticate = dri2_wayland_authenticate; 9356b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 93693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* we're supporting EGL 1.4 */ 93793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->VersionMajor = 1; 93893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->VersionMinor = 4; 93993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 94093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 94193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 94293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_driver: 94393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dlclose(dri2_dpy->driver); 94493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_driver_name: 94593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy->driver_name); 94693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_fd: 94793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke close(dri2_dpy->fd); 948c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg cleanup_drm: 949c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg free(dri2_dpy->device_name); 950c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_drm_destroy(dri2_dpy->wl_drm); 95193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_dpy: 95293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy); 95393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 95493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_FALSE; 95593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 956