1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (C) Copyright IBM Corporation 2004 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 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 * on the rights to use, copy, modify, merge, publish, distribute, sub 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file glx_pbuffer.c 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implementation of pbuffer related functions. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Ian Romanick <idr@us.ibm.com> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <inttypes.h> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxclient.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/extutil.h> 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/Xext.h> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxextensions.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <pthread.h> 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "apple_glx_drawable.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glx_error.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WARN_ONCE_GLX_1_3(a, b) { \ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static int warned=1; \ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(warned) { \ 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org warn_GLX_1_3((a), b ); \ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org warned=0; \ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit a warning when clients use GLX 1.3 functions on pre-1.3 systems. 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwarn_GLX_1_3(Display * dpy, const char *function_name) 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv = __glXInitialize(dpy); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (priv->minorVersion < 3) { 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "WARNING: Application calling GLX 1.3 function \"%s\" " 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "when GLX 1.3 is not supported! This is an application bug!\n", 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function_name); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GLX_USE_APPLEGL 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Change a drawable's attribute. 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is used to implement \c glXSelectEvent and 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c glXSelectEventSGIX. 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function dynamically determines whether to use the SGIX_pbuffer 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * version of the protocol or the GLX 1.3 version of the protocol. 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgChangeDrawableAttribute(Display * dpy, GLXDrawable drawable, 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const CARD32 * attribs, size_t num_attribs) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv = __glXInitialize(dpy); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __GLXDRIdrawable *pdraw; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD32 *output; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD8 opcode; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dpy == NULL) || (drawable == 0)) { 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = __glXSetupForCommand(dpy); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!opcode) 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXChangeDrawableAttributesReq *req; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXChangeDrawableAttributes, 8 * num_attribs, req); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output = (CARD32 *) (req + 1); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = opcode; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXChangeDrawableAttributes; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->drawable = drawable; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->numAttribs = (CARD32) num_attribs; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXVendorPrivateWithReplyReq *vpreq; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXVendorPrivateWithReply, 8 + (8 * num_attribs), vpreq); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output = (CARD32 *) (vpreq + 1); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->reqType = opcode; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->glxCode = X_GLXVendorPrivateWithReply; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->vendorCode = X_GLXvop_ChangeDrawableAttributesSGIX; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[0] = (CARD32) drawable; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[1] = num_attribs; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output += 2; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memcpy(output, attribs, sizeof(CARD32) * 2 * num_attribs); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pdraw = GetGLXDRIDrawable(dpy, drawable); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pdraw) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_attribs; i++) { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(attribs[i * 2]) { 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_EVENT_MASK: 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Keep a local copy for masking out DRI2 proto events as needed */ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pdraw->eventMask = attribs[i * 2 + 1]; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdetermineTextureTarget(const int *attribs, int numAttribs) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target = 0; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < numAttribs; i++) { 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) { 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attribs[2 * i + 1]) { 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TEXTURE_2D_EXT: 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GL_TEXTURE_2D; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TEXTURE_RECTANGLE_EXT: 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GL_TEXTURE_RECTANGLE_ARB; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return target; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdetermineTextureFormat(const int *attribs, int numAttribs) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < numAttribs; i++) { 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return attribs[2 * i + 1]; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCreateDRIDrawable(Display *dpy, struct glx_config *config, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XID drawable, XID glxdrawable, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *attrib_list, size_t num_attribs) 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *const priv = __glXInitialize(dpy); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __GLXDRIdrawable *pdraw; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_screen *psc; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc = priv->screens[config->screen]; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc->driScreen == NULL) 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pdraw = psc->driScreen->createDrawable(psc, drawable, 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glxdrawable, config); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pdraw == NULL) { 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "failed to create drawable\n"); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (__glxHashInsert(priv->drawHash, glxdrawable, pdraw)) { 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pdraw->destroyDrawable) (pdraw); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pdraw->textureTarget = determineTextureTarget(attrib_list, num_attribs); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pdraw->textureFormat = determineTextureFormat(attrib_list, num_attribs); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *const priv = __glXInitialize(dpy); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XID xid; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pdraw != NULL) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xid = pdraw->xDrawable; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pdraw->destroyDrawable) (pdraw); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glxHashDelete(priv->drawHash, drawable); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (destroy_xdrawable) 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XFreePixmap(priv->dpy, xid); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCreateDRIDrawable(Display *dpy, const struct glx_config * fbconfig, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XID drawable, XID glxdrawable, 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *attrib_list, size_t num_attribs) 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a drawable's attribute. 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is used to implement \c glXGetSelectedEvent and 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c glXGetSelectedEventSGIX. 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function dynamically determines whether to use the SGIX_pbuffer 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * version of the protocol or the GLX 1.3 version of the protocol. 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The number of attributes returned is likely to be small, probably less than 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 10. Given that, this routine should try to use an array on the stack to 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * capture the reply rather than always calling Xmalloc. 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGetDrawableAttribute(Display * dpy, GLXDrawable drawable, 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int attribute, unsigned int *value) 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXGetDrawableAttributesReply reply; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD32 *data; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD8 opcode; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int length; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int num_attributes; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean use_glx_1_3; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dpy == NULL) || (drawable == 0)) { 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv = __glXInitialize(dpy); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_glx_1_3 = ((priv->majorVersion > 1) || (priv->minorVersion >= 3)); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = 0; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = __glXSetupForCommand(dpy); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!opcode) 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_glx_1_3) { 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXGetDrawableAttributesReq *req; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXGetDrawableAttributes, req); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = opcode; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXGetDrawableAttributes; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->drawable = drawable; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXVendorPrivateWithReplyReq *vpreq; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXVendorPrivateWithReply, 4, vpreq); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = (CARD32 *) (vpreq + 1); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[0] = (CARD32) drawable; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->reqType = opcode; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->glxCode = X_GLXVendorPrivateWithReply; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->vendorCode = X_GLXvop_GetDrawableAttributesSGIX; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XReply(dpy, (xReply *) & reply, 0, False); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reply.type == X_Error) { 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org length = reply.length; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (length) { 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_attributes = (use_glx_1_3) ? reply.numAttribs : length / 2; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = (CARD32 *) Xmalloc(length * sizeof(CARD32)); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (data == NULL) { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Throw data on the floor */ 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XEatData(dpy, length); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XRead(dpy, (char *) data, length * sizeof(CARD32)); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Search the set of returned attributes for the attribute requested by 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the caller. 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_attributes; i++) { 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (data[i * 2] == attribute) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = data[(i * 2) + 1]; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pdraw != NULL && !pdraw->textureTarget) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pdraw->textureTarget = 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org determineTextureTarget((const int *) data, num_attributes); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pdraw != NULL && !pdraw->textureFormat) 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pdraw->textureFormat = 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org determineTextureFormat((const int *) data, num_attributes); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(data); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprotocolDestroyDrawable(Display *dpy, GLXDrawable drawable, CARD32 glxCode) 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXDestroyPbufferReq *req; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD8 opcode; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = __glXSetupForCommand(dpy); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!opcode) 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXDestroyPbuffer, req); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = opcode; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = glxCode; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->pbuffer = (GLXPbuffer) drawable; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a non-pbuffer GLX drawable. 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXDrawable 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCreateDrawable(Display *dpy, struct glx_config *config, 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Drawable drawable, const int *attrib_list, CARD8 glxCode) 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXCreateWindowReq *req; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_drawable *glxDraw; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD32 *data; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD8 opcode; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLXDrawable xid; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = 0; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrib_list) { 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (attrib_list[i * 2] != None) 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i++; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = __glXSetupForCommand(dpy); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!opcode) 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glxDraw = Xmalloc(sizeof(*glxDraw)); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!glxDraw) 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXCreateWindow, 8 * i, req); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = (CARD32 *) (req + 1); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = opcode; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = glxCode; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->screen = config->screen; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->fbconfig = config->fbconfigID; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->window = drawable; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxwindow = xid = XAllocID(dpy); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->numAttribs = i; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrib_list) 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(data, attrib_list, 8 * i); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (InitGLXDrawable(dpy, glxDraw, drawable, xid)) { 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(glxDraw); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!CreateDRIDrawable(dpy, config, drawable, xid, attrib_list, i)) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (glxCode == X_GLXCreatePixmap) 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glxCode = X_GLXDestroyPixmap; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glxCode = X_GLXDestroyWindow; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org protocolDestroyDrawable(dpy, xid, glxCode); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xid = None; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return xid; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy a non-pbuffer GLX drawable. 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDestroyDrawable(Display * dpy, GLXDrawable drawable, CARD32 glxCode) 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dpy == NULL) || (drawable == 0)) { 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org protocolDestroyDrawable(dpy, drawable, glxCode); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DestroyGLXDrawable(dpy, drawable); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DestroyDRIDrawable(dpy, drawable, GL_FALSE); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a pbuffer. 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is used to implement \c glXCreatePbuffer and 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c glXCreateGLXPbufferSGIX. 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function dynamically determines whether to use the SGIX_pbuffer 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * version of the protocol or the GLX 1.3 version of the protocol. 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXDrawable 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCreatePbuffer(Display * dpy, struct glx_config *config, 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int width, unsigned int height, 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *attrib_list, GLboolean size_in_attribs) 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv = __glXInitialize(dpy); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLXDrawable id = 0; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD32 *data; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD8 opcode; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Pixmap pixmap; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean glx_1_3 = GL_FALSE; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = 0; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrib_list) { 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (attrib_list[i * 2]) 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i++; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = __glXSetupForCommand(dpy); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!opcode) 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org id = XAllocID(dpy); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXCreatePbufferReq *req; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int extra = (size_in_attribs) ? 0 : 2; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glx_1_3 = GL_TRUE; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXCreatePbuffer, (8 * (i + extra)), req); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = (CARD32 *) (req + 1); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = opcode; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXCreatePbuffer; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->screen = config->screen; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->fbconfig = config->fbconfigID; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->pbuffer = id; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->numAttribs = i + extra; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!size_in_attribs) { 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[(2 * i) + 0] = GLX_PBUFFER_WIDTH; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[(2 * i) + 1] = width; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[(2 * i) + 2] = GLX_PBUFFER_HEIGHT; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[(2 * i) + 3] = height; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data += 4; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXVendorPrivateReq *vpreq; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXVendorPrivate, 20 + (8 * i), vpreq); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = (CARD32 *) (vpreq + 1); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->reqType = opcode; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->glxCode = X_GLXVendorPrivate; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->vendorCode = X_GLXvop_CreateGLXPbufferSGIX; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[0] = config->screen; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[1] = config->fbconfigID; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[2] = id; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[3] = width; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[4] = height; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data += 5; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memcpy(data, attrib_list, sizeof(CARD32) * 2 * i); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixmap = XCreatePixmap(dpy, RootWindow(dpy, config->screen), 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, config->rgbBits); 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!CreateDRIDrawable(dpy, config, pixmap, id, attrib_list, i)) { 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD32 o = glx_1_3 ? X_GLXDestroyPbuffer : X_GLXvop_DestroyGLXPbufferSGIX; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XFreePixmap(dpy, pixmap); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org protocolDestroyDrawable(dpy, id, o); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org id = None; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return id; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy a pbuffer. 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is used to implement \c glXDestroyPbuffer and 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c glXDestroyGLXPbufferSGIX. 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function dynamically determines whether to use the SGIX_pbuffer 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * version of the protocol or the GLX 1.3 version of the protocol. 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDestroyPbuffer(Display * dpy, GLXDrawable drawable) 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_display *priv = __glXInitialize(dpy); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD8 opcode; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dpy == NULL) || (drawable == 0)) { 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = __glXSetupForCommand(dpy); 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!opcode) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXDestroyPbufferReq *req; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReq(GLXDestroyPbuffer, req); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = opcode; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = X_GLXDestroyPbuffer; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->pbuffer = (GLXPbuffer) drawable; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXVendorPrivateWithReplyReq *vpreq; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD32 *data; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXVendorPrivateWithReply, 4, vpreq); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = (CARD32 *) (vpreq + 1); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[0] = (CARD32) drawable; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->reqType = opcode; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->glxCode = X_GLXVendorPrivateWithReply; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpreq->vendorCode = X_GLXvop_DestroyGLXPbufferSGIX; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnlockDisplay(dpy); 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SyncHandle(); 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DestroyDRIDrawable(dpy, drawable, GL_TRUE); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new pbuffer. 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT GLXPbufferSGIX 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXCreateGLXPbufferSGIX(Display * dpy, GLXFBConfigSGIX config, 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int width, unsigned int height, 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *attrib_list) 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (GLXPbufferSGIX) CreatePbuffer(dpy, (struct glx_config *) config, 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrib_list, GL_FALSE); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_USE_APPLEGL */ 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new pbuffer. 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT GLXPbuffer 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXCreatePbuffer(Display * dpy, GLXFBConfig config, const int *attrib_list) 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, width, height; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLXPbuffer result; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int errorcode; 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = 0; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = 0; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN_ONCE_GLX_1_3(dpy, __func__); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; attrib_list[i]; ++i) { 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attrib_list[i]) { 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_PBUFFER_WIDTH: 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = attrib_list[i + 1]; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++i; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_PBUFFER_HEIGHT: 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = attrib_list[i + 1]; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++i; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_LARGEST_PBUFFER: 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is a hint we should probably handle, but how? */ 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++i; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_PRESERVED_CONTENTS: 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The contents are always preserved with AppleSGLX with CGL. */ 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++i; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pbuffer_create(dpy, config, width, height, &errorcode, 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &result)) { 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * apple_glx_pbuffer_create only sets the errorcode to core X11 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * errors. 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendError(dpy, errorcode, 0, X_GLXCreatePbuffer, true); 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return result; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; attrib_list[i * 2]; i++) { 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attrib_list[i * 2]) { 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_PBUFFER_WIDTH: 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = attrib_list[i * 2 + 1]; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_PBUFFER_HEIGHT: 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = attrib_list[i * 2 + 1]; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (GLXPbuffer) CreatePbuffer(dpy, (struct glx_config *) config, 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, attrib_list, GL_TRUE); 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy an existing pbuffer. 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT void 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXDestroyPbuffer(Display * dpy, GLXPbuffer pbuf) 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pbuffer_destroy(dpy, pbuf)) { 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendError(dpy, GLXBadPbuffer, pbuf, X_GLXDestroyPbuffer, false); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DestroyPbuffer(dpy, pbuf); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Query an attribute of a drawable. 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT void 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXQueryDrawable(Display * dpy, GLXDrawable drawable, 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int attribute, unsigned int *value) 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN_ONCE_GLX_1_3(dpy, __func__); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Window root; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x, y; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int width, height, bd, depth; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pixmap_query(drawable, attribute, value)) 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /*done */ 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pbuffer_query(drawable, attribute, value)) 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /*done */ 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The OpenGL spec states that we should report GLXBadDrawable if 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the drawable is invalid, however doing so would require that we 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use XSetErrorHandler(), which is known to not be thread safe. 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we use a round-trip call to validate the drawable, there could 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be a race, so instead we just opt in favor of letting the 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XGetGeometry request fail with a GetGeometry request X error 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rather than GLXBadDrawable, in what is hoped to be a rare 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * case of an invalid drawable. In practice most and possibly all 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X11 apps using GLX shouldn't notice a difference. 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (XGetGeometry 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dpy, drawable, &root, &x, &y, &width, &height, &bd, &depth)) { 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attribute) { 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_WIDTH: 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = width; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_HEIGHT: 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = height; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetDrawableAttribute(dpy, drawable, attribute, value); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GLX_USE_APPLEGL 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Query an attribute of a pbuffer. 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT int 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX drawable, 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int attribute, unsigned int *value) 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GetDrawableAttribute(dpy, drawable, attribute, value); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Select the event mask for a drawable. 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT void 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXSelectEvent(Display * dpy, GLXDrawable drawable, unsigned long mask) 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XWindowAttributes xwattr; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pbuffer_set_event_mask(drawable, mask)) 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /*done */ 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The spec allows a window, but currently there are no valid 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * events for a window, so do nothing. 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (XGetWindowAttributes(dpy, drawable, &xwattr)) 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /*done */ 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The drawable seems to be invalid. Report an error. */ 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendError(dpy, GLXBadDrawable, drawable, 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org X_GLXChangeDrawableAttributes, false); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CARD32 attribs[2]; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs[0] = (CARD32) GLX_EVENT_MASK; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attribs[1] = (CARD32) mask; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ChangeDrawableAttribute(dpy, drawable, attribs, 1); 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the selected event mask for a drawable. 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT void 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXGetSelectedEvent(Display * dpy, GLXDrawable drawable, unsigned long *mask) 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XWindowAttributes xwattr; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pbuffer_get_event_mask(drawable, mask)) 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /*done */ 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The spec allows a window, but currently there are no valid 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * events for a window, so do nothing, but set the mask to 0. 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (XGetWindowAttributes(dpy, drawable, &xwattr)) { 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The window is valid, so set the mask to 0. */ 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *mask = 0; 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /*done */ 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The drawable seems to be invalid. Report an error. */ 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendError(dpy, GLXBadDrawable, drawable, X_GLXGetDrawableAttributes, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org true); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int value; 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The non-sense with value is required because on LP64 platforms 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sizeof(unsigned int) != sizeof(unsigned long). On little-endian 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we could just type-cast the pointer, but why? 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetDrawableAttribute(dpy, drawable, GLX_EVENT_MASK_SGIX, &value); 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *mask = value; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT GLXPixmap 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXCreatePixmap(Display * dpy, GLXFBConfig config, Pixmap pixmap, 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *attrib_list) 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN_ONCE_GLX_1_3(dpy, __func__); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct glx_config *modes = (const struct glx_config *) config; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pixmap_create(dpy, modes->screen, pixmap, modes)) 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pixmap; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CreateDrawable(dpy, (struct glx_config *) config, 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Drawable) pixmap, attrib_list, X_GLXCreatePixmap); 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT GLXWindow 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXCreateWindow(Display * dpy, GLXFBConfig config, Window win, 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *attrib_list) 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN_ONCE_GLX_1_3(dpy, __func__); 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XWindowAttributes xwattr; 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVisualInfo *visinfo; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) attrib_list; /*unused according to GLX 1.4 */ 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XGetWindowAttributes(dpy, win, &xwattr); 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org visinfo = glXGetVisualFromFBConfig(dpy, config); 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (NULL == visinfo) { 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendError(dpy, GLXBadFBConfig, 0, X_GLXCreateWindow, false); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (visinfo->visualid != XVisualIDFromVisual(xwattr.visual)) { 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendError(dpy, BadMatch, 0, X_GLXCreateWindow, true); 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XFree(visinfo); 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return win; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CreateDrawable(dpy, (struct glx_config *) config, 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Drawable) win, attrib_list, X_GLXCreateWindow); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT void 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXDestroyPixmap(Display * dpy, GLXPixmap pixmap) 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN_ONCE_GLX_1_3(dpy, __func__); 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_USE_APPLEGL 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apple_glx_pixmap_destroy(dpy, pixmap)) 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSendError(dpy, GLXBadPixmap, pixmap, X_GLXDestroyPixmap, false); 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DestroyDrawable(dpy, (GLXDrawable) pixmap, X_GLXDestroyPixmap); 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT void 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglXDestroyWindow(Display * dpy, GLXWindow win) 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN_ONCE_GLX_1_3(dpy, __func__); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GLX_USE_APPLEGL 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DestroyDrawable(dpy, (GLXDrawable) win, X_GLXDestroyWindow); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GLX_USE_APPLEGL 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLX_ALIAS_VOID(glXDestroyGLXPbufferSGIX, 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Display * dpy, GLXPbufferSGIX pbuf), 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dpy, pbuf), glXDestroyPbuffer) 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLX_ALIAS_VOID(glXSelectEventSGIX, 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Display * dpy, GLXDrawable drawable, 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long mask), (dpy, drawable, mask), glXSelectEvent) 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_EXPORT 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLX_ALIAS_VOID(glXGetSelectedEventSGIX, 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (Display * dpy, GLXDrawable drawable, 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long *mask), (dpy, drawable, mask), 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glXGetSelectedEvent) 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 959