platform_wayland.c revision 87dde5b1cd596c4008695ff2db9469f88c09f925
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> 3593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 3693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include "egl_dri2.h" 3793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 3893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 3993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 4093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 4193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 4293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, 4393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativeWindowType window, 4493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 4593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 4693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 4793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); 4893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf; 4993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_buffer *dri2_buf; 5093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 5193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 5293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 5393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 5493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf = malloc(sizeof *dri2_surf); 5593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf) { 5693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2_create_surface"); 5793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 5893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 5993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 6093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list)) 6193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_surf; 6293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 6393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) 6493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[i] = NULL; 6593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 6693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) 6793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i] = NULL; 6893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 6993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->block_swap_buffers = EGL_FALSE; 7093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 7193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke switch (type) { 7293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case EGL_WINDOW_BIT: 7393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win = (struct wl_egl_window *) window; 7493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->type = DRI2_WINDOW_SURFACE; 7593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 7693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = -1; 7793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = -1; 7893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 7993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case EGL_PIXMAP_BIT: 8093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix = (struct wl_egl_pixmap *) window; 8193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->type = DRI2_PIXMAP_SURFACE; 8293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 8393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = dri2_surf->wl_pix->width; 8493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = dri2_surf->wl_pix->height; 8593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 8693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->wl_pix->name > 0) { 8793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf = dri2_surf->wl_pix->driver_private; 8893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] = dri2_buf->dri_buffer; 8993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 9093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 9193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke default: 9293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_surf; 9393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 9493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 9593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_drawable = 9693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen, 9787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke type == EGL_WINDOW_BIT ? 9887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_conf->dri_double_config : 9987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_conf->dri_single_config, 10087dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_surf); 10193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_drawable == NULL) { 10293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); 10393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_dri_drawable; 10493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 10593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 10693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return &dri2_surf->base; 10793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 10893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_dri_drawable: 10993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable); 11093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_surf: 11193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_surf); 11293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 11393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 11493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 11593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 11693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 11793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 11893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 11993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 12093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, 12193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativeWindowType window, 12293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 12393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 12493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf, 12593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke window, attrib_list); 12693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 12793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 12893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLSurface * 12993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *disp, 13093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLConfig *conf, EGLNativePixmapType pixmap, 13193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const EGLint *attrib_list) 13293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 13393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_surface(drv, disp, EGL_PIXMAP_BIT, conf, 13493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke pixmap, attrib_list); 13593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 13693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 13793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 13893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglDestroySurface(), drv->API.DestroySurface(). 13993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 14093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 14193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) 14293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 14393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 14493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 14593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 14693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 14793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 14893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 14993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!_eglPutSurface(surf)) 15093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 15193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 15293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); 15393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 15493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) 15593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->wl_drm_buffer[i]) 15693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]); 15793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 15893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) 15993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_buffers[i] && !(i == __DRI_BUFFER_FRONT_LEFT && 16093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->type == DRI2_PIXMAP_SURFACE)) 16193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 16293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i]); 16393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 16493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(surf); 16593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 16693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 16793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 16893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 16993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 17093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_wl_egl_pixmap_destroy(struct wl_egl_pixmap *egl_pixmap) 17193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 17293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_buffer *dri2_buf = egl_pixmap->driver_private; 17393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 17493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(dri2_buf); 17593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 17693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri2_dpy->dri2->releaseBuffer(dri2_buf->dri2_dpy->dri_screen, 17793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri_buffer); 17893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 17993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_buf); 18093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 18193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke egl_pixmap->driver_private = NULL; 18293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke egl_pixmap->destroy = NULL; 18393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke egl_pixmap->name = 0; 18493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 18593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 18693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 18787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkedri2_process_back_buffer(struct dri2_egl_surface *dri2_surf, unsigned format) 18893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 18993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = 19093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 19193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 19287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke (void) format; 19387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 19493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke switch (dri2_surf->type) { 19593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case DRI2_WINDOW_SURFACE: 19687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke /* allocate a front buffer for our double-buffered window*/ 19787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] = 19893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 19987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke __DRI_BUFFER_FRONT_LEFT, format, 20093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 20193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 20287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke default: 20387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke break; 20487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke } 20587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke} 20687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 20787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkestatic void 20887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzkedri2_process_front_buffer(struct dri2_egl_surface *dri2_surf, unsigned format) 20987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke{ 21087dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke struct dri2_egl_display *dri2_dpy = 21187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 21287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke struct dri2_egl_buffer *dri2_buf; 21387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke 21487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke switch (dri2_surf->type) { 21593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case DRI2_PIXMAP_SURFACE: 21693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf = malloc(sizeof *dri2_buf); 21793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_buf) 21893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return; 21993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 22093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri_buffer = dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]; 22193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri2_dpy = dri2_dpy; 22293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 22393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix->name = dri2_buf->dri_buffer->name; 22493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix->stride = dri2_buf->dri_buffer->pitch; 22593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix->driver_private = dri2_buf; 22693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_pix->destroy = dri2_wl_egl_pixmap_destroy; 22793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 22893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke default: 22993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke break; 23093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 23193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 23293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 23393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic __DRIbuffer * 23493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_get_buffers_with_format(__DRIdrawable * driDrawable, 23593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *width, int *height, 23693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments, int count, 23793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *out_count, void *loaderPrivate) 23893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 23993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = loaderPrivate; 24093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = 24193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 24293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 24393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 24493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->type == DRI2_WINDOW_SURFACE && 24593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (dri2_surf->base.Width != dri2_surf->wl_win->width || 24693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height != dri2_surf->wl_win->height)) { 24793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < __DRI_BUFFER_COUNT; ++i) { 24893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_buffers[i]) { 24993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 25093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i]); 25193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[i] = NULL; 25293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 25393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 25493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 25593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width = dri2_surf->wl_win->width; 25693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Height = dri2_surf->wl_win->height; 25793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx = dri2_surf->wl_win->dx; 25893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dy = dri2_surf->wl_win->dy; 25993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 26093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < WL_BUFFER_COUNT; ++i) { 26193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->wl_drm_buffer[i]) 26293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_buffer_destroy(dri2_surf->wl_drm_buffer[i]); 26393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[i] = NULL; 26493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 26593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 26693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 26793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->buffer_count = 0; 26893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < 2*count; i+=2) { 26993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(attachments[i] < __DRI_BUFFER_COUNT); 27093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(dri2_surf->buffer_count < 5); 27193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 27293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->dri_buffers[attachments[i]] == NULL) { 27393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 27493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[attachments[i]] = 27593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 27693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments[i], attachments[i+1], 27793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 27893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 27993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf->dri_buffers[attachments[i]]) 28093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke continue; 28193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 28293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (attachments[i] == __DRI_BUFFER_FRONT_LEFT) 28393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_process_front_buffer(dri2_surf, attachments[i+1]); 28487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke else if (attachments[i] == __DRI_BUFFER_BACK_LEFT) 28587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_process_back_buffer(dri2_surf, attachments[i+1]); 28693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 28793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 28893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke memcpy(&dri2_surf->buffers[dri2_surf->buffer_count], 28993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[attachments[i]], 29093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke sizeof(__DRIbuffer)); 29193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 29293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->buffer_count++; 29393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 29493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 29593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke assert(dri2_surf->type == DRI2_PIXMAP_SURFACE || 29693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]); 29793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 29893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *out_count = dri2_surf->buffer_count; 29993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->buffer_count == 0) 30093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 30193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 30293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *width = dri2_surf->base.Width; 30393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *height = dri2_surf->base.Height; 30493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 30593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_surf->buffers; 30693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 30793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 30893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic __DRIbuffer * 30993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_get_buffers(__DRIdrawable * driDrawable, 31093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *width, int *height, 31193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments, int count, 31293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int *out_count, void *loaderPrivate) 31393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 31493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke unsigned int *attachments_with_format; 31593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRIbuffer *buffer; 31693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const unsigned int format = 32; 31793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 31893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 31993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format = calloc(count * 2, sizeof(unsigned int)); 32093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!attachments_with_format) { 32193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *out_count = 0; 32293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 32393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 32493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 32593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; i < count; ++i) { 32693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format[2*i] = attachments[i]; 32793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format[2*i + 1] = format; 32893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 32993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 33093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke buffer = 33193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_get_buffers_with_format(driDrawable, 33293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke width, height, 33393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke attachments_with_format, count, 33493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke out_count, loaderPrivate); 33593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 33693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(attachments_with_format); 33793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 33893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return buffer; 33993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 34093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 34193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 34293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 34393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) 34493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 34593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) driDrawable; 34693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 34793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* FIXME: Does EGL support front buffer rendering at all? */ 34893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 34993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#if 0 35093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = loaderPrivate; 35193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 35293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2WaitGL(dri2_surf); 35393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#else 35493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) loaderPrivate; 35593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#endif 35693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 35793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 35893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic struct wl_buffer * 35993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkewayland_create_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) 36093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 36193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = 36293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_egl_display(dri2_surf->base.Resource.Display); 36393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 36493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return wl_drm_create_buffer(dri2_dpy->wl_dpy->drm, buffer->name, 36593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height, 36693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke buffer->pitch, dri2_surf->wl_win->visual); 36793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 36893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 36993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void 37093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkewayland_frame_callback(void *data, uint32_t time) 37193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 37293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = data; 37393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 37493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->block_swap_buffers = EGL_FALSE; 37593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 37693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 37793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic inline void 37893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkepointer_swap(const void **p1, const void **p2) 37993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 38093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke const void *tmp = *p1; 38193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *p1 = *p2; 38293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke *p2 = tmp; 38393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 38493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 38593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 38693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglSwapBuffers(), drv->API.SwapBuffers(). 38793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 38893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 38993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) 39093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 39193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 39293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 39393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); 39493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 39593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke while (dri2_surf->block_swap_buffers) 39693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_display_iterate(dri2_dpy->wl_dpy->display, WL_DISPLAY_READABLE); 39793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 39893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->block_swap_buffers = EGL_TRUE; 39993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_display_frame_callback(dri2_dpy->wl_dpy->display, 40093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wayland_frame_callback, dri2_surf); 40193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 40293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_surf->type == DRI2_WINDOW_SURFACE) { 40393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke pointer_swap( 40493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT], 40593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (const void **) &dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]); 40693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 40793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]->attachment = 40893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_FRONT_LEFT; 40993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->attachment = 41093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_BACK_LEFT; 41193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 41293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke pointer_swap((const void **) &dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT], 41393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (const void **) &dri2_surf->wl_drm_buffer[WL_BUFFER_BACK]); 41493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 41593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT]) 41693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT] = 41793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wayland_create_buffer(dri2_surf, 41887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT]); 41993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 42093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_surface_attach(dri2_surf->wl_win->surface, 42193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_drm_buffer[WL_BUFFER_FRONT], 42293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx, dri2_surf->dy); 42393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 42493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win->attached_width = dri2_surf->base.Width; 42593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->wl_win->attached_height = dri2_surf->base.Height; 42693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* reset resize growing parameters */ 42793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dx = 0; 42893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->dy = 0; 42993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 43093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_surface_damage(dri2_surf->wl_win->surface, 0, 0, 43193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_surf->base.Width, dri2_surf->base.Height); 43293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 43393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 43493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLContext *ctx; 43593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_drv->glFlush) { 43693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke ctx = _eglGetCurrentContext(); 43793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (ctx && ctx->DrawSurface == &dri2_surf->base) 43893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_drv->glFlush(); 43993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 44093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 44193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 44293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); 44393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 44493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 44593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 44693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 44793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 44893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglCreateImageKHR(), drv->API.CreateImageKHR(). 44993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 45093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLImage * 45193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx, 45293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGLClientBuffer buffer, const EGLint *attr_list) 45393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 45493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 45593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct wl_egl_pixmap *wl_egl_pixmap = (struct wl_egl_pixmap *) buffer; 45693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_buffer *dri2_buf; 45793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGLint wl_attr_list[] = { 45893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_WIDTH, 0, 45993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_HEIGHT, 0, 46093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_DRM_BUFFER_STRIDE_MESA, 0, 46193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, 46293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGL_NONE 46393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke }; 46493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 46593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf = malloc(sizeof *dri2_buf); 46693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_buf) 46793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return NULL; 46893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 46993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri2_dpy = dri2_dpy; 47093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_buf->dri_buffer = 47193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 47293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke __DRI_BUFFER_FRONT_LEFT, 32, 47393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->width, 47493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->height); 47593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 47693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->name = dri2_buf->dri_buffer->name; 47793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->stride = dri2_buf->dri_buffer->pitch; 47893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->destroy = dri2_wl_egl_pixmap_destroy; 47993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_egl_pixmap->driver_private = dri2_buf; 48093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 48193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_attr_list[1] = wl_egl_pixmap->width; 48293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_attr_list[3] = wl_egl_pixmap->height; 48393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke wl_attr_list[5] = wl_egl_pixmap->stride / 4; 48493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 48593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 48693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_image_khr(disp->Driver, disp, ctx, EGL_DRM_BUFFER_MESA, 48793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (EGLClientBuffer)(intptr_t) wl_egl_pixmap->name, wl_attr_list); 48893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 48993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 49093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic _EGLImage * 49193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_wayland_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, 49293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _EGLContext *ctx, EGLenum target, 49393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke EGLClientBuffer buffer, const EGLint *attr_list) 49493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 49593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke (void) drv; 49693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 49793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke switch (target) { 49893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke case EGL_NATIVE_PIXMAP_KHR: 49993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list); 50093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke default: 50193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list); 50293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 50393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 50493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 50593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke/** 50693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke * Called via eglTerminate(), drv->API.Terminate(). 50793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke */ 50893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic EGLBoolean 50993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_terminate(_EGLDriver *drv, _EGLDisplay *disp) 51093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 51193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 51293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 51393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglReleaseDisplayResources(drv, disp); 51493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglCleanupDisplay(disp); 51593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 51693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); 51793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke close(dri2_dpy->fd); 51893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dlclose(dri2_dpy->driver); 51993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy->driver_name); 52093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy); 52193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->DriverData = NULL; 52293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 52493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 52593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 52656758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsbergstatic void 52756758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsbergsync_callback(void *data) 52856758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg{ 52956758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg int *done = data; 53056758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg 53156758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg *done = 1; 53256758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg} 53356758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg 53456758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsbergstatic void 53556758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsbergforce_roundtrip(struct wl_display *display) 53656758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg{ 53756758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg int done = 0; 53856758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg 53956758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg wl_display_sync_callback(display, sync_callback, &done); 54056758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg wl_display_iterate(display, WL_DISPLAY_WRITABLE); 54156758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg while (!done) 54256758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg wl_display_iterate(display, WL_DISPLAY_READABLE); 54356758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg} 54493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 54593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin FranzkeEGLBoolean 54693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkedri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp) 54793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{ 54893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke struct dri2_egl_display *dri2_dpy; 54993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke int i; 55093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 55193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.CreateWindowSurface = dri2_create_window_surface; 55293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.CreatePixmapSurface = dri2_create_pixmap_surface; 55393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.DestroySurface = dri2_destroy_surface; 55493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.SwapBuffers = dri2_swap_buffers; 55593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.CreateImageKHR = dri2_wayland_create_image_khr; 55693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke drv->API.Terminate = dri2_terminate; 55793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 55893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy = malloc(sizeof *dri2_dpy); 55993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_dpy) 56093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return _eglError(EGL_BAD_ALLOC, "eglInitialize"); 56193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 56293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->DriverData = (void *) dri2_dpy; 56393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->wl_dpy = disp->PlatformDisplay; 56493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 56556758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg if (dri2_dpy->wl_dpy->fd == -1) 56656758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg force_roundtrip(dri2_dpy->wl_dpy->display); 56756758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg if (dri2_dpy->wl_dpy->fd == -1) 56856758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg goto cleanup_dpy; 56956758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg 57093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->fd = dup(dri2_dpy->wl_dpy->fd); 57193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_dpy->fd < 0) { 57293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "DRI2: failed to dup fd"); 57393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_dpy; 57493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 57556758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg 57656758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg if (!dri2_dpy->wl_dpy->authenticated) 57756758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg force_roundtrip(dri2_dpy->wl_dpy->display); 57856758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg if (!dri2_dpy->wl_dpy->authenticated) 57956758c839ff29bd168529535a4816bff3b79cde5Kristian Høgsberg goto cleanup_dpy; 58093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 58193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->driver_name = dri2_get_driver_for_fd(dri2_dpy->fd); 58293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (dri2_dpy->driver_name == NULL) { 58393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke _eglError(EGL_BAD_ALLOC, "DRI2: failed to get driver name"); 58493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_fd; 58593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke } 58693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 58793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_load_driver(disp)) 58893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_driver_name; 58993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 59093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->loader_extension.base.name = __DRI_DRI2_LOADER; 59193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->loader_extension.base.version = 3; 59293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->loader_extension.getBuffers = dri2_get_buffers; 59393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->loader_extension.flushFrontBuffer = dri2_flush_front_buffer; 59493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->loader_extension.getBuffersWithFormat = 59593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_get_buffers_with_format; 59693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 59793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->extensions[0] = &dri2_dpy->loader_extension.base; 59893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->extensions[1] = &image_lookup_extension.base; 59993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_dpy->extensions[2] = NULL; 60093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 60193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke if (!dri2_create_screen(disp)) 60293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke goto cleanup_driver; 60393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 60493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke for (i = 0; dri2_dpy->driver_configs[i]; i++) 60593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dri2_add_config(disp, dri2_dpy->driver_configs[i], i + 1, 0, 60687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke EGL_WINDOW_BIT | EGL_PIXMAP_BIT, NULL); 60793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 60893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 60993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->Extensions.MESA_drm_image = EGL_TRUE; 61093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->Extensions.KHR_image_base = EGL_TRUE; 61193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->Extensions.KHR_image_pixmap = EGL_TRUE; 61293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->Extensions.KHR_gl_renderbuffer_image = EGL_TRUE; 61393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->Extensions.KHR_gl_texture_2D_image = EGL_TRUE; 61493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 61593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke /* we're supporting EGL 1.4 */ 61693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->VersionMajor = 1; 61793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke disp->VersionMinor = 4; 61893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 61993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_TRUE; 62093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 62193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_driver: 62293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke dlclose(dri2_dpy->driver); 62393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_driver_name: 62493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy->driver_name); 62593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_fd: 62693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke close(dri2_dpy->fd); 62793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke cleanup_dpy: 62893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke free(dri2_dpy); 62993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke 63093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke return EGL_FALSE; 63193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke} 632