1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.1 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 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 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR 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 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file xm_api.c 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All the XMesa* API functions. 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NOTES: 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The window coordinate system origin (0,0) is in the lower-left corner 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the window. X11's window coordinate origin is in the upper-left 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * corner of the window. Therefore, most drawing functions in this 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * file have to flip Y coordinates. 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Byte swapping: If the Mesa host and the X display use a different 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * byte order then there's some trickiness to be aware of when using 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XImages. The byte ordering used for the XImage is that of the X 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * display, not the Mesa host. 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The color-to-pixel encoding for True/DirectColor must be done 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * according to the display's visual red_mask, green_mask, and blue_mask. 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * do byte swapping if needed. If one wants to directly "poke" the pixel 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * into the XImage's buffer then the pixel must be byte swapped first. 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __CYGWIN__ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef WIN32 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef __WIN32__ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xm_api.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xm_st.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_atomic.h" 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xm_public.h" 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/glx.h> 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Driver interface routines, set up by xlib backend on library 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _init(). These are global in the same way that function names are 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * global. 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct xm_driver driver; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct st_api *stapi; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Default strict invalidate to false. This means we will not call 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XGetGeometry after every swapbuffers, which allows swapbuffers to 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * remain asynchronous. For apps running at 100fps with synchronous 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swapping, a 10% boost is typical. For gears, I see closer to 20% 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * speedup. 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that the work of copying data on swapbuffers doesn't disappear 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - this change just allows the X server to execute the PutImage 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * asynchronously without us effectively blocked until its completion. 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This speeds up even llvmpipe's threaded rasterization as the 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swapbuffers operation was a large part of the serial component of 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an llvmpipe frame. 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The downside of this is correctness - applications which don't call 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glViewport on window resizes will get incorrect rendering. A 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * better solution would be to have per-frame but asynchronous 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * invalidation. Xcb almost looks as if it could provide this, but 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the API doesn't seem to quite be there. 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean xmesa_strict_invalidate = FALSE; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid xmesa_set_driver( const struct xm_driver *templ ) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver = *templ; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stapi = driver.create_st_api(); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_strict_invalidate = 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_get_bool_option("XMESA_STRICT_INVALIDATE", FALSE); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX replace this with a linked list, or better yet, try to attach the 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * gallium/mesa extra bits to the X Display object with XAddExtension(). 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAX_DISPLAYS 10 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct xmesa_display Displays[MAX_DISPLAYS]; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int NumDisplays = 0; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_get_param(struct st_manager *smapi, 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum st_manager_param param) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(param) { 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ST_MANAGER_BROKEN_INVALIDATE: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return !xmesa_strict_invalidate; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaDisplay 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_init_display( Display *display ) 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_static_mutex(init_mutex); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDisplay xmdpy; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(init_mutex); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Look for XMesaDisplay which corresponds to 'display' */ 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NumDisplays; i++) { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (Displays[i].display == display) { 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Found it */ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(init_mutex); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &Displays[i]; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create new XMesaDisplay */ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(NumDisplays < MAX_DISPLAYS); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy = &Displays[NumDisplays]; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NumDisplays++; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xmdpy->display && display) { 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->display = display; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->screen = driver.create_pipe_screen(display); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->smapi = CALLOC_STRUCT(st_manager); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xmdpy->smapi) { 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->smapi->screen = xmdpy->screen; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->smapi->get_param = xmesa_get_param; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xmdpy->screen && xmdpy->smapi) { 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_init(xmdpy->mutex); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xmdpy->screen) { 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->screen->destroy(xmdpy->screen); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->screen = NULL; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xmdpy->smapi) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(xmdpy->smapi); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->smapi = NULL; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->display = NULL; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xmdpy->display || xmdpy->display != display) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy = NULL; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(init_mutex); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return xmdpy; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** X Utility Functions *****/ 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the host's byte order as LSBFirst or MSBFirst ala X. 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int host_byte_order( void ) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = 1; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *cptr = (char *) &i; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (*cptr==1) ? LSBFirst : MSBFirst; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the true number of bits per pixel for XImages. 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, if we request a 24-bit deep visual we may actually need/get 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32bpp XImages. This function returns the appropriate bpp. 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: dpy - the X display 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * visinfo - desribes the visual to be used for XImages 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: true number of bits per pixel for XImages 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbits_per_pixel( XMesaVisual xmv ) 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display *dpy = xmv->display; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVisualInfo * visinfo = xmv->visinfo; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XImage *img; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int bitsPerPixel; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create a temporary XImage */ 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ZPixmap, 0, /*format, offset*/ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (char*) MALLOC(8), /*data*/ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, 1, /*width, height*/ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32, /*bitmap_pad*/ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 /*bytes_per_line*/ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(img); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* grab the bits/pixel value */ 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bitsPerPixel = img->bits_per_pixel; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* free the XImage */ 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free( img->data ); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->data = NULL; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XDestroyImage( img ); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bitsPerPixel; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine if a given X window ID is valid (window exists). 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do this by calling XGetWindowAttributes() for the window and 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * checking if we catch an X error. 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: dpy - the display 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * win - the window to check for existance 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: GL_TRUE - window exists 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE - window doesn't exist 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean WindowExistsFlag; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int window_exists_err_handler( Display* dpy, XErrorEvent* xerr ) 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dpy; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xerr->error_code == BadWindow) { 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WindowExistsFlag = GL_FALSE; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean window_exists( Display *dpy, Window win ) 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XWindowAttributes wa; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int (*old_handler)( Display*, XErrorEvent* ); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WindowExistsFlag = GL_TRUE; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_handler = XSetErrorHandler(window_exists_err_handler); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSetErrorHandler(old_handler); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return WindowExistsFlag; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Status 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_drawable_size( Display *dpy, Drawable d, uint *width, uint *height ) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Window root; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Status stat; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int xpos, ypos; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int w, h, bw, depth; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = w; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = h; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return stat; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the size of the window (or pixmap) that corresponds to the 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * given XMesaBuffer. 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width returns width in pixels 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height returns height in pixels 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_get_window_size(Display *dpy, XMesaBuffer b, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *width, GLuint *height) 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDisplay xmdpy = xmesa_init_display(dpy); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Status stat; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(xmdpy->mutex); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stat = get_drawable_size(dpy, b->ws.drawable, width, height); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(xmdpy->mutex); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!stat) { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* probably querying a window that's recently been destroyed */ 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, "XGetGeometry failed!\n"); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = *height = 1; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_REDMASK(__v) __v->mesa_visual.redMask 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_GREENMASK(__v) __v->mesa_visual.greenMask 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_BLUEMASK(__v) __v->mesa_visual.blueMask 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Choose the pixel format for the given visual. 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This will tell the gallium driver how to pack pixel data into 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * drawing surfaces. 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchoose_pixel_format(XMesaVisual v) 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean native_byte_order = (host_byte_order() == 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ImageByteOrder(v->display)); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( GET_REDMASK(v) == 0x0000ff 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_GREENMASK(v) == 0x00ff00 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_BLUEMASK(v) == 0xff0000 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->BitsPerPixel == 32) { 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_byte_order) { 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no byteswapping needed */ 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_R8G8B8A8_UNORM; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_A8B8G8R8_UNORM; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ( GET_REDMASK(v) == 0xff0000 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_GREENMASK(v) == 0x00ff00 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_BLUEMASK(v) == 0x0000ff 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->BitsPerPixel == 32) { 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_byte_order) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no byteswapping needed */ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_B8G8R8A8_UNORM; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_A8R8G8B8_UNORM; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ( GET_REDMASK(v) == 0x0000ff00 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_GREENMASK(v) == 0x00ff0000 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_BLUEMASK(v) == 0xff000000 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->BitsPerPixel == 32) { 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_byte_order) { 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no byteswapping needed */ 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_A8R8G8B8_UNORM; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_B8G8R8A8_UNORM; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ( GET_REDMASK(v) == 0xf800 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_GREENMASK(v) == 0x07e0 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_BLUEMASK(v) == 0x001f 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && native_byte_order 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->BitsPerPixel == 16) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 5-6-5 RGB */ 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_B5G6R5_UNORM; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_NONE; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Choose a depth/stencil format that satisfies the given depth and 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stencil sizes. 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum pipe_format 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchoose_depth_stencil_format(XMesaDisplay xmdpy, int depth, int stencil) 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const enum pipe_texture_target target = PIPE_TEXTURE_2D; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned tex_usage = PIPE_BIND_DEPTH_STENCIL; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned sample_count = 0; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format formats[8], fmt; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int count, i; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = 0; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth <= 16 && stencil == 0) { 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_Z16_UNORM; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth <= 24 && stencil == 0) { 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_X8Z24_UNORM; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_Z24X8_UNORM; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth <= 24 && stencil <= 8) { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_S8_UINT_Z24_UNORM; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_Z24_UNORM_S8_UINT; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth <= 32 && stencil == 0) { 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_Z32_UNORM; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fmt = PIPE_FORMAT_NONE; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xmdpy->screen->is_format_supported(xmdpy->screen, formats[i], 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target, sample_count, 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_usage)) { 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fmt = formats[i]; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return fmt; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Linked list of XMesaBuffers *****/ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaBuffer XMesaBufferList = NULL; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate a new XMesaBuffer object which corresponds to the given drawable. 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that XMesaBuffer is derived from struct gl_framebuffer. 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The new XMesaBuffer will not have any size (Width=Height=0). 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param d the corresponding X drawable (window or pixmap) 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type either WINDOW, PIXMAP or PBUFFER, describing d 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param vis the buffer's visual 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param cmap the window's colormap, if known. 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return new XMesaBuffer or NULL if any problem 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaBuffer 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_xmesa_buffer(Drawable d, BufferType type, 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaVisual vis, Colormap cmap) 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDisplay xmdpy = xmesa_init_display(vis->display); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint width, height; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xmdpy) 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->ws.drawable = d; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->ws.visual = vis->visinfo->visual; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->ws.depth = vis->visinfo->depth; 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->xm_visual = vis; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->type = type; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->cmap = cmap; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_drawable_size(vis->display, d, &width, &height); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create framebuffer, but we'll plug in our own renderbuffers below. 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->stfb = xmesa_create_st_framebuffer(xmdpy, b); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GLX_EXT_texture_from_pixmap */ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureTarget = 0; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureMipmap = 0; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* insert buffer into linked list */ 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->Next = XMesaBufferList; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBufferList = b; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find an XMesaBuffer by matching X display and colormap but NOT matching 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the notThis buffer. 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_find_buffer(Display *dpy, Colormap cmap, XMesaBuffer notThis) 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b = XMesaBufferList; b; b = b->Next) { 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->xm_visual->display == dpy && 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->cmap == cmap && 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b != notThis) { 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Remove buffer from linked list, delete if no longer referenced. 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_free_buffer(XMesaBuffer buffer) 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer prev = NULL, b; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b = XMesaBufferList; b; b = b->Next) { 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b == buffer) { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unlink buffer from list */ 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prev) 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev->Next = buffer->Next; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBufferList = buffer->Next; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Since the X window for the XMesaBuffer is going away, we don't 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * want to dereference this pointer in the future. 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->ws.drawable = 0; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX we should move the buffer to a delete-pending list and destroy 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the buffer until it is no longer current. 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_destroy_st_framebuffer(buffer->stfb); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(buffer); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* continue search */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev = b; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* buffer not found in XMesaBufferList */ 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Misc Private Functions *****/ 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When a context is bound for the first time, we can finally finish 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * initializing the context's visual and buffer information. 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the XMesaVisual to initialize 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param b the XMesaBuffer to initialize (may be NULL) 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param window the window/pixmap we're rendering into 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param cmap the colormap associated with the window/pixmap 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE=success, GL_FALSE=failure 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean rgb_flag, Drawable window, 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Colormap cmap) 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(!b || b->xm_visual == v); 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Save true bits/pixel */ 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->BitsPerPixel = bits_per_pixel(v); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v->BitsPerPixel > 0); 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rgb_flag == GL_FALSE) { 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* COLOR-INDEXED WINDOW: not supported*/ 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RGB WINDOW: 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We support RGB rendering into almost any kind of visual. 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int xclass = v->visualType; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xclass != GLX_TRUE_COLOR && xclass == !GLX_DIRECT_COLOR) { 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "XMesa: RGB mode rendering not supported in given visual.\n"); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.indexBits = 0; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->BitsPerPixel == 32) { 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We use XImages for all front/back buffers. If an X Window or 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X Pixmap is 32bpp, there's no guarantee that the alpha channel 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will be preserved. For XImages we're in luck. 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.alphaBits = 8; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If MESA_INFO env var is set print out some debugging info 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which can help Brian figure out what's going on when a user 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reports bugs. 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_getenv("MESA_INFO")) { 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa visual = %p\n", (void *) v); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa level = %d\n", v->mesa_visual.level); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa depth = %d\n", v->visinfo->depth); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_VISUAL_TYPES 6 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert an X visual type to a GLX visual type. 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to be converted. 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return If \c visualType is a valid X visual type, a GLX visual type will 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be returned. Otherwise \c GLX_NONE will be returned. 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DRI CVS tree. 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_convert_from_x_visual_type( int visualType ) 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_STATIC_GRAY, GLX_GRAY_SCALE, 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_TRUE_COLOR, GLX_DIRECT_COLOR 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? glx_visual_types[ visualType ] : GLX_NONE; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Public Functions *****/ 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new X/Mesa visual. 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: display - X11 display 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * visinfo - an XVisualInfo pointer 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rgb_flag - GL_TRUE = RGB mode, 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE = color index mode 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * alpha_flag - alpha buffer requested? 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * db_flag - GL_TRUE = double-buffered, 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE = single buffered 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stereo_flag - stereo visual? 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ximage_flag - GL_TRUE = use an XImage for back buffer, 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE = use an off-screen pixmap for back buffer 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * depth_size - requested bits/depth values, or zero 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stencil_size - requested bits/stencil values, or zero 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_red_size - requested bits/red accum values, or zero 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_green_size - requested bits/green accum values, or zero 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_blue_size - requested bits/blue accum values, or zero 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_alpha_size - requested bits/alpha accum values, or zero 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * num_samples - number of samples/pixel if multisampling, or zero 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level - visual level, usually 0 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * visualCaveat - ala the GLX extension, usually GLX_NONE 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return; a new XMesaVisual or 0 if error. 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaVisual XMesaCreateVisual( Display *display, 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVisualInfo * visinfo, 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean rgb_flag, 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean alpha_flag, 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean db_flag, 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean stereo_flag, 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean ximage_flag, 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint depth_size, 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint stencil_size, 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_red_size, 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_green_size, 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_blue_size, 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_alpha_size, 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint num_samples, 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint level, 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint visualCaveat ) 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDisplay xmdpy = xmesa_init_display(display); 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaVisual v; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint red_bits, green_bits, blue_bits, alpha_bits; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xmdpy) 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For debugging only */ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_getenv("MESA_XSYNC")) { 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This makes debugging X easier. 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In your debugger, set a breakpoint on _XError to stop when an 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X protocol error is generated. 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSynchronize( display, 1 ); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!v) { 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->display = display; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Save a copy of the XVisualInfo struct because the user may Xfree() 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the struct but we may need some of the information contained in it 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * at a later time. 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!v->visinfo) { 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(v); 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(v->visinfo, visinfo, sizeof(*visinfo)); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->ximage_flag = ximage_flag; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.redMask = visinfo->red_mask; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.greenMask = visinfo->green_mask; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.blueMask = visinfo->blue_mask; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visualID = visinfo->visualid; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->screen = visinfo->screen; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !(defined(__cplusplus) || defined(c_plusplus)) 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visualType = xmesa_convert_from_x_visual_type(visinfo->class); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.visualRating = visualCaveat; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (alpha_flag) 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.alphaBits = 8; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 ); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int xclass = v->visualType; 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits = _mesa_bitcount(GET_REDMASK(v)); 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org green_bits = _mesa_bitcount(GET_GREENMASK(v)); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this is an approximation */ 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int depth; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = v->visinfo->depth; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits = depth / 3; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth -= red_bits; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org green_bits = depth / 2; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth -= green_bits; 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blue_bits = depth; 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_bits = 0; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( red_bits + green_bits + blue_bits == v->visinfo->depth ); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_bits = v->mesa_visual.alphaBits; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* initialize visual */ 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_config *vis = &v->mesa_visual; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->rgbMode = GL_TRUE; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->doubleBufferMode = db_flag; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->stereoMode = stereo_flag; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->redBits = red_bits; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->greenBits = green_bits; 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->blueBits = blue_bits; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->alphaBits = alpha_bits; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->rgbBits = red_bits + green_bits + blue_bits; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->indexBits = 0; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->depthBits = depth_size; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->stencilBits = stencil_size; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->accumRedBits = accum_red_size; 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->accumGreenBits = accum_green_size; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->accumBlueBits = accum_blue_size; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->accumAlphaBits = accum_alpha_size; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->haveAccumBuffer = accum_red_size > 0; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->haveDepthBuffer = depth_size > 0; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->haveStencilBuffer = stencil_size > 0; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->numAuxBuffers = 0; 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->level = 0; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->sampleBuffers = 0; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->samples = 0; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (db_flag) 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stereo_flag) { 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (db_flag) 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.color_format = choose_pixel_format(v); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->stvis.color_format == PIPE_FORMAT_NONE) { 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(v->visinfo); 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(v); 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.depth_stencil_format = 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org choose_depth_stencil_format(xmdpy, depth_size, stencil_size); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.accum_format = (accum_red_size + 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org accum_green_size + accum_blue_size + accum_alpha_size) ? 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.samples = num_samples; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->stvis.render_buffer = ST_ATTACHMENT_INVALID; 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX minor hack */ 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.level = level; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return v; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaDestroyVisual( XMesaVisual v ) 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(v->visinfo); 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(v); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the informative name. 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char * 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_get_name(void) 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return stapi->name; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do per-display initializations. 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_init( Display *display ) 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_init_display(display); 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new XMesaContext. 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the XMesaVisual 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param share_list another XMesaContext with which to share display 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lists or NULL if no sharing is wanted. 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return an XMesaContext or NULL if error. 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list, 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint major, GLuint minor, 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint profileMask, GLuint contextFlags) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDisplay xmdpy = xmesa_init_display(v->display); 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_context_attribs attribs; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum st_context_error ctx_err = 0; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaContext c; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xmdpy) 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: the XMesaContext contains a Mesa struct gl_context struct (inheritance) */ 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c) 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_visual = v; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_read_buffer = NULL; 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&attribs, 0, sizeof(attribs)); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.visual = v->stvis; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.major = major; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.minor = minor; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (contextFlags & GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB) 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.flags |= ST_CONTEXT_FLAG_FORWARD_COMPATIBLE; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (contextFlags & GLX_CONTEXT_DEBUG_BIT_ARB) 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.flags |= ST_CONTEXT_FLAG_DEBUG; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (contextFlags & GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB) 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* There are no profiles before OpenGL 3.2. The 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX_ARB_create_context_profile spec says: 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "If the requested OpenGL version is less than 3.2, 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * context is determined solely by the requested version." 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The spec also says: 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "The default value for GLX_CONTEXT_PROFILE_MASK_ARB is 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX_CONTEXT_CORE_PROFILE_BIT_ARB." 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.profile = ST_PROFILE_DEFAULT; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((major > 3 || (major == 3 && minor >= 2)) 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ((profileMask & GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) == 0)) 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs.profile = ST_PROFILE_OPENGL_CORE; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->st = stapi->create_context(stapi, xmdpy->smapi, &attribs, 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx_err, (share_list) ? share_list->st : NULL); 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->st == NULL) 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->st->st_manager_private = (void *) c; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return c; 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail: 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->st) 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->st->destroy(c->st); 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(c); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaDestroyContext( XMesaContext c ) 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->st->destroy(c->st); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: We should destroy the screen here, but if we do so, surfaces may 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * outlive it, causing segfaults 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = c->st->pipe->screen; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->destroy(screen); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(c); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Private function for creating an XMesaBuffer which corresponds to an 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X window or pixmap. 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the window's XMesaVisual 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param w the window we're wrapping 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return new XMesaBuffer or NULL if error 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC XMesaBuffer 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreateWindowBuffer(XMesaVisual v, Window w) 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XWindowAttributes attr; 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Colormap cmap; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int depth; 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(w); 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check that window depth matches visual depth */ 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XGetWindowAttributes( v->display, w, &attr ); 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = attr.depth; 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->visinfo->depth != depth) { 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visinfo->depth, depth); 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Find colormap */ 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attr.colormap) { 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cmap = attr.colormap; 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this is weird, a window w/out a colormap!? */ 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OK, let's just allocate a new one and hope for the best */ 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer((Drawable) w, WINDOW, v, cmap); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode, 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Drawable) w, cmap )) { 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new XMesaBuffer from an X pixmap. 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the XMesaVisual 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param p the pixmap 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c GLX_DIRECT_COLOR visual for the pixmap 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \returns new XMesaBuffer or NULL if error 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC XMesaBuffer 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreatePixmapBuffer(XMesaVisual v, Pixmap p, Colormap cmap) 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v); 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer((Drawable) p, PIXMAP, v, cmap); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Drawable) p, cmap)) { 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For GLX_EXT_texture_from_pixmap 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreatePixmapTextureBuffer(XMesaVisual v, Pixmap p, 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Colormap cmap, 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int format, int target, int mipmap) 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v); 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer((Drawable) p, PIXMAP, v, cmap); 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get pixmap size */ 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_get_window_size(v->display, b, &b->width, &b->height); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == 0) { 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* examine dims */ 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_texture_non_power_of_two) { 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_2D_EXT; 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ( _mesa_bitcount(b->width) == 1 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && _mesa_bitcount(b->height) == 1) { 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* power of two size */ 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->height == 1) { 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_1D_EXT; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_2D_EXT; 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Extensions.NV_texture_rectangle) { 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_RECTANGLE_EXT; 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* non power of two textures not supported */ 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDestroyBuffer(b); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureTarget = target; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureFormat = format; 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureMipmap = mipmap; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Drawable) p, cmap)) { 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreatePBuffer(XMesaVisual v, Colormap cmap, 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int width, unsigned int height) 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Window root; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Drawable drawable; /* X Pixmap Drawable */ 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* allocate pixmap for front buffer */ 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org root = RootWindow( v->display, v->visinfo->screen ); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable = XCreatePixmap(v->display, root, width, height, 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visinfo->depth); 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!drawable) 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable, cmap)) { 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Deallocate an XMesaBuffer structure and all related info. 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC void 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaDestroyBuffer(XMesaBuffer b) 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Notify the binding context to validate the buffer. 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_notify_invalid_buffer(XMesaBuffer b) 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_atomic_inc(&b->stfb->stamp); 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Query the current drawable size and notify the binding context. 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_check_buffer_size(XMesaBuffer b) 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint old_width, old_height; 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->type == PBUFFER) 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_width = b->width; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_height = b->height; 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_get_window_size(b->xm_visual->display, b, &b->width, &b->height); 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->width != old_width || b->height != old_height) 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_notify_invalid_buffer(b); 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Bind buffer b to context c and make c the current rendering context. 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer readBuffer ) 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaContext old_ctx = XMesaGetCurrentContext(); 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old_ctx && old_ctx != c) { 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaFlush(old_ctx); 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_ctx->xm_buffer = NULL; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_ctx->xm_read_buffer = NULL; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c) { 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!drawBuffer || !readBuffer) 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; /* must specify buffers! */ 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c == old_ctx && 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_buffer == drawBuffer && 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_read_buffer == readBuffer) 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_check_buffer_size(drawBuffer); 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (readBuffer != drawBuffer) 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_check_buffer_size(readBuffer); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_buffer = drawBuffer; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_read_buffer = readBuffer; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stapi->make_current(stapi, c->st, drawBuffer->stfb, readBuffer->stfb); 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawBuffer->wasCurrent = GL_TRUE; 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Detach */ 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stapi->make_current(stapi, NULL, NULL, NULL); 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unbind the context c from its buffer. 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaUnbindContext( XMesaContext c ) 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A no-op for XFree86 integration purposes */ 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaContext XMesaGetCurrentContext( void ) 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_context_iface *st = stapi->get_current(stapi); 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (XMesaContext) (st) ? st->st_manager_private : NULL; 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Swap front and back color buffers and have winsys display front buffer. 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If there's no front color buffer no swap actually occurs. 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaSwapBuffers( XMesaBuffer b ) 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaContext xmctx = XMesaGetCurrentContext(); 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xmctx && xmctx->xm_buffer == b) { 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmctx->st->flush( xmctx->st, ST_FLUSH_FRONT, NULL); 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_swap_st_framebuffer(b->stfb); 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy sub-region of back buffer to front buffer 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_copy_st_framebuffer(b->stfb, 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ST_ATTACHMENT_BACK_LEFT, ST_ATTACHMENT_FRONT_LEFT, 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, width, height); 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaFlush( XMesaContext c ) 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c && c->xm_visual->display) { 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDisplay xmdpy = xmesa_init_display(c->xm_visual->display); 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_fence_handle *fence = NULL; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->st->flush(c->st, ST_FLUSH_FRONT, &fence); 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fence) { 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->screen->fence_finish(xmdpy->screen, fence, 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TIMEOUT_INFINITE); 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmdpy->screen->fence_reference(xmdpy->screen, &fence, NULL); 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XFlush( c->xm_visual->display ); 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer XMesaFindBuffer( Display *dpy, Drawable d ) 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b = XMesaBufferList; b; b = b->Next) { 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->ws.drawable == d && b->xm_visual->display == dpy) { 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free/destroy all XMesaBuffers associated with given display. 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid xmesa_destroy_buffers_on_display(Display *dpy) 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b, next; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b = XMesaBufferList; b; b = next) { 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = b->Next; 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->xm_visual->display == dpy) { 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* delete head of list? */ 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (XMesaBufferList == b) { 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBufferList = next; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Look for XMesaBuffers whose X window has been destroyed. 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Deallocate any such XMesaBuffers. 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaGarbageCollect( void ) 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b, next; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b=XMesaBufferList; b; b=next) { 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = b->Next; 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->xm_visual && 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->xm_visual->display && 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->ws.drawable && 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->type == WINDOW) { 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSync(b->xm_visual->display, False); 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!window_exists( b->xm_visual->display, b->ws.drawable )) { 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* found a dead window, free the ancillary info */ 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDestroyBuffer( b ); 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum st_attachment_type xmesa_attachment_type(int glx_attachment) 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(glx_attachment) { 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_FRONT_LEFT_EXT: 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ST_ATTACHMENT_FRONT_LEFT; 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_FRONT_RIGHT_EXT: 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ST_ATTACHMENT_FRONT_RIGHT; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BACK_LEFT_EXT: 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ST_ATTACHMENT_BACK_LEFT; 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BACK_RIGHT_EXT: 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ST_ATTACHMENT_BACK_RIGHT; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ST_ATTACHMENT_FRONT_LEFT; 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC void 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBindTexImage(Display *dpy, XMesaBuffer drawable, int buffer, 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *attrib_list) 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_context_iface *st = stapi->get_current(stapi); 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_framebuffer_iface* stfbi = drawable->stfb; 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res; 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x, y, w, h; 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum st_attachment_type st_attachment = xmesa_attachment_type(buffer); 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x = 0; 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = 0; 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w = drawable->width; 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = drawable->height; 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We need to validate our attachments before using them, 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in case the texture doesn't exist yet. */ 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_st_framebuffer_validate_textures(stfbi, w, h, 1 << st_attachment); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = xmesa_get_attachment(stfbi, st_attachment); 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res) { 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context* pipe = xmesa_get_context(stfbi); 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format internal_format = res->format; 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *tex_xfer; 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *map; 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int line, ximage_stride; 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XImage *img; 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internal_format = choose_pixel_format(drawable->xm_visual); 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_xfer = pipe_get_transfer(pipe, res, 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, /* level, layer */ 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE, 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w, h); 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tex_xfer) 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Grab the XImage that we want to turn into a texture. */ 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = XGetImage(dpy, 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->ws.drawable, 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w, h, 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org AllPlanes, 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ZPixmap); 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!img) { 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_destroy(pipe, tex_xfer); 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe_transfer_map(pipe, tex_xfer); 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!map) { 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_destroy(pipe, tex_xfer); 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org We assume 32 bit pixels. */ 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ximage_stride = w * 4; 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (line = 0; line < h; line++) 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&map[line * tex_xfer->stride], 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &img->data[line * ximage_stride], 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ximage_stride); 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_unmap(pipe, tex_xfer); 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_destroy(pipe, tex_xfer); 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org st->teximage(st, 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ST_TEXTURE_2D, 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* level */ 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internal_format, 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res, 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FALSE /* no mipmap */); 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC void 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaReleaseTexImage(Display *dpy, XMesaBuffer drawable, int buffer) 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCopyContext(XMesaContext src, XMesaContext dst, unsigned long mask) 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst->st->copy) 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->st->copy(dst->st, src->st, mask); 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1438