149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/* 249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Mesa 3-D graphics library 349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Version: 7.8 449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org> 649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * copy of this software and associated documentation files (the "Software"), 949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * to deal in the Software without restriction, including without limitation 1049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 1449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * The above copyright notice and this permission notice shall be included 1549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * in all copies or substantial portions of the Software. 1649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE. 2449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 2549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 2649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_memory.h" 2749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_math.h" 2849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_format.h" 29f225042a8615e319a911ee0881cec5fc1d1ce0a7Igor Oliveira#include "util/u_inlines.h" 306e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu#include "util/u_hash_table.h" 3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_compiler.h" 3249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_screen.h" 3349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_context.h" 3449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_state.h" 35f9d9574913c5edb92191ac3f5e8d011452427852Jakob Bornecrantz#include "state_tracker/drm_driver.h" 3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "egllog.h" 3749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 3849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "native_x11.h" 3949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "x11_screen.h" 4049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 417c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu#include "common/native_helper.h" 42184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef HAVE_WAYLAND_BACKEND 43184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#include "common/native_wayland_drm_bufmgr_helper.h" 44184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif 45184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 46cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#ifdef GLX_DIRECT_RENDERING 47cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 4849381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct dri2_display { 4949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_display base; 5049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu Display *dpy; 5149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu boolean own_dpy; 5249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 5373df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu const struct native_event_handler *event_handler; 54e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu 5549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct x11_screen *xscr; 5649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int xscr_number; 57545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu const char *dri_driver; 58545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu int dri_major, dri_minor; 5949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 6049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_config *configs; 6149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int num_configs; 626e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 636e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu struct util_hash_table *surfaces; 64184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef HAVE_WAYLAND_BACKEND 65184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct wl_drm *wl_server_drm; /* for EGL_WL_bind_wayland_display */ 66184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif 6749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}; 6849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 6949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct dri2_surface { 7049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_surface base; 7149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu Drawable drawable; 7249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu enum pipe_format color_format; 7349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy; 7449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 756e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu unsigned int server_stamp; 766e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu unsigned int client_stamp; 779d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu int width, height; 78287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS]; 799d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu uint valid_mask; 809d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 819d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu boolean have_back, have_fake; 829d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 839d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu struct x11_drawable_buffer *last_xbufs; 849d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu int last_num_xbufs; 8549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}; 8649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 8749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct dri2_config { 8849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_config base; 8949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}; 9049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 9149381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic INLINE struct dri2_display * 9249381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display(const struct native_display *ndpy) 9349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 9449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (struct dri2_display *) ndpy; 9549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 9649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 9749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic INLINE struct dri2_surface * 9849381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_surface(const struct native_surface *nsurf) 9949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 10049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (struct dri2_surface *) nsurf; 10149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 10249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 10349381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic INLINE struct dri2_config * 10449381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_config(const struct native_config *nconf) 10549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 10649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (struct dri2_config *) nconf; 10749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 10849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 1099d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu/** 11029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu * Process the buffers returned by the server. 1119d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu */ 1129d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic void 11329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wudri2_surface_process_drawable_buffers(struct native_surface *nsurf, 11429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu struct x11_drawable_buffer *xbufs, 11529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu int num_xbufs) 11649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 11749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 11849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy = dri2surf->dri2dpy; 119287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 120b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz struct winsys_handle whandle; 1219d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu uint valid_mask; 12229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu int i; 12349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 12429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu /* free the old textures */ 1259d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++) 126287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&dri2surf->textures[i], NULL); 1279d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu dri2surf->valid_mask = 0x0; 1289d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 1299d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu dri2surf->have_back = FALSE; 1309d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu dri2surf->have_fake = FALSE; 1319d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 1329d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (!xbufs) 1339d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu return; 1349d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 1359d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu memset(&templ, 0, sizeof(templ)); 1369d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu templ.target = PIPE_TEXTURE_2D; 1379d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu templ.last_level = 0; 1389d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu templ.width0 = dri2surf->width; 1399d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu templ.height0 = dri2surf->height; 1409d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu templ.depth0 = 1; 1414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger templ.array_size = 1; 1429d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu templ.format = dri2surf->color_format; 143287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_RENDER_TARGET; 1449d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 1459d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu valid_mask = 0x0; 14629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu for (i = 0; i < num_xbufs; i++) { 14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct x11_drawable_buffer *xbuf = &xbufs[i]; 14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const char *desc; 14949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu enum native_attachment natt; 15049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 15149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu switch (xbuf->attachment) { 15249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case DRI2BufferFrontLeft: 15349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu natt = NATIVE_ATTACHMENT_FRONT_LEFT; 15449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu desc = "DRI2 Front Buffer"; 15549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 15649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case DRI2BufferFakeFrontLeft: 15749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu natt = NATIVE_ATTACHMENT_FRONT_LEFT; 15849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu desc = "DRI2 Fake Front Buffer"; 15949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->have_fake = TRUE; 16049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 16149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case DRI2BufferBackLeft: 16249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu natt = NATIVE_ATTACHMENT_BACK_LEFT; 16349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu desc = "DRI2 Back Buffer"; 16449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->have_back = TRUE; 16549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 16649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu default: 16749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu desc = NULL; 16849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 16949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 17049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 1719d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (!desc || dri2surf->textures[natt]) { 17249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!desc) 17349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu _eglLog(_EGL_WARNING, "unknown buffer %d", xbuf->attachment); 174fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu else 17549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu _eglLog(_EGL_WARNING, "both real and fake front buffers are listed"); 17649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu continue; 17749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 17849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 179b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz memset(&whandle, 0, sizeof(whandle)); 180b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz whandle.stride = xbuf->pitch; 181b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz whandle.handle = xbuf->name; 182287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell dri2surf->textures[natt] = dri2dpy->base.screen->resource_from_handle( 183b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz dri2dpy->base.screen, &templ, &whandle); 1849d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (dri2surf->textures[natt]) 1859d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu valid_mask |= 1 << natt; 1869d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu } 1879d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 18829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu dri2surf->valid_mask = valid_mask; 18929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu} 19029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 19129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu/** 19229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu * Get the buffers from the server. 19329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu */ 19429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wustatic void 19529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wudri2_surface_get_buffers(struct native_surface *nsurf, uint buffer_mask) 19629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu{ 19729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 19829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu struct dri2_display *dri2dpy = dri2surf->dri2dpy; 199927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu unsigned int dri2atts[NUM_NATIVE_ATTACHMENTS * 2]; 20029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu int num_ins, num_outs, att; 20129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu struct x11_drawable_buffer *xbufs; 202927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu uint bpp = util_format_get_blocksizebits(dri2surf->color_format); 203927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu boolean with_format = FALSE; /* never ask for depth/stencil */ 204d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz 205d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz /* We must get the front on servers which doesn't support with format 206d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz * due to a silly bug in core dri2. You can't copy to/from a buffer 207d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz * that you haven't requested and you recive BadValue errors */ 208927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu if (dri2surf->dri2dpy->dri_minor < 1) { 209927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu with_format = FALSE; 210d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz buffer_mask |= (1 << NATIVE_ATTACHMENT_FRONT_LEFT); 211927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu } 21229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 21329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu /* prepare the attachments */ 21429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu num_ins = 0; 21529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) { 21629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu if (native_attachment_mask_test(buffer_mask, att)) { 21729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu unsigned int dri2att; 21829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 21929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu switch (att) { 22029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu case NATIVE_ATTACHMENT_FRONT_LEFT: 22129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu dri2att = DRI2BufferFrontLeft; 22229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu break; 22329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu case NATIVE_ATTACHMENT_BACK_LEFT: 22429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu dri2att = DRI2BufferBackLeft; 22529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu break; 22629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu case NATIVE_ATTACHMENT_FRONT_RIGHT: 22729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu dri2att = DRI2BufferFrontRight; 22829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu break; 22929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu case NATIVE_ATTACHMENT_BACK_RIGHT: 23029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu dri2att = DRI2BufferBackRight; 23129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu break; 23229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu default: 23329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu assert(0); 23429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu dri2att = 0; 23529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu break; 23629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu } 23729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 238927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu dri2atts[num_ins++] = dri2att; 239927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu if (with_format) 240927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu dri2atts[num_ins++] = bpp; 24129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu } 24229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu } 243927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu if (with_format) 244927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu num_ins /= 2; 24529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 24629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu xbufs = x11_drawable_get_buffers(dri2dpy->xscr, dri2surf->drawable, 24729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu &dri2surf->width, &dri2surf->height, 248d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz dri2atts, with_format, num_ins, &num_outs); 24929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 25029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu /* we should be able to do better... */ 25129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu if (xbufs && dri2surf->last_num_xbufs == num_outs && 25229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu memcmp(dri2surf->last_xbufs, xbufs, sizeof(*xbufs) * num_outs) == 0) { 253870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(xbufs); 2546e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2surf->client_stamp = dri2surf->server_stamp; 25529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu return; 25629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu } 25729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 25829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu dri2_surface_process_drawable_buffers(&dri2surf->base, xbufs, num_outs); 25929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 2606e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2surf->server_stamp++; 2616e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2surf->client_stamp = dri2surf->server_stamp; 26229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu 2639d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (dri2surf->last_xbufs) 264870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(dri2surf->last_xbufs); 2659d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu dri2surf->last_xbufs = xbufs; 2669d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu dri2surf->last_num_xbufs = num_outs; 2679d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu} 2689d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 2699d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu/** 2709d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu * Update the buffers of the surface. This is a slow function due to the 2719d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu * round-trip to the server. 2729d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu */ 2739d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean 2749d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wudri2_surface_update_buffers(struct native_surface *nsurf, uint buffer_mask) 2759d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{ 2769d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 2779d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 278f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu dri2_surface_get_buffers(&dri2surf->base, buffer_mask); 27949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 2809d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu return ((dri2surf->valid_mask & buffer_mask) == buffer_mask); 2819d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu} 2829d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 2836e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu/** 2846e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu * Return TRUE if the surface receives DRI2_InvalidateBuffers events. 2856e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu */ 2866e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic INLINE boolean 2876e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_surface_receive_events(struct native_surface *nsurf) 2886e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{ 2896e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 2906e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu return (dri2surf->dri2dpy->dri_minor >= 3); 2916e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu} 2926e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 2939d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean 2949d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wudri2_surface_flush_frontbuffer(struct native_surface *nsurf) 2959d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{ 2969d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 2979d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu struct dri2_display *dri2dpy = dri2surf->dri2dpy; 2989d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 2999d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu /* copy to real front buffer */ 3009d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (dri2surf->have_fake) 3019d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 3029d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 0, 0, dri2surf->width, dri2surf->height, 3039d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 3049d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3056e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu /* force buffers to be updated in next validation call */ 306e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu if (!dri2_surface_receive_events(&dri2surf->base)) { 3076e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2surf->server_stamp++; 308e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu dri2dpy->event_handler->invalid_surface(&dri2dpy->base, 309e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu &dri2surf->base, dri2surf->server_stamp); 310e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu } 3116e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 3129d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu return TRUE; 3139d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu} 3149d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3159d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean 316a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglunddri2_surface_swap_buffers(struct native_surface *nsurf, int num_rects, 317a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund const int *rects) 3189d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{ 3199d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 3209d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu struct dri2_display *dri2dpy = dri2surf->dri2dpy; 3219d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3229d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu /* copy to front buffer */ 323a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund if (dri2surf->have_back) { 324a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund if (num_rects > 0) 325a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable, 326a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund num_rects, rects, 327a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund DRI2BufferBackLeft, DRI2BufferFrontLeft); 328a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund else 329a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 330a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund 0, 0, dri2surf->width, dri2surf->height, 331a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund DRI2BufferBackLeft, DRI2BufferFrontLeft); 332a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund } 3339d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3349d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu /* and update fake front buffer */ 335a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund if (dri2surf->have_fake) { 336a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund if (num_rects > 0) 337a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable, 338a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund num_rects, rects, 339a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 340a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund else 341a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 342a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund 0, 0, dri2surf->width, dri2surf->height, 343a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 344a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund } 3459d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3466e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu /* force buffers to be updated in next validation call */ 347e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu if (!dri2_surface_receive_events(&dri2surf->base)) { 3486e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2surf->server_stamp++; 349e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu dri2dpy->event_handler->invalid_surface(&dri2dpy->base, 350e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu &dri2surf->base, dri2surf->server_stamp); 351e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu } 3526e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 3539d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu return TRUE; 3549d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu} 3559d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3569d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean 35794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wudri2_surface_present(struct native_surface *nsurf, 35808e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu const struct native_present_control *ctrl) 35994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu{ 36094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu boolean ret; 36194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 36208e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu if (ctrl->swap_interval) 36394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu return FALSE; 36494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 36508e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu switch (ctrl->natt) { 36694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_ATTACHMENT_FRONT_LEFT: 36794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu ret = dri2_surface_flush_frontbuffer(nsurf); 36894bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu break; 36994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_ATTACHMENT_BACK_LEFT: 370a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund ret = dri2_surface_swap_buffers(nsurf, ctrl->num_rects, ctrl->rects); 37194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu break; 37294bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu default: 37394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu ret = FALSE; 37494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu break; 37594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu } 37694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 37794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu return ret; 37894bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu} 37994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 38094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wustatic boolean 3819d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wudri2_surface_validate(struct native_surface *nsurf, uint attachment_mask, 382287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned int *seq_num, struct pipe_resource **textures, 3839d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu int *width, int *height) 3849d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{ 3859d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 3869d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3876e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu if (dri2surf->server_stamp != dri2surf->client_stamp || 3886e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu (dri2surf->valid_mask & attachment_mask) != attachment_mask) { 3896e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu if (!dri2_surface_update_buffers(&dri2surf->base, attachment_mask)) 3906e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu return FALSE; 3916e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu } 39249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 3936cb89b23eeac50cfb0c5fb8d77e19f869b524eacChia-I Wu if (seq_num) 3946e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu *seq_num = dri2surf->client_stamp; 3959d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 3969d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (textures) { 3979d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu int att; 3989d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) { 3999d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (native_attachment_mask_test(attachment_mask, att)) { 400287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *ptex = dri2surf->textures[att]; 4019d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 4029d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu textures[att] = NULL; 403287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&textures[att], ptex); 4049d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu } 4059d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu } 4069d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu } 4079d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 40849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (width) 40949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *width = dri2surf->width; 41049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (height) 41149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *height = dri2surf->height; 41249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 41349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return TRUE; 41449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 41549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 41649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic void 41749381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_surface_wait(struct native_surface *nsurf) 41849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 41949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 42049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy = dri2surf->dri2dpy; 42149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 42249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (dri2surf->have_fake) { 42349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable, 42449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 0, 0, dri2surf->width, dri2surf->height, 42549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 42649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 42749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 42849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 42949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic void 43049381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_surface_destroy(struct native_surface *nsurf) 43149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 43249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_surface *dri2surf = dri2_surface(nsurf); 43349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int i; 43449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 4359d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu if (dri2surf->last_xbufs) 436870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(dri2surf->last_xbufs); 4379d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 43849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++) { 439287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *ptex = dri2surf->textures[i]; 440287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ptex, NULL); 44149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 44249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 4436e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu if (dri2surf->drawable) { 44449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu x11_drawable_enable_dri2(dri2surf->dri2dpy->xscr, 44549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->drawable, FALSE); 4466e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 4476e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu util_hash_table_remove(dri2surf->dri2dpy->surfaces, 4486e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu (void *) dri2surf->drawable); 4496e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu } 450870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(dri2surf); 45149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 45249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 45349381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic struct dri2_surface * 45449381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_create_surface(struct native_display *ndpy, 45549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu Drawable drawable, 456af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu enum pipe_format color_format) 45749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 45849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy = dri2_display(ndpy); 45949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_surface *dri2surf; 46049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 46149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf = CALLOC_STRUCT(dri2_surface); 46249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2surf) 46349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return NULL; 46449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 46549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->dri2dpy = dri2dpy; 46649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->drawable = drawable; 467af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu dri2surf->color_format = color_format; 46849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 46949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->base.destroy = dri2_surface_destroy; 47094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu dri2surf->base.present = dri2_surface_present; 47149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->base.validate = dri2_surface_validate; 47249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2surf->base.wait = dri2_surface_wait; 47349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 4746e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu if (drawable) { 4759d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu x11_drawable_enable_dri2(dri2dpy->xscr, drawable, TRUE); 4766e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu /* initialize the geometry */ 4776e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2_surface_update_buffers(&dri2surf->base, 0x0); 4786e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 4796e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu util_hash_table_set(dri2surf->dri2dpy->surfaces, 4806e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu (void *) dri2surf->drawable, (void *) &dri2surf->base); 4816e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu } 4829d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu 48349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return dri2surf; 48449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 48549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 48649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic struct native_surface * 48749381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_create_window_surface(struct native_display *ndpy, 48849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu EGLNativeWindowType win, 48949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const struct native_config *nconf) 49049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 49149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_surface *dri2surf; 49249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 493af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu dri2surf = dri2_display_create_surface(ndpy, 494af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu (Drawable) win, nconf->color_format); 49549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (dri2surf) ? &dri2surf->base : NULL; 49649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 49749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 49849381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic struct native_surface * 49949381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_create_pixmap_surface(struct native_display *ndpy, 50049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu EGLNativePixmapType pix, 50149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const struct native_config *nconf) 50249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 50349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_surface *dri2surf; 50449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 505af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu if (!nconf) { 506af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu struct dri2_display *dri2dpy = dri2_display(ndpy); 507af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu uint depth, nconf_depth; 508af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu int i; 509af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu 510af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix); 511af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu for (i = 0; i < dri2dpy->num_configs; i++) { 512af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu nconf_depth = util_format_get_blocksizebits( 513af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu dri2dpy->configs[i].base.color_format); 514af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu /* simple depth match for now */ 515af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu if (depth == nconf_depth || 516af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu (depth == 24 && depth + 8 == nconf_depth)) { 517af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu nconf = &dri2dpy->configs[i].base; 518af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu break; 519af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu } 520af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu } 521af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu 522af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu if (!nconf) 523af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu return NULL; 524af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu } 525af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu 526af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu dri2surf = dri2_display_create_surface(ndpy, 527af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu (Drawable) pix, nconf->color_format); 52849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (dri2surf) ? &dri2surf->base : NULL; 52949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 53049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 53149381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic int 53249381d63e61c724b156b76068058df1c01a906c2Chia-I Wuchoose_color_format(const __GLcontextModes *mode, enum pipe_format formats[32]) 53349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 53449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int count = 0; 53549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 53649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu switch (mode->rgbBits) { 53749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case 32: 53849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu formats[count++] = PIPE_FORMAT_B8G8R8A8_UNORM; 539ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca formats[count++] = PIPE_FORMAT_A8R8G8B8_UNORM; 54049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 54149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case 24: 54249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu formats[count++] = PIPE_FORMAT_B8G8R8X8_UNORM; 543ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca formats[count++] = PIPE_FORMAT_X8R8G8B8_UNORM; 54449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu formats[count++] = PIPE_FORMAT_B8G8R8A8_UNORM; 545ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca formats[count++] = PIPE_FORMAT_A8R8G8B8_UNORM; 54649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 54749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case 16: 548ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca formats[count++] = PIPE_FORMAT_B5G6R5_UNORM; 54949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 55049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu default: 55149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 55249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 55349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 55449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return count; 55549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 55649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 55749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean 55849381d63e61c724b156b76068058df1c01a906c2Chia-I Wuis_format_supported(struct pipe_screen *screen, 5592a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger enum pipe_format fmt, unsigned sample_count, boolean is_color) 56049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 5612a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger return screen->is_format_supported(screen, fmt, PIPE_TEXTURE_2D, sample_count, 562287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell (is_color) ? PIPE_BIND_RENDER_TARGET : 563e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_DEPTH_STENCIL); 56449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 56549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 56649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean 56749381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_convert_config(struct native_display *ndpy, 56849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const __GLcontextModes *mode, 56949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_config *nconf) 57049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 57149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu enum pipe_format formats[32]; 57249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int num_formats, i; 5732a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger int sample_count = 0; 57449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 57549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!(mode->renderType & GLX_RGBA_BIT) || !mode->rgbMode) 57649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return FALSE; 57749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 578f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu /* only interested in native renderable configs */ 579f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu if (!mode->xRenderable || !mode->drawableType) 580f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu return FALSE; 58149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 582445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu /* fast/slow configs are probably not relevant */ 583445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu if (mode->visualRating == GLX_SLOW_CONFIG) 584445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu return FALSE; 585445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu 586f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->buffer_mask = 1 << NATIVE_ATTACHMENT_FRONT_LEFT; 587f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu if (mode->doubleBufferMode) 588f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_BACK_LEFT; 589f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu if (mode->stereoMode) { 590f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_FRONT_RIGHT; 591f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu if (mode->doubleBufferMode) 592f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_BACK_RIGHT; 593f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu } 594f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu 59549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /* choose color format */ 59649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu num_formats = choose_color_format(mode, formats); 59749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu for (i = 0; i < num_formats; i++) { 5982a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger if (is_format_supported(ndpy->screen, formats[i], sample_count, TRUE)) { 59949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu nconf->color_format = formats[i]; 60049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 60149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 60249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 60349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (nconf->color_format == PIPE_FORMAT_NONE) 60449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return FALSE; 60549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 606445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu if ((mode->drawableType & GLX_WINDOW_BIT) && mode->visualID) 607f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->window_bit = TRUE; 608f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu if (mode->drawableType & GLX_PIXMAP_BIT) 609f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->pixmap_bit = TRUE; 610f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu 611f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->native_visual_id = mode->visualID; 612445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu switch (mode->visualType) { 613445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu case GLX_TRUE_COLOR: 614445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu nconf->native_visual_type = TrueColor; 615445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu break; 616445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu case GLX_DIRECT_COLOR: 617445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu nconf->native_visual_type = DirectColor; 618445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu break; 619445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu case GLX_PSEUDO_COLOR: 620445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu nconf->native_visual_type = PseudoColor; 621445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu break; 622445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu case GLX_STATIC_COLOR: 623445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu nconf->native_visual_type = StaticColor; 624445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu break; 625445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu case GLX_GRAY_SCALE: 626445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu nconf->native_visual_type = GrayScale; 627445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu break; 628445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu case GLX_STATIC_GRAY: 629445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu nconf->native_visual_type = StaticGray; 630445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu break; 631445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu } 632f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->level = mode->level; 633f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu 634f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu if (mode->transparentPixel == GLX_TRANSPARENT_RGB) { 635f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->transparent_rgb = TRUE; 636f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->transparent_rgb_values[0] = mode->transparentRed; 637f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->transparent_rgb_values[1] = mode->transparentGreen; 638f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu nconf->transparent_rgb_values[2] = mode->transparentBlue; 639f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu } 640f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu 64149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return TRUE; 64249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 64349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 64449381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic const struct native_config ** 64549381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_get_configs(struct native_display *ndpy, int *num_configs) 64649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 64749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy = dri2_display(ndpy); 64849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const struct native_config **configs; 64949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int i; 65049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 65149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /* first time */ 65249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2dpy->configs) { 65349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const __GLcontextModes *modes; 65449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int num_modes, count; 65549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 65649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu modes = x11_screen_get_glx_configs(dri2dpy->xscr); 65749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!modes) 65849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return NULL; 65949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu num_modes = x11_context_modes_count(modes); 66049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 661870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu dri2dpy->configs = CALLOC(num_modes, sizeof(*dri2dpy->configs)); 66249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2dpy->configs) 66349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return NULL; 66449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 66549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu count = 0; 66649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu for (i = 0; i < num_modes; i++) { 66749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_config *nconf = &dri2dpy->configs[count].base; 668445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu 669445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu if (dri2_display_convert_config(&dri2dpy->base, modes, nconf)) { 670445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu int j; 671445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu /* look for duplicates */ 672445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu for (j = 0; j < count; j++) { 673445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu if (memcmp(&dri2dpy->configs[j], nconf, sizeof(*nconf)) == 0) 674445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu break; 675445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu } 676445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu if (j == count) 677445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu count++; 678445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu } 67949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu modes = modes->next; 68049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 68149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 68249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->num_configs = count; 68349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 68449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 685870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu configs = MALLOC(dri2dpy->num_configs * sizeof(*configs)); 68649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (configs) { 68749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu for (i = 0; i < dri2dpy->num_configs; i++) 68849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu configs[i] = (const struct native_config *) &dri2dpy->configs[i]; 68949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (num_configs) 69049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *num_configs = dri2dpy->num_configs; 69149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 69249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 69349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return configs; 69449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 69549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 696f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wustatic boolean 697a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wudri2_display_get_pixmap_format(struct native_display *ndpy, 698a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu EGLNativePixmapType pix, 699a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu enum pipe_format *format) 700f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu{ 701f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu struct dri2_display *dri2dpy = dri2_display(ndpy); 702a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu boolean ret = EGL_TRUE; 703a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu uint depth; 704f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu 705f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix); 706a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu switch (depth) { 707a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu case 32: 708a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu case 24: 709a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu *format = PIPE_FORMAT_B8G8R8A8_UNORM; 710a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu break; 711a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu case 16: 712a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu *format = PIPE_FORMAT_B5G6R5_UNORM; 713a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu break; 714a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu default: 715a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu *format = PIPE_FORMAT_NONE; 716a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu ret = EGL_FALSE; 717a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu break; 718a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu } 719f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu 720a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu return ret; 721f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu} 722f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu 723fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wustatic int 724fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wudri2_display_get_param(struct native_display *ndpy, 725fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu enum native_param_type param) 726fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu{ 727fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu int val; 728fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu 729fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu switch (param) { 730fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu case NATIVE_PARAM_USE_NATIVE_BUFFER: 73194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu /* DRI2GetBuffers uses the native buffers */ 73294bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu val = TRUE; 73394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu break; 73494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_PARAM_PRESERVE_BUFFER: 73594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu /* DRI2CopyRegion is used */ 736fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu val = TRUE; 737fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu break; 738a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund case NATIVE_PARAM_PRESENT_REGION: 739a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund val = TRUE; 740a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund break; 74194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_PARAM_MAX_SWAP_INTERVAL: 742fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu default: 743fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu val = 0; 744fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu break; 745fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu } 746fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu 747fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu return val; 748fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu} 749fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu 75049381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic void 75149381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_destroy(struct native_display *ndpy) 75249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 75349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy = dri2_display(ndpy); 75449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 75549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (dri2dpy->configs) 756870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(dri2dpy->configs); 75749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 75849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (dri2dpy->base.screen) 75949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->base.screen->destroy(dri2dpy->base.screen); 76049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 7616e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu if (dri2dpy->surfaces) 7626e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu util_hash_table_destroy(dri2dpy->surfaces); 7636e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 76449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (dri2dpy->xscr) 76549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu x11_screen_destroy(dri2dpy->xscr); 76649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (dri2dpy->own_dpy) 76749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu XCloseDisplay(dri2dpy->dpy); 768870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(dri2dpy); 76949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 77049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 7716e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic void 7726e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_display_invalidate_buffers(struct x11_screen *xscr, Drawable drawable, 7736e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu void *user_data) 7746e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{ 7756e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu struct native_display *ndpy = (struct native_display* ) user_data; 7766e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu struct dri2_display *dri2dpy = dri2_display(ndpy); 7776e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu struct native_surface *nsurf; 7786e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu struct dri2_surface *dri2surf; 7796e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 7806e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu nsurf = (struct native_surface *) 7816e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu util_hash_table_get(dri2dpy->surfaces, (void *) drawable); 7826e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu if (!nsurf) 7836e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu return; 7846e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 7856e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2surf = dri2_surface(nsurf); 786e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu 7876e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2surf->server_stamp++; 788e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu dri2dpy->event_handler->invalid_surface(&dri2dpy->base, 789e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu &dri2surf->base, dri2surf->server_stamp); 7906e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu} 7916e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 79249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 79349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Initialize DRI2 and pipe screen. 79449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 79549381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean 79649381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_init_screen(struct native_display *ndpy) 79749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 79849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy = dri2_display(ndpy); 79949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int fd; 80049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 80149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_DRI2) || 80249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu !x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_GLX)) { 80349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu _eglLog(_EGL_WARNING, "GLX/DRI2 is not supported"); 80449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return FALSE; 80549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 80649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 807545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu dri2dpy->dri_driver = x11_screen_probe_dri2(dri2dpy->xscr, 808545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu &dri2dpy->dri_major, &dri2dpy->dri_minor); 809545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 8106e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu fd = x11_screen_enable_dri2(dri2dpy->xscr, 8116e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2_display_invalidate_buffers, &dri2dpy->base); 81249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (fd < 0) 81349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return FALSE; 81449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 815d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu dri2dpy->base.screen = 816d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu dri2dpy->event_handler->new_drm_screen(&dri2dpy->base, 817d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu dri2dpy->dri_driver, fd); 81849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2dpy->base.screen) { 819e28ecdee0396cc6665f9be95cfbaa2c2db1d4891Kristian Høgsberg _eglLog(_EGL_DEBUG, "failed to create DRM screen"); 82049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return FALSE; 82149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 82249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 82349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return TRUE; 82449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 82549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 8266e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic unsigned 8276e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_display_hash_table_hash(void *key) 8286e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{ 8296e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu XID drawable = pointer_to_uintptr(key); 8306e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu return (unsigned) drawable; 8316e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu} 8326e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 8336e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic int 8346e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_display_hash_table_compare(void *key1, void *key2) 8356e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{ 83697e9a0e23f0e06d020883c37b9d065e8978a47f4Chia-I Wu return ((char *) key1 - (char *) key2); 8376e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu} 8386e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 8397aadb53ef020b13658c9a99ecffe554af8755420Chia-I Wu#ifdef HAVE_WAYLAND_BACKEND 8407aadb53ef020b13658c9a99ecffe554af8755420Chia-I Wu 841184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic int 842184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkedri2_display_authenticate(void *user_data, uint32_t magic) 843184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{ 844184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct native_display *ndpy = user_data; 845184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct dri2_display *dri2dpy = dri2_display(ndpy); 846184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 847184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return x11_screen_authenticate(dri2dpy->xscr, magic); 848184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke} 849184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 850184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic struct wayland_drm_callbacks wl_drm_callbacks = { 851184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke dri2_display_authenticate, 852184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke egl_g3d_wl_drm_helper_reference_buffer, 853184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke egl_g3d_wl_drm_helper_unreference_buffer 854184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke}; 855184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 856184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic boolean 857184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkedri2_display_bind_wayland_display(struct native_display *ndpy, 858184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct wl_display *wl_dpy) 859184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{ 860184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct dri2_display *dri2dpy = dri2_display(ndpy); 861184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 862184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke if (dri2dpy->wl_server_drm) 863184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return FALSE; 864184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 865184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke dri2dpy->wl_server_drm = wayland_drm_init(wl_dpy, 866184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke x11_screen_get_device_name(dri2dpy->xscr), 867184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke &wl_drm_callbacks, ndpy); 868184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 869184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke if (!dri2dpy->wl_server_drm) 870184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return FALSE; 871184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 872184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return TRUE; 873184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke} 874184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 875184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic boolean 876184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkedri2_display_unbind_wayland_display(struct native_display *ndpy, 877184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct wl_display *wl_dpy) 878184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{ 879184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct dri2_display *dri2dpy = dri2_display(ndpy); 880184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 881184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke if (!dri2dpy->wl_server_drm) 882184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return FALSE; 883184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 884184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke wayland_drm_uninit(dri2dpy->wl_server_drm); 885184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke dri2dpy->wl_server_drm = NULL; 886184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 887184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return TRUE; 888184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke} 889184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 890184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic struct native_display_wayland_bufmgr dri2_display_wayland_bufmgr = { 891184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke dri2_display_bind_wayland_display, 892184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke dri2_display_unbind_wayland_display, 893a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg egl_g3d_wl_drm_common_wl_buffer_get_resource, 894a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg egl_g3d_wl_drm_common_query_buffer 895184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke}; 896184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 897184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif /* HAVE_WAYLAND_BACKEND */ 898184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 89949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display * 900f22665df95406567193dee0089f4830664ff4101Chia-I Wux11_create_dri2_display(Display *dpy, 90173df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu const struct native_event_handler *event_handler) 90249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 90349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct dri2_display *dri2dpy; 90449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 90549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy = CALLOC_STRUCT(dri2_display); 90649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2dpy) 90749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return NULL; 90849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 909e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu dri2dpy->event_handler = event_handler; 91049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 91149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->dpy = dpy; 91249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2dpy->dpy) { 91349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->dpy = XOpenDisplay(NULL); 91449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2dpy->dpy) { 91549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2_display_destroy(&dri2dpy->base); 91649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return NULL; 91749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 91849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->own_dpy = TRUE; 91949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 92049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 92149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->xscr_number = DefaultScreen(dri2dpy->dpy); 92249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->xscr = x11_screen_create(dri2dpy->dpy, dri2dpy->xscr_number); 92349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!dri2dpy->xscr) { 92449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2_display_destroy(&dri2dpy->base); 92549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return NULL; 92649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 92749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 9286e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2dpy->surfaces = util_hash_table_create(dri2_display_hash_table_hash, 9296e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2_display_hash_table_compare); 9306e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu if (!dri2dpy->surfaces) { 9316e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu dri2_display_destroy(&dri2dpy->base); 9326e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu return NULL; 9336e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu } 9346e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu 93573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu dri2dpy->base.init_screen = dri2_display_init_screen; 93649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->base.destroy = dri2_display_destroy; 937fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu dri2dpy->base.get_param = dri2_display_get_param; 93849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->base.get_configs = dri2_display_get_configs; 939a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu dri2dpy->base.get_pixmap_format = dri2_display_get_pixmap_format; 9407c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu dri2dpy->base.copy_to_pixmap = native_display_copy_to_pixmap; 94149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->base.create_window_surface = dri2_display_create_window_surface; 94249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2dpy->base.create_pixmap_surface = dri2_display_create_pixmap_surface; 943184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef HAVE_WAYLAND_BACKEND 944184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke dri2dpy->base.wayland_bufmgr = &dri2_display_wayland_bufmgr; 945184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif 94649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 94749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return &dri2dpy->base; 94849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 949cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 950cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#else /* GLX_DIRECT_RENDERING */ 951cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 952cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wustruct native_display * 953cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wux11_create_dri2_display(Display *dpy, 954ed47d65c7c05d7dd5a5b4cafaa32afbd4fff0befChia-I Wu const struct native_event_handler *event_handler) 955cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu{ 956cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu return NULL; 957cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu} 958cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 959cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#endif /* GLX_DIRECT_RENDERING */ 960