platform_drm.c revision 32f4cf38085e4056b8e4a9fc78fea28897a1d05f
19dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg/*
29dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Copyright © 2011 Intel Corporation
39dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg *
49dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a
59dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * copy of this software and associated documentation files (the "Software"),
69dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * to deal in the Software without restriction, including without limitation
79dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
89dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the
99dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Software is furnished to do so, subject to the following conditions:
109dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg *
119dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * The above copyright notice and this permission notice (including the next
129dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * paragraph) shall be included in all copies or substantial portions of the
139dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Software.
149dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg *
159dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
169dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
179dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
189dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
199dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
209dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
219dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
229dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * DEALINGS IN THE SOFTWARE.
239dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg *
249dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg * Authors:
259dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg *    Kristian Høgsberg <krh@bitplanet.net>
269dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg */
279dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
289dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include <stdlib.h>
299dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include <stdio.h>
307f881c43dfb4f1aeeab3a84125b5c106c191a43fBenjamin Franzke#include <string.h>
319dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include <xf86drm.h>
32ac3c2c8ece9bf4778239e2f81903a685248ab791Benjamin Franzke#include <dlfcn.h>
3332f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <sys/types.h>
3432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <sys/stat.h>
3532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <fcntl.h>
3632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke#include <unistd.h>
379dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
389dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg#include "egl_dri2.h"
399dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
40e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkestatic _EGLImage *
41e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkedri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
42e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke			     EGLClientBuffer buffer, const EGLint *attr_list)
43e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke{
44e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
45e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct gbm_dri_bo *dri_bo = gbm_dri_bo((struct gbm_bo *) buffer);
46e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct dri2_egl_image *dri2_img;
47e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
48e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_img = malloc(sizeof *dri2_img);
49e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (!dri2_img) {
50e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap");
51e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return NULL;
52e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
53e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
54e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (!_eglInitImage(&dri2_img->base, disp)) {
55e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_img);
56e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return NULL;
57e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
58e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
59e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_img->dri_image = dri2_dpy->image->dupImage(dri_bo->image, dri2_img);
60e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (dri2_img->dri_image == NULL) {
61e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_img);
62e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap");
63e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return NULL;
64e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
65e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
66e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   return &dri2_img->base;
67e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke}
68e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
69e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkestatic _EGLImage *
70e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkedri2_drm_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
71e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke                          _EGLContext *ctx, EGLenum target,
72e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke                          EGLClientBuffer buffer, const EGLint *attr_list)
73e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke{
74e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   (void) drv;
75e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
76e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   switch (target) {
77e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   case EGL_NATIVE_PIXMAP_KHR:
78e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list);
79e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   default:
80e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list);
81e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
82e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke}
83e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
846b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestatic int
856b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkedri2_drm_authenticate(_EGLDisplay *disp, uint32_t id)
866b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
876b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
886b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
896b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   return drmAuthMagic(dri2_dpy->fd, id);
906b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
916b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
929dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian HøgsbergEGLBoolean
939dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsbergdri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
949dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg{
959dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   struct dri2_egl_display *dri2_dpy;
96e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct gbm_device *gbm;
9732f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   int fd = -1;
989dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   int i;
999dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
1009dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   dri2_dpy = malloc(sizeof *dri2_dpy);
1019dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   if (!dri2_dpy)
1029dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg      return _eglError(EGL_BAD_ALLOC, "eglInitialize");
103e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
104f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   memset(dri2_dpy, 0, sizeof *dri2_dpy);
1059dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
1069dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   disp->DriverData = (void *) dri2_dpy;
1079dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
10832f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   gbm = disp->PlatformDisplay;
10932f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   if (gbm == NULL) {
11032f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      fd = open("/dev/dri/card0", O_RDWR);
11132f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      dri2_dpy->own_gbm_device = 1;
11232f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      gbm = gbm_create_device(fd);
11332f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      if (gbm == NULL)
11432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke         return EGL_FALSE;
11532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   }
11632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke
117e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) {
118e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_dpy);
119e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return EGL_FALSE;
120e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
1219dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
122e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->gbm_dri = gbm_dri_device(gbm);
123e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (dri2_dpy->gbm_dri->base.type != GBM_DRM_DRIVER_TYPE_DRI) {
124e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_dpy);
125e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return EGL_FALSE;
1266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   }
1276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
12832f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   if (fd < 0) {
12932f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      fd = dup(gbm_device_get_fd(gbm));
13032f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      if (fd < 0) {
13132f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke         free(dri2_dpy);
13232f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke         return EGL_FALSE;
13332f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      }
13432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   }
13532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke
13632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   dri2_dpy->fd = fd;
137e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->device_name = dri2_get_device_name_for_fd(dri2_dpy->fd);
138e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->driver_name = dri2_dpy->gbm_dri->base.driver_name;
139e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
140e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->dri_screen = dri2_dpy->gbm_dri->screen;
141e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->core = dri2_dpy->gbm_dri->core;
142e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->dri2 = dri2_dpy->gbm_dri->dri2;
143e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->image = dri2_dpy->gbm_dri->image;
144e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->driver_configs = dri2_dpy->gbm_dri->driver_configs;
1459dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
146e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->gbm_dri->lookup_image = dri2_lookup_egl_image;
147e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->gbm_dri->lookup_user_data = disp;
1489dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
149e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_setup_screen(disp);
1509dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
1519dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   for (i = 0; dri2_dpy->driver_configs[i]; i++)
152e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      dri2_add_config(disp, dri2_dpy->driver_configs[i],
153e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke                      i + 1, 0, 0, NULL);
154e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
155e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   drv->API.CreateImageKHR = dri2_drm_create_image_khr;
1569dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
1576b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#ifdef HAVE_WAYLAND_PLATFORM
1586b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
1596b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
1606b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   dri2_dpy->authenticate = dri2_drm_authenticate;
161e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
1629dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   /* we're supporting EGL 1.4 */
1639dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   disp->VersionMajor = 1;
1649dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   disp->VersionMinor = 4;
1659dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
1669dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   return EGL_TRUE;
1679dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg}
168