1cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 2cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * (C) Copyright IBM Corporation 2004 3cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * All Rights Reserved. 4cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 5cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Permission is hereby granted, free of charge, to any person obtaining a 6cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * copy of this software and associated documentation files (the "Software"), 7cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * to deal in the Software without restriction, including without limitation 8cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * on the rights to use, copy, modify, merge, publish, distribute, sub 9cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * license, and/or sell copies of the Software, and to permit persons to whom 10cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the Software is furnished to do so, subject to the following conditions: 11cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 12cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * The above copyright notice and this permission notice (including the next 13cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * paragraph) shall be included in all copies or substantial portions of the 14cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Software. 15cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 16cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * DEALINGS IN THE SOFTWARE. 23cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 24cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 25cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 26cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \file glx_pbuffer.c 27cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Implementation of pbuffer related functions. 280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 29cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \author Ian Romanick <idr@us.ibm.com> 30cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 31cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 32cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <inttypes.h> 33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "glxclient.h" 3482dfd4b71f932f46e116743b204d0077a0875ab8Brian Paul#include <X11/extensions/extutil.h> 3582dfd4b71f932f46e116743b204d0077a0875ab8Brian Paul#include <X11/extensions/Xext.h> 36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <assert.h> 37cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <string.h> 38cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "glxextensions.h" 39cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 40ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 41ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <pthread.h> 42ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx_drawable.h" 43ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "glx_error.h" 44ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 45ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 46e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden#define WARN_ONCE_GLX_1_3(a, b) { \ 47e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden static int warned=1; \ 48e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden if(warned) { \ 49e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden warn_GLX_1_3((a), b ); \ 50e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden warned=0; \ 51e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden } \ 52e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden } 53cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 54cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 551f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick * Emit a warning when clients use GLX 1.3 functions on pre-1.3 systems. 561f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick */ 571f309c40b8065b8729fce631540c66e4b50b84dfIan Romanickstatic void 58ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonwarn_GLX_1_3(Display * dpy, const char *function_name) 591f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick{ 60c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv = __glXInitialize(dpy); 611f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick 621f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick if (priv->minorVersion < 3) { 63ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston fprintf(stderr, 64ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston "WARNING: Application calling GLX 1.3 function \"%s\" " 65ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston "when GLX 1.3 is not supported! This is an application bug!\n", 66ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston function_name); 671f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick } 681f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick} 691f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick 70ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL 711f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick/** 72cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Change a drawable's attribute. 73cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 74cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function is used to implement \c glXSelectEvent and 75cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXSelectEventSGIX. 76cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 77cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \note 78cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function dynamically determines whether to use the SGIX_pbuffer 79cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * version of the protocol or the GLX 1.3 version of the protocol. 80cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 81cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void 822d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófChangeDrawableAttribute(Display * dpy, GLXDrawable drawable, 832d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf const CARD32 * attribs, size_t num_attribs) 84cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 85c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv = __glXInitialize(dpy); 86ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#ifdef GLX_DIRECT_RENDERING 875c9e54f2ff2eb651b5bf594ac95d39ba5747c500Vinson Lee __GLXDRIdrawable *pdraw; 88ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#endif 892d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf CARD32 *output; 90c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg CARD8 opcode; 91f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler int i; 92cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 932d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if ((dpy == NULL) || (drawable == 0)) { 94cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return; 95cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 96cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 97c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg opcode = __glXSetupForCommand(dpy); 98c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg if (!opcode) 99c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg return; 100cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 101cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson LockDisplay(dpy); 102cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1032d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 104cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xGLXChangeDrawableAttributesReq *req; 105cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1064324d6fdfbba17e66b476cf008713d26cac83ad1Julien Cristau GetReqExtra(GLXChangeDrawableAttributes, 8 * num_attribs, req); 107cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson output = (CARD32 *) (req + 1); 108cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 109c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg req->reqType = opcode; 110cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson req->glxCode = X_GLXChangeDrawableAttributes; 111cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson req->drawable = drawable; 112cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson req->numAttribs = (CARD32) num_attribs; 113cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 114cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson else { 115cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xGLXVendorPrivateWithReplyReq *vpreq; 116cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 117e27913f805acbb7d00f83ba625a8605576738a13Julien Cristau GetReqExtra(GLXVendorPrivateWithReply, 8 + (8 * num_attribs), vpreq); 118cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson output = (CARD32 *) (vpreq + 1); 119cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 120c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg vpreq->reqType = opcode; 121cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vpreq->glxCode = X_GLXVendorPrivateWithReply; 122cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vpreq->vendorCode = X_GLXvop_ChangeDrawableAttributesSGIX; 123cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 124cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson output[0] = (CARD32) drawable; 125e27913f805acbb7d00f83ba625a8605576738a13Julien Cristau output[1] = num_attribs; 126e27913f805acbb7d00f83ba625a8605576738a13Julien Cristau output += 2; 127cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 128cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1292d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (void) memcpy(output, attribs, sizeof(CARD32) * 2 * num_attribs); 130cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 131cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson UnlockDisplay(dpy); 132cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson SyncHandle(); 133cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 134ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#ifdef GLX_DIRECT_RENDERING 135ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY pdraw = GetGLXDRIDrawable(dpy, drawable); 136ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY 1376ae9e8cbabdc8a18a821ea3f716b18b3eb82a495Jesse Barnes if (!pdraw) 1386ae9e8cbabdc8a18a821ea3f716b18b3eb82a495Jesse Barnes return; 1396ae9e8cbabdc8a18a821ea3f716b18b3eb82a495Jesse Barnes 140f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler for (i = 0; i < num_attribs; i++) { 141f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler switch(attribs[i * 2]) { 142f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler case GLX_EVENT_MASK: 143f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler /* Keep a local copy for masking out DRI2 proto events as needed */ 144f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler pdraw->eventMask = attribs[i * 2 + 1]; 145f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler break; 146f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler } 147f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler } 148ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#endif 149f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler 150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return; 151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 15423635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer#ifdef GLX_DIRECT_RENDERING 15523635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzerstatic GLenum 15623635510e3333ea8056311afa741c5e6d7c9ec15Michel DänzerdetermineTextureTarget(const int *attribs, int numAttribs) 15723635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer{ 1582d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf GLenum target = 0; 1592d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf int i; 1602d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf 1612d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf for (i = 0; i < numAttribs; i++) { 1622d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) { 1632d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf switch (attribs[2 * i + 1]) { 1642d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf case GLX_TEXTURE_2D_EXT: 1652d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf target = GL_TEXTURE_2D; 1662d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf break; 1672d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf case GLX_TEXTURE_RECTANGLE_EXT: 1682d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf target = GL_TEXTURE_RECTANGLE_ARB; 1692d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf break; 1702d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 1712d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 1722d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 1732d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf 1742d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf return target; 17523635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer} 17666175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt 17766175aac7609ad314f25fbdff0d3958af310dc24Eric Anholtstatic GLenum 17866175aac7609ad314f25fbdff0d3958af310dc24Eric AnholtdetermineTextureFormat(const int *attribs, int numAttribs) 17966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt{ 18066175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt int i; 18166175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt 18266175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt for (i = 0; i < numAttribs; i++) { 18366175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT) 1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return attribs[2 * i + 1]; 18566175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt } 18666175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt 18766175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt return 0; 18866175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt} 1895a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 1904833104718677caad0027d5e7539ca9bba389392Adam Jacksonstatic GLboolean 1916ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergCreateDRIDrawable(Display *dpy, struct glx_config *config, 1925a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg XID drawable, XID glxdrawable, 1935a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg const int *attrib_list, size_t num_attribs) 1945a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg{ 195c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *const priv = __glXInitialize(dpy); 1965a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg __GLXDRIdrawable *pdraw; 19766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen *psc; 1985a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 19966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg psc = priv->screens[config->screen]; 2005a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg if (psc->driScreen == NULL) 2014833104718677caad0027d5e7539ca9bba389392Adam Jackson return GL_TRUE; 2025a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 2035a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg pdraw = psc->driScreen->createDrawable(psc, drawable, 2046ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg glxdrawable, config); 2055a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg if (pdraw == NULL) { 2065a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg fprintf(stderr, "failed to create drawable\n"); 2074833104718677caad0027d5e7539ca9bba389392Adam Jackson return GL_FALSE; 2085a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg } 2095a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 210e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg if (__glxHashInsert(priv->drawHash, glxdrawable, pdraw)) { 2115a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg (*pdraw->destroyDrawable) (pdraw); 2124833104718677caad0027d5e7539ca9bba389392Adam Jackson return GL_FALSE; 2135a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg } 2145a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 2155a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg pdraw->textureTarget = determineTextureTarget(attrib_list, num_attribs); 2165a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg pdraw->textureFormat = determineTextureFormat(attrib_list, num_attribs); 2174833104718677caad0027d5e7539ca9bba389392Adam Jackson 2184833104718677caad0027d5e7539ca9bba389392Adam Jackson return GL_TRUE; 2195a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg} 2205a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 2215a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsbergstatic void 2225a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian HøgsbergDestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) 2235a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg{ 224c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *const priv = __glXInitialize(dpy); 225eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable); 22680e48ddcf6d5bdc1fc063f28b7af478dae330233Kristian Høgsberg XID xid; 2275a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 2285a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg if (pdraw != NULL) { 22980e48ddcf6d5bdc1fc063f28b7af478dae330233Kristian Høgsberg xid = pdraw->xDrawable; 2305a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg (*pdraw->destroyDrawable) (pdraw); 231e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg __glxHashDelete(priv->drawHash, drawable); 232d8ab9aac54c3b6e4d97016172527d4b7c85b27a2Kristian Høgsberg if (destroy_xdrawable) 23380e48ddcf6d5bdc1fc063f28b7af478dae330233Kristian Høgsberg XFreePixmap(priv->dpy, xid); 2345a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg } 2355a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg} 2365a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 2375a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg#else 2385a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 2394833104718677caad0027d5e7539ca9bba389392Adam Jacksonstatic GLboolean 2406ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergCreateDRIDrawable(Display *dpy, const struct glx_config * fbconfig, 2415a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg XID drawable, XID glxdrawable, 2425a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg const int *attrib_list, size_t num_attribs) 2435a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg{ 2444833104718677caad0027d5e7539ca9bba389392Adam Jackson return GL_FALSE; 2455a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg} 2465a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 2475a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsbergstatic void 2485a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian HøgsbergDestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) 2495a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg{ 2505a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg} 2515a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 25223635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer#endif 25323635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer 254cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 255cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get a drawable's attribute. 256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function is used to implement \c glXGetSelectedEvent and 258cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetSelectedEventSGIX. 259cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 260cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \note 261cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function dynamically determines whether to use the SGIX_pbuffer 262cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * version of the protocol or the GLX 1.3 version of the protocol. 263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 264cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo 265cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * The number of attributes returned is likely to be small, probably less than 266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 10. Given that, this routine should try to use an array on the stack to 267cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * capture the reply rather than always calling Xmalloc. 268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int 2702d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófGetDrawableAttribute(Display * dpy, GLXDrawable drawable, 2712d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf int attribute, unsigned int *value) 272cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 273c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv; 274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xGLXGetDrawableAttributesReply reply; 2752d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf CARD32 *data; 276c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg CARD8 opcode; 277cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson unsigned int length; 278cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson unsigned int i; 279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson unsigned int num_attributes; 280b4866f8a5229d4769a49b4c54a1675a61497d206Owain G. Ainsworth GLboolean use_glx_1_3; 281d25ad506f2c2ce28e7d01b8d3f31c1863ef15d63Adam Jackson 2822d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if ((dpy == NULL) || (drawable == 0)) { 283d25ad506f2c2ce28e7d01b8d3f31c1863ef15d63Adam Jackson return 0; 284d25ad506f2c2ce28e7d01b8d3f31c1863ef15d63Adam Jackson } 285d25ad506f2c2ce28e7d01b8d3f31c1863ef15d63Adam Jackson 286d25ad506f2c2ce28e7d01b8d3f31c1863ef15d63Adam Jackson priv = __glXInitialize(dpy); 287b4866f8a5229d4769a49b4c54a1675a61497d206Owain G. Ainsworth use_glx_1_3 = ((priv->majorVersion > 1) || (priv->minorVersion >= 3)); 288cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 28942725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul *value = 0; 290cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 291cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 292c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg opcode = __glXSetupForCommand(dpy); 293c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg if (!opcode) 294c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg return 0; 295c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg 296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson LockDisplay(dpy); 297cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2982d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (use_glx_1_3) { 299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xGLXGetDrawableAttributesReq *req; 300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3014324d6fdfbba17e66b476cf008713d26cac83ad1Julien Cristau GetReq(GLXGetDrawableAttributes, req); 302c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg req->reqType = opcode; 303cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson req->glxCode = X_GLXGetDrawableAttributes; 304cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson req->drawable = drawable; 305cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 306cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson else { 307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xGLXVendorPrivateWithReplyReq *vpreq; 308cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3092d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf GetReqExtra(GLXVendorPrivateWithReply, 4, vpreq); 310cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson data = (CARD32 *) (vpreq + 1); 311cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson data[0] = (CARD32) drawable; 312cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 313c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg vpreq->reqType = opcode; 314cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vpreq->glxCode = X_GLXVendorPrivateWithReply; 315cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vpreq->vendorCode = X_GLXvop_GetDrawableAttributesSGIX; 316cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 317cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3182d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf _XReply(dpy, (xReply *) & reply, 0, False); 319cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3202d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (reply.type == X_Error) { 3212d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf UnlockDisplay(dpy); 3222d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf SyncHandle(); 3232d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf return 0; 32442725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul } 32542725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul 326cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson length = reply.length; 3272d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (length) { 3282d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf num_attributes = (use_glx_1_3) ? reply.numAttribs : length / 2; 3292d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf data = (CARD32 *) Xmalloc(length * sizeof(CARD32)); 3302d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (data == NULL) { 3312d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf /* Throw data on the floor */ 3322d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf _XEatData(dpy, length); 3332d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 3342d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf else { 3352d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf _XRead(dpy, (char *) data, length * sizeof(CARD32)); 3362d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf 3372d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf /* Search the set of returned attributes for the attribute requested by 3382d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf * the caller. 3392d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf */ 3402d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf for (i = 0; i < num_attributes; i++) { 3412d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (data[i * 2] == attribute) { 3422d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf *value = data[(i * 2) + 1]; 3432d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf break; 3442d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 3452d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 34642725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul 34780b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 3482d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf { 349eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable); 35023635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer 3512d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (pdraw != NULL && !pdraw->textureTarget) 3522d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf pdraw->textureTarget = 3532d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf determineTextureTarget((const int *) data, num_attributes); 35466175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt if (pdraw != NULL && !pdraw->textureFormat) 35566175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt pdraw->textureFormat = 35666175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt determineTextureFormat((const int *) data, num_attributes); 3572d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 35823635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer#endif 35923635510e3333ea8056311afa741c5e6d7c9ec15Michel Dänzer 3602d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf Xfree(data); 3612d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf } 362cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 363cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 364cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson UnlockDisplay(dpy); 365cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson SyncHandle(); 366cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 367cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return 0; 368cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 369cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3704833104718677caad0027d5e7539ca9bba389392Adam Jacksonstatic void 3714833104718677caad0027d5e7539ca9bba389392Adam JacksonprotocolDestroyDrawable(Display *dpy, GLXDrawable drawable, CARD32 glxCode) 3724833104718677caad0027d5e7539ca9bba389392Adam Jackson{ 3734833104718677caad0027d5e7539ca9bba389392Adam Jackson xGLXDestroyPbufferReq *req; 3744833104718677caad0027d5e7539ca9bba389392Adam Jackson CARD8 opcode; 3754833104718677caad0027d5e7539ca9bba389392Adam Jackson 3764833104718677caad0027d5e7539ca9bba389392Adam Jackson opcode = __glXSetupForCommand(dpy); 3774833104718677caad0027d5e7539ca9bba389392Adam Jackson if (!opcode) 3784833104718677caad0027d5e7539ca9bba389392Adam Jackson return; 3794833104718677caad0027d5e7539ca9bba389392Adam Jackson 3804833104718677caad0027d5e7539ca9bba389392Adam Jackson LockDisplay(dpy); 3814833104718677caad0027d5e7539ca9bba389392Adam Jackson 3824833104718677caad0027d5e7539ca9bba389392Adam Jackson GetReq(GLXDestroyPbuffer, req); 3834833104718677caad0027d5e7539ca9bba389392Adam Jackson req->reqType = opcode; 3844833104718677caad0027d5e7539ca9bba389392Adam Jackson req->glxCode = glxCode; 3854833104718677caad0027d5e7539ca9bba389392Adam Jackson req->pbuffer = (GLXPbuffer) drawable; 3864833104718677caad0027d5e7539ca9bba389392Adam Jackson 3874833104718677caad0027d5e7539ca9bba389392Adam Jackson UnlockDisplay(dpy); 3884833104718677caad0027d5e7539ca9bba389392Adam Jackson SyncHandle(); 3894833104718677caad0027d5e7539ca9bba389392Adam Jackson} 3904833104718677caad0027d5e7539ca9bba389392Adam Jackson 391cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 392cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Create a non-pbuffer GLX drawable. 393cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 394cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic GLXDrawable 3956ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergCreateDrawable(Display *dpy, struct glx_config *config, 3962d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf Drawable drawable, const int *attrib_list, CARD8 glxCode) 397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 3982d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf xGLXCreateWindowReq *req; 3994df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes struct glx_drawable *glxDraw; 4002d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf CARD32 *data; 401b47731f24db2e4c99073b107050376addf636c98Ian Romanick unsigned int i; 402342d1de38c25c70f98783a8adc27b2acca2b84abDavid Reveman CARD8 opcode; 403a95ec18549b677b5e9912ca9e2c92df5cfef3b4eAdam Jackson GLXDrawable xid; 404cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 405b47731f24db2e4c99073b107050376addf636c98Ian Romanick i = 0; 406b47731f24db2e4c99073b107050376addf636c98Ian Romanick if (attrib_list) { 4072d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf while (attrib_list[i * 2] != None) 4082d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf i++; 409b47731f24db2e4c99073b107050376addf636c98Ian Romanick } 410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 411c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg opcode = __glXSetupForCommand(dpy); 412c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg if (!opcode) 413c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg return None; 414342d1de38c25c70f98783a8adc27b2acca2b84abDavid Reveman 4154df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes glxDraw = Xmalloc(sizeof(*glxDraw)); 4164df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes if (!glxDraw) 4174df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes return None; 4184df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 419cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson LockDisplay(dpy); 4202d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf GetReqExtra(GLXCreateWindow, 8 * i, req); 421cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson data = (CARD32 *) (req + 1); 422cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 423342d1de38c25c70f98783a8adc27b2acca2b84abDavid Reveman req->reqType = opcode; 424cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson req->glxCode = glxCode; 4256ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->screen = config->screen; 4266ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->fbconfig = config->fbconfigID; 4276ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->window = drawable; 428a95ec18549b677b5e9912ca9e2c92df5cfef3b4eAdam Jackson req->glxwindow = xid = XAllocID(dpy); 4296ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->numAttribs = i; 430cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 4315f40a7aed12500fd6792e2453f495555c3b5c54dBrian Paul if (attrib_list) 4325f40a7aed12500fd6792e2453f495555c3b5c54dBrian Paul memcpy(data, attrib_list, 8 * i); 4332d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf 434cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson UnlockDisplay(dpy); 435cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson SyncHandle(); 4362d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf 4374df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes if (InitGLXDrawable(dpy, glxDraw, drawable, xid)) { 4384df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes free(glxDraw); 4394df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes return None; 4404df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes } 4414df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 4424833104718677caad0027d5e7539ca9bba389392Adam Jackson if (!CreateDRIDrawable(dpy, config, drawable, xid, attrib_list, i)) { 4434833104718677caad0027d5e7539ca9bba389392Adam Jackson if (glxCode == X_GLXCreatePixmap) 4444833104718677caad0027d5e7539ca9bba389392Adam Jackson glxCode = X_GLXDestroyPixmap; 4454833104718677caad0027d5e7539ca9bba389392Adam Jackson else 4464833104718677caad0027d5e7539ca9bba389392Adam Jackson glxCode = X_GLXDestroyWindow; 4474833104718677caad0027d5e7539ca9bba389392Adam Jackson protocolDestroyDrawable(dpy, xid, glxCode); 4484833104718677caad0027d5e7539ca9bba389392Adam Jackson xid = None; 4494833104718677caad0027d5e7539ca9bba389392Adam Jackson } 450e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 451a95ec18549b677b5e9912ca9e2c92df5cfef3b4eAdam Jackson return xid; 452cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 453cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 454cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 455cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 456cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Destroy a non-pbuffer GLX drawable. 457cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 458cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void 4592d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófDestroyDrawable(Display * dpy, GLXDrawable drawable, CARD32 glxCode) 460cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 4612d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if ((dpy == NULL) || (drawable == 0)) { 462cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return; 463cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 464cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 4654833104718677caad0027d5e7539ca9bba389392Adam Jackson protocolDestroyDrawable(dpy, drawable, glxCode); 466cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 4674df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes DestroyGLXDrawable(dpy, drawable); 4685a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg DestroyDRIDrawable(dpy, drawable, GL_FALSE); 469e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 470cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return; 471cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 472cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 473cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 474cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 475cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Create a pbuffer. 476cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 477cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function is used to implement \c glXCreatePbuffer and 478cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXCreateGLXPbufferSGIX. 479cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 480cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \note 481cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function dynamically determines whether to use the SGIX_pbuffer 482cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * version of the protocol or the GLX 1.3 version of the protocol. 483cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 484cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic GLXDrawable 4856ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergCreatePbuffer(Display * dpy, struct glx_config *config, 4862d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf unsigned int width, unsigned int height, 4872d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf const int *attrib_list, GLboolean size_in_attribs) 488cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 489c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv = __glXInitialize(dpy); 490cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson GLXDrawable id = 0; 4912d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf CARD32 *data; 492c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg CARD8 opcode; 4932d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf unsigned int i; 4945a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg Pixmap pixmap; 4954833104718677caad0027d5e7539ca9bba389392Adam Jackson GLboolean glx_1_3 = GL_FALSE; 496cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 497b47731f24db2e4c99073b107050376addf636c98Ian Romanick i = 0; 498b47731f24db2e4c99073b107050376addf636c98Ian Romanick if (attrib_list) { 4992d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf while (attrib_list[i * 2]) 5002d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf i++; 501b47731f24db2e4c99073b107050376addf636c98Ian Romanick } 502cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 503c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg opcode = __glXSetupForCommand(dpy); 504c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg if (!opcode) 505c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg return None; 506c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg 507cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson LockDisplay(dpy); 508cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson id = XAllocID(dpy); 509cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5102d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 5112d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf xGLXCreatePbufferReq *req; 512cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson unsigned int extra = (size_in_attribs) ? 0 : 2; 513cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5144833104718677caad0027d5e7539ca9bba389392Adam Jackson glx_1_3 = GL_TRUE; 5154833104718677caad0027d5e7539ca9bba389392Adam Jackson 5162d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf GetReqExtra(GLXCreatePbuffer, (8 * (i + extra)), req); 517cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson data = (CARD32 *) (req + 1); 518cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 519c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg req->reqType = opcode; 520cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson req->glxCode = X_GLXCreatePbuffer; 5216ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->screen = config->screen; 5226ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->fbconfig = config->fbconfigID; 5236ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->pbuffer = id; 5246ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg req->numAttribs = i + extra; 525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5262d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf if (!size_in_attribs) { 5272d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf data[(2 * i) + 0] = GLX_PBUFFER_WIDTH; 5282d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf data[(2 * i) + 1] = width; 5292d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf data[(2 * i) + 2] = GLX_PBUFFER_HEIGHT; 5302d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf data[(2 * i) + 3] = height; 5312d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf data += 4; 532cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 533cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 534cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson else { 535cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xGLXVendorPrivateReq *vpreq; 536cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5372d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf GetReqExtra(GLXVendorPrivate, 20 + (8 * i), vpreq); 538cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson data = (CARD32 *) (vpreq + 1); 539cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 540c25eb99f95eec9f905a603079603fc6d4252575aKristian Høgsberg vpreq->reqType = opcode; 541cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vpreq->glxCode = X_GLXVendorPrivate; 542cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vpreq->vendorCode = X_GLXvop_CreateGLXPbufferSGIX; 543cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5446ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg data[0] = config->screen; 5456ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg data[1] = config->fbconfigID; 5466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg data[2] = id; 5476ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg data[3] = width; 5486ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg data[4] = height; 549cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson data += 5; 550cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 551cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5522d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (void) memcpy(data, attrib_list, sizeof(CARD32) * 2 * i); 553cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 554cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson UnlockDisplay(dpy); 555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson SyncHandle(); 556cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg pixmap = XCreatePixmap(dpy, RootWindow(dpy, config->screen), 5586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg width, height, config->rgbBits); 5595a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 5604833104718677caad0027d5e7539ca9bba389392Adam Jackson if (!CreateDRIDrawable(dpy, config, pixmap, id, attrib_list, i)) { 5614833104718677caad0027d5e7539ca9bba389392Adam Jackson CARD32 o = glx_1_3 ? X_GLXDestroyPbuffer : X_GLXvop_DestroyGLXPbufferSGIX; 5624833104718677caad0027d5e7539ca9bba389392Adam Jackson XFreePixmap(dpy, pixmap); 5634833104718677caad0027d5e7539ca9bba389392Adam Jackson protocolDestroyDrawable(dpy, id, o); 5644833104718677caad0027d5e7539ca9bba389392Adam Jackson id = None; 5654833104718677caad0027d5e7539ca9bba389392Adam Jackson } 5665a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return id; 568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 569cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5705a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg/** 5715a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * Destroy a pbuffer. 5725a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * 5735a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * This function is used to implement \c glXDestroyPbuffer and 5745a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * \c glXDestroyGLXPbufferSGIX. 5755a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * 5765a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * \note 5775a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * This function dynamically determines whether to use the SGIX_pbuffer 5785a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg * version of the protocol or the GLX 1.3 version of the protocol. 5795a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg */ 5805a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsbergstatic void 5815a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian HøgsbergDestroyPbuffer(Display * dpy, GLXDrawable drawable) 5825a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg{ 583c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv = __glXInitialize(dpy); 5845a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg CARD8 opcode; 5855a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 5865a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg if ((dpy == NULL) || (drawable == 0)) { 5875a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg return; 5885a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg } 5895a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 5905a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg opcode = __glXSetupForCommand(dpy); 5915a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg if (!opcode) 5925a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg return; 5935a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 5945a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg LockDisplay(dpy); 5955a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 5965a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 5975a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg xGLXDestroyPbufferReq *req; 5985a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 5995a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg GetReq(GLXDestroyPbuffer, req); 6005a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg req->reqType = opcode; 6015a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg req->glxCode = X_GLXDestroyPbuffer; 6025a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg req->pbuffer = (GLXPbuffer) drawable; 6035a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg } 6045a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg else { 6055a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg xGLXVendorPrivateWithReplyReq *vpreq; 6065a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg CARD32 *data; 6075a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 6085a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg GetReqExtra(GLXVendorPrivateWithReply, 4, vpreq); 6095a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg data = (CARD32 *) (vpreq + 1); 6105a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 6115a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg data[0] = (CARD32) drawable; 6125a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 6135a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg vpreq->reqType = opcode; 6145a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg vpreq->glxCode = X_GLXVendorPrivateWithReply; 6155a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg vpreq->vendorCode = X_GLXvop_DestroyGLXPbufferSGIX; 6165a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg } 6175a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 6185a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg UnlockDisplay(dpy); 6195a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg SyncHandle(); 6205a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 6215a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg DestroyDRIDrawable(dpy, drawable, GL_TRUE); 6225a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg 6235a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg return; 6245a43dbac687c63ea543035319e44ca7a0acf9ff9Kristian Høgsberg} 625cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 626cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 627cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Create a new pbuffer. 628cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 62938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPbufferSGIX 6302d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXCreateGLXPbufferSGIX(Display * dpy, GLXFBConfigSGIX config, 6312d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf unsigned int width, unsigned int height, 6322d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf int *attrib_list) 633cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 6346ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return (GLXPbufferSGIX) CreatePbuffer(dpy, (struct glx_config *) config, 6352d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf width, height, 6362d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf attrib_list, GL_FALSE); 637cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 638cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 639ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */ 640cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 641cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 642cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Create a new pbuffer. 643cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 64438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPbuffer 6452d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXCreatePbuffer(Display * dpy, GLXFBConfig config, const int *attrib_list) 646cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 6478b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg int i, width, height; 648ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 649ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GLXPbuffer result; 650ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int errorcode; 651ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 6528b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg 6538b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg width = 0; 6548b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg height = 0; 6558b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg 656e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden WARN_ONCE_GLX_1_3(dpy, __func__); 6571f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick 658ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 659ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston for (i = 0; attrib_list[i]; ++i) { 660ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston switch (attrib_list[i]) { 661ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case GLX_PBUFFER_WIDTH: 662ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston width = attrib_list[i + 1]; 663ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ++i; 664ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 665ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 666ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case GLX_PBUFFER_HEIGHT: 667ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston height = attrib_list[i + 1]; 668ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ++i; 669ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 670ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 671ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case GLX_LARGEST_PBUFFER: 672ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* This is a hint we should probably handle, but how? */ 673ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ++i; 674ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 675ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 676ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case GLX_PRESERVED_CONTENTS: 677ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* The contents are always preserved with AppleSGLX with CGL. */ 678ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ++i; 679ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 680ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 681ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston default: 682ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return None; 683ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 684ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 685ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 686ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pbuffer_create(dpy, config, width, height, &errorcode, 687ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston &result)) { 688ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 689ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * apple_glx_pbuffer_create only sets the errorcode to core X11 690ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * errors. 691ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 692ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXSendError(dpy, errorcode, 0, X_GLXCreatePbuffer, true); 693ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 694ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return None; 695ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 696ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 697ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return result; 698ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 6998b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg for (i = 0; attrib_list[i * 2]; i++) { 7008b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg switch (attrib_list[i * 2]) { 7018b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg case GLX_PBUFFER_WIDTH: 7022d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf width = attrib_list[i * 2 + 1]; 7032d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf break; 7048b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg case GLX_PBUFFER_HEIGHT: 7052d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf height = attrib_list[i * 2 + 1]; 7062d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf break; 7078b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg } 7088b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg } 7098b2041191517a7aeaaa77a6896cdd15f97c4c100Kristian Høgsberg 7106ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return (GLXPbuffer) CreatePbuffer(dpy, (struct glx_config *) config, 7112d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf width, height, attrib_list, GL_TRUE); 712ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 713cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 714cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 715cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 716cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 717cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Destroy an existing pbuffer. 718cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 71938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void 7202d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXDestroyPbuffer(Display * dpy, GLXPbuffer pbuf) 721cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 722ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 723ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pbuffer_destroy(dpy, pbuf)) { 724ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXSendError(dpy, GLXBadPbuffer, pbuf, X_GLXDestroyPbuffer, false); 725ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 726ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 7272d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf DestroyPbuffer(dpy, pbuf); 728ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 729cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 730cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 731cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 732cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 733cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Query an attribute of a drawable. 734cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 73538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void 7362d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXQueryDrawable(Display * dpy, GLXDrawable drawable, 7372d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf int attribute, unsigned int *value) 738cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 739e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden WARN_ONCE_GLX_1_3(dpy, __func__); 740ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 741ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Window root; 742ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int x, y; 743ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston unsigned int width, height, bd, depth; 744ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 745ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pixmap_query(drawable, attribute, value)) 746ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return; /*done */ 747ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 748ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pbuffer_query(drawable, attribute, value)) 749ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return; /*done */ 750ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 751ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 752ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * The OpenGL spec states that we should report GLXBadDrawable if 753ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * the drawable is invalid, however doing so would require that we 754ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * use XSetErrorHandler(), which is known to not be thread safe. 755ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * If we use a round-trip call to validate the drawable, there could 756ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * be a race, so instead we just opt in favor of letting the 757ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * XGetGeometry request fail with a GetGeometry request X error 758ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * rather than GLXBadDrawable, in what is hoped to be a rare 759ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * case of an invalid drawable. In practice most and possibly all 760ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * X11 apps using GLX shouldn't notice a difference. 761ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 762ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (XGetGeometry 763ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston (dpy, drawable, &root, &x, &y, &width, &height, &bd, &depth)) { 764ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston switch (attribute) { 765ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case GLX_WIDTH: 766ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *value = width; 767ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 768ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 769ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case GLX_HEIGHT: 770ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *value = height; 771ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 772ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 773ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 774ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 7752d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf GetDrawableAttribute(dpy, drawable, attribute, value); 776ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 777cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 778cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 779cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 780ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL 781cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 782cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Query an attribute of a pbuffer. 783cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 78438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int 7852d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX drawable, 7862d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf int attribute, unsigned int *value) 787cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 7882d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf return GetDrawableAttribute(dpy, drawable, attribute, value); 789cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 790ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 791cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 792cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 793cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Select the event mask for a drawable. 794cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 79538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void 7962d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXSelectEvent(Display * dpy, GLXDrawable drawable, unsigned long mask) 797cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 798ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 799ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XWindowAttributes xwattr; 800ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 801ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pbuffer_set_event_mask(drawable, mask)) 802ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return; /*done */ 803ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 804ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 805ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * The spec allows a window, but currently there are no valid 806ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * events for a window, so do nothing. 807ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 808ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (XGetWindowAttributes(dpy, drawable, &xwattr)) 809ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return; /*done */ 810ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* The drawable seems to be invalid. Report an error. */ 811ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 812ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXSendError(dpy, GLXBadDrawable, drawable, 813ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston X_GLXChangeDrawableAttributes, false); 814ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 815cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson CARD32 attribs[2]; 816cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 817cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson attribs[0] = (CARD32) GLX_EVENT_MASK; 818cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson attribs[1] = (CARD32) mask; 819cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 8202d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf ChangeDrawableAttribute(dpy, drawable, attribs, 1); 821ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 822cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 823cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 824cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 825cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 826cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the selected event mask for a drawable. 827cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 82838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void 8292d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXGetSelectedEvent(Display * dpy, GLXDrawable drawable, unsigned long *mask) 830cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 831ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 832ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XWindowAttributes xwattr; 833ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 834ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pbuffer_get_event_mask(drawable, mask)) 835ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return; /*done */ 836ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 837ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 838ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * The spec allows a window, but currently there are no valid 839ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * events for a window, so do nothing, but set the mask to 0. 840ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 841ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (XGetWindowAttributes(dpy, drawable, &xwattr)) { 842ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* The window is valid, so set the mask to 0. */ 843ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *mask = 0; 844ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return; /*done */ 845ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 846ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* The drawable seems to be invalid. Report an error. */ 847ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 848ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXSendError(dpy, GLXBadDrawable, drawable, X_GLXGetDrawableAttributes, 849ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston true); 850ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 851cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson unsigned int value; 852cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 853cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 854cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* The non-sense with value is required because on LP64 platforms 855cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * sizeof(unsigned int) != sizeof(unsigned long). On little-endian 856cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * we could just type-cast the pointer, but why? 857cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 858cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 8592d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf GetDrawableAttribute(dpy, drawable, GLX_EVENT_MASK_SGIX, &value); 860cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *mask = value; 861ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 862cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 863cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 864cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 86538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap 8662d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXCreatePixmap(Display * dpy, GLXFBConfig config, Pixmap pixmap, 8672d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf const int *attrib_list) 868cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 869e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden WARN_ONCE_GLX_1_3(dpy, __func__); 8701f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick 871ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 872bb621cb61e0c6d7fcd06df5a77c75efe5c76926dJeremy Huddleston const struct glx_config *modes = (const struct glx_config *) config; 873ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 874ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pixmap_create(dpy, modes->screen, pixmap, modes)) 875ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return None; 876ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 877ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return pixmap; 878ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 8796ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return CreateDrawable(dpy, (struct glx_config *) config, 8802d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (Drawable) pixmap, attrib_list, X_GLXCreatePixmap); 881ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 882cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 883cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 884cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 88538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXWindow 8862d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXCreateWindow(Display * dpy, GLXFBConfig config, Window win, 8872d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf const int *attrib_list) 888cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 889e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden WARN_ONCE_GLX_1_3(dpy, __func__); 890ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 891ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XWindowAttributes xwattr; 892ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XVisualInfo *visinfo; 893ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 894ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston (void) attrib_list; /*unused according to GLX 1.4 */ 895ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 896ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XGetWindowAttributes(dpy, win, &xwattr); 8971f309c40b8065b8729fce631540c66e4b50b84dfIan Romanick 898ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston visinfo = glXGetVisualFromFBConfig(dpy, config); 899ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 900ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (NULL == visinfo) { 901ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXSendError(dpy, GLXBadFBConfig, 0, X_GLXCreateWindow, false); 902ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return None; 903ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 904ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 905ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (visinfo->visualid != XVisualIDFromVisual(xwattr.visual)) { 906ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXSendError(dpy, BadMatch, 0, X_GLXCreateWindow, true); 907ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return None; 908ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 909ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 910ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XFree(visinfo); 911ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 912ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return win; 913ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 9146ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return CreateDrawable(dpy, (struct glx_config *) config, 9152d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (Drawable) win, attrib_list, X_GLXCreateWindow); 916ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 917cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 918cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 919cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 92038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void 9212d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXDestroyPixmap(Display * dpy, GLXPixmap pixmap) 922cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 923e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden WARN_ONCE_GLX_1_3(dpy, __func__); 924ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 925ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (apple_glx_pixmap_destroy(dpy, pixmap)) 926ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXSendError(dpy, GLXBadPixmap, pixmap, X_GLXDestroyPixmap, false); 927ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 9282d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf DestroyDrawable(dpy, (GLXDrawable) pixmap, X_GLXDestroyPixmap); 929ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 930cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 931cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 932cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 93338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void 9342d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófglXDestroyWindow(Display * dpy, GLXWindow win) 935cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 936e8573033058a13bd39a0b85f48b6db64b04c65e0Tormod Volden WARN_ONCE_GLX_1_3(dpy, __func__); 937ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL 9382d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf DestroyDrawable(dpy, (GLXDrawable) win, X_GLXDestroyWindow); 939ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 940cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 941cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 942ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL 94338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT 9442d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófGLX_ALIAS_VOID(glXDestroyGLXPbufferSGIX, 9452d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (Display * dpy, GLXPbufferSGIX pbuf), 9462d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (dpy, pbuf), glXDestroyPbuffer) 947cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 94838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT 9492d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófGLX_ALIAS_VOID(glXSelectEventSGIX, 9502d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (Display * dpy, GLXDrawable drawable, 9510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned long mask), (dpy, drawable, mask), glXSelectEvent) 952cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 95338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT 9542d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, KristófGLX_ALIAS_VOID(glXGetSelectedEventSGIX, 9552d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf (Display * dpy, GLXDrawable drawable, 9562d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf unsigned long *mask), (dpy, drawable, mask), 9572d4c26b85e39bcfb145976067f440a86bee4f02bRALOVICH, Kristóf glXGetSelectedEvent) 958ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 959