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 73f2da7e720f60e8df96bf2530f35e3e79897e0cb7Jonas Ådahl if (!done) 74f2da7e720f60e8df96bf2530f35e3e79897e0cb7Jonas Ådahl wl_callback_destroy(callback); 75f2da7e720f60e8df96bf2530f35e3e79897e0cb7Jonas Ådahl 76a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg return ret; 77a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg} 78a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 79a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic void 800cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkewl_buffer_release(void *data, struct wl_buffer *buffer) 810cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 820cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke struct dri2_egl_surface *dri2_surf = data; 830cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke int i; 840cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 850cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) 860cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_drm_buffer[i] == buffer) 870cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 880cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 890cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke assert(i <= WL_BUFFER_COUNT); 900cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 910cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke /* not found? */ 920cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (i == WL_BUFFER_COUNT) 930cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke return; 940cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 950cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[i] = 0; 960cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 970cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 980cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 990cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic struct wl_buffer_listener wl_buffer_listener = { 1000cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke wl_buffer_release 1010cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke}; 10251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 103eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveirastatic void 104eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveiraresize_callback(struct wl_egl_window *wl_win, void *data) 105eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira{ 106eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira struct dri2_egl_surface *dri2_surf = data; 107eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira struct dri2_egl_display *dri2_dpy = 108eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira dri2_egl_display(dri2_surf->base.Resource.Display); 109eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira 110eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); 111eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira} 112eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira 11393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 11493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 11593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 11693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 11793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, 11893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativeWindowType window, 11993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 12093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 12193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 12293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); 12393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf; 12493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 12593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 12693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 12793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 12893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf = malloc(sizeof *dri2_surf); 12993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf) { 13093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2_create_surface"); 13193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 13293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 13393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 13493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list)) 13593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_surf; 13693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 1370cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) { 13893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[i] = NULL; 1390cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[i] = 0; 1400cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 14193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 14293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) 14393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i] = NULL; 14493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 14551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer = NULL; 1460cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer = NULL; 147a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_surf->frame_callback = NULL; 14881d40e66ad1c0c53c1de2f183a4987a3159c7c55Ander Conselvan de Oliveira dri2_surf->pending_buffer_callback = NULL; 14993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 1507b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg if (conf->AlphaSize == 0) 15158dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_surf->format = WL_DRM_FORMAT_XRGB8888; 1527b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg else 15358dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_surf->format = WL_DRM_FORMAT_ARGB8888; 1547b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg 15593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke switch (type) { 15693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case EGL_WINDOW_BIT: 15793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win = (struct wl_egl_window *) window; 15893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 159eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira dri2_surf->wl_win->private = dri2_surf; 160eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira dri2_surf->wl_win->resize_callback = resize_callback; 161eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira 16293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = -1; 16393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = -1; 16493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 16593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke default: 16693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_surf; 16793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 16893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 16993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_drawable = 17093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen, 17187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke type == EGL_WINDOW_BIT ? 17287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_conf->dri_double_config : 17387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_conf->dri_single_config, 17487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_surf); 17593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_drawable == NULL) { 17693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); 17793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_dri_drawable; 17893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 17993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 18093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return &dri2_surf->base; 18193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 18293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_dri_drawable: 18393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable); 18493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_surf: 18593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_surf); 18693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 18793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 18893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 18993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 19093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 19193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 19293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 19393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 19493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, 19593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativeWindowType window, 19693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 19793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 19893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf, 19993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke window, attrib_list); 20093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 20193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 20293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 20393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglDestroySurface(), drv->API.DestroySurface(). 20493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 20593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 20693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) 20793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 20893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 20993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 21093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 21193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 21293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 21393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 21493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!_eglPutSurface(surf)) 21593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 21693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 21793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); 21893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 21993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) 22093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->wl_drm_buffer[i]) 22193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]); 22293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 22393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) 2242a81037439afb04d4170f674646cdae59619707dKristian Høgsberg if (dri2_surf->dri_buffers[i]) 22593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 22693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i]); 22793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 2280cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->third_buffer) { 2290cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 2300cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer); 2310cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 2320cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 2332332bc26d435e465a6f6571ab267db2a33ce05d2Jonas Ådahl if (dri2_surf->frame_callback) 2342332bc26d435e465a6f6571ab267db2a33ce05d2Jonas Ådahl wl_callback_destroy(dri2_surf->frame_callback); 2352332bc26d435e465a6f6571ab267db2a33ce05d2Jonas Ådahl 23681d40e66ad1c0c53c1de2f183a4987a3159c7c55Ander Conselvan de Oliveira if (dri2_surf->pending_buffer_callback) 23781d40e66ad1c0c53c1de2f183a4987a3159c7c55Ander Conselvan de Oliveira wl_callback_destroy(dri2_surf->pending_buffer_callback); 23881d40e66ad1c0c53c1de2f183a4987a3159c7c55Ander Conselvan de Oliveira 239eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira 240eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira if (dri2_surf->base.Type == EGL_WINDOW_BIT) { 241eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira dri2_surf->wl_win->private = NULL; 242eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira dri2_surf->wl_win->resize_callback = NULL; 243eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira } 244eaf6884621661288624fc060974c3aa485771324Ander Conselvan de Oliveira 24593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(surf); 24693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 24793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 24893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 24993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 250f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzkestatic struct wl_buffer * 251f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzkewayland_create_buffer(struct dri2_egl_surface *dri2_surf, 2527b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg __DRIbuffer *buffer) 253f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke{ 254f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke struct dri2_egl_display *dri2_dpy = 255f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 2560cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke struct wl_buffer *buf; 257f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke 2580cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke buf = wl_drm_create_buffer(dri2_dpy->wl_drm, buffer->name, 2590cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height, 2607b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg buffer->pitch, dri2_surf->format); 2610cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke wl_buffer_add_listener(buf, &wl_buffer_listener, dri2_surf); 2620cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 2630cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke return buf; 264f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke} 265f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke 26693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 26787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkedri2_process_back_buffer(struct dri2_egl_surface *dri2_surf, unsigned format) 26893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 26993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = 27093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 27193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 27287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke (void) format; 27387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 274f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke switch (dri2_surf->base.Type) { 275f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke case EGL_WINDOW_BIT: 27687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke /* allocate a front buffer for our double-buffered window*/ 2770cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] != NULL) 2780cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 27987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] = 28093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 28187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke __DRI_BUFFER_FRONT_LEFT, format, 28293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 28393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 28487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke default: 28587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke break; 28687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke } 28787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke} 28887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 28987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkestatic void 2906602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergdri2_release_pending_buffer(void *data, 2916602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg struct wl_callback *callback, uint32_t time) 29251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke{ 29351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke struct dri2_egl_surface *dri2_surf = data; 29451f2820922b669af3947fcedd17109524644bb94Benjamin Franzke struct dri2_egl_display *dri2_dpy = 29551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 29651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 29751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke /* FIXME: print internal error */ 29851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke if (!dri2_surf->pending_buffer) 29951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke return; 30051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 30151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 30251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer); 30351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer = NULL; 30411f64668a91259b876d6b6bccd902f875531502dBenjamin Franzke 30511f64668a91259b876d6b6bccd902f875531502dBenjamin Franzke wl_callback_destroy(callback); 30681d40e66ad1c0c53c1de2f183a4987a3159c7c55Ander Conselvan de Oliveira dri2_surf->pending_buffer_callback = NULL; 30751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke} 30851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 3096602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergstatic const struct wl_callback_listener release_buffer_listener = { 3106602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg dri2_release_pending_buffer 3116602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg}; 3126602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg 31351f2820922b669af3947fcedd17109524644bb94Benjamin Franzkestatic void 31451f2820922b669af3947fcedd17109524644bb94Benjamin Franzkedri2_release_buffers(struct dri2_egl_surface *dri2_surf) 31551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke{ 31651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke struct dri2_egl_display *dri2_dpy = 31751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 3186602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg struct wl_callback *callback; 31951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke int i; 32051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 3210cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->third_buffer) { 3220cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 3230cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer); 3240cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer = NULL; 3250cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 3260cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 32751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) { 32851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke if (dri2_surf->dri_buffers[i]) { 32951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke switch (i) { 33051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke case __DRI_BUFFER_FRONT_LEFT: 33151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke if (dri2_surf->pending_buffer) 332a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg roundtrip(dri2_dpy); 33351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->pending_buffer = dri2_surf->dri_buffers[i]; 3346602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg callback = wl_display_sync(dri2_dpy->wl_dpy); 3356602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg wl_callback_add_listener(callback, 3366602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg &release_buffer_listener, dri2_surf); 337a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_proxy_set_queue((struct wl_proxy *) callback, 338a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue); 33981d40e66ad1c0c53c1de2f183a4987a3159c7c55Ander Conselvan de Oliveira dri2_surf->pending_buffer_callback = callback; 34051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke break; 34151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke default: 34251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 34351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->dri_buffers[i]); 34451f2820922b669af3947fcedd17109524644bb94Benjamin Franzke break; 34551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke } 34651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_surf->dri_buffers[i] = NULL; 34751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke } 34851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke } 34951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke} 35051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 3510cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic inline void 3520cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkepointer_swap(const void **p1, const void **p2) 3530cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 3540cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke const void *tmp = *p1; 3550cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke *p1 = *p2; 3560cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke *p2 = tmp; 3570cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 3580cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3590cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 3600cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkedestroy_third_buffer(struct dri2_egl_surface *dri2_surf) 3610cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 3620cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke struct dri2_egl_display *dri2_dpy = 3630cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 3640cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3650cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->third_buffer == NULL) 3660cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke return; 3670cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3680cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 3690cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer); 3700cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->third_buffer = NULL; 3710cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3720cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD]) 3730cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD]); 3740cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_THIRD] = NULL; 3750cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[WL_BUFFER_THIRD] = 0; 3760cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 3770cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3780cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 3790cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkeswap_wl_buffers(struct dri2_egl_surface *dri2_surf, 3800cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke enum wayland_buffer_type a, enum wayland_buffer_type b) 3810cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 3820cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke int tmp; 3830cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3840cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke tmp = dri2_surf->wl_buffer_lock[a]; 3850cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[a] = dri2_surf->wl_buffer_lock[b]; 3860cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[b] = tmp; 3870cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3880cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke pointer_swap((const void **) &dri2_surf->wl_drm_buffer[a], 3890cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke (const void **) &dri2_surf->wl_drm_buffer[b]); 3900cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 3910cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3920cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 3930cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkeswap_back_and_third(struct dri2_egl_surface *dri2_surf) 3940cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 3950cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_buffer_lock[WL_BUFFER_THIRD]) 3960cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke destroy_third_buffer(dri2_surf); 3970cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 3980cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke pointer_swap((const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT], 3990cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke (const void **) &dri2_surf->third_buffer); 4000cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4010cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke swap_wl_buffers(dri2_surf, WL_BUFFER_BACK, WL_BUFFER_THIRD); 4020cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 4030cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4040cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkestatic void 4050cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzkedri2_prior_buffer_creation(struct dri2_egl_surface *dri2_surf, 4060cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke unsigned int type) 4070cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke{ 4080cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke switch (type) { 4090cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke case __DRI_BUFFER_BACK_LEFT: 4100cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke if (dri2_surf->wl_buffer_lock[WL_BUFFER_BACK]) 4110cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke swap_back_and_third(dri2_surf); 4120cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke else if (dri2_surf->third_buffer) 4130cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke destroy_third_buffer(dri2_surf); 4140cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 4150cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke default: 4160cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke break; 4170cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 4180cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke } 4190cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke} 4200cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 42193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic __DRIbuffer * 42293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_get_buffers_with_format(__DRIdrawable * driDrawable, 42393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *width, int *height, 42493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments, int count, 42593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *out_count, void *loaderPrivate) 42693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 42793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = loaderPrivate; 42893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = 42993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 43093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 43193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 432f9d8d0c3b5e11c4ae08b078dca2aa48a3218f8d9Ander Conselvan de Oliveira /* There might be a buffer release already queued that wasn't processed */ 433f9d8d0c3b5e11c4ae08b078dca2aa48a3218f8d9Ander Conselvan de Oliveira wl_display_dispatch_queue_pending(dri2_dpy->wl_dpy, dri2_dpy->wl_queue); 434f9d8d0c3b5e11c4ae08b078dca2aa48a3218f8d9Ander Conselvan de Oliveira 435f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke if (dri2_surf->base.Type == EGL_WINDOW_BIT && 43693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (dri2_surf->base.Width != dri2_surf->wl_win->width || 43793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height != dri2_surf->wl_win->height)) { 43851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke 43951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke dri2_release_buffers(dri2_surf); 44093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 44193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = dri2_surf->wl_win->width; 44293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = dri2_surf->wl_win->height; 44393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx = dri2_surf->wl_win->dx; 44493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dy = dri2_surf->wl_win->dy; 44593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 44693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) { 44793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->wl_drm_buffer[i]) 44893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]); 44993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[i] = NULL; 4500cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[i] = 0; 45193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 45293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 45393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 45493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->buffer_count = 0; 45593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < 2*count; i+=2) { 45693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(attachments[i] < __DRI_BUFFER_COUNT); 45793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(dri2_surf->buffer_count < 5); 45893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 4590cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_prior_buffer_creation(dri2_surf, attachments[i]); 4600cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke 46193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_buffers[attachments[i]] == NULL) { 46293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 46393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[attachments[i]] = 46493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 46593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments[i], attachments[i+1], 46693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 46793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 46893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf->dri_buffers[attachments[i]]) 46993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke continue; 47093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 4712a81037439afb04d4170f674646cdae59619707dKristian Høgsberg if (attachments[i] == __DRI_BUFFER_BACK_LEFT) 47287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_process_back_buffer(dri2_surf, attachments[i+1]); 47393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 47493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 47593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke memcpy(&dri2_surf->buffers[dri2_surf->buffer_count], 47693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[attachments[i]], 47793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke sizeof(__DRIbuffer)); 47893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 47993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->buffer_count++; 48093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 48193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 4822a81037439afb04d4170f674646cdae59619707dKristian Høgsberg assert(dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]); 483f09c66b3cc9542b0a8f795e34b882c2b8f9f26f7Benjamin Franzke 48493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *out_count = dri2_surf->buffer_count; 48593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->buffer_count == 0) 48693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 48793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 48893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *width = dri2_surf->base.Width; 48993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *height = dri2_surf->base.Height; 49093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 49193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_surf->buffers; 49293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 49393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 49493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic __DRIbuffer * 49593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_get_buffers(__DRIdrawable * driDrawable, 49693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *width, int *height, 49793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments, int count, 49893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *out_count, void *loaderPrivate) 49993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 50093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments_with_format; 50193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRIbuffer *buffer; 50293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const unsigned int format = 32; 50393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 50493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 50593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format = calloc(count * 2, sizeof(unsigned int)); 50693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!attachments_with_format) { 50793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *out_count = 0; 50893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 50993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 51093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 51193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < count; ++i) { 51293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format[2*i] = attachments[i]; 51393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format[2*i + 1] = format; 51493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 51593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 51693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke buffer = 51793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_get_buffers_with_format(driDrawable, 51893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke width, height, 51993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format, count, 52093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke out_count, loaderPrivate); 52193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(attachments_with_format); 52393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return buffer; 52593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 52693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 52993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) 53093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 53193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) driDrawable; 53293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 53393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* FIXME: Does EGL support front buffer rendering at all? */ 53493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 53593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#if 0 53693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = loaderPrivate; 53793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 53893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2WaitGL(dri2_surf); 53993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#else 54093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) loaderPrivate; 54193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#endif 54293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 54393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 54493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 5456602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergwayland_frame_callback(void *data, struct wl_callback *callback, uint32_t time) 54693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 54793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = data; 54893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 549a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_surf->frame_callback = NULL; 5506602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg wl_callback_destroy(callback); 55193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 55293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 5536602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsbergstatic const struct wl_callback_listener frame_listener = { 5546602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg wayland_frame_callback 5556602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg}; 5566602bda23ba6c4351eb7f04d34803103a68ac2dbKristian Høgsberg 55793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 55893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglSwapBuffers(), drv->API.SwapBuffers(). 55993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 56093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 56193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) 56293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 56393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 56493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 56593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); 566a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg int ret = 0; 56793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 568a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg while (dri2_surf->frame_callback && ret != -1) 569a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg ret = wl_display_dispatch_queue(dri2_dpy->wl_dpy, dri2_dpy->wl_queue); 570a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (ret < 0) 571a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg return EGL_FALSE; 57293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 573a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_surf->frame_callback = wl_surface_frame(dri2_surf->wl_win->surface); 574a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_callback_add_listener(dri2_surf->frame_callback, 575a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg &frame_listener, dri2_surf); 576a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_proxy_set_queue((struct wl_proxy *) dri2_surf->frame_callback, 577a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue); 57893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 579f811c1e6d637a556f36271ee4abeb30aaeb07204Benjamin Franzke if (dri2_surf->base.Type == EGL_WINDOW_BIT) { 58093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke pointer_swap( 58193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT], 58293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]); 58393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 58493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]->attachment = 58593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_FRONT_LEFT; 58693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->attachment = 58793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_BACK_LEFT; 58893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 5890cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke swap_wl_buffers(dri2_surf, WL_BUFFER_FRONT, WL_BUFFER_BACK); 59093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 59193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT]) 59293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT] = 59393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wayland_create_buffer(dri2_surf, 5947b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]); 59593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 59693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_surface_attach(dri2_surf->wl_win->surface, 59793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT], 59893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx, dri2_surf->dy); 5990cb356dd5c93f745bb1b17987d206a24ab708f31Benjamin Franzke dri2_surf->wl_buffer_lock[WL_BUFFER_FRONT] = 1; 60093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 60193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win->attached_width = dri2_surf->base.Width; 60293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win->attached_height = dri2_surf->base.Height; 60393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* reset resize growing parameters */ 60493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx = 0; 60593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dy = 0; 60693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 60793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_surface_damage(dri2_surf->wl_win->surface, 0, 0, 60893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 609a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 610a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_surface_commit(dri2_surf->wl_win->surface); 61193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 61293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 61393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLContext *ctx; 61493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_drv->glFlush) { 61593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke ctx = _eglGetCurrentContext(); 61693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (ctx && ctx->DrawSurface == &dri2_surf->base) 61793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_drv->glFlush(); 61893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 61993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 62093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 621b49d9338d7e79752e886eede34db08e37c34f8edKristian Høgsberg (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); 62293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 62393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 62493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 62593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 6266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestatic int 6276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkedri2_wayland_authenticate(_EGLDisplay *disp, uint32_t id) 6286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{ 6296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 6306b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke int ret = 0; 6316b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 632aa87a938fb4cec30dad48642e8d12810e947bc8bBenjamin Franzke dri2_dpy->authenticated = 0; 6336b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 634c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_drm_authenticate(dri2_dpy->wl_drm, id); 635a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0) 636a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg ret = -1; 6376b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 638c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg if (!dri2_dpy->authenticated) 6396b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke ret = -1; 6406b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 6416b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke /* reset authenticated */ 642aa87a938fb4cec30dad48642e8d12810e947bc8bBenjamin Franzke dri2_dpy->authenticated = 1; 6436b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 6446b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke return ret; 6456b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke} 6466b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 64793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 64893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglTerminate(), drv->API.Terminate(). 64993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 65093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 65193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_terminate(_EGLDriver *drv, _EGLDisplay *disp) 65293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 65393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 65493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 65593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglReleaseDisplayResources(drv, disp); 65693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglCleanupDisplay(disp); 65793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 65893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); 65993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke close(dri2_dpy->fd); 66093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dlclose(dri2_dpy->driver); 66193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy->driver_name); 6622a58453e25899e726f02db005de0e1296c326845Benjamin Franzke free(dri2_dpy->device_name); 6632a58453e25899e726f02db005de0e1296c326845Benjamin Franzke wl_drm_destroy(dri2_dpy->wl_drm); 6642a58453e25899e726f02db005de0e1296c326845Benjamin Franzke if (dri2_dpy->own_device) 665e6aa32ac7f8d7b843f4d4f8bf9d8e9db790b0868Benjamin Franzke wl_display_disconnect(dri2_dpy->wl_dpy); 66693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy); 66793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->DriverData = NULL; 66893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 66993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 67093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 67193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 672c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergstatic void 673c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergdrm_handle_device(void *data, struct wl_drm *drm, const char *device) 674c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg{ 675c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 676c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drm_magic_t magic; 677c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 678c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg dri2_dpy->device_name = strdup(device); 679c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg if (!dri2_dpy->device_name) 680c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg return; 681c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 682b60120608f6ddf4098bc324363197c979ee04cb7David Fries#ifdef O_CLOEXEC 683b60120608f6ddf4098bc324363197c979ee04cb7David Fries dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR | O_CLOEXEC); 684b60120608f6ddf4098bc324363197c979ee04cb7David Fries if (dri2_dpy->fd == -1 && errno == EINVAL) 685b60120608f6ddf4098bc324363197c979ee04cb7David Fries#endif 686b60120608f6ddf4098bc324363197c979ee04cb7David Fries { 687b60120608f6ddf4098bc324363197c979ee04cb7David Fries dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR); 688b60120608f6ddf4098bc324363197c979ee04cb7David Fries if (dri2_dpy->fd != -1) 689b60120608f6ddf4098bc324363197c979ee04cb7David Fries fcntl(dri2_dpy->fd, F_SETFD, fcntl(dri2_dpy->fd, F_GETFD) | 690b60120608f6ddf4098bc324363197c979ee04cb7David Fries FD_CLOEXEC); 691b60120608f6ddf4098bc324363197c979ee04cb7David Fries } 692c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg if (dri2_dpy->fd == -1) { 693c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg _eglLog(_EGL_WARNING, "wayland-egl: could not open %s (%s)", 694c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg dri2_dpy->device_name, strerror(errno)); 695c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg return; 696c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg } 697c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 698c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drmGetMagic(dri2_dpy->fd, &magic); 699c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_drm_authenticate(dri2_dpy->wl_drm, magic); 700c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg} 701c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 702c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergstatic void 7037b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsbergdrm_handle_format(void *data, struct wl_drm *drm, uint32_t format) 7047b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg{ 7057b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 7067b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg 7077b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg switch (format) { 70858dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg case WL_DRM_FORMAT_ARGB8888: 70958dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_dpy->formats |= HAS_ARGB8888; 7107b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg break; 71158dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg case WL_DRM_FORMAT_XRGB8888: 71258dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg dri2_dpy->formats |= HAS_XRGB8888; 7137b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg break; 7147b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg } 7157b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg} 7167b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg 7177b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsbergstatic void 718c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergdrm_handle_authenticated(void *data, struct wl_drm *drm) 719c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg{ 720c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 721c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 722aa87a938fb4cec30dad48642e8d12810e947bc8bBenjamin Franzke dri2_dpy->authenticated = 1; 723c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg} 724c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 725c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsbergstatic const struct wl_drm_listener drm_listener = { 726c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drm_handle_device, 7277b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg drm_handle_format, 728c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg drm_handle_authenticated 729c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg}; 730c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg 731a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic void 732a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergregistry_handle_global(void *data, struct wl_registry *registry, uint32_t name, 733a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg const char *interface, uint32_t version) 734a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg{ 735a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg struct dri2_egl_display *dri2_dpy = data; 736a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 737a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (strcmp(interface, "wl_drm") == 0) { 738a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_drm = 739a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_registry_bind(registry, name, &wl_drm_interface, 1); 740a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_drm_add_listener(dri2_dpy->wl_drm, &drm_listener, dri2_dpy); 741a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg } 742a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg} 743a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 744a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic const struct wl_registry_listener registry_listener = { 745a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg registry_handle_global 746a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg}; 747a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 74893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin FranzkeEGLBoolean 74993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp) 75093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 75193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy; 7527b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg const __DRIconfig *config; 753a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg uint32_t types; 75493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 7557b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg static const unsigned int argb_masks[4] = 7567b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg { 0xff0000, 0xff00, 0xff, 0xff000000 }; 7577b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg static const unsigned int rgb_masks[4] = { 0xff0000, 0xff00, 0xff, 0 }; 75893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 75993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.CreateWindowSurface = dri2_create_window_surface; 76093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.DestroySurface = dri2_destroy_surface; 76193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.SwapBuffers = dri2_swap_buffers; 76293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.Terminate = dri2_terminate; 76393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 76493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy = malloc(sizeof *dri2_dpy); 76593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_dpy) 76693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return _eglError(EGL_BAD_ALLOC, "eglInitialize"); 76793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 768f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng memset(dri2_dpy, 0, sizeof *dri2_dpy); 769f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng 77093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->DriverData = (void *) dri2_dpy; 771b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke if (disp->PlatformDisplay == NULL) { 772b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke dri2_dpy->wl_dpy = wl_display_connect(NULL); 773b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke if (dri2_dpy->wl_dpy == NULL) 774b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke goto cleanup_dpy; 7752a58453e25899e726f02db005de0e1296c326845Benjamin Franzke dri2_dpy->own_device = 1; 776b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke } else { 777b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke dri2_dpy->wl_dpy = disp->PlatformDisplay; 778b8325fd2554aafde3d0b784b7944b1473af7d144Benjamin Franzke } 77993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 780a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue = wl_display_create_queue(dri2_dpy->wl_dpy); 781a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_registry = wl_display_get_registry(dri2_dpy->wl_dpy); 782a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_proxy_set_queue((struct wl_proxy *) dri2_dpy->wl_registry, 783a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg dri2_dpy->wl_queue); 784a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg wl_registry_add_listener(dri2_dpy->wl_registry, 785a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg ®istry_listener, dri2_dpy); 786a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_drm == NULL) 78793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_dpy; 788a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg 789a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0 || dri2_dpy->fd == -1) 790c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg goto cleanup_drm; 79156758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg 792a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg if (roundtrip(dri2_dpy) < 0 || !dri2_dpy->authenticated) 793c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg goto cleanup_fd; 79493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 79593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->driver_name = dri2_get_driver_for_fd(dri2_dpy->fd); 79693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_dpy->driver_name == NULL) { 79793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "DRI2: failed to get driver name"); 79893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_fd; 79993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 80093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 8016b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke if (!dri2_load_driver(disp)) 802c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg goto cleanup_driver_name; 80393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 8043104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER; 8053104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.base.version = 3; 8063104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers; 8073104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer; 8083104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->dri2_loader_extension.getBuffersWithFormat = 80993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_get_buffers_with_format; 81093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 8113104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base; 81293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->extensions[1] = &image_lookup_extension.base; 81316a04e019dcb0f1d50ceab5c8c2eafb56fa60853Kristian Høgsberg dri2_dpy->extensions[2] = &use_invalidate.base; 81416a04e019dcb0f1d50ceab5c8c2eafb56fa60853Kristian Høgsberg dri2_dpy->extensions[3] = NULL; 81593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 81693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_create_screen(disp)) 81793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_driver; 81893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 8192a81037439afb04d4170f674646cdae59619707dKristian Høgsberg types = EGL_WINDOW_BIT; 8207b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg for (i = 0; dri2_dpy->driver_configs[i]; i++) { 8217b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg config = dri2_dpy->driver_configs[i]; 82258dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg if (dri2_dpy->formats & HAS_XRGB8888) 8237b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg dri2_add_config(disp, config, i + 1, 0, types, NULL, rgb_masks); 82458dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg if (dri2_dpy->formats & HAS_ARGB8888) 8257b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg dri2_add_config(disp, config, i + 1, 0, types, NULL, argb_masks); 8267b1d94e5d1f53ac5f59000176aea1d02fc9a1181Kristian Høgsberg } 82793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 8286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke disp->Extensions.WL_bind_wayland_display = EGL_TRUE; 8296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke dri2_dpy->authenticate = dri2_wayland_authenticate; 8306b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 83193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* we're supporting EGL 1.4 */ 83293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->VersionMajor = 1; 83393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->VersionMinor = 4; 83493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 83593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 83693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 83793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_driver: 83893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dlclose(dri2_dpy->driver); 83993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_driver_name: 84093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy->driver_name); 84193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_fd: 84293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke close(dri2_dpy->fd); 843c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg cleanup_drm: 844c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg free(dri2_dpy->device_name); 845c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg wl_drm_destroy(dri2_dpy->wl_drm); 84693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_dpy: 84793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy); 84893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 84993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_FALSE; 85093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 851