1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice including the dates of first publication and 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * either this permission notice or a reference to 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * http://oss.sgi.com/projects/FreeB/ 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shall be included 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 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Except as contained in this notice, the name of Silicon Graphics, Inc. 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shall not be used in advertising or otherwise to promote the sale, use or 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * other dealings in this Software without prior written authorization from 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Silicon Graphics, Inc. 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file glxext.c 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX protocol interface boot-strap code. 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Direct rendering support added by Precision Insight, Inc. 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Kevin E. Martin <kevin@precisioninsight.com> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxclient.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/Xext.h> 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/extutil.h> 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "apple_glx.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "apple_visual.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxextensions.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_XCB 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/Xlib-xcb.h> 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xcb/xcb.h> 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xcb/glx.h> 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid __glXDumpDrawBuffer(struct glx_context * ctx); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** You can set this cell to 1 to force the gl drawing stuff to be 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** one command per packet 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN int __glXDebug = 0; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Extension required boiler plate */ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char __glXExtensionName[] = GLX_EXTENSION_NAME; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static struct glx_display *glx_displays; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic /* const */ char *error_list[] = { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadContext", 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadContextState", 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadDrawable", 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadPixmap", 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadContextTag", 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadCurrentWindow", 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadRenderRequest", 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadLargeRequest", 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXUnsupportedPrivateRequest", 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadFBConfig", 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadPbuffer", 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadCurrentDrawable", 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadWindow", 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GLXBadProfileARB", 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char *__glXErrorString(Display *dpy, int code, XExtCodes *codes, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *buf, int n); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXEXT_GENERATE_ERROR_STRING(__glXErrorString, __glXExtensionName, 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __GLX_NUMBER_ERRORS, error_list) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX events are a bit funky. We don't stuff the X event code into 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * our user exposed (via XNextEvent) structure. Instead we use the GLX 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * private event code namespace (and hope it doesn't conflict). Clients 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * have to know that bit 15 in the event type field means they're getting 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a GLX event, and then handle the various sub-event types there, rather 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * than simply checking the event code and handling it directly. 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXWireToEvent(Display *dpy, XEvent *event, xEvent *wire) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *glx_dpy = __glXInitialize(dpy); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (glx_dpy == NULL) 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return False; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch ((wire->u.u.type & 0x7f) - glx_dpy->codes->first_event) { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_PbufferClobber: 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLXPbufferClobberEvent *aevent = (GLXPbufferClobberEvent *)event; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXPbufferClobberEvent *awire = (xGLXPbufferClobberEvent *)wire; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->event_type = awire->type; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->serial = awire->sequenceNumber; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->event_type = awire->event_type; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->draw_type = awire->draw_type; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->drawable = awire->drawable; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->buffer_mask = awire->buffer_mask; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->aux_buffer = awire->aux_buffer; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->x = awire->x; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->y = awire->y; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->width = awire->width; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->height = awire->height; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->count = awire->count; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return True; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BufferSwapComplete: 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXBufferSwapComplete2 *awire = (xGLXBufferSwapComplete2 *)wire; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_drawable *glxDraw = GetGLXDrawable(dpy, awire->drawable); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->event_type = awire->event_type; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->drawable = awire->drawable; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!glxDraw) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return False; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (awire->sbc < glxDraw->lastEventSbc) 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glxDraw->eventSbcWrap += 0x100000000; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glxDraw->lastEventSbc = awire->sbc; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aevent->sbc = awire->sbc + glxDraw->eventSbcWrap; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return True; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* client doesn't support server event */ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return False; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* We don't actually support this. It doesn't make sense for clients to 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * send each other GLX events. 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Status 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXEventToWire(Display *dpy, XEvent *event, xEvent *wire) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *glx_dpy = __glXInitialize(dpy); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (glx_dpy == NULL) 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return False; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (event->type) { 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_DAMAGED: 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_SAVED: 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_EXCHANGE_COMPLETE_INTEL: 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_COPY_COMPLETE_INTEL: 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_FLIP_COMPLETE_INTEL: 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* client doesn't support server event */ 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Success; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************/ 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Free the per screen configs data as well as the array of 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** __glXScreenConfigs. 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFreeScreenConfigs(struct glx_display * priv) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_screen *psc; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i, screens; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Free screen configuration information */ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screens = ScreenCount(priv->dpy); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < screens; i++) { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = priv->screens[i]; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_screen_cleanup(psc); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc->driScreen) { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->driScreen->destroyScreen(psc); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(psc); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(psc); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XFree((char *) priv->screens); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->screens = NULL; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglx_display_free(struct glx_display *priv) 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_context *gc; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc = __glXGetCurrentContext(); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->dpy == gc->currentDpy) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc->vtable->destroy(gc); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSetCurrentContextNull(); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FreeScreenConfigs(priv); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->serverGLXvendor) 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree((char *) priv->serverGLXvendor); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->serverGLXversion) 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree((char *) priv->serverGLXversion); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glxHashDestroy(priv->glXDrawHash); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glxHashDestroy(priv->drawHash); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Free the direct rendering per display data */ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->driswDisplay) 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*priv->driswDisplay->destroyDisplay) (priv->driswDisplay); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->driswDisplay = NULL; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->driDisplay) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*priv->driDisplay->destroyDisplay) (priv->driDisplay); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->driDisplay = NULL; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->dri2Display) 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*priv->dri2Display->destroyDisplay) (priv->dri2Display); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->dri2Display = NULL; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree((char *) priv); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXCloseDisplay(Display * dpy, XExtCodes * codes) 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv, **prev; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XLockMutex(_Xglobal_lock); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev = &glx_displays; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (priv = glx_displays; priv; prev = &priv->next, priv = priv->next) { 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->dpy == dpy) { 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *prev = priv->next; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XUnlockMutex(_Xglobal_lock); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_display_free(priv); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Query the version of the GLX extension. This procedure works even if 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** the client extension is not completely set up. 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgQueryVersion(Display * dpy, int opcode, int *major, int *minor) 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_XCB 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_connection_t *c = XGetXCBConnection(dpy); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_glx_query_version_reply_t *reply = xcb_glx_query_version_reply(c, 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_glx_query_version 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (c, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_MAJOR_VERSION, 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_MINOR_VERSION), 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!reply) 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply->major_version != GLX_MAJOR_VERSION) { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *major = reply->major_version; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *minor = min(reply->minor_version, GLX_MINOR_VERSION); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(reply); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXQueryVersionReq *req; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXQueryVersionReply reply; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Send the glXQueryVersion request */ 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXQueryVersion, req); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = opcode; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXQueryVersion; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->majorVersion = GLX_MAJOR_VERSION; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->minorVersion = GLX_MINOR_VERSION; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XReply(dpy, (xReply *) & reply, 0, False); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply.majorVersion != GLX_MAJOR_VERSION) { 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** The server does not support the same major release as this 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** client. 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *major = reply.majorVersion; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *minor = min(reply.minorVersion, GLX_MINOR_VERSION); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* USE_XCB */ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We don't want to enable this GLX_OML_swap_method in glxext.h, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * because we can't support it. The X server writes it out though, 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so we should handle it somehow, to avoid false warnings. 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IGNORE_GLX_SWAP_METHOD_OML = 0x8060 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconvert_from_x_visual_type(int visualType) 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const int glx_visual_types[] = { 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_STATIC_GRAY, GLX_GRAY_SCALE, 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_TRUE_COLOR, GLX_DIRECT_COLOR 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (visualType < ARRAY_SIZE(glx_visual_types)) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return glx_visual_types[visualType]; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GLX_NONE; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * getVisualConfigs uses the !tagged_only path. 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * getFBConfigs uses the tagged_only path. 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN void 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXInitializeVisualConfigFromTags(struct glx_config * config, int count, 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const INT32 * bp, Bool tagged_only, 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Bool fbconfig_style_tags) 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tagged_only) { 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy in the first set of properties */ 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->visualID = *bp++; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->visualType = convert_from_x_visual_type(*bp++); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->rgbMode = *bp++; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->redBits = *bp++; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->greenBits = *bp++; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->blueBits = *bp++; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->alphaBits = *bp++; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumRedBits = *bp++; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumGreenBits = *bp++; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumBlueBits = *bp++; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumAlphaBits = *bp++; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->doubleBufferMode = *bp++; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->stereoMode = *bp++; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->rgbBits = *bp++; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->depthBits = *bp++; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->stencilBits = *bp++; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->numAuxBuffers = *bp++; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->level = *bp++; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* AppleSGLX supports pixmap and pbuffers with all config. */ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Unfortunately this can create an ABI compatibility problem. */ 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= 18; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= __GLX_MIN_CONFIG_PROPS; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->sRGBCapable = GL_FALSE; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Additional properties may be in a list at the end 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** of the reply. They are in pairs of property type 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** and property value. 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FETCH_OR_SET(tag) \ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config-> tag = ( fbconfig_style_tags ) ? *bp++ : 1 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i += 2) { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org long int tag = *bp++; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tag) { 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_RGBA: 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FETCH_OR_SET(rgbMode); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BUFFER_SIZE: 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->rgbBits = *bp++; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_LEVEL: 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->level = *bp++; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_DOUBLEBUFFER: 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FETCH_OR_SET(doubleBufferMode); 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_STEREO: 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FETCH_OR_SET(stereoMode); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX_BUFFERS: 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->numAuxBuffers = *bp++; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_RED_SIZE: 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->redBits = *bp++; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_GREEN_SIZE: 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->greenBits = *bp++; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BLUE_SIZE: 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->blueBits = *bp++; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_ALPHA_SIZE: 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->alphaBits = *bp++; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_DEPTH_SIZE: 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->depthBits = *bp++; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_STENCIL_SIZE: 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->stencilBits = *bp++; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_ACCUM_RED_SIZE: 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumRedBits = *bp++; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_ACCUM_GREEN_SIZE: 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumGreenBits = *bp++; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_ACCUM_BLUE_SIZE: 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumBlueBits = *bp++; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_ACCUM_ALPHA_SIZE: 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->accumAlphaBits = *bp++; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_VISUAL_CAVEAT_EXT: 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->visualRating = *bp++; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_X_VISUAL_TYPE: 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->visualType = *bp++; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TRANSPARENT_TYPE: 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->transparentPixel = *bp++; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TRANSPARENT_INDEX_VALUE: 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->transparentIndex = *bp++; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TRANSPARENT_RED_VALUE: 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->transparentRed = *bp++; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TRANSPARENT_GREEN_VALUE: 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->transparentGreen = *bp++; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TRANSPARENT_BLUE_VALUE: 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->transparentBlue = *bp++; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TRANSPARENT_ALPHA_VALUE: 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->transparentAlpha = *bp++; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_VISUAL_ID: 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->visualID = *bp++; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_DRAWABLE_TYPE: 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->drawableType = *bp++; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* AppleSGLX supports pixmap and pbuffers with all config. */ 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->drawableType |= GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_RENDER_TYPE: 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->renderType = *bp++; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_X_RENDERABLE: 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->xRenderable = *bp++; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_FBCONFIG_ID: 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->fbconfigID = *bp++; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_MAX_PBUFFER_WIDTH: 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->maxPbufferWidth = *bp++; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_MAX_PBUFFER_HEIGHT: 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->maxPbufferHeight = *bp++; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_MAX_PBUFFER_PIXELS: 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->maxPbufferPixels = *bp++; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GLX_USE_APPLEGL 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX: 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->optimalPbufferWidth = *bp++; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX: 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->optimalPbufferHeight = *bp++; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_VISUAL_SELECT_GROUP_SGIX: 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->visualSelectGroup = *bp++; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_SWAP_METHOD_OML: 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->swapMethod = *bp++; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_SAMPLE_BUFFERS_SGIS: 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->sampleBuffers = *bp++; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_SAMPLES_SGIS: 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->samples = *bp++; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case IGNORE_GLX_SWAP_METHOD_OML: 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We ignore this tag. See the comment above this function. */ 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++bp; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BIND_TO_TEXTURE_RGB_EXT: 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->bindToTextureRgb = *bp++; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BIND_TO_TEXTURE_RGBA_EXT: 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->bindToTextureRgba = *bp++; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BIND_TO_MIPMAP_TEXTURE_EXT: 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->bindToMipmapTexture = *bp++; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BIND_TO_TEXTURE_TARGETS_EXT: 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->bindToTextureTargets = *bp++; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_Y_INVERTED_EXT: 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->yInverted = *bp++; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT: 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->sRGBCapable = *bp++; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_USE_GL: 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fbconfig_style_tags) 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bp++; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case None: 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = count; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(getenv("LIBGL_DIAGNOSTIC")) { 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org long int tagvalue = *bp++; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "WARNING: unknown GLX tag from server: " 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "tag 0x%lx value 0x%lx\n", tag, tagvalue); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ignore the unrecognized tag's value */ 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bp++; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->renderType = 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct glx_config * 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreateConfigsFromProperties(Display * dpy, int nvisuals, int nprops, 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int screen, GLboolean tagged_only) 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT32 buf[__GLX_TOTAL_CONFIG], *props; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prop_size; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_config *modes, *m; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nprops == 0) 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: Is the __GLX_MIN_CONFIG_PROPS test correct for FBconfigs? */ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check number of properties */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nprops < __GLX_MIN_CONFIG_PROPS || nprops > __GLX_MAX_CONFIG_PROPS) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Allocate memory for our config structure */ 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modes = glx_config_create_list(nvisuals); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!modes) 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prop_size = nprops * __GLX_SIZE_INT32; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prop_size <= sizeof(buf)) 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org props = buf; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org props = Xmalloc(prop_size); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Read each config structure and convert it into our format */ 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = modes; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nvisuals; i++) { 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XRead(dpy, (char *) props, prop_size); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Older X servers don't send this so we default it here. */ 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m->drawableType = GLX_WINDOW_BIT; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The XQuartz 2.3.2.1 X server doesn't set this properly, so 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * set the proper bits here. 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AppleSGLX supports windows, pixmaps, and pbuffers with all config. 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXInitializeVisualConfigFromTags(m, nprops, props, 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tagged_only, GL_TRUE); 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m->screen = screen; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = m->next; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (props != buf) 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(props); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return modes; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggetVisualConfigs(struct glx_screen *psc, 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv, int screen) 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXGetVisualConfigsReq *req; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXGetVisualConfigsReply reply; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display *dpy = priv->dpy; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->visuals = NULL; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXGetVisualConfigs, req); 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = priv->majorOpcode; 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXGetVisualConfigs; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->screen = screen; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_XReply(dpy, (xReply *) & reply, 0, False)) 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->visuals = createConfigsFromProperties(dpy, 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply.numVisuals, 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply.numProps, 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen, GL_FALSE); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out: 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return psc->visuals != NULL; 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org getFBConfigs(struct glx_screen *psc, struct glx_display *priv, int screen) 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXGetFBConfigsReq *fb_req; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXGetFBConfigsSGIXReq *sgi_req; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXVendorPrivateWithReplyReq *vpreq; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXGetFBConfigsReply reply; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display *dpy = priv->dpy; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->serverGLXexts = 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->configs = NULL; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (atof(priv->serverGLXversion) >= 1.3) { 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXGetFBConfigs, fb_req); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_req->reqType = priv->majorOpcode; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_req->glxCode = X_GLXGetFBConfigs; 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_req->screen = screen; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (strstr(psc->serverGLXexts, "GLX_SGIX_fbconfig") != NULL) { 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXVendorPrivateWithReply, 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sz_xGLXGetFBConfigsSGIXReq - 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sz_xGLXVendorPrivateWithReplyReq, vpreq); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sgi_req = (xGLXGetFBConfigsSGIXReq *) vpreq; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sgi_req->reqType = priv->majorOpcode; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sgi_req->glxCode = X_GLXVendorPrivateWithReply; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sgi_req->vendorCode = X_GLXvop_GetFBConfigsSGIX; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sgi_req->screen = screen; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_XReply(dpy, (xReply *) & reply, 0, False)) 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->configs = createConfigsFromProperties(dpy, 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply.numFBConfigs, 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reply.numAttribs * 2, 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen, GL_TRUE); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out: 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return psc->configs != NULL; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN Bool 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglx_screen_init(struct glx_screen *psc, 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int screen, struct glx_display * priv) 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize per screen dynamic client GLX extensions */ 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->ext_list_first_time = GL_TRUE; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->scr = screen; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->dpy = priv->dpy; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->display = priv; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org getVisualConfigs(psc, priv, screen); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org getFBConfigs(psc, priv, screen); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN void 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglx_screen_cleanup(struct glx_screen *psc) 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc->configs) { 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_config_destroy_list(psc->configs); 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc->effectiveGLXexts) 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(psc->effectiveGLXexts); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->configs = NULL; /* NOTE: just for paranoia */ 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc->visuals) { 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_config_destroy_list(psc->visuals); 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->visuals = NULL; /* NOTE: just for paranoia */ 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree((char *) psc->serverGLXexts); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Allocate the memory for the per screen configs for each screen. 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** If that works then fetch the per screen configs data. 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv) 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_screen *psc; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i, screens; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** First allocate memory for the array of per screen configs. 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screens = ScreenCount(dpy); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->screens = Xmalloc(screens * sizeof *priv->screens); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!priv->screens) 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->serverGLXversion = 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->serverGLXversion == NULL) { 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FreeScreenConfigs(priv); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < screens; i++, psc++) { 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = NULL; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->dri2Display) 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = (*priv->dri2Display->createScreen) (i, priv); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc == NULL && priv->driDisplay) 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = (*priv->driDisplay->createScreen) (i, priv); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc == NULL && priv->driswDisplay) 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = (*priv->driswDisplay->createScreen) (i, priv); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(GLX_USE_APPLEGL) 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc == NULL) 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = applegl_create_screen(i, priv); 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc == NULL) 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = indirect_create_screen(i, priv); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->screens[i] = psc; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Initialize the client side extension code. 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _X_HIDDEN struct glx_display * 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXInitialize(Display * dpy) 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *dpyPriv, *d; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Bool glx_direct, glx_accel; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XLockMutex(_Xglobal_lock); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (dpyPriv = glx_displays; dpyPriv; dpyPriv = dpyPriv->next) { 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpyPriv->dpy == dpy) { 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XUnlockMutex(_Xglobal_lock); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dpyPriv; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Drop the lock while we create the display private. */ 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XUnlockMutex(_Xglobal_lock); 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv = Xcalloc(1, sizeof *dpyPriv); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dpyPriv) 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->codes = XInitExtension(dpy, __glXExtensionName); 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dpyPriv->codes) { 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(dpyPriv); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XUnlockMutex(_Xglobal_lock); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->dpy = dpy; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->majorOpcode = dpyPriv->codes->major_opcode; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->serverGLXvendor = 0x0; 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->serverGLXversion = 0x0; 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See if the versions are compatible. This GLX implementation does not 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * work with servers that only support GLX 1.0. 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!QueryVersion(dpy, dpyPriv->majorOpcode, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dpyPriv->majorVersion, &dpyPriv->minorVersion) 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || (dpyPriv->majorVersion == 1 && dpyPriv->minorVersion < 1)) { 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(dpyPriv); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XUnlockMutex(_Xglobal_lock); 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < __GLX_NUMBER_EVENTS; i++) { 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XESetWireToEvent(dpy, dpyPriv->codes->first_event + i, __glXWireToEvent); 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XESetEventToWire(dpy, dpyPriv->codes->first_event + i, __glXEventToWire); 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XESetCloseDisplay(dpy, dpyPriv->codes->extension, __glXCloseDisplay); 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XESetErrorString (dpy, dpyPriv->codes->extension,__glXErrorString); 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->glXDrawHash = __glxHashCreate(); 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL); 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->drawHash = __glxHashCreate(); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Initialize the direct rendering per display data and functions. 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Note: This _must_ be done before calling any other DRI routines 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** (e.g., those called in AllocAndFetchScreenConfigs). 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (glx_direct && glx_accel) { 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->dri2Display = dri2CreateDisplay(dpy); 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->driDisplay = driCreateDisplay(dpy); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (glx_direct) 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->driswDisplay = driswCreateDisplay(dpy); 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!applegl_create_display(dpyPriv)) { 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(dpyPriv); 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) { 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(dpyPriv); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_XCB 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glX_send_client_info(dpyPriv); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXClientInfo(dpy, dpyPriv->majorOpcode); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Grab the lock again and add the dispay private, unless somebody 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * beat us to initializing on this display in the meantime. */ 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XLockMutex(_Xglobal_lock); 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (d = glx_displays; d; d = d->next) { 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (d->dpy == dpy) { 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XUnlockMutex(_Xglobal_lock); 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_display_free(dpyPriv); 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return d; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyPriv->next = glx_displays; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_displays = dpyPriv; 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XUnlockMutex(_Xglobal_lock); 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dpyPriv; 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Setup for sending a GLX command on dpy. Make sure the extension is 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** initialized. Try to avoid calling __glXInitialize as its kinda slow. 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN CARD8 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXSetupForCommand(Display * dpy) 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_context *gc; 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv; 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If this thread has a current context, flush its rendering commands */ 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc = __glXGetCurrentContext(); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gc->currentDpy) { 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Flush rendering buffer of the current context, if any */ 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) __glXFlushRenderBuffer(gc, gc->pc); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gc->currentDpy == dpy) { 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Use opcode from gc because its right */ 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return gc->majorOpcode; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Have to get info about argument dpy because it might be to 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** a different server 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Forced to lookup extension via the slow initialize route */ 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv = __glXInitialize(dpy); 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!priv) { 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return priv->majorOpcode; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flush the drawing command transport buffer. 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx Context whose transport buffer is to be flushed. 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param pc Pointer to first unused buffer location. 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Modify this function to use \c ctx->pc instead of the explicit 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c pc parameter. 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN GLubyte * 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXFlushRenderBuffer(struct glx_context * ctx, GLubyte * pc) 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display *const dpy = ctx->currentDpy; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_XCB 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_connection_t *c = XGetXCBConnection(dpy); 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXRenderReq *req; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* USE_XCB */ 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint size = pc - ctx->buf; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dpy != NULL) && (size > 0)) { 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_XCB 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_glx_render(c, ctx->currentContextTag, size, 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (const uint8_t *) ctx->buf); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Send the entire buffer as an X request */ 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXRender, req); 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = ctx->majorOpcode; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXRender; 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->contextTag = ctx->currentContextTag; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->length += (size + 3) >> 2; 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XSend(dpy, (char *) ctx->buf, size); 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Reset pointer and return it */ 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pc = ctx->buf; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->pc; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Send a portion of a GLXRenderLarge command to the server. The advantage of 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this function over \c __glXSendLargeCommand is that callers can use the 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * data buffer in the GLX context and may be able to avoid allocating an 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * extra buffer. The disadvantage is the clients will have to do more 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX protocol work (i.e., calculating \c totalRequests, etc.). 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa __glXSendLargeCommand 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param gc GLX context 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param requestNumber Which part of the whole command is this? The first 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * request is 1. 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param totalRequests How many requests will there be? 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param data Command data. 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dataLen Size, in bytes, of the command data. 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN void 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXSendLargeChunk(struct glx_context * gc, GLint requestNumber, 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint totalRequests, const GLvoid * data, GLint dataLen) 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display *dpy = gc->currentDpy; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_XCB 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_connection_t *c = XGetXCBConnection(dpy); 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_glx_render_large(c, gc->currentContextTag, requestNumber, 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org totalRequests, dataLen, data); 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXRenderLargeReq *req; 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (requestNumber == 1) { 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXRenderLarge, req); 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = gc->majorOpcode; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXRenderLarge; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->contextTag = gc->currentContextTag; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->length += (dataLen + 3) >> 2; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->requestNumber = requestNumber; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->requestTotal = totalRequests; 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->dataBytes = dataLen; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Data(dpy, data, dataLen); 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (requestNumber == totalRequests) { 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* USE_XCB */ 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Send a command that is too large for the GLXRender protocol request. 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Send a large command, one that is too large for some reason to 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * send using the GLXRender protocol request. One reason to send 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a large command is to avoid copying the data. 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GLX context 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param header Header data. 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param headerLen Size, in bytes, of the header data. It is assumed that 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the header data will always be small enough to fit in 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a single X protocol packet. 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param data Command data. 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dataLen Size, in bytes, of the command data. 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN void 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXSendLargeCommand(struct glx_context * ctx, 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid * header, GLint headerLen, 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid * data, GLint dataLen) 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint maxSize; 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint totalRequests, requestNumber; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Calculate the maximum amount of data can be stuffed into a single 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** packet. sz_xGLXRenderReq is added because bufSize is the maximum 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** packet size minus sz_xGLXRenderReq. 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = (ctx->bufSize + sz_xGLXRenderReq) - sz_xGLXRenderLargeReq; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org totalRequests = 1 + (dataLen / maxSize); 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dataLen % maxSize) 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org totalRequests++; 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Send all of the command, except the large array, as one request. 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(headerLen <= maxSize); 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendLargeChunk(ctx, 1, totalRequests, header, headerLen); 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Send enough requests until the whole array is sent. 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (requestNumber = 2; requestNumber <= (totalRequests - 1); 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org requestNumber++) { 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, maxSize); 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = (const GLvoid *) (((const GLubyte *) data) + maxSize); 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dataLen -= maxSize; 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dataLen > 0); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dataLen <= maxSize); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, dataLen); 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************/ 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN void 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXDumpDrawBuffer(struct glx_context * ctx) 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *p = ctx->buf; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *end = ctx->pc; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort opcode, length; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (p < end) { 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fetch opcode */ 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = *((GLushort *) p); 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org length = *((GLushort *) (p + 2)); 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("%2x: %5d: ", opcode, length); 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org length -= 4; 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p += 4; 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (length > 0) { 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("%08x ", *((unsigned *) p)); 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p += 4; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org length -= 4; 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("\n"); 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1133