platform_x11.c revision 80636ff2da374ca417db5afaaa0ab0cc5de9272d
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 {
23458f95f9d01f1fe2c260ca87f1ee74d9710947c12Feng, Haitao      swrastCreateDrawable(dri2_dpy, dri2_surf, _eglGetConfigKey(conf, EGL_BUFFER_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;
4814ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke   char *driver_name, *device_name;
48280636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke   const xcb_query_extension_reply_t *extension;
4832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_xfixes_id);
4852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_dri2_id);
4862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
48780636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke   extension = xcb_get_extension_data(dri2_dpy->conn, &xcb_xfixes_id);
48880636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke   if (!(extension && extension->present))
48980636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke      return EGL_FALSE;
49080636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke
49180636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke   extension = xcb_get_extension_data(dri2_dpy->conn, &xcb_dri2_id);
49280636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke   if (!(extension && extension->present))
49380636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke      return EGL_FALSE;
49480636ff2da374ca417db5afaaa0ab0cc5de9272dBenjamin Franzke
4952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xfixes_query_cookie = xcb_xfixes_query_version(dri2_dpy->conn,
4962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						  XCB_XFIXES_MAJOR_VERSION,
4972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						  XCB_XFIXES_MINOR_VERSION);
4982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
4992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_query_cookie = xcb_dri2_query_version (dri2_dpy->conn,
5002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					       XCB_DRI2_MAJOR_VERSION,
5012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					       XCB_DRI2_MINOR_VERSION);
5022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn));
5042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   connect_cookie = xcb_dri2_connect_unchecked (dri2_dpy->conn,
5052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						s.data->root,
5062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg						XCB_DRI2_DRIVER_TYPE_DRI);
5072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xfixes_query =
5092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_xfixes_query_version_reply (dri2_dpy->conn,
5102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg				      xfixes_query_cookie, &error);
5112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (xfixes_query == NULL ||
5122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       error != NULL || xfixes_query->major_version < 2) {
513f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to query xfixes version");
5142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(error);
5152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5162889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(xfixes_query);
5182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_query =
5202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_dri2_query_version_reply (dri2_dpy->conn, dri2_query_cookie, &error);
5212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_query == NULL || error != NULL) {
522f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to query version");
5232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(error);
5242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->dri2_major = dri2_query->major_version;
5272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->dri2_minor = dri2_query->minor_version;
5282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(dri2_query);
5292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   connect = xcb_dri2_connect_reply (dri2_dpy->conn, connect_cookie, NULL);
5312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (connect == NULL ||
5322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg       connect->driver_name_length + connect->device_name_length == 0) {
533f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to authenticate");
5342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5374ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke   driver_name = xcb_dri2_connect_driver_name (connect);
5382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->driver_name =
5394ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke      dri2_strndup(driver_name,
5402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		   xcb_dri2_connect_driver_name_length (connect));
5412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5424ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke#if XCB_DRI2_CONNECT_DEVICE_NAME_BROKEN
5434ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke   device_name = driver_name + ((connect->driver_name_length + 3) & ~3);
5444ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke#else
5454ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke   device_name = xcb_dri2_connect_device_name (connect);
5464ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke#endif
5474ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke
5484ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke   dri2_dpy->device_name =
5494ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke      dri2_strndup(device_name,
5504ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke		   xcb_dri2_connect_device_name_length (connect));
5514ca075ac4f047141d5e5ef865991650e0ac488e4Benjamin Franzke
5522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->device_name == NULL || dri2_dpy->driver_name == NULL) {
5532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(dri2_dpy->device_name);
5542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(dri2_dpy->driver_name);
5552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(connect);
5562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(connect);
5592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
5612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
5622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5636b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestatic int
5646b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkedri2_x11_authenticate(_EGLDisplay *disp, uint32_t id)
5652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
5666b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
5672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_authenticate_reply_t *authenticate;
5682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_authenticate_cookie_t authenticate_cookie;
5692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_screen_iterator_t s;
5706b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   int ret = 0;
5716b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
5726b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn));
5736b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   authenticate_cookie =
5746b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      xcb_dri2_authenticate_unchecked(dri2_dpy->conn, s.data->root, id);
5756b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   authenticate =
5766b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      xcb_dri2_authenticate_reply(dri2_dpy->conn, authenticate_cookie, NULL);
5776b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
5786b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (authenticate == NULL || !authenticate->authenticated)
5796b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      ret = -1;
5806b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
5816b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (authenticate)
5826b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      free(authenticate);
5836b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
5846b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   return ret;
5856b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
5866b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
5876b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestatic EGLBoolean
5886b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkedri2_authenticate(_EGLDisplay *disp)
5896b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
5906b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
5912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drm_magic_t magic;
5922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
5932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (drmGetMagic(dri2_dpy->fd, &magic)) {
594f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to get drm magic");
5952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
5962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
5976b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
5986b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (dri2_x11_authenticate(disp, magic) < 0) {
599f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: failed to authenticate");
6002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
6012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
6022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
6042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
6052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
6072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy,
6082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			     _EGLDisplay *disp)
6092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
6102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_screen_iterator_t s;
6112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_depth_iterator_t d;
6122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_visualtype_t *visuals;
6132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   int i, j, id;
6142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   EGLint surface_type;
61587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   EGLint config_attrs[] = {
61687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	   EGL_NATIVE_VISUAL_ID,   0,
61787dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	   EGL_NATIVE_VISUAL_TYPE, 0,
61887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	   EGL_NONE
61987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   };
6202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn));
6222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   d = xcb_screen_allowed_depths_iterator(s.data);
6232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   id = 1;
6242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   surface_type =
6262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_WINDOW_BIT |
6272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_PIXMAP_BIT |
6282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_PBUFFER_BIT |
6292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
6302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   while (d.rem > 0) {
6322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      EGLBoolean class_added[6] = { 0, };
6332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      visuals = xcb_depth_visuals(d.data);
6352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      for (i = 0; i < xcb_depth_visuals_length(d.data); i++) {
6362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 if (class_added[visuals[i]._class])
6372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	    continue;
6382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 class_added[visuals[i]._class] = EGL_TRUE;
6402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 for (j = 0; dri2_dpy->driver_configs[j]; j++) {
64187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke            config_attrs[1] = visuals[i].visual_id;
64287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke            config_attrs[3] = visuals[i]._class;
64387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke
64487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke	    dri2_add_config(disp, dri2_dpy->driver_configs[j], id++,
64587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke			    d.data->depth, surface_type, config_attrs);
6462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 }
6472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      }
6482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_depth_next(&d);
6502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
6512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!_eglGetArraySize(disp->Configs)) {
6532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglLog(_EGL_WARNING, "DRI2: failed to create any config");
6542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_FALSE;
6552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
6562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
6582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
6592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
6612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_copy_region(_EGLDriver *drv, _EGLDisplay *disp,
6622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		 _EGLSurface *draw, xcb_xfixes_region_t region)
6632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
6642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
6652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
6662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
6672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   _EGLContext *ctx;
66887dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   enum xcb_dri2_attachment_t render_attachment;
6692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_copy_region_cookie_t cookie;
6702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_drv->glFlush) {
6722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      ctx = _eglGetCurrentContext();
6732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (ctx && ctx->DrawSurface == &dri2_surf->base)
6742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg         dri2_drv->glFlush();
6752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
6762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
6782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#if 0
6802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* FIXME: Add support for dri swapbuffers, that'll give us swap
6812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg    * interval and page flipping (at least for fullscreen windows) as
6822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg    * well as the page flip event.  Unless surface->SwapBehavior is
6832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg    * EGL_BUFFER_PRESERVED. */
6842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#if __DRI2_FLUSH_VERSION >= 2
6852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (pdraw->psc->f)
6862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      (*pdraw->psc->f->flushInvalidate)(pdraw->driDrawable);
6872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#endif
6882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg#endif
6892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
69087dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   if (dri2_surf->have_fake_front)
69187dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke      render_attachment = XCB_DRI2_ATTACHMENT_BUFFER_FAKE_FRONT_LEFT;
69287dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   else
69387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke      render_attachment = XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT;
6942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
6952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   cookie = xcb_dri2_copy_region_unchecked(dri2_dpy->conn,
6962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   dri2_surf->drawable,
6972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   region,
6982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT,
69987dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke					   render_attachment);
7002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(xcb_dri2_copy_region_reply(dri2_dpy->conn, cookie, NULL));
7012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
7032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
7042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
7062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
7072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
708f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
7092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
7102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
711f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (dri2_dpy->dri2) {
712f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return dri2_copy_region(drv, disp, draw, dri2_surf->region);
713f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
714f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      assert(dri2_dpy->swrast);
715f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
716f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_dpy->core->swapBuffers(dri2_surf->dri_drawable);
717f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return EGL_TRUE;
718f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
7192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
7202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
7222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw,
7232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			 EGLint numRects, const EGLint *rects)
7242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
7252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
7262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
7272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   EGLBoolean ret;
7282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_region_t region;
7292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_rectangle_t rectangles[16];
7302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   int i;
7312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (numRects > (int)ARRAY_SIZE(rectangles))
7332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return dri2_copy_region(drv, disp, draw, dri2_surf->region);
7342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* FIXME: Invert y here? */
7362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   for (i = 0; i < numRects; i++) {
7372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].x = rects[i * 4];
7382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].y = rects[i * 4 + 1];
7392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].width = rects[i * 4 + 2];
7402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      rectangles[i].height = rects[i * 4 + 3];
7412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
7422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   region = xcb_generate_id(dri2_dpy->conn);
7442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_create_region(dri2_dpy->conn, region, numRects, rectangles);
7452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   ret = dri2_copy_region(drv, disp, draw, region);
7462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_xfixes_destroy_region(dri2_dpy->conn, region);
7472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return ret;
7492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
7502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic EGLBoolean
7522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_copy_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
7532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  EGLNativePixmapType target)
7542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
7552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
7562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
7572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_gcontext_t gc;
7582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) drv;
7602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
7622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   gc = xcb_generate_id(dri2_dpy->conn);
7642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_create_gc(dri2_dpy->conn, gc, target, 0, NULL);
7652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_copy_area(dri2_dpy->conn,
7662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  dri2_surf->drawable,
7672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  target,
7682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  gc,
7692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  0, 0,
7702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  0, 0,
7712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  dri2_surf->base.Width,
7722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		  dri2_surf->base.Height);
7732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_free_gc(dri2_dpy->conn, gc);
7742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
7762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
7772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLImage *
7792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
7802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			     EGLClientBuffer buffer, const EGLint *attr_list)
7812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
7822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
7832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_image *dri2_img;
7842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   unsigned int attachments[1];
7852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_drawable_t drawable;
7862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_cookie_t buffers_cookie;
7872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_get_buffers_reply_t *buffers_reply;
7882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_dri2_buffer_t *buffers;
7892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_get_geometry_cookie_t geometry_cookie;
7902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_get_geometry_reply_t *geometry_reply;
7912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_generic_error_t *error;
7922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   int stride, format;
7932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) ctx;
7952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
7966a661895e946f38b21775bf9cb45ef6b22fab85aJosé Fonseca   drawable = (xcb_drawable_t) (uintptr_t) buffer;
7972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   xcb_dri2_create_drawable (dri2_dpy->conn, drawable);
7982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   attachments[0] = XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT;
7992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers_cookie =
8002889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_dri2_get_buffers_unchecked (dri2_dpy->conn,
8012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg				      drawable, 1, 1, attachments);
8022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   geometry_cookie = xcb_get_geometry (dri2_dpy->conn, drawable);
8032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers_reply = xcb_dri2_get_buffers_reply (dri2_dpy->conn,
8042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					       buffers_cookie, NULL);
8052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   buffers = xcb_dri2_get_buffers_buffers (buffers_reply);
8062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (buffers == NULL) {
8072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
8082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8092889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   geometry_reply = xcb_get_geometry_reply (dri2_dpy->conn,
8112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					    geometry_cookie, &error);
8122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (geometry_reply == NULL || error != NULL) {
8132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_ALLOC, "xcb_get_geometry");
8142889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(error);
8152889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
816bf0c56522e21bd45ad3385e3115ef7eb71a7b8bfChia-I Wu      return NULL;
8172889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8182889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   switch (geometry_reply->depth) {
8202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case 16:
8212889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      format = __DRI_IMAGE_FORMAT_RGB565;
8222889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      break;
8232889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case 24:
8242889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      format = __DRI_IMAGE_FORMAT_XRGB8888;
8252889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      break;
8262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case 32:
8272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      format = __DRI_IMAGE_FORMAT_ARGB8888;
8282889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      break;
8292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   default:
8302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_PARAMETER,
8312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg		"dri2_create_image_khr: unsupported pixmap depth");
8322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
8332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(geometry_reply);
8342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return NULL;
8352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_img = malloc(sizeof *dri2_img);
8382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_img) {
8392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
8402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(geometry_reply);
8412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
8422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_NO_IMAGE_KHR;
8432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8442889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8452889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!_eglInitImage(&dri2_img->base, disp)) {
8462889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(buffers_reply);
8472889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      free(geometry_reply);
8482889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return EGL_NO_IMAGE_KHR;
8492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   stride = buffers[0].pitch / buffers[0].cpp;
8522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_img->dri_image =
8532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
8542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   buffers_reply->width,
8552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   buffers_reply->height,
8562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   format,
8572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   buffers[0].name,
8582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   stride,
8592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg					   dri2_img);
8602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(buffers_reply);
8622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(geometry_reply);
8632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return &dri2_img->base;
8652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
8662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergstatic _EGLImage *
8682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsbergdri2_x11_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
8692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			  _EGLContext *ctx, EGLenum target,
8702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg			  EGLClientBuffer buffer, const EGLint *attr_list)
8712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
8722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   (void) drv;
8732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
8742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   switch (target) {
8752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   case EGL_NATIVE_PIXMAP_KHR:
8762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list);
8772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   default:
8782889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list);
8792889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
8802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
8812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
882f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic EGLBoolean
883f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengdri2_initialize_x11_swrast(_EGLDriver *drv, _EGLDisplay *disp)
884f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
885f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   struct dri2_egl_display *dri2_dpy;
886f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
887f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreateWindowSurface = dri2_create_window_surface;
888f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreatePixmapSurface = dri2_create_pixmap_surface;
889f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface;
890f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.DestroySurface = dri2_destroy_surface;
891f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.SwapBuffers = dri2_swap_buffers;
892f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CopyBuffers = dri2_copy_buffers;
893f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
894f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.SwapBuffersRegionNOK = NULL;
895f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreateImageKHR  = NULL;
896f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.DestroyImageKHR = NULL;
897f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.CreateDRMImageMESA = NULL;
898f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   drv->API.ExportDRMImageMESA = NULL;
899f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
900f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy = malloc(sizeof *dri2_dpy);
901f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (!dri2_dpy)
902f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      return _eglError(EGL_BAD_ALLOC, "eglInitialize");
903f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
904f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   memset(dri2_dpy, 0, sizeof *dri2_dpy);
905f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
906f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   disp->DriverData = (void *) dri2_dpy;
907f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (disp->PlatformDisplay == NULL) {
908f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_dpy->conn = xcb_connect(0, 0);
909f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
910f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      dri2_dpy->conn = XGetXCBConnection((Display *) disp->PlatformDisplay);
911f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
912f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
913f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (xcb_connection_has_error(dri2_dpy->conn)) {
914f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      _eglLog(_EGL_WARNING, "DRI2: xcb_connect failed");
915f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      goto cleanup_dpy;
916f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
917f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
918cf69eeacc6931e833e7894a379af4fae085881e9Chia-I Wu   if (!dri2_load_driver_swrast(disp))
919f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      goto cleanup_conn;
920f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
921f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.base.name = __DRI_SWRAST_LOADER;
922f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.base.version = __DRI_SWRAST_LOADER_VERSION;
923f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.getDrawableInfo = swrastGetDrawableInfo;
924f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.putImage = swrastPutImage;
925f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->swrast_loader_extension.getImage = swrastGetImage;
926f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
927f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->extensions[0] = &dri2_dpy->swrast_loader_extension.base;
928f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->extensions[1] = NULL;
929f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->extensions[2] = NULL;
930f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
931f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (!dri2_create_screen(disp))
932f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      goto cleanup_driver;
933f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
934f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (dri2_dpy->conn) {
935f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      if (!dri2_add_configs_for_visuals(dri2_dpy, disp))
936f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         goto cleanup_configs;
937f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
938f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
939f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   /* we're supporting EGL 1.4 */
940f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   disp->VersionMajor = 1;
941f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   disp->VersionMinor = 4;
942f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
943f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   return EGL_TRUE;
944f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
945f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_configs:
946f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   _eglCleanupDisplay(disp);
947f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
948f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_driver:
949f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   dlclose(dri2_dpy->driver);
950f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_conn:
951f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (disp->PlatformDisplay == NULL)
952f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      xcb_disconnect(dri2_dpy->conn);
953f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng cleanup_dpy:
954f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   free(dri2_dpy);
955f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
956f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   return EGL_FALSE;
957f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
958f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
959f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
960f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengstatic EGLBoolean
961f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengdri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp)
9622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg{
9632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   struct dri2_egl_display *dri2_dpy;
9642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreateWindowSurface = dri2_create_window_surface;
9662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreatePixmapSurface = dri2_create_pixmap_surface;
9672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface;
9682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.DestroySurface = dri2_destroy_surface;
9692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.SwapBuffers = dri2_swap_buffers;
9702889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CopyBuffers = dri2_copy_buffers;
9712889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.CreateImageKHR = dri2_x11_create_image_khr;
9722889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   drv->API.SwapBuffersRegionNOK = dri2_swap_buffers_region;
9732889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9742889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy = malloc(sizeof *dri2_dpy);
9752889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_dpy)
9762889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      return _eglError(EGL_BAD_ALLOC, "eglInitialize");
9772889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
978f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   memset(dri2_dpy, 0, sizeof *dri2_dpy);
979f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
9802889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->DriverData = (void *) dri2_dpy;
9812889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (disp->PlatformDisplay == NULL) {
9822889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_dpy->conn = xcb_connect(0, 0);
9832889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   } else {
9842889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      dri2_dpy->conn = XGetXCBConnection((Display *) disp->PlatformDisplay);
9852889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9862889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9872889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (xcb_connection_has_error(dri2_dpy->conn)) {
9882889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglLog(_EGL_WARNING, "DRI2: xcb_connect failed");
9892889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_dpy;
9902889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9912889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9922889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->conn) {
9932889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (!dri2_connect(dri2_dpy))
9942889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 goto cleanup_conn;
9952889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
9962889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
9972889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_load_driver(disp))
9982889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_conn;
9992889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
100055a629cee5c20b357cca5c767a14fb27d9691e16Kristian Høgsberg   dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR | O_CLOEXEC);
10012889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->fd == -1) {
10022889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      _eglLog(_EGL_WARNING,
10032889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	      "DRI2: could not open %s (%s)", dri2_dpy->device_name,
10042889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg              strerror(errno));
10052889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_driver;
10062889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
10072889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10082889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->conn) {
10096b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      if (!dri2_authenticate(disp))
10102889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 goto cleanup_fd;
10112889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
10122889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10132889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->dri2_minor >= 1) {
10143104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER;
10153104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.version = 3;
10163104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers;
10173104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer;
10183104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffersWithFormat =
10192889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 dri2_get_buffers_with_format;
10202889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   } else {
10213104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER;
10223104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.base.version = 2;
10233104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers;
10243104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer;
10253104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng      dri2_dpy->dri2_loader_extension.getBuffersWithFormat = NULL;
10262889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
10272889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10283104e5cb4f8524e9852300aa1e112d7fe31545caHaitao Feng   dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base;
10292889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->extensions[1] = &image_lookup_extension.base;
10302889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->extensions[2] = NULL;
10312889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10322889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (!dri2_create_screen(disp))
10332889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      goto cleanup_fd;
10342889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10352889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (dri2_dpy->conn) {
10362889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      if (!dri2_add_configs_for_visuals(dri2_dpy, disp))
10372889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg	 goto cleanup_configs;
10382889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   }
10392889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10402889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.KHR_image_pixmap = EGL_TRUE;
10412889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.NOK_swap_region = EGL_TRUE;
10422889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE;
10432889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10446b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#ifdef HAVE_WAYLAND_PLATFORM
10456b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
10466b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
10476b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   dri2_dpy->authenticate = dri2_x11_authenticate;
10486b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
10492889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   /* we're supporting EGL 1.4 */
10502889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->VersionMajor = 1;
10512889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   disp->VersionMinor = 4;
10522889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10532889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_TRUE;
10542889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10552889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_configs:
10562889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   _eglCleanupDisplay(disp);
10572889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
10582889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_fd:
10592889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   close(dri2_dpy->fd);
10602889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_driver:
10612889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   dlclose(dri2_dpy->driver);
10622889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_conn:
10632889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   if (disp->PlatformDisplay == NULL)
10642889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg      xcb_disconnect(dri2_dpy->conn);
10652889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg cleanup_dpy:
10662889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   free(dri2_dpy);
10672889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg
10682889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg   return EGL_FALSE;
10692889d9640fa98b690c6a89593572bbc9ea5640e3Kristian Høgsberg}
1070f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1071f55d027ac2e0423eba5d0664cc36668520597703Haitao FengEGLBoolean
1072f55d027ac2e0423eba5d0664cc36668520597703Haitao Fengdri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp)
1073f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng{
1074f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   EGLBoolean initialized = EGL_TRUE;
1075f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1076f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   int x11_dri2_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL);
1077f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1078f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   if (x11_dri2_accel) {
1079f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      if (!dri2_initialize_x11_dri2(drv, disp)) {
1080f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng         initialized = dri2_initialize_x11_swrast(drv, disp);
1081f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      }
1082f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   } else {
1083f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng      initialized = dri2_initialize_x11_swrast(drv, disp);
1084f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   }
1085f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1086f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng   return initialized;
1087f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng}
1088f55d027ac2e0423eba5d0664cc36668520597703Haitao Feng
1089