platform_x11.c revision f55d027ac2e0423eba5d0664cc36668520597703
12889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg/*
22889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Copyright © 2011 Intel Corporation
32889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg *
42889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a
52889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * copy of this software and associated documentation files (the "Software"),
62889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * to deal in the Software without restriction, including without limitation
72889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
82889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the
92889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Software is furnished to do so, subject to the following conditions:
102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg *
112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * The above copyright notice and this permission notice (including the next
122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * paragraph) shall be included in all copies or substantial portions of the
132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Software.
142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg *
152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * DEALINGS IN THE SOFTWARE.
232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg *
242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Authors:
252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg *    Kristian Høgsberg <krh@bitplanet.net>
262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg */
272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <stdlib.h>
292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <string.h>
302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <stdio.h>
312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <limits.h>
322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <dlfcn.h>
332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <fcntl.h>
342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <errno.h>
352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <unistd.h>
362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <xf86drm.h>
372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <sys/types.h>
382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include <sys/stat.h>
392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#include "egl_dri2.h"
412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
42f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic void
43f55d027ac2e0423eba5d0664cc36668520597703Haitao FengswrastCreateDrawable(struct dri2_egl_display * dri2_dpy,
44f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                     struct dri2_egl_surface * dri2_surf,
45f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                     int depth)
46f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
47f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   uint32_t           mask;
48f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   const uint32_t     function = GXcopy;
49f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   uint32_t           valgc[2];
50f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
51f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   /* create GC's */
52f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_surf->gc = xcb_generate_id(dri2_dpy->conn);
53f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   mask = XCB_GC_FUNCTION;
54f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_create_gc(dri2_dpy->conn, dri2_surf->gc, dri2_surf->drawable, mask, &function);
55f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
56f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_surf->swapgc = xcb_generate_id(dri2_dpy->conn);
57f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   mask = XCB_GC_FUNCTION | XCB_GC_GRAPHICS_EXPOSURES;
58f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   valgc[0] = function;
59f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   valgc[1] = False;
60f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_create_gc(dri2_dpy->conn, dri2_surf->swapgc, dri2_surf->drawable, mask, valgc);
61f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_surf->depth = depth;
62f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   switch (depth) {
63f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      case 32:
64f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      case 24:
65f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         dri2_surf->bytes_per_pixel = 4;
66f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         break;
67f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      case 16:
68f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         dri2_surf->bytes_per_pixel = 2;
69f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         break;
70f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      case 8:
71f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         dri2_surf->bytes_per_pixel = 1;
72f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         break;
73f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      case 0:
74f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         dri2_surf->bytes_per_pixel = 0;
75f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         break;
76f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      default:
77f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         _eglLog(_EGL_WARNING, "unsupported depth %d", depth);
78f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
79f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
80f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
81f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic void
82f55d027ac2e0423eba5d0664cc36668520597703Haitao FengswrastDestroyDrawable(struct dri2_egl_display * dri2_dpy,
83f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                      struct dri2_egl_surface * dri2_surf)
84f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
85f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_free_gc(dri2_dpy->conn, dri2_surf->gc);
86f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_free_gc(dri2_dpy->conn, dri2_surf->swapgc);
87f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
88f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
89f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic void
90f55d027ac2e0423eba5d0664cc36668520597703Haitao FengswrastGetDrawableInfo(__DRIdrawable * draw,
91f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                      int *x, int *y, int *w, int *h,
92f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                      void *loaderPrivate)
93f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
94f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_surface *dri2_surf = loaderPrivate;
95f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display);
96f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
97f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_get_geometry_cookie_t cookie;
98f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_get_geometry_reply_t *reply;
99f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_generic_error_t *error;
100f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
101f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   *w = *h = 0;
102f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable);
103f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   reply = xcb_get_geometry_reply (dri2_dpy->conn, cookie, &error);
104f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (reply == NULL)
105f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return;
106f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
107f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (error != NULL) {
108f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "error in xcb_get_geometry");
109f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      free(error);
110f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
111f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      *w = reply->width;
112f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      *h = reply->height;
113f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
114f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   free(reply);
115f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
116f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
117f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic void
118f55d027ac2e0423eba5d0664cc36668520597703Haitao FengswrastPutImage(__DRIdrawable * draw, int op,
119f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng               int x, int y, int w, int h,
120f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng               char *data, void *loaderPrivate)
121f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
122f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_surface *dri2_surf = loaderPrivate;
123f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display);
124f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
125f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_gcontext_t gc;
126f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
127f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   switch (op) {
128f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   case __DRI_SWRAST_IMAGE_OP_DRAW:
129f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      gc = dri2_surf->gc;
130f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      break;
131f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   case __DRI_SWRAST_IMAGE_OP_SWAP:
132f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      gc = dri2_surf->swapgc;
133f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      break;
134f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   default:
135f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return;
136f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
137f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
138f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_put_image(dri2_dpy->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, dri2_surf->drawable,
139f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                 gc, w, h, x, y, 0, dri2_surf->depth,
140f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                 w*h*dri2_surf->bytes_per_pixel, (const uint8_t *)data);
141f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
142f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
143f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic void
144f55d027ac2e0423eba5d0664cc36668520597703Haitao FengswrastGetImage(__DRIdrawable * read,
145f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng               int x, int y, int w, int h,
146f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng               char *data, void *loaderPrivate)
147f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
148f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_surface *dri2_surf = loaderPrivate;
149f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display);
150f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
151f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_get_image_cookie_t cookie;
152f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_get_image_reply_t *reply;
153f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   xcb_generic_error_t *error;
154f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
155f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   cookie = xcb_get_image (dri2_dpy->conn, XCB_IMAGE_FORMAT_Z_PIXMAP,
156f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng                           dri2_surf->drawable, x, y, w, h, ~0);
157f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   reply = xcb_get_image_reply (dri2_dpy->conn, cookie, &error);
158f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (reply == NULL)
159f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return;
160f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
161f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (error != NULL) {
162f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "error in xcb_get_image");
163f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      free(error);
164f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
165f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      uint32_t bytes = xcb_get_image_data_length(reply);
166f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      uint8_t *idata = xcb_get_image_data(reply);
167f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      memcpy(data, idata, bytes);
168f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
169f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   free(reply);
170f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
171f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
172f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg/**
1742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface().
1752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg */
1762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLSurface *
1772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
1782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		    _EGLConfig *conf, EGLNativeWindowType window,
1792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		    const EGLint *attrib_list)
1802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
1812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);
1832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf;
1842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_get_geometry_cookie_t cookie;
1852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_get_geometry_reply_t *reply;
1862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_screen_iterator_t s;
1872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_generic_error_t *error;
1882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
1892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) drv;
1902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
1912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf = malloc(sizeof *dri2_surf);
1922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_surf) {
1932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_ALLOC, "dri2_create_surface");
1942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
1952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
1962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
1972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list))
1982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_surf;
1992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->region = XCB_NONE;
2012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (type == EGL_PBUFFER_BIT) {
2022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->drawable = xcb_generate_id(dri2_dpy->conn);
2032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn));
2042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_create_pixmap(dri2_dpy->conn, conf->BufferSize,
2052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			dri2_surf->drawable, s.data->root,
2062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			dri2_surf->base.Width, dri2_surf->base.Height);
2072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   } else {
2082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->drawable = window;
2092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
2102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
211f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (dri2_dpy->dri2) {
212f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_surf->dri_drawable =
213f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng	 (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen,
214f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng					       type == EGL_WINDOW_BIT ?
215f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng					       dri2_conf->dri_double_config :
216f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng					       dri2_conf->dri_single_config,
217f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng					       dri2_surf);
218f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
219f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      assert(dri2_dpy->swrast);
220f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_surf->dri_drawable =
221f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng	 (*dri2_dpy->swrast->createNewDrawable) (dri2_dpy->dri_screen,
222f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng						 dri2_conf->dri_double_config,
223f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng						 dri2_surf);
224f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
225f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
2262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_surf->dri_drawable == NULL) {
2272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable");
2282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_pixmap;
2292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
230f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
231f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (dri2_dpy->dri2) {
232f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      xcb_dri2_create_drawable (dri2_dpy->conn, dri2_surf->drawable);
233f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
234f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      swrastCreateDrawable(dri2_dpy, dri2_surf, _eglGetConfigKey(conf, EGL_DEPTH_SIZE));
235f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
2362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (type != EGL_PBUFFER_BIT) {
2382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable);
2392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      reply = xcb_get_geometry_reply (dri2_dpy->conn, cookie, &error);
2402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (reply == NULL || error != NULL) {
2412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 _eglError(EGL_BAD_ALLOC, "xcb_get_geometry");
2422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 free(error);
2432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 goto cleanup_dri_drawable;
2442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      }
2452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->base.Width = reply->width;
2472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->base.Height = reply->height;
2482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(reply);
2492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
2502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return &dri2_surf->base;
2522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_dri_drawable:
2542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
2552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_pixmap:
2562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (type == EGL_PBUFFER_BIT)
2572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_free_pixmap(dri2_dpy->conn, dri2_surf->drawable);
2582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_surf:
2592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(dri2_surf);
2602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return NULL;
2622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
2632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg/**
2652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface().
2662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg */
2672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLSurface *
2682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
2692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			   _EGLConfig *conf, EGLNativeWindowType window,
2702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			   const EGLint *attrib_list)
2712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
2722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf,
2732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			      window, attrib_list);
2742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
2752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLSurface *
2772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *disp,
2782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			   _EGLConfig *conf, EGLNativePixmapType pixmap,
2792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			   const EGLint *attrib_list)
2802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
2812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return dri2_create_surface(drv, disp, EGL_PIXMAP_BIT, conf,
2822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			      pixmap, attrib_list);
2832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
2842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLSurface *
2862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp,
2872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			    _EGLConfig *conf, const EGLint *attrib_list)
2882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
2892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return dri2_create_surface(drv, disp, EGL_PBUFFER_BIT, conf,
2902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			      XCB_WINDOW_NONE, attrib_list);
2912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
2922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
2942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
2952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
2962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
2972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
2982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
2992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) drv;
3002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!_eglPutSurface(surf))
3022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_TRUE;
3032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable);
3052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
306f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (dri2_dpy->dri2) {
307f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      xcb_dri2_destroy_drawable (dri2_dpy->conn, dri2_surf->drawable);
308f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
309f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      assert(dri2_dpy->swrast);
310f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      swrastDestroyDrawable(dri2_dpy, dri2_surf);
311f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
3122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (surf->Type == EGL_PBUFFER_BIT)
3142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_free_pixmap (dri2_dpy->conn, dri2_surf->drawable);
3152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(surf);
3172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
3192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
3202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg/**
3222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Process list of buffer received from the server
3232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg *
3242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * Processes the list of buffers received in a reply from the server to either
3252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat.
3262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg */
3272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic void
3282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_process_buffers(struct dri2_egl_surface *dri2_surf,
3292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		     xcb_dri2_dri2_buffer_t *buffers, unsigned count)
3302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
3312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy =
3322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_egl_display(dri2_surf->base.Resource.Display);
3332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_rectangle_t rectangle;
3342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   unsigned i;
3352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->buffer_count = count;
3372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->have_fake_front = 0;
3382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* This assumes the DRI2 buffer attachment tokens matches the
3402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg    * __DRIbuffer tokens. */
3412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   for (i = 0; i < count; i++) {
3422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->buffers[i].attachment = buffers[i].attachment;
3432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->buffers[i].name = buffers[i].name;
3442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->buffers[i].pitch = buffers[i].pitch;
3452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->buffers[i].cpp = buffers[i].cpp;
3462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_surf->buffers[i].flags = buffers[i].flags;
3472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      /* We only use the DRI drivers single buffer configs.  This
3492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       * means that if we try to render to a window, DRI2 will give us
3502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       * the fake front buffer, which we'll use as a back buffer.
3512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       * Note that EGL doesn't require that several clients rendering
3522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       * to the same window must see the same aux buffers. */
3532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (dri2_surf->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT)
3542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg         dri2_surf->have_fake_front = 1;
3552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
3562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_surf->region != XCB_NONE)
3582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_xfixes_destroy_region(dri2_dpy->conn, dri2_surf->region);
3592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   rectangle.x = 0;
3612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   rectangle.y = 0;
3622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   rectangle.width = dri2_surf->base.Width;
3632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   rectangle.height = dri2_surf->base.Height;
3642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->region = xcb_generate_id(dri2_dpy->conn);
3652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_create_region(dri2_dpy->conn, dri2_surf->region, 1, &rectangle);
3662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
3672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic __DRIbuffer *
3692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_get_buffers(__DRIdrawable * driDrawable,
3702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		int *width, int *height,
3712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		unsigned int *attachments, int count,
3722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		int *out_count, void *loaderPrivate)
3732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
3742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = loaderPrivate;
3752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy =
3762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_egl_display(dri2_surf->base.Resource.Display);
3772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_dri2_buffer_t *buffers;
3782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_reply_t *reply;
3792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_cookie_t cookie;
3802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) driDrawable;
3822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   cookie = xcb_dri2_get_buffers_unchecked (dri2_dpy->conn,
3842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					    dri2_surf->drawable,
3852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					    count, count, attachments);
3862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   reply = xcb_dri2_get_buffers_reply (dri2_dpy->conn, cookie, NULL);
3872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers = xcb_dri2_get_buffers_buffers (reply);
3882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (buffers == NULL)
3892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
3902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   *out_count = reply->count;
3922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->base.Width = *width = reply->width;
3932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->base.Height = *height = reply->height;
3942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_process_buffers(dri2_surf, buffers, *out_count);
3952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(reply);
3972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
3982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return dri2_surf->buffers;
3992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
4002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic __DRIbuffer *
4022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_get_buffers_with_format(__DRIdrawable * driDrawable,
4032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			     int *width, int *height,
4042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			     unsigned int *attachments, int count,
4052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			     int *out_count, void *loaderPrivate)
4062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
4072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = loaderPrivate;
4082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy =
4092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_egl_display(dri2_surf->base.Resource.Display);
4102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_dri2_buffer_t *buffers;
4112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_with_format_reply_t *reply;
4122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_with_format_cookie_t cookie;
4132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_attach_format_t *format_attachments;
4142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) driDrawable;
4162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   format_attachments = (xcb_dri2_attach_format_t *) attachments;
4182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   cookie = xcb_dri2_get_buffers_with_format_unchecked (dri2_dpy->conn,
4192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg							dri2_surf->drawable,
4202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg							count, count,
4212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg							format_attachments);
4222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   reply = xcb_dri2_get_buffers_with_format_reply (dri2_dpy->conn,
4242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						   cookie, NULL);
4252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (reply == NULL)
4262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
4272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers = xcb_dri2_get_buffers_with_format_buffers (reply);
4292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->base.Width = *width = reply->width;
4302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_surf->base.Height = *height = reply->height;
4312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   *out_count = reply->count;
4322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_process_buffers(dri2_surf, buffers, *out_count);
4332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(reply);
4352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return dri2_surf->buffers;
4372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
4382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic void
4402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
4412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
4422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) driDrawable;
4432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* FIXME: Does EGL support front buffer rendering at all? */
4452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#if 0
4472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = loaderPrivate;
4482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2WaitGL(dri2_surf);
4502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#else
4512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) loaderPrivate;
4522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#endif
4532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
4542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic char *
4562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_strndup(const char *s, int length)
4572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
4582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   char *d;
4592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   d = malloc(length + 1);
4612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (d == NULL)
4622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
4632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   memcpy(d, s, length);
4652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   d[length] = '\0';
4662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return d;
4682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
4692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
4712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_connect(struct dri2_egl_display *dri2_dpy)
4722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
4732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_query_version_reply_t *xfixes_query;
4742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_query_version_cookie_t xfixes_query_cookie;
4752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_query_version_reply_t *dri2_query;
4762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_query_version_cookie_t dri2_query_cookie;
4772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_connect_reply_t *connect;
4782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_connect_cookie_t connect_cookie;
4792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_generic_error_t *error;
4802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_screen_iterator_t s;
4812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_xfixes_id);
4832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_dri2_id);
4842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xfixes_query_cookie = xcb_xfixes_query_version(dri2_dpy->conn,
4862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						  XCB_XFIXES_MAJOR_VERSION,
4872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						  XCB_XFIXES_MINOR_VERSION);
4882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_query_cookie = xcb_dri2_query_version (dri2_dpy->conn,
4902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					       XCB_DRI2_MAJOR_VERSION,
4912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					       XCB_DRI2_MINOR_VERSION);
4922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn));
4942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   connect_cookie = xcb_dri2_connect_unchecked (dri2_dpy->conn,
4952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						s.data->root,
4962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						XCB_DRI2_DRIVER_TYPE_DRI);
4972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xfixes_query =
4992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_xfixes_query_version_reply (dri2_dpy->conn,
5002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg				      xfixes_query_cookie, &error);
5012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (xfixes_query == NULL ||
5022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       error != NULL || xfixes_query->major_version < 2) {
503f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to query xfixes version");
5042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(error);
5052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(xfixes_query);
5082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_query =
5102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_dri2_query_version_reply (dri2_dpy->conn, dri2_query_cookie, &error);
5112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_query == NULL || error != NULL) {
512f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to query version");
5132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(error);
5142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->dri2_major = dri2_query->major_version;
5172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->dri2_minor = dri2_query->minor_version;
5182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(dri2_query);
5192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   connect = xcb_dri2_connect_reply (dri2_dpy->conn, connect_cookie, NULL);
5212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (connect == NULL ||
5222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       connect->driver_name_length + connect->device_name_length == 0) {
523f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to authenticate");
5242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->device_name =
5282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_strndup(xcb_dri2_connect_device_name (connect),
5292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		   xcb_dri2_connect_device_name_length (connect));
5302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->driver_name =
5322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_strndup(xcb_dri2_connect_driver_name (connect),
5332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		   xcb_dri2_connect_driver_name_length (connect));
5342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->device_name == NULL || dri2_dpy->driver_name == NULL) {
5362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(dri2_dpy->device_name);
5372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(dri2_dpy->driver_name);
5382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(connect);
5392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(connect);
5422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
5442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
5452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
5472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_authenticate(struct dri2_egl_display *dri2_dpy)
5482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
5492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_authenticate_reply_t *authenticate;
5502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_authenticate_cookie_t authenticate_cookie;
5512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_screen_iterator_t s;
5522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drm_magic_t magic;
5532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (drmGetMagic(dri2_dpy->fd, &magic)) {
555f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to get drm magic");
5562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn));
5602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   authenticate_cookie =
5612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_dri2_authenticate_unchecked(dri2_dpy->conn, s.data->root, magic);
5622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   authenticate =
5632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_dri2_authenticate_reply(dri2_dpy->conn, authenticate_cookie, NULL);
5642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (authenticate == NULL || !authenticate->authenticated) {
565f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to authenticate");
5662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(authenticate);
5672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(authenticate);
5712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
5732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
5742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
5762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy,
5772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			     _EGLDisplay *disp)
5782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
5792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_screen_iterator_t s;
5802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_depth_iterator_t d;
5812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_visualtype_t *visuals;
5822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   int i, j, id;
5832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   EGLint surface_type;
58487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   EGLint config_attrs[] = {
58587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	   EGL_NATIVE_VISUAL_ID,   0,
58687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	   EGL_NATIVE_VISUAL_TYPE, 0,
58787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	   EGL_NONE
58887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   };
5892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn));
5912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   d = xcb_screen_allowed_depths_iterator(s.data);
5922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   id = 1;
5932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   surface_type =
5952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_WINDOW_BIT |
5962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_PIXMAP_BIT |
5972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_PBUFFER_BIT |
5982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
5992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   while (d.rem > 0) {
6012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGLBoolean class_added[6] = { 0, };
6022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      visuals = xcb_depth_visuals(d.data);
6042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      for (i = 0; i < xcb_depth_visuals_length(d.data); i++) {
6052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 if (class_added[visuals[i]._class])
6062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	    continue;
6072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 class_added[visuals[i]._class] = EGL_TRUE;
6092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 for (j = 0; dri2_dpy->driver_configs[j]; j++) {
61087dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke            config_attrs[1] = visuals[i].visual_id;
61187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke            config_attrs[3] = visuals[i]._class;
61287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke
61387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	    dri2_add_config(disp, dri2_dpy->driver_configs[j], id++,
61487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke			    d.data->depth, surface_type, config_attrs);
6152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 }
6162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      }
6172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_depth_next(&d);
6192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
6202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!_eglGetArraySize(disp->Configs)) {
6222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglLog(_EGL_WARNING, "DRI2: failed to create any config");
6232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
6242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
6252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
6272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
6282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
6302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_copy_region(_EGLDriver *drv, _EGLDisplay *disp,
6312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		 _EGLSurface *draw, xcb_xfixes_region_t region)
6322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
6332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
6342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
6352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
6362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   _EGLContext *ctx;
63787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   enum xcb_dri2_attachment_t render_attachment;
6382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_copy_region_cookie_t cookie;
6392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_drv->glFlush) {
6412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      ctx = _eglGetCurrentContext();
6422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (ctx && ctx->DrawSurface == &dri2_surf->base)
6432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg         dri2_drv->glFlush();
6442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
6452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
6472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#if 0
6492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* FIXME: Add support for dri swapbuffers, that'll give us swap
6502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg    * interval and page flipping (at least for fullscreen windows) as
6512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg    * well as the page flip event.  Unless surface->SwapBehavior is
6522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg    * EGL_BUFFER_PRESERVED. */
6532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#if __DRI2_FLUSH_VERSION >= 2
6542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (pdraw->psc->f)
6552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      (*pdraw->psc->f->flushInvalidate)(pdraw->driDrawable);
6562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#endif
6572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#endif
6582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
65987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   if (dri2_surf->have_fake_front)
66087dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke      render_attachment = XCB_DRI2_ATTACHMENT_BUFFER_FAKE_FRONT_LEFT;
66187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   else
66287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke      render_attachment = XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT;
6632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   cookie = xcb_dri2_copy_region_unchecked(dri2_dpy->conn,
6652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   dri2_surf->drawable,
6662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   region,
6672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT,
66887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke					   render_attachment);
6692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(xcb_dri2_copy_region_reply(dri2_dpy->conn, cookie, NULL));
6702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
6722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
6732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
6752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
6762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
677f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
6782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
6792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
680f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (dri2_dpy->dri2) {
681f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return dri2_copy_region(drv, disp, draw, dri2_surf->region);
682f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
683f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      assert(dri2_dpy->swrast);
684f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
685f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_dpy->core->swapBuffers(dri2_surf->dri_drawable);
686f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return EGL_TRUE;
687f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
6882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
6892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
6912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw,
6922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			 EGLint numRects, const EGLint *rects)
6932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
6942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
6952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
6962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   EGLBoolean ret;
6972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_region_t region;
6982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_rectangle_t rectangles[16];
6992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   int i;
7002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (numRects > (int)ARRAY_SIZE(rectangles))
7022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return dri2_copy_region(drv, disp, draw, dri2_surf->region);
7032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* FIXME: Invert y here? */
7052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   for (i = 0; i < numRects; i++) {
7062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].x = rects[i * 4];
7072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].y = rects[i * 4 + 1];
7082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].width = rects[i * 4 + 2];
7092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].height = rects[i * 4 + 3];
7102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
7112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   region = xcb_generate_id(dri2_dpy->conn);
7132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_create_region(dri2_dpy->conn, region, numRects, rectangles);
7142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   ret = dri2_copy_region(drv, disp, draw, region);
7152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_destroy_region(dri2_dpy->conn, region);
7162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return ret;
7182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
7192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
7212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_copy_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
7222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  EGLNativePixmapType target)
7232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
7242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
7252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
7262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_gcontext_t gc;
7272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) drv;
7292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
7312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   gc = xcb_generate_id(dri2_dpy->conn);
7332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_create_gc(dri2_dpy->conn, gc, target, 0, NULL);
7342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_copy_area(dri2_dpy->conn,
7352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  dri2_surf->drawable,
7362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  target,
7372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  gc,
7382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  0, 0,
7392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  0, 0,
7402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  dri2_surf->base.Width,
7412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  dri2_surf->base.Height);
7422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_free_gc(dri2_dpy->conn, gc);
7432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
7452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
7462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLImage *
7482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
7492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			     EGLClientBuffer buffer, const EGLint *attr_list)
7502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
7512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
7522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_image *dri2_img;
7532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   unsigned int attachments[1];
7542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_drawable_t drawable;
7552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_cookie_t buffers_cookie;
7562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_reply_t *buffers_reply;
7572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_dri2_buffer_t *buffers;
7582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_get_geometry_cookie_t geometry_cookie;
7592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_get_geometry_reply_t *geometry_reply;
7602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_generic_error_t *error;
7612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   int stride, format;
7622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) ctx;
7642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drawable = (xcb_drawable_t) buffer;
7662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_create_drawable (dri2_dpy->conn, drawable);
7672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   attachments[0] = XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT;
7682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers_cookie =
7692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_dri2_get_buffers_unchecked (dri2_dpy->conn,
7702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg				      drawable, 1, 1, attachments);
7712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   geometry_cookie = xcb_get_geometry (dri2_dpy->conn, drawable);
7722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers_reply = xcb_dri2_get_buffers_reply (dri2_dpy->conn,
7732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					       buffers_cookie, NULL);
7742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers = xcb_dri2_get_buffers_buffers (buffers_reply);
7752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (buffers == NULL) {
7762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
7772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
7782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   geometry_reply = xcb_get_geometry_reply (dri2_dpy->conn,
7802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					    geometry_cookie, &error);
7812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (geometry_reply == NULL || error != NULL) {
7822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_ALLOC, "xcb_get_geometry");
7832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(error);
7842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
7852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
7862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   switch (geometry_reply->depth) {
7882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case 16:
7892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      format = __DRI_IMAGE_FORMAT_RGB565;
7902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      break;
7912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case 24:
7922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      format = __DRI_IMAGE_FORMAT_XRGB8888;
7932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      break;
7942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case 32:
7952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      format = __DRI_IMAGE_FORMAT_ARGB8888;
7962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      break;
7972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   default:
7982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_PARAMETER,
7992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		"dri2_create_image_khr: unsupported pixmap depth");
8002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
8012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(geometry_reply);
8022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
8032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_img = malloc(sizeof *dri2_img);
8062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_img) {
8072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
8082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(geometry_reply);
8092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
8102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_NO_IMAGE_KHR;
8112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!_eglInitImage(&dri2_img->base, disp)) {
8142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
8152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(geometry_reply);
8162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_NO_IMAGE_KHR;
8172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   stride = buffers[0].pitch / buffers[0].cpp;
8202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_img->dri_image =
8212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
8222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   buffers_reply->width,
8232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   buffers_reply->height,
8242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   format,
8252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   buffers[0].name,
8262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   stride,
8272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   dri2_img);
8282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(buffers_reply);
8302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(geometry_reply);
8312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return &dri2_img->base;
8332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
8342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLImage *
8362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_x11_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
8372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			  _EGLContext *ctx, EGLenum target,
8382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			  EGLClientBuffer buffer, const EGLint *attr_list)
8392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
8402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) drv;
8412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   switch (target) {
8432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case EGL_NATIVE_PIXMAP_KHR:
8442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list);
8452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   default:
8462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list);
8472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
8492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
850f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic EGLBoolean
851f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengdri2_initialize_x11_swrast(_EGLDriver *drv, _EGLDisplay *disp)
852f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
853f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_display *dri2_dpy;
854f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
855f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreateWindowSurface = dri2_create_window_surface;
856f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreatePixmapSurface = dri2_create_pixmap_surface;
857f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface;
858f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.DestroySurface = dri2_destroy_surface;
859f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.SwapBuffers = dri2_swap_buffers;
860f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CopyBuffers = dri2_copy_buffers;
861f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
862f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.SwapBuffersRegionNOK = NULL;
863f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreateImageKHR  = NULL;
864f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.DestroyImageKHR = NULL;
865f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreateDRMImageMESA = NULL;
866f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.ExportDRMImageMESA = NULL;
867f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
868f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy = malloc(sizeof *dri2_dpy);
869f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (!dri2_dpy)
870f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return _eglError(EGL_BAD_ALLOC, "eglInitialize");
871f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
872f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   memset(dri2_dpy, 0, sizeof *dri2_dpy);
873f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
874f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   disp->DriverData = (void *) dri2_dpy;
875f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (disp->PlatformDisplay == NULL) {
876f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_dpy->conn = xcb_connect(0, 0);
877f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
878f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_dpy->conn = XGetXCBConnection((Display *) disp->PlatformDisplay);
879f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
880f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
881f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (xcb_connection_has_error(dri2_dpy->conn)) {
882f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: xcb_connect failed");
883f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      goto cleanup_dpy;
884f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
885f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
886f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->driver_name = dri2_strndup("swrast", strlen("swrast"));
887f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
888f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (!dri2_load_driver(disp))
889f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      goto cleanup_conn;
890f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
891f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.base.name = __DRI_SWRAST_LOADER;
892f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.base.version = __DRI_SWRAST_LOADER_VERSION;
893f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.getDrawableInfo = swrastGetDrawableInfo;
894f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.putImage = swrastPutImage;
895f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.getImage = swrastGetImage;
896f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
897f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->extensions[0] = &dri2_dpy->swrast_loader_extension.base;
898f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->extensions[1] = NULL;
899f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->extensions[2] = NULL;
900f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
901f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (!dri2_create_screen(disp))
902f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      goto cleanup_driver;
903f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
904f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (dri2_dpy->conn) {
905f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      if (!dri2_add_configs_for_visuals(dri2_dpy, disp))
906f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         goto cleanup_configs;
907f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
908f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
909f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   /* we're supporting EGL 1.4 */
910f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   disp->VersionMajor = 1;
911f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   disp->VersionMinor = 4;
912f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
913f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   return EGL_TRUE;
914f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
915f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_configs:
916f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   _eglCleanupDisplay(disp);
917f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
918f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_driver:
919f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dlclose(dri2_dpy->driver);
920f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_conn:
921f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (disp->PlatformDisplay == NULL)
922f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      xcb_disconnect(dri2_dpy->conn);
923f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_dpy:
924f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   free(dri2_dpy);
925f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
926f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   return EGL_FALSE;
927f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
928f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
929f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
930f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic EGLBoolean
931f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengdri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp)
9322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
9332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy;
9342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreateWindowSurface = dri2_create_window_surface;
9362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreatePixmapSurface = dri2_create_pixmap_surface;
9372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface;
9382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.DestroySurface = dri2_destroy_surface;
9392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.SwapBuffers = dri2_swap_buffers;
9402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CopyBuffers = dri2_copy_buffers;
9412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreateImageKHR = dri2_x11_create_image_khr;
9422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.SwapBuffersRegionNOK = dri2_swap_buffers_region;
9432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy = malloc(sizeof *dri2_dpy);
9452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_dpy)
9462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return _eglError(EGL_BAD_ALLOC, "eglInitialize");
9472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
948f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   memset(dri2_dpy, 0, sizeof *dri2_dpy);
949f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
9502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->DriverData = (void *) dri2_dpy;
9512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (disp->PlatformDisplay == NULL) {
9522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_dpy->conn = xcb_connect(0, 0);
9532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   } else {
9542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_dpy->conn = XGetXCBConnection((Display *) disp->PlatformDisplay);
9552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (xcb_connection_has_error(dri2_dpy->conn)) {
9582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglLog(_EGL_WARNING, "DRI2: xcb_connect failed");
9592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_dpy;
9602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->conn) {
9632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (!dri2_connect(dri2_dpy))
9642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 goto cleanup_conn;
9652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_load_driver(disp))
9682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_conn;
9692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR);
9712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->fd == -1) {
9722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglLog(_EGL_WARNING,
9732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	      "DRI2: could not open %s (%s)", dri2_dpy->device_name,
9742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg              strerror(errno));
9752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_driver;
9762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->conn) {
9792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (!dri2_authenticate(dri2_dpy))
9802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 goto cleanup_fd;
9812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->dri2_minor >= 1) {
9843104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER;
9853104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.version = 3;
9863104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers;
9873104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer;
9883104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffersWithFormat =
9892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 dri2_get_buffers_with_format;
9902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   } else {
9913104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER;
9923104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.version = 2;
9933104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers;
9943104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer;
9953104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffersWithFormat = NULL;
9962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9983104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng   dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base;
9992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->extensions[1] = &image_lookup_extension.base;
10002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->extensions[2] = NULL;
10012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_create_screen(disp))
10032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_fd;
10042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->conn) {
10062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (!dri2_add_configs_for_visuals(dri2_dpy, disp))
10072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 goto cleanup_configs;
10082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
10092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.MESA_drm_image = EGL_TRUE;
10112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.KHR_image_base = EGL_TRUE;
10122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.KHR_image_pixmap = EGL_TRUE;
10132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.KHR_gl_renderbuffer_image = EGL_TRUE;
10142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.KHR_gl_texture_2D_image = EGL_TRUE;
10152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.NOK_swap_region = EGL_TRUE;
10162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE;
10172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* we're supporting EGL 1.4 */
10192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->VersionMajor = 1;
10202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->VersionMinor = 4;
10212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
10232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_configs:
10252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   _eglCleanupDisplay(disp);
10262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
10272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_fd:
10282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   close(dri2_dpy->fd);
10292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_driver:
10302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dlclose(dri2_dpy->driver);
10312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_conn:
10322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (disp->PlatformDisplay == NULL)
10332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_disconnect(dri2_dpy->conn);
10342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_dpy:
10352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(dri2_dpy);
10362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_FALSE;
10382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
1039f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1040f55d027ac2e0423eba5d0664cc36668520597703Haitao FengEGLBoolean
1041f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengdri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp)
1042f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
1043f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   EGLBoolean initialized = EGL_TRUE;
1044f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1045f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   int x11_dri2_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL);
1046f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1047f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (x11_dri2_accel) {
1048f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      if (!dri2_initialize_x11_dri2(drv, disp)) {
1049f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         initialized = dri2_initialize_x11_swrast(drv, disp);
1050f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      }
1051f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
1052f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      initialized = dri2_initialize_x11_swrast(drv, disp);
1053f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
1054f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1055f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   return initialized;
1056f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
1057f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1058