1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2011 Intel Corporation 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Kristian Høgsberg <krh@bitplanet.net> 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h> 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <limits.h> 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <dlfcn.h> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <fcntl.h> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <errno.h> 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86drm.h> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/types.h> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/stat.h> 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_dri2.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswrastCreateDrawable(struct dri2_egl_display * dri2_dpy, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface * dri2_surf, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int depth) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t mask; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t function = GXcopy; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t valgc[2]; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create GC's */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->gc = xcb_generate_id(dri2_dpy->conn); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = XCB_GC_FUNCTION; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_create_gc(dri2_dpy->conn, dri2_surf->gc, dri2_surf->drawable, mask, &function); 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->swapgc = xcb_generate_id(dri2_dpy->conn); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = XCB_GC_FUNCTION | XCB_GC_GRAPHICS_EXPOSURES; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valgc[0] = function; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valgc[1] = False; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_create_gc(dri2_dpy->conn, dri2_surf->swapgc, dri2_surf->drawable, mask, valgc); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->depth = depth; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (depth) { 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 24: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->bytes_per_pixel = 4; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->bytes_per_pixel = 2; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->bytes_per_pixel = 1; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->bytes_per_pixel = 0; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "unsupported depth %d", depth); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswrastDestroyDrawable(struct dri2_egl_display * dri2_dpy, 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface * dri2_surf) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_free_gc(dri2_dpy->conn, dri2_surf->gc); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_free_gc(dri2_dpy->conn, dri2_surf->swapgc); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswrastGetDrawableInfo(__DRIdrawable * draw, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *x, int *y, int *w, int *h, 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *loaderPrivate) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = loaderPrivate; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_geometry_cookie_t cookie; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_geometry_reply_t *reply; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_generic_error_t *error; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *w = *h = 0; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply = xcb_get_geometry_reply (dri2_dpy->conn, cookie, &error); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply == NULL) 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (error != NULL) { 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "error in xcb_get_geometry"); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(error); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *w = reply->width; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *h = reply->height; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswrastPutImage(__DRIdrawable * draw, int op, 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x, int y, int w, int h, 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *data, void *loaderPrivate) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = loaderPrivate; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_gcontext_t gc; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (op) { 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_SWRAST_IMAGE_OP_DRAW: 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc = dri2_surf->gc; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_SWRAST_IMAGE_OP_SWAP: 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc = dri2_surf->swapgc; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_put_image(dri2_dpy->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, dri2_surf->drawable, 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc, w, h, x, y, 0, dri2_surf->depth, 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w*h*dri2_surf->bytes_per_pixel, (const uint8_t *)data); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswrastGetImage(__DRIdrawable * read, 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x, int y, int w, int h, 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *data, void *loaderPrivate) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = loaderPrivate; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_image_cookie_t cookie; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_image_reply_t *reply; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_generic_error_t *error; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie = xcb_get_image (dri2_dpy->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable, x, y, w, h, ~0); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply = xcb_get_image_reply (dri2_dpy->conn, cookie, &error); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply == NULL) 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (error != NULL) { 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "error in xcb_get_image"); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(error); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t bytes = xcb_get_image_data_length(reply); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *idata = xcb_get_image_data(reply); 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(data, idata, bytes); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLSurface * 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLConfig *conf, EGLNativeWindowType window, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint *attrib_list) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_geometry_cookie_t cookie; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_geometry_reply_t *reply; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_screen_iterator_t s; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_generic_error_t *error; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf = malloc(sizeof *dri2_surf); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_surf) { 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "dri2_create_surface"); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list)) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_surf; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->region = XCB_NONE; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == EGL_PBUFFER_BIT) { 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable = xcb_generate_id(dri2_dpy->conn); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_create_pixmap(dri2_dpy->conn, conf->BufferSize, 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable, s.data->root, 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Width, dri2_surf->base.Height); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable = window; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->dri_drawable = 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen, 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type == EGL_WINDOW_BIT ? 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_conf->dri_double_config : 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_conf->dri_single_config, 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->swrast); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->dri_drawable = 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->swrast->createNewDrawable) (dri2_dpy->dri_screen, 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_conf->dri_double_config, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_surf->dri_drawable == NULL) { 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_pixmap; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_create_drawable (dri2_dpy->conn, dri2_surf->drawable); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrastCreateDrawable(dri2_dpy, dri2_surf, _eglGetConfigKey(conf, EGL_BUFFER_SIZE)); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type != EGL_PBUFFER_BIT) { 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply = xcb_get_geometry_reply (dri2_dpy->conn, cookie, &error); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply == NULL || error != NULL) { 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "xcb_get_geometry"); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(error); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_dri_drawable; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Width = reply->width; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Height = reply->height; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we always copy the back buffer to front */ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.PostSubBufferSupportedNV = EGL_TRUE; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &dri2_surf->base; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_dri_drawable: 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_pixmap: 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == EGL_PBUFFER_BIT) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_free_pixmap(dri2_dpy->conn, dri2_surf->drawable); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_surf: 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_surf); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLSurface * 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLConfig *conf, EGLNativeWindowType window, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint *attrib_list) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf, 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org window, attrib_list); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLSurface * 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *disp, 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLConfig *conf, EGLNativePixmapType pixmap, 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint *attrib_list) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_surface(drv, disp, EGL_PIXMAP_BIT, conf, 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixmap, attrib_list); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLSurface * 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp, 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLConfig *conf, const EGLint *attrib_list) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_surface(drv, disp, EGL_PBUFFER_BIT, conf, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCB_WINDOW_NONE, attrib_list); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglPutSurface(surf)) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_destroy_drawable (dri2_dpy->conn, dri2_surf->drawable); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->swrast); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrastDestroyDrawable(dri2_dpy, dri2_surf); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surf->Type == EGL_PBUFFER_BIT) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_free_pixmap (dri2_dpy->conn, dri2_surf->drawable); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(surf); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Process list of buffer received from the server 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Processes the list of buffers received in a reply from the server to either 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_process_buffers(struct dri2_egl_surface *dri2_surf, 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_dri2_buffer_t *buffers, unsigned count) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_egl_display(dri2_surf->base.Resource.Display); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_rectangle_t rectangle; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->buffer_count = count; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->have_fake_front = 0; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This assumes the DRI2 buffer attachment tokens matches the 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __DRIbuffer tokens. */ 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->buffers[i].attachment = buffers[i].attachment; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->buffers[i].name = buffers[i].name; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->buffers[i].pitch = buffers[i].pitch; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->buffers[i].cpp = buffers[i].cpp; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->buffers[i].flags = buffers[i].flags; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We only use the DRI drivers single buffer configs. This 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * means that if we try to render to a window, DRI2 will give us 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the fake front buffer, which we'll use as a back buffer. 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that EGL doesn't require that several clients rendering 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the same window must see the same aux buffers. */ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_surf->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->have_fake_front = 1; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_surf->region != XCB_NONE) 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_destroy_region(dri2_dpy->conn, dri2_surf->region); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangle.x = 0; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangle.y = 0; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangle.width = dri2_surf->base.Width; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangle.height = dri2_surf->base.Height; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->region = xcb_generate_id(dri2_dpy->conn); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_create_region(dri2_dpy->conn, dri2_surf->region, 1, &rectangle); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIbuffer * 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_get_buffers(__DRIdrawable * driDrawable, 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *width, int *height, 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int *attachments, int count, 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *out_count, void *loaderPrivate) 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = loaderPrivate; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_egl_display(dri2_surf->base.Resource.Display); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_dri2_buffer_t *buffers; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_get_buffers_reply_t *reply; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_get_buffers_cookie_t cookie; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) driDrawable; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie = xcb_dri2_get_buffers_unchecked (dri2_dpy->conn, 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable, 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count, count, attachments); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply = xcb_dri2_get_buffers_reply (dri2_dpy->conn, cookie, NULL); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers = xcb_dri2_get_buffers_buffers (reply); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buffers == NULL) 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_count = reply->count; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Width = *width = reply->width; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Height = *height = reply->height; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_process_buffers(dri2_surf, buffers, *out_count); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_surf->buffers; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIbuffer * 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_get_buffers_with_format(__DRIdrawable * driDrawable, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *width, int *height, 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int *attachments, int count, 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *out_count, void *loaderPrivate) 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = loaderPrivate; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_egl_display(dri2_surf->base.Resource.Display); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_dri2_buffer_t *buffers; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_get_buffers_with_format_reply_t *reply; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_get_buffers_with_format_cookie_t cookie; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_attach_format_t *format_attachments; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) driDrawable; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format_attachments = (xcb_dri2_attach_format_t *) attachments; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie = xcb_dri2_get_buffers_with_format_unchecked (dri2_dpy->conn, 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable, 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count, count, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format_attachments); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply = xcb_dri2_get_buffers_with_format_reply (dri2_dpy->conn, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie, NULL); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply == NULL) 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers = xcb_dri2_get_buffers_with_format_buffers (reply); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Width = *width = reply->width; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Height = *height = reply->height; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_count = reply->count; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_process_buffers(dri2_surf, buffers, *out_count); 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_surf->buffers; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) driDrawable; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: Does EGL support front buffer rendering at all? */ 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = loaderPrivate; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2WaitGL(dri2_surf); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) loaderPrivate; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char * 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_strndup(const char *s, int length) 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *d; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d = malloc(length + 1); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (d == NULL) 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(d, s, length); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d[length] = '\0'; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return d; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_connect(struct dri2_egl_display *dri2_dpy) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_query_version_reply_t *xfixes_query; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_query_version_cookie_t xfixes_query_cookie; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_query_version_reply_t *dri2_query; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_query_version_cookie_t dri2_query_cookie; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_connect_reply_t *connect; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_connect_cookie_t connect_cookie; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_generic_error_t *error; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_screen_iterator_t s; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *driver_name, *device_name; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const xcb_query_extension_reply_t *extension; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_xfixes_id); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_dri2_id); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extension = xcb_get_extension_data(dri2_dpy->conn, &xcb_xfixes_id); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(extension && extension->present)) 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extension = xcb_get_extension_data(dri2_dpy->conn, &xcb_dri2_id); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(extension && extension->present)) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xfixes_query_cookie = xcb_xfixes_query_version(dri2_dpy->conn, 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCB_XFIXES_MAJOR_VERSION, 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCB_XFIXES_MINOR_VERSION); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_query_cookie = xcb_dri2_query_version (dri2_dpy->conn, 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCB_DRI2_MAJOR_VERSION, 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCB_DRI2_MINOR_VERSION); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org connect_cookie = xcb_dri2_connect_unchecked (dri2_dpy->conn, 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s.data->root, 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCB_DRI2_DRIVER_TYPE_DRI); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xfixes_query = 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_query_version_reply (dri2_dpy->conn, 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xfixes_query_cookie, &error); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xfixes_query == NULL || 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error != NULL || xfixes_query->major_version < 2) { 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to query xfixes version"); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(error); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(xfixes_query); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_query = 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_query_version_reply (dri2_dpy->conn, dri2_query_cookie, &error); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_query == NULL || error != NULL) { 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to query version"); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(error); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_major = dri2_query->major_version; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_minor = dri2_query->minor_version; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_query); 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org connect = xcb_dri2_connect_reply (dri2_dpy->conn, connect_cookie, NULL); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (connect == NULL || 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org connect->driver_name_length + connect->device_name_length == 0) { 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to authenticate"); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver_name = xcb_dri2_connect_driver_name (connect); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->driver_name = 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_strndup(driver_name, 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_connect_driver_name_length (connect)); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if XCB_DRI2_CONNECT_DEVICE_NAME_BROKEN 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org device_name = driver_name + ((connect->driver_name_length + 3) & ~3); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org device_name = xcb_dri2_connect_device_name (connect); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->device_name = 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_strndup(device_name, 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_connect_device_name_length (connect)); 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->device_name == NULL || dri2_dpy->driver_name == NULL) { 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_dpy->device_name); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_dpy->driver_name); 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(connect); 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(connect); 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_x11_authenticate(_EGLDisplay *disp, uint32_t id) 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_authenticate_reply_t *authenticate; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_authenticate_cookie_t authenticate_cookie; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_screen_iterator_t s; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret = 0; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org authenticate_cookie = 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_authenticate_unchecked(dri2_dpy->conn, s.data->root, id); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org authenticate = 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_authenticate_reply(dri2_dpy->conn, authenticate_cookie, NULL); 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (authenticate == NULL || !authenticate->authenticated) 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = -1; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (authenticate) 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(authenticate); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_authenticate(_EGLDisplay *disp) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_magic_t magic; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (drmGetMagic(dri2_dpy->fd, &magic)) { 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to get drm magic"); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_x11_authenticate(disp, magic) < 0) { 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to authenticate"); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy, 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *disp) 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_screen_iterator_t s; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_depth_iterator_t d; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_visualtype_t *visuals; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, id; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint surface_type; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint config_attrs[] = { 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_NATIVE_VISUAL_ID, 0, 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_NATIVE_VISUAL_TYPE, 0, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_NONE 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d = xcb_screen_allowed_depths_iterator(s.data); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org id = 1; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type = 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_WINDOW_BIT | 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_PIXMAP_BIT | 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_PBUFFER_BIT | 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_SWAP_BEHAVIOR_PRESERVED_BIT; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (d.rem > 0) { 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLBoolean class_added[6] = { 0, }; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org visuals = xcb_depth_visuals(d.data); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < xcb_depth_visuals_length(d.data); i++) { 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (class_added[visuals[i]._class]) 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class_added[visuals[i]._class] = EGL_TRUE; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; dri2_dpy->driver_configs[j]; j++) { 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config_attrs[1] = visuals[i].visual_id; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config_attrs[3] = visuals[i]._class; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_add_config(disp, dri2_dpy->driver_configs[j], id++, 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d.data->depth, surface_type, config_attrs, NULL); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_depth_next(&d); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglGetArraySize(disp->Configs)) { 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to create any config"); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_copy_region(_EGLDriver *drv, _EGLDisplay *disp, 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLSurface *draw, xcb_xfixes_region_t region) 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum xcb_dri2_attachment_t render_attachment; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_copy_region_cookie_t cookie; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No-op for a pixmap or pbuffer surface */ 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->Type == EGL_PIXMAP_BIT || draw->Type == EGL_PBUFFER_BIT) 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __DRI2_FLUSH 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->flush) 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_surf->have_fake_front) 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org render_attachment = XCB_DRI2_ATTACHMENT_BUFFER_FAKE_FRONT_LEFT; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org render_attachment = XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie = xcb_dri2_copy_region_unchecked(dri2_dpy->conn, 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable, 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org region, 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT, 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org render_attachment); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(xcb_dri2_copy_region_reply(dri2_dpy->conn, cookie, NULL)); 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int64_t 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_swap_buffers_msc(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw, 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t msc, int64_t divisor, int64_t remainder) 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if XCB_DRI2_MINOR_VERSION >= 3 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t msc_hi = msc >> 32; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t msc_lo = msc & 0xffffffff; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t divisor_hi = divisor >> 32; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t divisor_lo = divisor & 0xffffffff; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t remainder_hi = remainder >> 32; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t remainder_lo = remainder & 0xffffffff; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_swap_buffers_cookie_t cookie; 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_swap_buffers_reply_t *reply; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t swap_count = -1; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No-op for a pixmap or pbuffer surface */ 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->Type == EGL_PIXMAP_BIT || draw->Type == EGL_PBUFFER_BIT) 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->SwapBehavior == EGL_BUFFER_PRESERVED || !dri2_dpy->swap_available) 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_copy_region(drv, disp, draw, dri2_surf->region) ? 0 : -1; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __DRI2_FLUSH 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->flush) 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cookie = xcb_dri2_swap_buffers_unchecked(dri2_dpy->conn, dri2_surf->drawable, 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msc_hi, msc_lo, divisor_hi, divisor_lo, remainder_hi, remainder_lo); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply = xcb_dri2_swap_buffers_reply(dri2_dpy->conn, cookie, NULL); 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply) { 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swap_count = (((int64_t)reply->swap_hi) << 32) | reply->swap_lo; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if __DRI2_FLUSH_VERSION >= 3 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the server doesn't send invalidate events */ 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->invalidate_available && dri2_dpy->flush && 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->flush->base.version >= 3 && dri2_dpy->flush->invalidate) 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return swap_count; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_copy_region(drv, disp, draw, dri2_surf->region) ? 0 : -1; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* XCB_DRI2_MINOR_VERSION >= 3 */ 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_swap_buffers_msc(drv, disp, draw, 0, 0, 0) != -1; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->swrast); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->swapBuffers(dri2_surf->dri_drawable); 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw, 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint numRects, const EGLint *rects) 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLBoolean ret; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_region_t region; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_rectangle_t rectangles[16]; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (numRects > (int)ARRAY_SIZE(rectangles)) 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_copy_region(drv, disp, draw, dri2_surf->region); 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < numRects; i++) { 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangles[i].x = rects[i * 4]; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangles[i].y = dri2_surf->base.Height - rects[i * 4 + 1] - rects[i * 4 + 3]; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangles[i].width = rects[i * 4 + 2]; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rectangles[i].height = rects[i * 4 + 3]; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org region = xcb_generate_id(dri2_dpy->conn); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_create_region(dri2_dpy->conn, region, numRects, rectangles); 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = dri2_copy_region(drv, disp, draw, region); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_xfixes_destroy_region(dri2_dpy->conn, region); 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_post_sub_buffer(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw, 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint x, EGLint y, EGLint width, EGLint height) 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint rect[4] = { x, y, width, height }; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (x < 0 || y < 0 || width < 0 || height < 0) 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "eglPostSubBufferNV"); 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_swap_buffers_region(drv, disp, draw, 1, rect); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_swap_interval(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint interval) 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if XCB_DRI2_MINOR_VERSION >= 3 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX Check vblank_mode here? */ 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (interval > surf->Config->MaxSwapInterval) 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org interval = surf->Config->MaxSwapInterval; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (interval < surf->Config->MinSwapInterval) 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org interval = surf->Config->MinSwapInterval; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if XCB_DRI2_MINOR_VERSION >= 3 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (interval != surf->SwapInterval && dri2_dpy->swap_available) 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_swap_interval(dri2_dpy->conn, dri2_surf->drawable, interval); 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf->SwapInterval = interval; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_copy_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLNativePixmapType target) 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_gcontext_t gc; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc = xcb_generate_id(dri2_dpy->conn); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_create_gc(dri2_dpy->conn, gc, target, 0, NULL); 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_copy_area(dri2_dpy->conn, 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->drawable, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target, 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc, 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Width, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->base.Height); 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_free_gc(dri2_dpy->conn, gc); 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage * 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx, 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLClientBuffer buffer, const EGLint *attr_list) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_image *dri2_img; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int attachments[1]; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_drawable_t drawable; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_get_buffers_cookie_t buffers_cookie; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_get_buffers_reply_t *buffers_reply; 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_dri2_buffer_t *buffers; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_geometry_cookie_t geometry_cookie; 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_get_geometry_reply_t *geometry_reply; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_generic_error_t *error; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int stride, format; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable = (xcb_drawable_t) (uintptr_t) buffer; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_create_drawable (dri2_dpy->conn, drawable); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attachments[0] = XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers_cookie = 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_dri2_get_buffers_unchecked (dri2_dpy->conn, 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable, 1, 1, attachments); 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org geometry_cookie = xcb_get_geometry (dri2_dpy->conn, drawable); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers_reply = xcb_dri2_get_buffers_reply (dri2_dpy->conn, 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers_cookie, NULL); 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers = xcb_dri2_get_buffers_buffers (buffers_reply); 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buffers == NULL) { 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org geometry_reply = xcb_get_geometry_reply (dri2_dpy->conn, 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org geometry_cookie, &error); 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (geometry_reply == NULL || error != NULL) { 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "xcb_get_geometry"); 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(error); 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(buffers_reply); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (geometry_reply->depth) { 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_RGB565; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 24: 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_XRGB8888; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_ARGB8888; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "dri2_create_image_khr: unsupported pixmap depth"); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(buffers_reply); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(geometry_reply); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img = malloc(sizeof *dri2_img); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_img) { 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(buffers_reply); 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(geometry_reply); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr"); 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_NO_IMAGE_KHR; 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglInitImage(&dri2_img->base, disp)) { 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(buffers_reply); 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(geometry_reply); 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_img); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_NO_IMAGE_KHR; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride = buffers[0].pitch / buffers[0].cpp; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img->dri_image = 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen, 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers_reply->width, 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers_reply->height, 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers[0].name, 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride, 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img); 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(buffers_reply); 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(geometry_reply); 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &dri2_img->base; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage * 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_x11_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLContext *ctx, EGLenum target, 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLClientBuffer buffer, const EGLint *attr_list) 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_NATIVE_PIXMAP_KHR: 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image_khr_pixmap(disp, ctx, buffer, attr_list); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list); 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_initialize_x11_swrast(_EGLDriver *drv, _EGLDisplay *disp) 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreateWindowSurface = dri2_create_window_surface; 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreatePixmapSurface = dri2_create_pixmap_surface; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroySurface = dri2_destroy_surface; 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.SwapBuffers = dri2_swap_buffers; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CopyBuffers = dri2_copy_buffers; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.SwapBuffersRegionNOK = NULL; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreateImageKHR = NULL; 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroyImageKHR = NULL; 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreateDRMImageMESA = NULL; 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.ExportDRMImageMESA = NULL; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy = malloc(sizeof *dri2_dpy); 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_dpy) 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _eglError(EGL_BAD_ALLOC, "eglInitialize"); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dri2_dpy, 0, sizeof *dri2_dpy); 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->DriverData = (void *) dri2_dpy; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->PlatformDisplay == NULL) { 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->conn = xcb_connect(0, 0); 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->conn = XGetXCBConnection((Display *) disp->PlatformDisplay); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xcb_connection_has_error(dri2_dpy->conn)) { 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: xcb_connect failed"); 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_dpy; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_load_driver_swrast(disp)) 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_conn; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swrast_loader_extension.base.name = __DRI_SWRAST_LOADER; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swrast_loader_extension.base.version = __DRI_SWRAST_LOADER_VERSION; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swrast_loader_extension.getDrawableInfo = swrastGetDrawableInfo; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swrast_loader_extension.putImage = swrastPutImage; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swrast_loader_extension.getImage = swrastGetImage; 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->extensions[0] = &dri2_dpy->swrast_loader_extension.base; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->extensions[1] = NULL; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->extensions[2] = NULL; 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_create_screen(disp)) 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_driver; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->conn) { 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_add_configs_for_visuals(dri2_dpy, disp)) 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_configs; 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we're supporting EGL 1.4 */ 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->VersionMajor = 1; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->VersionMinor = 4; 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_configs: 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglCleanupDisplay(disp); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_driver: 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(dri2_dpy->driver); 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_conn: 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->PlatformDisplay == NULL) 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_disconnect(dri2_dpy->conn); 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_dpy: 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_dpy); 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp) 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreateWindowSurface = dri2_create_window_surface; 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreatePixmapSurface = dri2_create_pixmap_surface; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface; 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroySurface = dri2_destroy_surface; 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.SwapBuffers = dri2_swap_buffers; 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CopyBuffers = dri2_copy_buffers; 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.CreateImageKHR = dri2_x11_create_image_khr; 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.SwapBuffersRegionNOK = dri2_swap_buffers_region; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.PostSubBufferNV = dri2_post_sub_buffer; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.SwapInterval = dri2_swap_interval; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy = malloc(sizeof *dri2_dpy); 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_dpy) 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _eglError(EGL_BAD_ALLOC, "eglInitialize"); 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dri2_dpy, 0, sizeof *dri2_dpy); 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->DriverData = (void *) dri2_dpy; 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->PlatformDisplay == NULL) { 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->conn = xcb_connect(0, 0); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->conn = XGetXCBConnection((Display *) disp->PlatformDisplay); 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xcb_connection_has_error(dri2_dpy->conn)) { 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: xcb_connect failed"); 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_dpy; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->conn) { 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_connect(dri2_dpy)) 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_conn; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_load_driver(disp)) 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_conn; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef O_CLOEXEC 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR | O_CLOEXEC); 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->fd == -1 && errno == EINVAL) 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR); 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->fd != -1) 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fcntl(dri2_dpy->fd, F_SETFD, fcntl(dri2_dpy->fd, F_GETFD) | 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FD_CLOEXEC); 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->fd == -1) { 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "DRI2: could not open %s (%s)", dri2_dpy->device_name, 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org strerror(errno)); 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_driver; 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->conn) { 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_authenticate(disp)) 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_fd; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2_minor >= 1) { 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.base.version = 3; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer; 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.getBuffersWithFormat = 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_get_buffers_with_format; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.base.version = 2; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers; 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer; 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2_loader_extension.getBuffersWithFormat = NULL; 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base; 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->extensions[1] = &image_lookup_extension.base; 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->extensions[2] = NULL; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if XCB_DRI2_MINOR_VERSION >= 3 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swap_available = (dri2_dpy->dri2_minor >= 2); 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->invalidate_available = (dri2_dpy->dri2_minor >= 3); 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_create_screen(disp)) 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_fd; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->conn) { 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_add_configs_for_visuals(dri2_dpy, disp)) 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_configs; 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.KHR_image_pixmap = EGL_TRUE; 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.NOK_swap_region = EGL_TRUE; 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE; 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.NV_post_sub_buffer = EGL_TRUE; 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.WL_bind_wayland_display = EGL_TRUE; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->authenticate = dri2_x11_authenticate; 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we're supporting EGL 1.4 */ 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->VersionMajor = 1; 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->VersionMinor = 4; 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_configs: 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglCleanupDisplay(disp); 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_fd: 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org close(dri2_dpy->fd); 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_driver: 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(dri2_dpy->driver); 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_conn: 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->PlatformDisplay == NULL) 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_disconnect(dri2_dpy->conn); 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_dpy: 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_dpy); 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp) 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLBoolean initialized = EGL_TRUE; 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x11_dri2_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL); 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (x11_dri2_accel) { 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_initialize_x11_dri2(drv, disp)) { 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org initialized = dri2_initialize_x11_swrast(drv, disp); 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org initialized = dri2_initialize_x11_swrast(drv, disp); 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return initialized; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1189