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