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