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:
111cf775c9cbf86676aa321eb9665fe38aeba35afc9Elvis Lee      if (!window)
112cf775c9cbf86676aa321eb9665fe38aeba35afc9Elvis Lee         return NULL;
1134a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      surf = gbm_dri_surface((struct gbm_surface *) window);
1144a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_surf->gbm_surf = surf;
1154a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_surf->base.Width =  surf->base.width;
1164a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_surf->base.Height = surf->base.height;
1174a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      surf->dri_private = dri2_surf;
1184a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      break;
1194a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   default:
1204a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      goto cleanup_surf;
1214a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
1224a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1234a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_surf->dri_drawable =
1244a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen,
1254a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira					    dri2_conf->dri_double_config,
1264a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira					    dri2_surf->gbm_surf);
1274a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1284a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (dri2_surf->dri_drawable == NULL) {
1294a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable");
1304a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      goto cleanup_surf;
1314a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
1324a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1334a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return &dri2_surf->base;
1344a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1354a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira cleanup_surf:
1364a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   free(dri2_surf);
1374a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1384a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return NULL;
1394a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
1404a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1414a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic _EGLSurface *
1424a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
1434a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira			   _EGLConfig *conf, EGLNativeWindowType window,
1444a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira			   const EGLint *attrib_list)
1454a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
1464a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf,
1474a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira			      window, attrib_list);
1484a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
1494a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1504a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic EGLBoolean
1514a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
1524a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
1534a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1544a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
1554a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   int i;
1564a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1574a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (!_eglPutSurface(surf))
1584a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      return EGL_TRUE;
1594a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1604a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable);
1614a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1624a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
1634a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      if (dri2_surf->color_buffers[i].bo)
1644a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 gbm_bo_destroy(dri2_surf->color_buffers[i].bo);
1654a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
1664a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1674a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   for (i = 0; i < __DRI_BUFFER_COUNT; i++) {
1684a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      if (dri2_surf->dri_buffers[i])
1694a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira         dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen,
1704a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira                                       dri2_surf->dri_buffers[i]);
1714a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
1724a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1734a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   free(surf);
1744a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1754a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return EGL_TRUE;
1764a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
1774a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1784a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic int
1794a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiraget_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
1804a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
1814a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct dri2_egl_display *dri2_dpy =
1824a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_egl_display(dri2_surf->base.Resource.Display);
1834a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct gbm_dri_bo *bo;
1844a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct gbm_dri_surface *surf = dri2_surf->gbm_surf;
1854a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   int i, name, pitch;
1864a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1874a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (dri2_surf->back == NULL) {
1884a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
1894a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 if (!dri2_surf->color_buffers[i].locked) {
1904a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	    dri2_surf->back = &dri2_surf->color_buffers[i];
1914a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	    break;
1924a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 }
1934a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      }
1944a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
1954a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
1964a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (dri2_surf->back == NULL)
1974a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      return -1;
1984a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (dri2_surf->back->bo == NULL)
1994a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_surf->back->bo = gbm_bo_create(&dri2_dpy->gbm_dri->base.base,
2004a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira					  surf->base.width, surf->base.height,
2014a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira					  surf->base.format, surf->base.flags);
2024a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (dri2_surf->back->bo == NULL)
2034a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      return -1;
2044a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2054a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   bo = (struct gbm_dri_bo *) dri2_surf->back->bo;
2064a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2074a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_NAME, &name);
2084a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE, &pitch);
2094a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2104a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   buffer->attachment = __DRI_BUFFER_BACK_LEFT;
2114a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   buffer->name = name;
2124a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   buffer->pitch = pitch;
2134a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   buffer->cpp = 4;
2144a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   buffer->flags = 0;
2154a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2164a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return 0;
2174a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
2184a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2194a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic int
2204a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiraget_aux_bo(struct dri2_egl_surface *dri2_surf,
2214a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	   unsigned int attachment, unsigned int format, __DRIbuffer *buffer)
2224a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
2234a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct dri2_egl_display *dri2_dpy =
2244a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_egl_display(dri2_surf->base.Resource.Display);
2250695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines   __DRIbuffer *b = dri2_surf->dri_buffers[attachment];
2264a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2270695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines   if (b == NULL) {
2284a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      b = dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen,
2294a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira					 attachment, format,
2304a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira					 dri2_surf->base.Width,
2314a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira					 dri2_surf->base.Height);
2320695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines      dri2_surf->dri_buffers[attachment] = b;
2330695cf68f5afb903f93cc3779444d095b218271dMandeep Singh Baines   }
2344a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (b == NULL)
2354a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      return -1;
2364a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2374a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   memcpy(buffer, b, sizeof *buffer);
2384a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2394a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return 0;
2404a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
2414a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2424a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic __DRIbuffer *
2434a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_get_buffers_with_format(__DRIdrawable *driDrawable,
2444a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira			     int *width, int *height,
2454a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira			     unsigned int *attachments, int count,
2464a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira			     int *out_count, void *loaderPrivate)
2474a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
2484a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct dri2_egl_surface *dri2_surf = loaderPrivate;
2494a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   int i, j;
2504a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2514a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_surf->buffer_count = 0;
2524a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   for (i = 0, j = 0; i < 2 * count; i += 2, j++) {
2534a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      assert(attachments[i] < __DRI_BUFFER_COUNT);
2544a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      assert(dri2_surf->buffer_count < 5);
2554a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2564a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      switch (attachments[i]) {
2574a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      case __DRI_BUFFER_BACK_LEFT:
2584a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 if (get_back_bo(dri2_surf, &dri2_surf->buffers[j]) < 0) {
2594a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	    _eglError(EGL_BAD_ALLOC, "failed to allocate color buffer");
2604a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	    return NULL;
2614a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 }
2624a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 break;
2634a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      default:
2644a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 if (get_aux_bo(dri2_surf, attachments[i], attachments[i + 1],
2654a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira			&dri2_surf->buffers[j]) < 0) {
2664a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	    _eglError(EGL_BAD_ALLOC, "failed to allocate aux buffer");
2674a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	    return NULL;
2684a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 }
2694a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 break;
2704a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      }
2714a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
2724a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2734a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   *out_count = j;
2744a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (j == 0)
2754a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      return NULL;
2764a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2774a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   *width = dri2_surf->base.Width;
2784a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   *height = dri2_surf->base.Height;
2794a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2804a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return dri2_surf->buffers;
2814a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
2824a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2834a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic __DRIbuffer *
2844a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_get_buffers(__DRIdrawable * driDrawable,
2854a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira		 int *width, int *height,
2864a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira		 unsigned int *attachments, int count,
2874a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira		 int *out_count, void *loaderPrivate)
2884a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
2894a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   unsigned int *attachments_with_format;
2904a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   __DRIbuffer *buffer;
2914a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   const unsigned int format = 32;
2924a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   int i;
2934a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
2944a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   attachments_with_format = calloc(count * 2, sizeof(unsigned int));
2954a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (!attachments_with_format) {
2964a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      *out_count = 0;
2974a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      return NULL;
2984a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
2994a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3004a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   for (i = 0; i < count; ++i) {
3014a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      attachments_with_format[2*i] = attachments[i];
3024a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      attachments_with_format[2*i + 1] = format;
3034a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
3044a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3054a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   buffer =
3064a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_get_buffers_with_format(driDrawable,
3074a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira				   width, height,
3084a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira				   attachments_with_format, count,
3094a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira				   out_count, loaderPrivate);
3104a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3114a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   free(attachments_with_format);
3124a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3134a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return buffer;
3144a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
3154a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3164a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic void
3174a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
3184a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
3194a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   (void) driDrawable;
3204a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   (void) loaderPrivate;
3214a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
3224a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3234a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveirastatic EGLBoolean
3244a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveiradri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
3254a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira{
3264a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
3274a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
3284a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3294a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
3304a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      if (dri2_surf->current)
3314a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira	 _eglError(EGL_BAD_SURFACE, "dri2_swap_buffers");
3324a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_surf->current = dri2_surf->back;
3334a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira      dri2_surf->back = NULL;
3344a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   }
3354a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3364a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
3374a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable);
3384a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
3394a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   return EGL_TRUE;
3404a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira}
3414a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
342e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkestatic _EGLImage *
343e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkedri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
344e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke			     EGLClientBuffer buffer, const EGLint *attr_list)
345e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke{
346e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
347e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct gbm_dri_bo *dri_bo = gbm_dri_bo((struct gbm_bo *) buffer);
348e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct dri2_egl_image *dri2_img;
349e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
350e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_img = malloc(sizeof *dri2_img);
351e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (!dri2_img) {
352e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap");
353e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return NULL;
354e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
355e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
356e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (!_eglInitImage(&dri2_img->base, disp)) {
357e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_img);
358e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return NULL;
359e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
360e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
361e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_img->dri_image = dri2_dpy->image->dupImage(dri_bo->image, dri2_img);
362e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (dri2_img->dri_image == NULL) {
363e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_img);
364e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap");
365e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return NULL;
366e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
367e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
368e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   return &dri2_img->base;
369e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke}
370e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
371e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkestatic _EGLImage *
372e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzkedri2_drm_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
373e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke                          _EGLContext *ctx, EGLenum target,
374e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke                          EGLClientBuffer buffer, const EGLint *attr_list)
375e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke{
376e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   (void) drv;
377e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
378e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   switch (target) {
379e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   case EGL_NATIVE_PIXMAP_KHR:
380e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list);
381e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   default:
382e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list);
383e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
384e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke}
385e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
3866b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestatic int
3876b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkedri2_drm_authenticate(_EGLDisplay *disp, uint32_t id)
3886b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
3896b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
3906b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
3916b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   return drmAuthMagic(dri2_dpy->fd, id);
3926b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
3936b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
3949dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian HøgsbergEGLBoolean
3959dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsbergdri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
3969dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg{
3979dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   struct dri2_egl_display *dri2_dpy;
398e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   struct gbm_device *gbm;
39932f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   int fd = -1;
4009dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   int i;
4019dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
4029dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   dri2_dpy = malloc(sizeof *dri2_dpy);
4039dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   if (!dri2_dpy)
4049dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg      return _eglError(EGL_BAD_ALLOC, "eglInitialize");
405e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
406f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   memset(dri2_dpy, 0, sizeof *dri2_dpy);
4079dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
4089dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   disp->DriverData = (void *) dri2_dpy;
4099dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
41032f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   gbm = disp->PlatformDisplay;
41132f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   if (gbm == NULL) {
41232f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      fd = open("/dev/dri/card0", O_RDWR);
4132a58453e25899e726f02db005de0e1296c326845Benjamin Franzke      dri2_dpy->own_device = 1;
41432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      gbm = gbm_create_device(fd);
41532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      if (gbm == NULL)
41632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke         return EGL_FALSE;
41732f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   }
41832f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke
419e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) {
420e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_dpy);
421e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return EGL_FALSE;
422e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   }
4239dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
424e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->gbm_dri = gbm_dri_device(gbm);
425e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   if (dri2_dpy->gbm_dri->base.type != GBM_DRM_DRIVER_TYPE_DRI) {
426e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      free(dri2_dpy);
427e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      return EGL_FALSE;
4286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   }
4296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
43032f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   if (fd < 0) {
43132f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      fd = dup(gbm_device_get_fd(gbm));
43232f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      if (fd < 0) {
43332f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke         free(dri2_dpy);
43432f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke         return EGL_FALSE;
43532f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke      }
43632f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   }
43732f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke
43832f4cf38085e4056b8e4a9fc78fea28897a1d05fBenjamin Franzke   dri2_dpy->fd = fd;
439e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->device_name = dri2_get_device_name_for_fd(dri2_dpy->fd);
440e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->driver_name = dri2_dpy->gbm_dri->base.driver_name;
441e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
442e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->dri_screen = dri2_dpy->gbm_dri->screen;
443e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->core = dri2_dpy->gbm_dri->core;
444e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->dri2 = dri2_dpy->gbm_dri->dri2;
445e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->image = dri2_dpy->gbm_dri->image;
446410aa3eb45c88dd939dcecaa2aafa8f5afd6e000Ander Conselvan de Oliveira   dri2_dpy->flush = dri2_dpy->gbm_dri->flush;
447e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->driver_configs = dri2_dpy->gbm_dri->driver_configs;
4489dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
449e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->gbm_dri->lookup_image = dri2_lookup_egl_image;
450e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_dpy->gbm_dri->lookup_user_data = disp;
4519dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
4524a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->gbm_dri->get_buffers = dri2_get_buffers;
4534a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->gbm_dri->flush_front_buffer = dri2_flush_front_buffer;
4544a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->gbm_dri->get_buffers_with_format = dri2_get_buffers_with_format;
4554a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
4564a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->gbm_dri->base.base.surface_lock_front_buffer = lock_front_buffer;
4574a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->gbm_dri->base.base.surface_release_buffer = release_buffer;
4584a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   dri2_dpy->gbm_dri->base.base.surface_has_free_buffers = has_free_buffers;
4594a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira
460e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   dri2_setup_screen(disp);
4619dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
4629dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   for (i = 0; dri2_dpy->driver_configs[i]; i++)
463e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke      dri2_add_config(disp, dri2_dpy->driver_configs[i],
4644a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira                      i + 1, 0, EGL_WINDOW_BIT, NULL, NULL);
465e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
4664a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   drv->API.CreateWindowSurface = dri2_create_window_surface;
4674a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   drv->API.DestroySurface = dri2_destroy_surface;
4684a976b60b1139021ef00e722361b7e1ad8e0810dAnder Conselvan de Oliveira   drv->API.SwapBuffers = dri2_swap_buffers;
469e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke   drv->API.CreateImageKHR = dri2_drm_create_image_khr;
4709dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
4716b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#ifdef HAVE_WAYLAND_PLATFORM
4726b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
4736b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
4746b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   dri2_dpy->authenticate = dri2_drm_authenticate;
475e5fc4c81ce5aa261e330977f1a672838cd186cdbBenjamin Franzke
4769dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   /* we're supporting EGL 1.4 */
4779dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   disp->VersionMajor = 1;
4789dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   disp->VersionMinor = 4;
4799dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg
4809dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg   return EGL_TRUE;
4819dc5de5bb13bfcd960f178c8e0eac265c3496fa8Kristian Høgsberg}
482