1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.8 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org> 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_hash_table.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/drm_driver.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egllog.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "native_x11.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "x11_screen.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "common/native_helper.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_BACKEND 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "common/native_wayland_drm_bufmgr_helper.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dri2_display { 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_display base; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display *dpy; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean own_dpy; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_event_handler *event_handler; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x11_screen *xscr; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int xscr_number; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *dri_driver; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dri_major, dri_minor; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_config *configs; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_configs; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct util_hash_table *surfaces; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_BACKEND 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_drm *wl_server_drm; /* for EGL_WL_bind_wayland_display */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dri2_surface { 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_surface base; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Drawable drawable; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format color_format; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int server_stamp; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int client_stamp; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, height; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS]; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint valid_mask; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean have_back, have_fake; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x11_drawable_buffer *last_xbufs; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_num_xbufs; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dri2_config { 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_config base; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct dri2_display * 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display(const struct native_display *ndpy) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct dri2_display *) ndpy; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct dri2_surface * 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface(const struct native_surface *nsurf) 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct dri2_surface *) nsurf; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct dri2_config * 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_config(const struct native_config *nconf) 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct dri2_config *) nconf; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Process the buffers returned by the server. 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_process_drawable_buffers(struct native_surface *nsurf, 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x11_drawable_buffer *xbufs, 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_xbufs) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2surf->dri2dpy; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templ; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle whandle; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint valid_mask; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* free the old textures */ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++) 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&dri2surf->textures[i], NULL); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->valid_mask = 0x0; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->have_back = FALSE; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->have_fake = FALSE; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xbufs) 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templ, 0, sizeof(templ)); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.target = PIPE_TEXTURE_2D; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.last_level = 0; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.width0 = dri2surf->width; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.height0 = dri2surf->height; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.depth0 = 1; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.array_size = 1; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = dri2surf->color_format; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.bind = PIPE_BIND_RENDER_TARGET; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valid_mask = 0x0; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_xbufs; i++) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x11_drawable_buffer *xbuf = &xbufs[i]; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *desc; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum native_attachment natt; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (xbuf->attachment) { 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DRI2BufferFrontLeft: 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org natt = NATIVE_ATTACHMENT_FRONT_LEFT; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = "DRI2 Front Buffer"; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DRI2BufferFakeFrontLeft: 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org natt = NATIVE_ATTACHMENT_FRONT_LEFT; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = "DRI2 Fake Front Buffer"; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->have_fake = TRUE; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DRI2BufferBackLeft: 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org natt = NATIVE_ATTACHMENT_BACK_LEFT; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = "DRI2 Back Buffer"; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->have_back = TRUE; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = NULL; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc || dri2surf->textures[natt]) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "unknown buffer %d", xbuf->attachment); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "both real and fake front buffers are listed"); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&whandle, 0, sizeof(whandle)); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.stride = xbuf->pitch; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.handle = xbuf->name; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->textures[natt] = dri2dpy->base.screen->resource_from_handle( 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.screen, &templ, &whandle); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->textures[natt]) 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valid_mask |= 1 << natt; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->valid_mask = valid_mask; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the buffers from the server. 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_get_buffers(struct native_surface *nsurf, uint buffer_mask) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2surf->dri2dpy; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int dri2atts[NUM_NATIVE_ATTACHMENTS * 2]; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_ins, num_outs, att; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x11_drawable_buffer *xbufs; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint bpp = util_format_get_blocksizebits(dri2surf->color_format); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean with_format = FALSE; /* never ask for depth/stencil */ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We must get the front on servers which doesn't support with format 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * due to a silly bug in core dri2. You can't copy to/from a buffer 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that you haven't requested and you recive BadValue errors */ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->dri2dpy->dri_minor < 1) { 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org with_format = FALSE; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_mask |= (1 << NATIVE_ATTACHMENT_FRONT_LEFT); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* prepare the attachments */ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_ins = 0; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) { 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_attachment_mask_test(buffer_mask, att)) { 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int dri2att; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (att) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_ATTACHMENT_FRONT_LEFT: 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2att = DRI2BufferFrontLeft; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_ATTACHMENT_BACK_LEFT: 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2att = DRI2BufferBackLeft; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_ATTACHMENT_FRONT_RIGHT: 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2att = DRI2BufferFrontRight; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_ATTACHMENT_BACK_RIGHT: 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2att = DRI2BufferBackRight; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2att = 0; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2atts[num_ins++] = dri2att; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (with_format) 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2atts[num_ins++] = bpp; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (with_format) 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_ins /= 2; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xbufs = x11_drawable_get_buffers(dri2dpy->xscr, dri2surf->drawable, 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2surf->width, &dri2surf->height, 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2atts, with_format, num_ins, &num_outs); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we should be able to do better... */ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xbufs && dri2surf->last_num_xbufs == num_outs && 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcmp(dri2surf->last_xbufs, xbufs, sizeof(*xbufs) * num_outs) == 0) { 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(xbufs); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->client_stamp = dri2surf->server_stamp; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surface_process_drawable_buffers(&dri2surf->base, xbufs, num_outs); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->server_stamp++; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->client_stamp = dri2surf->server_stamp; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->last_xbufs) 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dri2surf->last_xbufs); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->last_xbufs = xbufs; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->last_num_xbufs = num_outs; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Update the buffers of the surface. This is a slow function due to the 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * round-trip to the server. 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_update_buffers(struct native_surface *nsurf, uint buffer_mask) 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surface_get_buffers(&dri2surf->base, buffer_mask); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ((dri2surf->valid_mask & buffer_mask) == buffer_mask); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return TRUE if the surface receives DRI2_InvalidateBuffers events. 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_receive_events(struct native_surface *nsurf) 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (dri2surf->dri2dpy->dri_minor >= 3); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_flush_frontbuffer(struct native_surface *nsurf) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2surf->dri2dpy; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* copy to real front buffer */ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->have_fake) 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, dri2surf->width, dri2surf->height, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* force buffers to be updated in next validation call */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_surface_receive_events(&dri2surf->base)) { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->server_stamp++; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->event_handler->invalid_surface(&dri2dpy->base, 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2surf->base, dri2surf->server_stamp); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_swap_buffers(struct native_surface *nsurf, int num_rects, 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *rects) 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2surf->dri2dpy; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* copy to front buffer */ 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->have_back) { 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_rects > 0) 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable, 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_rects, rects, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DRI2BufferBackLeft, DRI2BufferFrontLeft); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, dri2surf->width, dri2surf->height, 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DRI2BufferBackLeft, DRI2BufferFrontLeft); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* and update fake front buffer */ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->have_fake) { 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_rects > 0) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_rects, rects, 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, dri2surf->width, dri2surf->height, 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* force buffers to be updated in next validation call */ 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_surface_receive_events(&dri2surf->base)) { 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->server_stamp++; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->event_handler->invalid_surface(&dri2dpy->base, 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2surf->base, dri2surf->server_stamp); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_present(struct native_surface *nsurf, 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_present_control *ctrl) 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean ret; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctrl->swap_interval) 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctrl->natt) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_ATTACHMENT_FRONT_LEFT: 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = dri2_surface_flush_frontbuffer(nsurf); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_ATTACHMENT_BACK_LEFT: 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = dri2_surface_swap_buffers(nsurf, ctrl->num_rects, ctrl->rects); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = FALSE; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_validate(struct native_surface *nsurf, uint attachment_mask, 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int *seq_num, struct pipe_resource **textures, 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *width, int *height) 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->server_stamp != dri2surf->client_stamp || 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dri2surf->valid_mask & attachment_mask) != attachment_mask) { 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_surface_update_buffers(&dri2surf->base, attachment_mask)) 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (seq_num) 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *seq_num = dri2surf->client_stamp; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (textures) { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int att; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) { 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_attachment_mask_test(attachment_mask, att)) { 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *ptex = dri2surf->textures[att]; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textures[att] = NULL; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&textures[att], ptex); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width) 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = dri2surf->width; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height) 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = dri2surf->height; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_wait(struct native_surface *nsurf) 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2surf->dri2dpy; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->have_fake) { 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, dri2surf->width, dri2surf->height, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_surface_destroy(struct native_surface *nsurf) 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf = dri2_surface(nsurf); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->last_xbufs) 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dri2surf->last_xbufs); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++) { 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *ptex = dri2surf->textures[i]; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ptex, NULL); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2surf->drawable) { 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_enable_dri2(dri2surf->dri2dpy->xscr, 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->drawable, FALSE); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_hash_table_remove(dri2surf->dri2dpy->surfaces, 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void *) dri2surf->drawable); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dri2surf); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_surface * 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_create_surface(struct native_display *ndpy, 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Drawable drawable, 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format color_format) 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf = CALLOC_STRUCT(dri2_surface); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2surf) 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->dri2dpy = dri2dpy; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->drawable = drawable; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->color_format = color_format; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->base.destroy = dri2_surface_destroy; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->base.present = dri2_surface_present; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->base.validate = dri2_surface_validate; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->base.wait = dri2_surface_wait; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (drawable) { 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_drawable_enable_dri2(dri2dpy->xscr, drawable, TRUE); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* initialize the geometry */ 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surface_update_buffers(&dri2surf->base, 0x0); 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_hash_table_set(dri2surf->dri2dpy->surfaces, 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void *) dri2surf->drawable, (void *) &dri2surf->base); 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2surf; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct native_surface * 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_create_window_surface(struct native_display *ndpy, 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLNativeWindowType win, 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_config *nconf) 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf = dri2_display_create_surface(ndpy, 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Drawable) win, nconf->color_format); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (dri2surf) ? &dri2surf->base : NULL; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct native_surface * 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_create_pixmap_surface(struct native_display *ndpy, 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLNativePixmapType pix, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_config *nconf) 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nconf) { 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint depth, nconf_depth; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < dri2dpy->num_configs; i++) { 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf_depth = util_format_get_blocksizebits( 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->configs[i].base.color_format); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple depth match for now */ 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth == nconf_depth || 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (depth == 24 && depth + 8 == nconf_depth)) { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf = &dri2dpy->configs[i].base; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nconf) 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf = dri2_display_create_surface(ndpy, 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Drawable) pix, nconf->color_format); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (dri2surf) ? &dri2surf->base : NULL; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchoose_color_format(const __GLcontextModes *mode, enum pipe_format formats[32]) 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int count = 0; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode->rgbBits) { 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_B8G8R8A8_UNORM; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_A8R8G8B8_UNORM; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 24: 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_B8G8R8X8_UNORM; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_X8R8G8B8_UNORM; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_B8G8R8A8_UNORM; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_A8R8G8B8_UNORM; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_B5G6R5_UNORM; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return count; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgis_format_supported(struct pipe_screen *screen, 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format fmt, unsigned sample_count, boolean is_color) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return screen->is_format_supported(screen, fmt, PIPE_TEXTURE_2D, sample_count, 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (is_color) ? PIPE_BIND_RENDER_TARGET : 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_DEPTH_STENCIL); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_convert_config(struct native_display *ndpy, 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __GLcontextModes *mode, 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_config *nconf) 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format formats[32]; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_formats, i; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int sample_count = 0; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(mode->renderType & GLX_RGBA_BIT) || !mode->rgbMode) 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* only interested in native renderable configs */ 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mode->xRenderable || !mode->drawableType) 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fast/slow configs are probably not relevant */ 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode->visualRating == GLX_SLOW_CONFIG) 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->buffer_mask = 1 << NATIVE_ATTACHMENT_FRONT_LEFT; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode->doubleBufferMode) 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_BACK_LEFT; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode->stereoMode) { 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_FRONT_RIGHT; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode->doubleBufferMode) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_BACK_RIGHT; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* choose color format */ 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_formats = choose_color_format(mode, formats); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_formats; i++) { 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_format_supported(ndpy->screen, formats[i], sample_count, TRUE)) { 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->color_format = formats[i]; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->color_format == PIPE_FORMAT_NONE) 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((mode->drawableType & GLX_WINDOW_BIT) && mode->visualID) 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->window_bit = TRUE; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode->drawableType & GLX_PIXMAP_BIT) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->pixmap_bit = TRUE; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->native_visual_id = mode->visualID; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode->visualType) { 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TRUE_COLOR: 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->native_visual_type = TrueColor; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_DIRECT_COLOR: 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->native_visual_type = DirectColor; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_PSEUDO_COLOR: 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->native_visual_type = PseudoColor; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_STATIC_COLOR: 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->native_visual_type = StaticColor; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_GRAY_SCALE: 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->native_visual_type = GrayScale; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_STATIC_GRAY: 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->native_visual_type = StaticGray; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->level = mode->level; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode->transparentPixel == GLX_TRANSPARENT_RGB) { 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->transparent_rgb = TRUE; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->transparent_rgb_values[0] = mode->transparentRed; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->transparent_rgb_values[1] = mode->transparentGreen; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf->transparent_rgb_values[2] = mode->transparentBlue; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct native_config ** 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_get_configs(struct native_display *ndpy, int *num_configs) 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_config **configs; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* first time */ 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->configs) { 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __GLcontextModes *modes; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_modes, count; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modes = x11_screen_get_glx_configs(dri2dpy->xscr); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!modes) 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_modes = x11_context_modes_count(modes); 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->configs = CALLOC(num_modes, sizeof(*dri2dpy->configs)); 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->configs) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = 0; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_modes; i++) { 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_config *nconf = &dri2dpy->configs[count].base; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_display_convert_config(&dri2dpy->base, modes, nconf)) { 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int j; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* look for duplicates */ 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < count; j++) { 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&dri2dpy->configs[j], nconf, sizeof(*nconf)) == 0) 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == count) 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count++; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modes = modes->next; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->num_configs = count; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org configs = MALLOC(dri2dpy->num_configs * sizeof(*configs)); 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (configs) { 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < dri2dpy->num_configs; i++) 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org configs[i] = (const struct native_config *) &dri2dpy->configs[i]; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_configs) 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *num_configs = dri2dpy->num_configs; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return configs; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_get_pixmap_format(struct native_display *ndpy, 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLNativePixmapType pix, 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format *format) 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean ret = EGL_TRUE; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint depth; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (depth) { 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 24: 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *format = PIPE_FORMAT_B8G8R8A8_UNORM; 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *format = PIPE_FORMAT_B5G6R5_UNORM; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *format = PIPE_FORMAT_NONE; 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = EGL_FALSE; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_get_param(struct native_display *ndpy, 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum native_param_type param) 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int val; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_PARAM_USE_NATIVE_BUFFER: 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* DRI2GetBuffers uses the native buffers */ 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = TRUE; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_PARAM_PRESERVE_BUFFER: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* DRI2CopyRegion is used */ 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = TRUE; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_PARAM_PRESENT_REGION: 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = TRUE; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NATIVE_PARAM_MAX_SWAP_INTERVAL: 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return val; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_destroy(struct native_display *ndpy) 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2dpy->configs) 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dri2dpy->configs); 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2dpy->base.screen) 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.screen->destroy(dri2dpy->base.screen); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2dpy->surfaces) 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_hash_table_destroy(dri2dpy->surfaces); 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2dpy->xscr) 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_screen_destroy(dri2dpy->xscr); 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2dpy->own_dpy) 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCloseDisplay(dri2dpy->dpy); 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dri2dpy); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_invalidate_buffers(struct x11_screen *xscr, Drawable drawable, 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *user_data) 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_display *ndpy = (struct native_display* ) user_data; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_surface *nsurf; 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_surface *dri2surf; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nsurf = (struct native_surface *) 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_hash_table_get(dri2dpy->surfaces, (void *) drawable); 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nsurf) 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf = dri2_surface(nsurf); 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2surf->server_stamp++; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->event_handler->invalid_surface(&dri2dpy->base, 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2surf->base, dri2surf->server_stamp); 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize DRI2 and pipe screen. 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_init_screen(struct native_display *ndpy) 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int fd; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_DRI2) || 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_GLX)) { 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "GLX/DRI2 is not supported"); 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->dri_driver = x11_screen_probe_dri2(dri2dpy->xscr, 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2dpy->dri_major, &dri2dpy->dri_minor); 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fd = x11_screen_enable_dri2(dri2dpy->xscr, 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_invalidate_buffers, &dri2dpy->base); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fd < 0) 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.screen = 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->event_handler->new_drm_screen(&dri2dpy->base, 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->dri_driver, fd); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->base.screen) { 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "failed to create DRM screen"); 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_hash_table_hash(void *key) 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XID drawable = pointer_to_uintptr(key); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (unsigned) drawable; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_hash_table_compare(void *key1, void *key2) 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ((char *) key1 - (char *) key2); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_BACKEND 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_authenticate(void *user_data, uint32_t magic) 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_display *ndpy = user_data; 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x11_screen_authenticate(dri2dpy->xscr, magic); 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct wayland_drm_callbacks wl_drm_callbacks = { 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_authenticate, 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_wl_drm_helper_reference_buffer, 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_wl_drm_helper_unreference_buffer 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_bind_wayland_display(struct native_display *ndpy, 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_display *wl_dpy) 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2dpy->wl_server_drm) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->wl_server_drm = wayland_drm_init(wl_dpy, 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x11_screen_get_device_name(dri2dpy->xscr), 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &wl_drm_callbacks, ndpy); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->wl_server_drm) 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_display_unbind_wayland_display(struct native_display *ndpy, 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_display *wl_dpy) 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy = dri2_display(ndpy); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->wl_server_drm) 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wayland_drm_uninit(dri2dpy->wl_server_drm); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->wl_server_drm = NULL; 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct native_display_wayland_bufmgr dri2_display_wayland_bufmgr = { 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_bind_wayland_display, 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_unbind_wayland_display, 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_wl_drm_common_wl_buffer_get_resource, 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_wl_drm_common_query_buffer 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* HAVE_WAYLAND_BACKEND */ 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct native_display * 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_create_dri2_display(Display *dpy, 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_event_handler *event_handler) 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_display *dri2dpy; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy = CALLOC_STRUCT(dri2_display); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy) 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->event_handler = event_handler; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->dpy = dpy; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->dpy) { 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->dpy = XOpenDisplay(NULL); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->dpy) { 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_destroy(&dri2dpy->base); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->own_dpy = TRUE; 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->xscr_number = DefaultScreen(dri2dpy->dpy); 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->xscr = x11_screen_create(dri2dpy->dpy, dri2dpy->xscr_number); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->xscr) { 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_destroy(&dri2dpy->base); 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->surfaces = util_hash_table_create(dri2_display_hash_table_hash, 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_hash_table_compare); 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2dpy->surfaces) { 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_display_destroy(&dri2dpy->base); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.init_screen = dri2_display_init_screen; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.destroy = dri2_display_destroy; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.get_param = dri2_display_get_param; 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.get_configs = dri2_display_get_configs; 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.get_pixmap_format = dri2_display_get_pixmap_format; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.copy_to_pixmap = native_display_copy_to_pixmap; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.create_window_surface = dri2_display_create_window_surface; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.create_pixmap_surface = dri2_display_create_pixmap_surface; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_BACKEND 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2dpy->base.wayland_bufmgr = &dri2_display_wayland_bufmgr; 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &dri2dpy->base; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* GLX_DIRECT_RENDERING */ 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct native_display * 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_create_dri2_display(Display *dpy, 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_event_handler *event_handler) 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_DIRECT_RENDERING */ 960