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