19dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg/* 29dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Copyright © 2011 Intel Corporation 39dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * 49dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a 59dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * copy of this software and associated documentation files (the "Software"), 69dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * to deal in the Software without restriction, including without limitation 79dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 89dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the 99dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Software is furnished to do so, subject to the following conditions: 109dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * 119dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * The above copyright notice and this permission notice (including the next 129dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * paragraph) shall be included in all copies or substantial portions of the 139dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Software. 149dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * 159dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 169dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 179dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 189dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 199dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 209dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 219dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 229dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * DEALINGS IN THE SOFTWARE. 239dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * 249dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Authors: 259dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Kristian Høgsberg <krh@bitplanet.net> 269dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg */ 279dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 289dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include <stdlib.h> 299dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include <stdio.h> 307f881c43dfb4f1aeeab3a84125b5c106c191a43fBenjamin Franzke#include <string.h> 319dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include <xf86drm.h> 32ac3c2c8ece9bf4778239e2f81903a685248ab791Benjamin Franzke#include <dlfcn.h> 3332f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <sys/types.h> 3432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <sys/stat.h> 3532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <fcntl.h> 3632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <unistd.h> 379dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 389dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include "egl_dri2.h" 399dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 404a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic struct gbm_bo * 414a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiralock_front_buffer(struct gbm_surface *_surf) 424a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 434a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct gbm_dri_surface *surf = (struct gbm_dri_surface *) _surf; 444a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_surface *dri2_surf = surf->dri_private; 454a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct gbm_bo *bo; 464a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 474a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->current == NULL) { 484a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _eglError(EGL_BAD_SURFACE, "no front buffer"); 494a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return NULL; 504a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 514a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 524a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira bo = dri2_surf->current->bo; 534a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->current->locked = 1; 544a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->current = NULL; 554a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 564a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return bo; 574a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 584a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 594a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic void 604a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirarelease_buffer(struct gbm_surface *_surf, struct gbm_bo *bo) 614a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 624a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct gbm_dri_surface *surf = (struct gbm_dri_surface *) _surf; 634a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_surface *dri2_surf = surf->dri_private; 644a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int i; 654a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 664a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) { 674a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->color_buffers[i].bo == bo) { 684a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->color_buffers[i].locked = 0; 694a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 704a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 714a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 724a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 734a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic int 744a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirahas_free_buffers(struct gbm_surface *_surf) 754a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 764a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct gbm_dri_surface *surf = (struct gbm_dri_surface *) _surf; 774a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_surface *dri2_surf = surf->dri_private; 784a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int i; 794a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 804a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) 814a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (!dri2_surf->color_buffers[i].locked) 824a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return 1; 834a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 844a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return 0; 854a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 864a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 874a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic _EGLSurface * 884a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, 894a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _EGLConfig *conf, EGLNativeWindowType window, 904a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira const EGLint *attrib_list) 914a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 924a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 934a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); 944a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_surface *dri2_surf; 954a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct gbm_dri_surface *surf; 964a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 974a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira (void) drv; 984a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 994a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf = malloc(sizeof *dri2_surf); 1004a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (!dri2_surf) { 1014a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _eglError(EGL_BAD_ALLOC, "dri2_create_surface"); 1024a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return NULL; 1034a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1044a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1054a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira memset(dri2_surf, 0, sizeof *dri2_surf); 1064a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list)) 1074a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira goto cleanup_surf; 1084a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1094a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira switch (type) { 1104a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira case EGL_WINDOW_BIT: 111cf775c9cbf86676aa321eb9665fe38aeba35afc9Elvis Lee if (!window) 112cf775c9cbf86676aa321eb9665fe38aeba35afc9Elvis Lee return NULL; 1134a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira surf = gbm_dri_surface((struct gbm_surface *) window); 1144a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->gbm_surf = surf; 1154a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->base.Width = surf->base.width; 1164a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->base.Height = surf->base.height; 1174a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira surf->dri_private = dri2_surf; 1184a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira break; 1194a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira default: 1204a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira goto cleanup_surf; 1214a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1224a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1234a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->dri_drawable = 1244a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen, 1254a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_conf->dri_double_config, 1264a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->gbm_surf); 1274a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1284a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->dri_drawable == NULL) { 1294a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); 1304a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira goto cleanup_surf; 1314a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1324a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1334a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return &dri2_surf->base; 1344a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1354a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira cleanup_surf: 1364a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira free(dri2_surf); 1374a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1384a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return NULL; 1394a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 1404a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1414a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic _EGLSurface * 1424a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, 1434a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _EGLConfig *conf, EGLNativeWindowType window, 1444a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira const EGLint *attrib_list) 1454a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 1464a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf, 1474a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira window, attrib_list); 1484a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 1494a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1504a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic EGLBoolean 1514a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) 1524a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 1534a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1544a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 1554a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int i; 1564a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1574a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (!_eglPutSurface(surf)) 1584a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return EGL_TRUE; 1594a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1604a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); 1614a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1624a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) { 1634a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->color_buffers[i].bo) 1644a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira gbm_bo_destroy(dri2_surf->color_buffers[i].bo); 1654a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1664a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1674a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira for (i = 0; i < __DRI_BUFFER_COUNT; i++) { 1684a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->dri_buffers[i]) 1694a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, 1704a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->dri_buffers[i]); 1714a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1724a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1734a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira free(surf); 1744a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1754a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return EGL_TRUE; 1764a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 1774a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1784a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic int 1794a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiraget_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) 1804a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 1814a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_display *dri2_dpy = 1824a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_egl_display(dri2_surf->base.Resource.Display); 1834a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct gbm_dri_bo *bo; 1844a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct gbm_dri_surface *surf = dri2_surf->gbm_surf; 1854a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int i, name, pitch; 1864a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1874a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->back == NULL) { 1884a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) { 1894a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (!dri2_surf->color_buffers[i].locked) { 1904a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->back = &dri2_surf->color_buffers[i]; 1914a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira break; 1924a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1934a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1944a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 1954a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 1964a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->back == NULL) 1974a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return -1; 1984a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->back->bo == NULL) 1994a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->back->bo = gbm_bo_create(&dri2_dpy->gbm_dri->base.base, 2004a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira surf->base.width, surf->base.height, 2014a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira surf->base.format, surf->base.flags); 2024a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->back->bo == NULL) 2034a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return -1; 2044a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2054a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira bo = (struct gbm_dri_bo *) dri2_surf->back->bo; 2064a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2074a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_NAME, &name); 2084a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE, &pitch); 2094a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2104a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira buffer->attachment = __DRI_BUFFER_BACK_LEFT; 2114a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira buffer->name = name; 2124a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira buffer->pitch = pitch; 2134a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira buffer->cpp = 4; 2144a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira buffer->flags = 0; 2154a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2164a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return 0; 2174a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 2184a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2194a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic int 2204a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiraget_aux_bo(struct dri2_egl_surface *dri2_surf, 2214a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira unsigned int attachment, unsigned int format, __DRIbuffer *buffer) 2224a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 2234a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_display *dri2_dpy = 2244a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_egl_display(dri2_surf->base.Resource.Display); 2250695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines __DRIbuffer *b = dri2_surf->dri_buffers[attachment]; 2264a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2270695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines if (b == NULL) { 2284a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira b = dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, 2294a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira attachment, format, 2304a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->base.Width, 2314a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->base.Height); 2320695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines dri2_surf->dri_buffers[attachment] = b; 2330695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines } 2344a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (b == NULL) 2354a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return -1; 2364a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2374a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira memcpy(buffer, b, sizeof *buffer); 2384a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2394a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return 0; 2404a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 2414a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2424a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic __DRIbuffer * 2434a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_get_buffers_with_format(__DRIdrawable *driDrawable, 2444a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int *width, int *height, 2454a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira unsigned int *attachments, int count, 2464a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int *out_count, void *loaderPrivate) 2474a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 2484a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_surface *dri2_surf = loaderPrivate; 2494a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int i, j; 2504a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2514a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->buffer_count = 0; 2524a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira for (i = 0, j = 0; i < 2 * count; i += 2, j++) { 2534a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira assert(attachments[i] < __DRI_BUFFER_COUNT); 2544a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira assert(dri2_surf->buffer_count < 5); 2554a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2564a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira switch (attachments[i]) { 2574a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira case __DRI_BUFFER_BACK_LEFT: 2584a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (get_back_bo(dri2_surf, &dri2_surf->buffers[j]) < 0) { 2594a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _eglError(EGL_BAD_ALLOC, "failed to allocate color buffer"); 2604a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return NULL; 2614a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 2624a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira break; 2634a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira default: 2644a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (get_aux_bo(dri2_surf, attachments[i], attachments[i + 1], 2654a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira &dri2_surf->buffers[j]) < 0) { 2664a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _eglError(EGL_BAD_ALLOC, "failed to allocate aux buffer"); 2674a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return NULL; 2684a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 2694a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira break; 2704a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 2714a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 2724a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2734a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira *out_count = j; 2744a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (j == 0) 2754a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return NULL; 2764a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2774a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira *width = dri2_surf->base.Width; 2784a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira *height = dri2_surf->base.Height; 2794a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2804a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return dri2_surf->buffers; 2814a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 2824a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2834a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic __DRIbuffer * 2844a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_get_buffers(__DRIdrawable * driDrawable, 2854a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int *width, int *height, 2864a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira unsigned int *attachments, int count, 2874a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int *out_count, void *loaderPrivate) 2884a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 2894a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira unsigned int *attachments_with_format; 2904a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira __DRIbuffer *buffer; 2914a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira const unsigned int format = 32; 2924a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira int i; 2934a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 2944a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira attachments_with_format = calloc(count * 2, sizeof(unsigned int)); 2954a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (!attachments_with_format) { 2964a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira *out_count = 0; 2974a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return NULL; 2984a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 2994a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3004a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira for (i = 0; i < count; ++i) { 3014a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira attachments_with_format[2*i] = attachments[i]; 3024a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira attachments_with_format[2*i + 1] = format; 3034a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 3044a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3054a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira buffer = 3064a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_get_buffers_with_format(driDrawable, 3074a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira width, height, 3084a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira attachments_with_format, count, 3094a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira out_count, loaderPrivate); 3104a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3114a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira free(attachments_with_format); 3124a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3134a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return buffer; 3144a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 3154a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3164a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic void 3174a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) 3184a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 3194a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira (void) driDrawable; 3204a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira (void) loaderPrivate; 3214a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 3224a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3234a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic EGLBoolean 3244a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) 3254a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{ 3264a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 3274a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 3284a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3294a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->base.Type == EGL_WINDOW_BIT) { 3304a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira if (dri2_surf->current) 3314a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira _eglError(EGL_BAD_SURFACE, "dri2_swap_buffers"); 3324a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->current = dri2_surf->back; 3334a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_surf->back = NULL; 3344a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira } 3354a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3364a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 3374a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); 3384a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 3394a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira return EGL_TRUE; 3404a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira} 3414a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 342e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkestatic _EGLImage * 343e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkedri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx, 344e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke EGLClientBuffer buffer, const EGLint *attr_list) 345e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke{ 346e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 347e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke struct gbm_dri_bo *dri_bo = gbm_dri_bo((struct gbm_bo *) buffer); 348e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke struct dri2_egl_image *dri2_img; 349e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 350e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_img = malloc(sizeof *dri2_img); 351e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke if (!dri2_img) { 352e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap"); 353e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return NULL; 354e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke } 355e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 356e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke if (!_eglInitImage(&dri2_img->base, disp)) { 357e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke free(dri2_img); 358e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return NULL; 359e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke } 360e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 361e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_img->dri_image = dri2_dpy->image->dupImage(dri_bo->image, dri2_img); 362e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke if (dri2_img->dri_image == NULL) { 363e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke free(dri2_img); 364e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap"); 365e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return NULL; 366e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke } 367e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 368e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return &dri2_img->base; 369e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke} 370e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 371e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkestatic _EGLImage * 372e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkedri2_drm_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, 373e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke _EGLContext *ctx, EGLenum target, 374e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke EGLClientBuffer buffer, const EGLint *attr_list) 375e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke{ 376e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke (void) drv; 377e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 378e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke switch (target) { 379e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke case EGL_NATIVE_PIXMAP_KHR: 380e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list); 381e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke default: 382e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list); 383e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke } 384e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke} 385e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 3866b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestatic int 3876b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkedri2_drm_authenticate(_EGLDisplay *disp, uint32_t id) 3886b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{ 3896b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 3906b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 3916b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke return drmAuthMagic(dri2_dpy->fd, id); 3926b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke} 3936b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 3949dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian HøgsbergEGLBoolean 3959dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsbergdri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) 3969dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg{ 3979dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg struct dri2_egl_display *dri2_dpy; 398e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke struct gbm_device *gbm; 39932f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke int fd = -1; 4009dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg int i; 4019dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 4029dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg dri2_dpy = malloc(sizeof *dri2_dpy); 4039dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg if (!dri2_dpy) 4049dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg return _eglError(EGL_BAD_ALLOC, "eglInitialize"); 405e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 406f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng memset(dri2_dpy, 0, sizeof *dri2_dpy); 4079dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 4089dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg disp->DriverData = (void *) dri2_dpy; 4099dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 41032f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke gbm = disp->PlatformDisplay; 41132f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke if (gbm == NULL) { 41232f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke fd = open("/dev/dri/card0", O_RDWR); 4132a58453e25899e726f02db005de0e1296c326845Benjamin Franzke dri2_dpy->own_device = 1; 41432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke gbm = gbm_create_device(fd); 41532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke if (gbm == NULL) 41632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke return EGL_FALSE; 41732f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke } 41832f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke 419e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) { 420e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke free(dri2_dpy); 421e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return EGL_FALSE; 422e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke } 4239dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 424e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->gbm_dri = gbm_dri_device(gbm); 425e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke if (dri2_dpy->gbm_dri->base.type != GBM_DRM_DRIVER_TYPE_DRI) { 426e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke free(dri2_dpy); 427e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke return EGL_FALSE; 4286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke } 4296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 43032f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke if (fd < 0) { 43132f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke fd = dup(gbm_device_get_fd(gbm)); 43232f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke if (fd < 0) { 43332f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke free(dri2_dpy); 43432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke return EGL_FALSE; 43532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke } 43632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke } 43732f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke 43832f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke dri2_dpy->fd = fd; 439e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->device_name = dri2_get_device_name_for_fd(dri2_dpy->fd); 440e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->driver_name = dri2_dpy->gbm_dri->base.driver_name; 441e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 442e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->dri_screen = dri2_dpy->gbm_dri->screen; 443e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->core = dri2_dpy->gbm_dri->core; 444e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->dri2 = dri2_dpy->gbm_dri->dri2; 445e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->image = dri2_dpy->gbm_dri->image; 446410aa3eb45c88dd939dcecaa2aafa8f5afd6e000Ander Conselvan de Oliveira dri2_dpy->flush = dri2_dpy->gbm_dri->flush; 447e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->driver_configs = dri2_dpy->gbm_dri->driver_configs; 4489dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 449e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->gbm_dri->lookup_image = dri2_lookup_egl_image; 450e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_dpy->gbm_dri->lookup_user_data = disp; 4519dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 4524a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->gbm_dri->get_buffers = dri2_get_buffers; 4534a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->gbm_dri->flush_front_buffer = dri2_flush_front_buffer; 4544a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->gbm_dri->get_buffers_with_format = dri2_get_buffers_with_format; 4554a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 4564a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->gbm_dri->base.base.surface_lock_front_buffer = lock_front_buffer; 4574a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->gbm_dri->base.base.surface_release_buffer = release_buffer; 4584a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira dri2_dpy->gbm_dri->base.base.surface_has_free_buffers = has_free_buffers; 4594a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira 460e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_setup_screen(disp); 4619dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 4629dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg for (i = 0; dri2_dpy->driver_configs[i]; i++) 463e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke dri2_add_config(disp, dri2_dpy->driver_configs[i], 4644a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira i + 1, 0, EGL_WINDOW_BIT, NULL, NULL); 465e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 4664a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira drv->API.CreateWindowSurface = dri2_create_window_surface; 4674a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira drv->API.DestroySurface = dri2_destroy_surface; 4684a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira drv->API.SwapBuffers = dri2_swap_buffers; 469e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke drv->API.CreateImageKHR = dri2_drm_create_image_khr; 4709dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 4716b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#ifdef HAVE_WAYLAND_PLATFORM 4726b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke disp->Extensions.WL_bind_wayland_display = EGL_TRUE; 4736b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif 4746b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke dri2_dpy->authenticate = dri2_drm_authenticate; 475e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke 4769dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg /* we're supporting EGL 1.4 */ 4779dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg disp->VersionMajor = 1; 4789dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg disp->VersionMinor = 4; 4799dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg 4809dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg return EGL_TRUE; 4819dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg} 482