12ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke/* 22ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Copyright © 2011 Intel Corporation 32ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 42ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Permission is hereby granted, free of charge, to any person obtaining a 52ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * copy of this software and associated documentation files (the "Software"), 62ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * to deal in the Software without restriction, including without limitation 72ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * and/or sell copies of the Software, and to permit persons to whom the 92ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Software is furnished to do so, subject to the following conditions: 102ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 112ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * The above copyright notice and this permission notice (including the next 122ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * paragraph) shall be included in all copies or substantial portions of the 132ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Software. 142ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 152ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 162ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 172ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 182ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 192ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 202ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 212ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 222ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * DEALINGS IN THE SOFTWARE. 232ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 242ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Authors: 252ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Benjamin Franzke <benjaminfranzke@googlemail.com> 262ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke */ 272ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 282ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <stdio.h> 292ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <stdlib.h> 302ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <stddef.h> 312ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <stdint.h> 322ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <string.h> 332ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <limits.h> 342ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 352ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <sys/types.h> 3679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg#include <sys/mman.h> 372ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <unistd.h> 382ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <dlfcn.h> 3979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg#include <xf86drm.h> 402ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 412ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <GL/gl.h> /* dri_interface needs GL types */ 422ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <GL/internal/dri_interface.h> 432ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 442ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include "gbm_driint.h" 452ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 462ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include "gbmint.h" 472ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 4844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg/* For importing wl_buffer */ 4944f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg#if HAVE_WAYLAND_PLATFORM 5044f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg#include "../../../egl/wayland/wayland-drm/wayland-drm.h" 5144f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg#endif 5244f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg 532ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic __DRIimage * 542ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkedri_lookup_egl_image(__DRIscreen *screen, void *image, void *data) 552ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 562ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_device *dri = data; 572ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 582ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri->lookup_image == NULL) 592ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return NULL; 602ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 612ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return dri->lookup_image(screen, image, dri->lookup_user_data); 622ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 632ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 64fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveirastatic __DRIbuffer * 65fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveiradri_get_buffers(__DRIdrawable * driDrawable, 66fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira int *width, int *height, 67fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira unsigned int *attachments, int count, 68fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira int *out_count, void *data) 69fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira{ 70fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira struct gbm_dri_surface *surf = data; 71fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira struct gbm_dri_device *dri = gbm_dri_device(surf->base.gbm); 72fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 73fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira if (dri->get_buffers == NULL) 74fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira return NULL; 75fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 76fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira return dri->get_buffers(driDrawable, width, height, attachments, 77fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira count, out_count, surf->dri_private); 78fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira} 79fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 80fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveirastatic void 81fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveiradri_flush_front_buffer(__DRIdrawable * driDrawable, void *data) 82fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira{ 83fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira struct gbm_dri_surface *surf = data; 84fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira struct gbm_dri_device *dri = gbm_dri_device(surf->base.gbm); 85fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 86fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira if (dri->flush_front_buffer != NULL) 87fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira dri->flush_front_buffer(driDrawable, surf->dri_private); 88fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira} 89fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 90fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveirastatic __DRIbuffer * 91fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveiradri_get_buffers_with_format(__DRIdrawable * driDrawable, 92fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira int *width, int *height, 93fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira unsigned int *attachments, int count, 94fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira int *out_count, void *data) 95fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira{ 96fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira struct gbm_dri_surface *surf = data; 97fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira struct gbm_dri_device *dri = gbm_dri_device(surf->base.gbm); 98fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 99fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira if (dri->get_buffers_with_format == NULL) 100fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira return NULL; 101fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 102fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira return 103fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira dri->get_buffers_with_format(driDrawable, width, height, attachments, 104fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira count, out_count, surf->dri_private); 105fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira} 106fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 107ab6e081914ed2d9f8e166d6cfb9fd9998a45181dBenjamin Franzkestatic const __DRIuseInvalidateExtension use_invalidate = { 1082ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke { __DRI_USE_INVALIDATE, 1 } 1092ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke}; 1102ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 111ab6e081914ed2d9f8e166d6cfb9fd9998a45181dBenjamin Franzkestatic const __DRIimageLookupExtension image_lookup_extension = { 1122ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke { __DRI_IMAGE_LOOKUP, 1 }, 1132ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri_lookup_egl_image 1142ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke}; 1152ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 116fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveiraconst __DRIdri2LoaderExtension dri2_loader_extension = { 117fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira { __DRI_DRI2_LOADER, 3 }, 118fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira dri_get_buffers, 119fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira dri_flush_front_buffer, 120fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira dri_get_buffers_with_format, 121fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira}; 122fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira 1232ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestruct dri_extension_match { 1242ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke const char *name; 1252ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke int version; 1262ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke int offset; 1272ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke}; 1282ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1292ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic struct dri_extension_match dri_core_extensions[] = { 130410aa3eb45c88dd939dcecaa2aafa8f5afd6e000Ander Conselvan de Oliveira { __DRI2_FLUSH, 1, offsetof(struct gbm_dri_device, flush) }, 1312ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke { __DRI_IMAGE, 1, offsetof(struct gbm_dri_device, image) }, 1322ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke { NULL, 0, 0 } 1332ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke}; 1342ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1352ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic struct dri_extension_match gbm_dri_device_extensions[] = { 1362ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke { __DRI_CORE, 1, offsetof(struct gbm_dri_device, core) }, 1372ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke { __DRI_DRI2, 1, offsetof(struct gbm_dri_device, dri2) }, 1382ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke { NULL, 0, 0 } 1392ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke}; 1402ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1412ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic int 1422ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkedri_bind_extensions(struct gbm_dri_device *dri, 1432ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct dri_extension_match *matches, 1442ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke const __DRIextension **extensions) 1452ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 1462ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke int i, j, ret = 0; 1472ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke void *field; 1482ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1492ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke for (i = 0; extensions[i]; i++) { 1502ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke for (j = 0; matches[j].name; j++) { 1512ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (strcmp(extensions[i]->name, matches[j].name) == 0 && 1522ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke extensions[i]->version >= matches[j].version) { 1532ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke field = ((char *) dri + matches[j].offset); 1542ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke *(const __DRIextension **) field = extensions[i]; 1552ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 1562ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 1572ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 1582ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1592ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke for (j = 0; matches[j].name; j++) { 1602ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke field = ((char *) dri + matches[j].offset); 1612ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (*(const __DRIextension **) field == NULL) { 1622ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke ret = -1; 1632ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 1642ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 1652ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1662ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return ret; 1672ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 1682ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1692ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic int 1702ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkedri_load_driver(struct gbm_dri_device *dri) 1712ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 1722ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke const __DRIextension **extensions; 1732ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke char path[PATH_MAX], *search_paths, *p, *next, *end; 1742ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1752ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke search_paths = NULL; 1762ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (geteuid() == getuid()) { 1772ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke /* don't allow setuid apps to use GBM_DRIVERS_PATH */ 1782ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke search_paths = getenv("GBM_DRIVERS_PATH"); 1792ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 1802ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (search_paths == NULL) 1812ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke search_paths = DEFAULT_DRIVER_DIR; 1822ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1832ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->driver = NULL; 1842ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke end = search_paths + strlen(search_paths); 1852ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke for (p = search_paths; p < end && dri->driver == NULL; p = next + 1) { 1862ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke int len; 1872ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke next = strchr(p, ':'); 1882ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (next == NULL) 1892ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke next = end; 1902ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 1912ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke len = next - p; 1922ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#if GLX_USE_TLS 1932ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke snprintf(path, sizeof path, 1942ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke "%.*s/tls/%s_dri.so", len, p, dri->base.driver_name); 1952ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); 1962ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#endif 1972ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri->driver == NULL) { 1982ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke snprintf(path, sizeof path, 1992ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke "%.*s/%s_dri.so", len, p, dri->base.driver_name); 2002ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); 2012ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri->driver == NULL) 2022ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fprintf(stderr, "failed to open %s: %s\n", path, dlerror()); 2032ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 2042ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 2052ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2062ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri->driver == NULL) { 2072ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fprintf(stderr, "gbm: failed to open any driver (search paths %s)", 2082ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke search_paths); 2092ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return -1; 2102ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 2112ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2122ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke extensions = dlsym(dri->driver, __DRI_DRIVER_EXTENSIONS); 2132ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (extensions == NULL) { 2142ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fprintf(stderr, "gbm: driver exports no extensions (%s)", dlerror()); 2152ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dlclose(dri->driver); 2162ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return -1; 2172ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 2182ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2192ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2202ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri_bind_extensions(dri, gbm_dri_device_extensions, extensions) < 0) { 2212ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dlclose(dri->driver); 2222ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fprintf(stderr, "failed to bind extensions\n"); 2232ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return -1; 2242ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 2252ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2262ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return 0; 2272ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 2282ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2292ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic int 2302ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkedri_screen_create(struct gbm_dri_device *dri) 2312ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 2322ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke const __DRIextension **extensions; 2332ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke int ret = 0; 2342ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2352ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.driver_name = dri_fd_get_driver_name(dri->base.base.fd); 2362ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri->base.driver_name == NULL) 2372ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return -1; 2382ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2392ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke ret = dri_load_driver(dri); 2402ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (ret) { 2412ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fprintf(stderr, "failed to load driver: %s\n", dri->base.driver_name); 2422ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return ret; 2432ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke }; 2442ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2452ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->extensions[0] = &image_lookup_extension.base; 2462ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->extensions[1] = &use_invalidate.base; 247fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira dri->extensions[2] = &dri2_loader_extension.base; 248fd6acb97fb9164b57daf3ca4b1bd637ca4685b64Ander Conselvan de Oliveira dri->extensions[3] = NULL; 2492ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2502ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri->dri2 == NULL) 2512ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return -1; 2522ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2532ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->screen = dri->dri2->createNewScreen(0, dri->base.base.fd, 2542ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->extensions, 2552ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke &dri->driver_configs, dri); 256eeed782ecb9fa92a958cb650c0a5a536556dc611RALOVICH, Kristóf if (dri->screen == NULL) 257eeed782ecb9fa92a958cb650c0a5a536556dc611RALOVICH, Kristóf return -1; 2582ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2592ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke extensions = dri->core->getExtensions(dri->screen); 2602ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (dri_bind_extensions(dri, dri_core_extensions, extensions) < 0) { 2612ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke ret = -1; 2622ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke goto free_screen; 2632ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 2642ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2652ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->lookup_image = NULL; 2662ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->lookup_user_data = NULL; 2672ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2682ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return 0; 2692ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2702ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkefree_screen: 2712ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->core->destroyScreen(dri->screen); 2722ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2732ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return ret; 2742ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 2752ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2762ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic int 2772ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkegbm_dri_is_format_supported(struct gbm_device *gbm, 2788de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes uint32_t format, 2792ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke uint32_t usage) 2802ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 2812ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke switch (format) { 2822ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke case GBM_BO_FORMAT_XRGB8888: 2838de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case GBM_FORMAT_XRGB8888: 2842ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke break; 2852ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke case GBM_BO_FORMAT_ARGB8888: 2868de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case GBM_FORMAT_ARGB8888: 2872ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (usage & GBM_BO_USE_SCANOUT) 2882ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return 0; 2892ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke break; 2902ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke default: 2912ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return 0; 2922ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 2932ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2942ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (usage & GBM_BO_USE_CURSOR_64X64 && 2952ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke usage & GBM_BO_USE_RENDERING) 2962ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return 0; 2972ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 2982ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return 1; 2992ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 3002ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 3014fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsbergstatic int 3024fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberggbm_dri_bo_write(struct gbm_bo *_bo, const void *buf, size_t count) 3034fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg{ 3044fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg struct gbm_dri_bo *bo = gbm_dri_bo(_bo); 3054fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 30679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (bo->image != NULL) 3074fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg return -1; 3084fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 30979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg memcpy(bo->map, buf, count); 310a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 311a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz return 0; 3124fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg} 3134fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 3142ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic void 3152ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkegbm_dri_bo_destroy(struct gbm_bo *_bo) 3162ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 3172ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm); 3182ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_bo *bo = gbm_dri_bo(_bo); 31979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg struct drm_mode_destroy_dumb arg; 3202ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 32179d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (bo->image != NULL) { 322a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz dri->image->destroyImage(bo->image); 32379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg } else { 32479d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg munmap(bo->map, bo->size); 32579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg memset(&arg, 0, sizeof(arg)); 32679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg arg.handle = bo->handle; 32779d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg drmIoctl(dri->base.base.fd, DRM_IOCTL_MODE_DESTROY_DUMB, &arg); 32879d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg } 32979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 3302ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke free(bo); 3312ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 3322ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 3338de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnesstatic uint32_t 3348de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnesgbm_dri_to_gbm_format(uint32_t dri_format) 3358de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes{ 3368de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes uint32_t ret = 0; 3378de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes 3388de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes switch (dri_format) { 3398de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_FORMAT_RGB565: 3408de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes ret = GBM_FORMAT_RGB565; 3418de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes break; 3428de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_FORMAT_XRGB8888: 3438de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes ret = GBM_FORMAT_XRGB8888; 3448de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes break; 3458de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_FORMAT_ARGB8888: 3468de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes ret = GBM_FORMAT_ARGB8888; 3478de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes break; 3488de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_FORMAT_ABGR8888: 3498de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes ret = GBM_FORMAT_ABGR8888; 3508de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes break; 3518de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes default: 3528de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes ret = 0; 3538de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes break; 3548de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes } 3558de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes 3568de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes return ret; 3578de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes} 3588de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes 3592ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic struct gbm_bo * 36044f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberggbm_dri_bo_import(struct gbm_device *gbm, 36144f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg uint32_t type, void *buffer, uint32_t usage) 3622ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 3632ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_device *dri = gbm_dri_device(gbm); 3642ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_bo *bo; 36544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg __DRIimage *image; 366221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg unsigned dri_use = 0; 36700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz int gbm_format; 36844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg 36993ebec87ed46978942464a6f08801ae06e86fa8bJakob Bornecrantz /* Required for query image WIDTH & HEIGHT */ 37093ebec87ed46978942464a6f08801ae06e86fa8bJakob Bornecrantz if (dri->image->base.version < 4) 37193ebec87ed46978942464a6f08801ae06e86fa8bJakob Bornecrantz return NULL; 37293ebec87ed46978942464a6f08801ae06e86fa8bJakob Bornecrantz 37344f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg switch (type) { 37444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg#if HAVE_WAYLAND_PLATFORM 37544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case GBM_BO_IMPORT_WL_BUFFER: 37644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg { 37744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg struct wl_drm_buffer *wb = (struct wl_drm_buffer *) buffer; 37844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg 3790a72dbd3504e7a97750561a50556978b13bc0361Kristian Høgsberg if (!wayland_buffer_is_drm(buffer)) 3800a72dbd3504e7a97750561a50556978b13bc0361Kristian Høgsberg return NULL; 3810a72dbd3504e7a97750561a50556978b13bc0361Kristian Høgsberg 38244f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg image = wb->driver_buffer; 38300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 38444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg switch (wb->format) { 38544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case WL_DRM_FORMAT_XRGB8888: 38644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg gbm_format = GBM_FORMAT_XRGB8888; 38744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg break; 38844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case WL_DRM_FORMAT_ARGB8888: 38944f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg gbm_format = GBM_FORMAT_ARGB8888; 39044f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg break; 39144f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case WL_DRM_FORMAT_YUYV: 39244f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg gbm_format = GBM_FORMAT_YUYV; 39344f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg break; 39444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg default: 39544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg return NULL; 39644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg } 39744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg break; 39844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg } 39944f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg#endif 4002ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 40144f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case GBM_BO_IMPORT_EGL_IMAGE: 40244f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg { 40300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz int dri_format; 40444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg if (dri->lookup_image == NULL) 40544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg return NULL; 40644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg 40744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg image = dri->lookup_image(dri->screen, buffer, dri->lookup_user_data); 40844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &dri_format); 40944f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg gbm_format = gbm_dri_to_gbm_format(dri_format); 41000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (gbm_format == 0) 41100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return NULL; 41244f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg break; 41344f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg } 4142ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 41544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg default: 4162ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return NULL; 41744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg } 41844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg 4192ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 4202ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke bo = calloc(1, sizeof *bo); 4212ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (bo == NULL) 4222ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return NULL; 4232ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 42400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz bo->image = dri->image->dupImage(image, NULL); 4252ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 426221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (usage & GBM_BO_USE_SCANOUT) 427221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg dri_use |= __DRI_IMAGE_USE_SCANOUT; 428221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (usage & GBM_BO_USE_CURSOR_64X64) 429221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg dri_use |= __DRI_IMAGE_USE_CURSOR; 430221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (dri->image->base.version >= 2 && 431221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg !dri->image->validateUsage(bo->image, dri_use)) { 432221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg free(bo); 433221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return NULL; 434221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg } 435221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 43644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg bo->base.base.gbm = gbm; 43744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg bo->base.base.format = gbm_format; 43800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 43900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_WIDTH, 44000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz (int*)&bo->base.base.width); 44100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HEIGHT, 44200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz (int*)&bo->base.base.height); 44300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE, 44400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz (int*)&bo->base.base.stride); 4452ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE, 4462ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke &bo->base.base.handle.s32); 4472ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 4482ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return &bo->base.base; 4492ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 4502ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 4512ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic struct gbm_bo * 45279d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsbergcreate_dumb(struct gbm_device *gbm, 4532ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke uint32_t width, uint32_t height, 4548de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes uint32_t format, uint32_t usage) 4552ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 4562ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_device *dri = gbm_dri_device(gbm); 45779d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg struct drm_mode_create_dumb create_arg; 45879d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg struct drm_mode_map_dumb map_arg; 4592ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_bo *bo; 46079d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg struct drm_mode_destroy_dumb destroy_arg; 46179d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg int ret; 46279d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 46379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (!(usage & GBM_BO_USE_CURSOR_64X64)) 46479d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg return NULL; 46579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (format != GBM_FORMAT_ARGB8888) 46679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg return NULL; 4672ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 4682ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke bo = calloc(1, sizeof *bo); 4692ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (bo == NULL) 4702ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return NULL; 4712ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 47279d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg create_arg.bpp = 32; 47379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg create_arg.width = width; 47479d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg create_arg.height = height; 47579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 47679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg ret = drmIoctl(dri->base.base.fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_arg); 47779d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (ret) 47879d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg goto free_bo; 47979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 4802ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke bo->base.base.gbm = gbm; 4812ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke bo->base.base.width = width; 4822ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke bo->base.base.height = height; 48379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->base.base.stride = create_arg.pitch; 48479d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->base.base.handle.u32 = create_arg.handle; 48579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->handle = create_arg.handle; 48679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->size = create_arg.size; 4872ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 48879d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg memset(&map_arg, 0, sizeof(map_arg)); 48979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg map_arg.handle = bo->handle; 490a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 49179d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg ret = drmIoctl(dri->base.base.fd, DRM_IOCTL_MODE_MAP_DUMB, &map_arg); 49279d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (ret) 49379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg goto destroy_dumb; 494a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 49579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->map = mmap(0, bo->size, PROT_WRITE, 49679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg MAP_SHARED, dri->base.base.fd, map_arg.offset); 49779d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (bo->map == MAP_FAILED) 49879d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg goto destroy_dumb; 499a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 50079d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg return &bo->base.base; 50179d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 50279d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsbergdestroy_dumb: 50379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg memset(&destroy_arg, 0, sizeof destroy_arg); 50479d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg destroy_arg.handle = create_arg.handle; 50579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg drmIoctl(dri->base.base.fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_arg); 50679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsbergfree_bo: 50779d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg free(bo); 508a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 50979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg return NULL; 51079d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg} 511a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 51279d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsbergstatic struct gbm_bo * 51379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberggbm_dri_bo_create(struct gbm_device *gbm, 51479d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg uint32_t width, uint32_t height, 51579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg uint32_t format, uint32_t usage) 51679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg{ 51779d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg struct gbm_dri_device *dri = gbm_dri_device(gbm); 51879d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg struct gbm_dri_bo *bo; 51979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg int dri_format; 52079d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg unsigned dri_use = 0; 52179d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 52279d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (usage & GBM_BO_USE_WRITE) 52379d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg return create_dumb(gbm, width, height, format, usage); 52479d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 52579d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo = calloc(1, sizeof *bo); 52679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg if (bo == NULL) 52779d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg return NULL; 52879d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 52979d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->base.base.gbm = gbm; 53079d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->base.base.width = width; 53179d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg bo->base.base.height = height; 532a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 5332ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke switch (format) { 5348de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case GBM_FORMAT_RGB565: 5358de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes dri_format =__DRI_IMAGE_FORMAT_RGB565; 5368de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes break; 5378de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case GBM_FORMAT_XRGB8888: 5382ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke case GBM_BO_FORMAT_XRGB8888: 5392ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri_format = __DRI_IMAGE_FORMAT_XRGB8888; 5402ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke break; 5418de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case GBM_FORMAT_ARGB8888: 5422ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke case GBM_BO_FORMAT_ARGB8888: 5432ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri_format = __DRI_IMAGE_FORMAT_ARGB8888; 5442ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke break; 5458de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case GBM_FORMAT_ABGR8888: 5468de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes dri_format = __DRI_IMAGE_FORMAT_ABGR8888; 5478de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes break; 5482ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke default: 5492ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return NULL; 5502ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 5512ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 5522ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (usage & GBM_BO_USE_SCANOUT) 5532ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri_use |= __DRI_IMAGE_USE_SCANOUT; 5542ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (usage & GBM_BO_USE_CURSOR_64X64) 5552ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri_use |= __DRI_IMAGE_USE_CURSOR; 5562ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 55761e95b8a5f8524c7ff726f92ef6edc6b6bb35196Jakob Bornecrantz /* Gallium drivers requires shared in order to get the handle/stride */ 55861e95b8a5f8524c7ff726f92ef6edc6b6bb35196Jakob Bornecrantz dri_use |= __DRI_IMAGE_USE_SHARE; 55961e95b8a5f8524c7ff726f92ef6edc6b6bb35196Jakob Bornecrantz 5602ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke bo->image = 5612ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->image->createImage(dri->screen, 5622ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke width, height, 5632ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri_format, dri_use, 5642ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke bo); 5652ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (bo->image == NULL) 5662ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return NULL; 5672ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 5682ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE, 5692ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke &bo->base.base.handle.s32); 5702ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE, 5717250cd506baa0bd4649b30d87509cdd0cbc06a57Kristian Høgsberg (int *) &bo->base.base.stride); 5722ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 5732ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return &bo->base.base; 5742ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 5752ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 5760d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveirastatic struct gbm_surface * 5770d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveiragbm_dri_surface_create(struct gbm_device *gbm, 5780d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira uint32_t width, uint32_t height, 5790d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira uint32_t format, uint32_t flags) 5800d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira{ 5810d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira struct gbm_dri_surface *surf; 5820d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 5830d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf = calloc(1, sizeof *surf); 5840d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira if (surf == NULL) 5850d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira return NULL; 5860d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 5870d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf->base.gbm = gbm; 5880d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf->base.width = width; 5890d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf->base.height = height; 5900d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf->base.format = format; 5910d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf->base.flags = flags; 5920d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 5930d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira return &surf->base; 5940d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira} 5950d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 5960d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveirastatic void 5970d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveiragbm_dri_surface_destroy(struct gbm_surface *_surf) 5980d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira{ 5990d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira struct gbm_dri_surface *surf = gbm_dri_surface(_surf); 6000d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 6010d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira free(surf); 6020d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira} 6030d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 6042ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic void 6052ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkedri_destroy(struct gbm_device *gbm) 6062ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 6072ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_device *dri = gbm_dri_device(gbm); 6082ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6092ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->core->destroyScreen(dri->screen); 6102ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke free(dri->driver_configs); 6112ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dlclose(dri->driver); 6122ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke free(dri->base.driver_name); 6132ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6142ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke free(dri); 6152ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 6162ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6172ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestatic struct gbm_device * 6182ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkedri_device_create(int fd) 6192ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 6202ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct gbm_dri_device *dri; 6212ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke int ret; 6222ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6232ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri = calloc(1, sizeof *dri); 6242ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6252ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.base.fd = fd; 6262ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.base.bo_create = gbm_dri_bo_create; 62744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg dri->base.base.bo_import = gbm_dri_bo_import; 6282ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.base.is_format_supported = gbm_dri_is_format_supported; 6294fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg dri->base.base.bo_write = gbm_dri_bo_write; 6302ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.base.bo_destroy = gbm_dri_bo_destroy; 6312ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.base.destroy = dri_destroy; 6320d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira dri->base.base.surface_create = gbm_dri_surface_create; 6330d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira dri->base.base.surface_destroy = gbm_dri_surface_destroy; 6342ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6352ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.type = GBM_DRM_DRIVER_TYPE_DRI; 6362ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke dri->base.base.name = "drm"; 6372ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6382ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke ret = dri_screen_create(dri); 639a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz if (ret) 640a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz goto err_dri; 6412ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6422ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return &dri->base.base; 643a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz 644a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantzerr_dri: 645a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz free(dri); 64679d9471efda3630c050c809cdc8c26236283fc6aKristian Høgsberg 647a669a5055eadae85ffa000cea19a2241d0699348Jakob Bornecrantz return NULL; 6482ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 6492ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 6502ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkestruct gbm_backend gbm_dri_backend = { 6512ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke .backend_name = "dri", 6522ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke .create_device = dri_device_create, 6532ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke}; 654