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