glx_pbuffer.c revision f972115d33e391499e049b83a1559959f2ca9f72
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky/* 23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * (C) Copyright IBM Corporation 2004 33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * All Rights Reserved. 43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * 53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * Permission is hereby granted, free of charge, to any person obtaining a 63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * copy of this software and associated documentation files (the "Software"), 73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * to deal in the Software without restriction, including without limitation 83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * on the rights to use, copy, modify, merge, publish, distribute, sub 93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * license, and/or sell copies of the Software, and to permit persons to whom 103ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * the Software is furnished to do so, subject to the following conditions: 113ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar * 1253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar * The above copyright notice and this permission notice (including the next 131b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar * paragraph) shall be included in all copies or substantial portions of the 141b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar * Software. 151b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar * 164ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1827e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 190648262df75d97b464c2be0ed867da3615659785Daniel Dunbar * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 201b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar * DEALINGS IN THE SOFTWARE. 230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar */ 24ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor 25ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor/** 267f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner * \file glx_pbuffer.c 271368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar * Implementation of pbuffer related functions. 284d7b14734f2285695dcec347f8718b512093390aTed Kremenek * 29548f6c8e8010b181cb151df92f0a989363cb993eDavid Blaikie * \author Ian Romanick <idr@us.ibm.com> 308f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar */ 310648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 32256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer#include <inttypes.h> 3303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "glxclient.h" 3403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include <X11/extensions/extutil.h> 35ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar#include <X11/extensions/Xext.h> 36f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include <assert.h> 3718d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth#include <string.h> 38f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "glxextensions.h" 39f2462be34a49e2108c9b4151f8e6d3fe1b916179Dylan Noblesmith 4069d3b4f7c9fa818d2536b4f1b220b942ae392128Dylan Noblesmith#ifdef GLX_USE_APPLEGL 41cc8a94565ec2ff459dcee9ef34237fdcdfc69b3fDylan Noblesmith#include <pthread.h> 42cc8a94565ec2ff459dcee9ef34237fdcdfc69b3fDylan Noblesmith#include "apple_glx_drawable.h" 431b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "glx_error.h" 4492b369928b8e9ad156fb6eec2bf9f21d657bd69bChris Lattner#endif 451b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar 465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#define WARN_ONCE_GLX_1_3(a, b) { \ 479606a57b6f2c43bf438a958fdffea1de60f6b2b7Sebastian Pop static int warned=1; \ 485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if(warned) { \ 4910a82cde7c317c5dd41dc3faf17f503c52ce2a3dBob Wilson warn_GLX_1_3((a), b ); \ 50d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie warned=0; \ 517e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky } \ 524762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop } 534762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop 54abac441b7d114d5980864093ee0643bf68f1a8f2Chad Rosier/** 5543302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar * Emit a warning when clients use GLX 1.3 functions on pre-1.3 systems. 56c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar */ 57c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbarstatic void 58951c5705771a57eca0bca07aae5d4738619dd6c6Joerg Sonnenbergerwarn_GLX_1_3(Display * dpy, const char *function_name) 59c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar{ 602b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier __GLXdisplayPrivate *priv = __glXInitialize(dpy); 612b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 62d6277fb9e0353edffc0d6c8655a65542c08cf6f1Argyrios Kyrtzidis if (priv->minorVersion < 3) { 63f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar fprintf(stderr, 64f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar "WARNING: Application calling GLX 1.3 function \"%s\" " 65b9da55780eb66fb09e771dbc5ff01eec5c4d957bDavid Blaikie "when GLX 1.3 is not supported! This is an application bug!\n", 66f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar function_name); 67f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar } 68f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar} 69f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar 70f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar#ifndef GLX_USE_APPLEGL 71f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar/** 72f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar * Change a drawable's attribute. 73f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar * 74225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar * This function is used to implement \c glXSelectEvent and 75d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer * \c glXSelectEventSGIX. 76d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer * 770bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar * \note 78225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar * This function dynamically determines whether to use the SGIX_pbuffer 795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * version of the protocol or the GLX 1.3 version of the protocol. 80f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith * 81d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer * \todo 82d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer * This function needs to be modified to work with direct-rendering drivers. 83d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer */ 84d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencerstatic void 85225c41706dc0f3682236e351820d339e14390e00Daniel DunbarChangeDrawableAttribute(Display * dpy, GLXDrawable drawable, 863ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar const CARD32 * attribs, size_t num_attribs) 873ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar{ 883ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar __GLXdisplayPrivate *priv = __glXInitialize(dpy); 891b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar __GLXDRIdrawable *pdraw; 9018d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth CARD32 *output; 9118d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth CARD8 opcode; 9218d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth int i; 9318d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth 9418d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth if ((dpy == NULL) || (drawable == 0)) { 953ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar return; 963ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar } 972d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner 988f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar pdraw = GetGLXDRIDrawable(dpy, drawable, NULL); 99847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 1007f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner opcode = __glXSetupForCommand(dpy); 101847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar if (!opcode) 102847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar return; 103847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 104847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar LockDisplay(dpy); 105847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 106847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 107847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar xGLXChangeDrawableAttributesReq *req; 108847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 109847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar GetReqExtra(GLXChangeDrawableAttributes, 8 + (8 * num_attribs), req); 110847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar output = (CARD32 *) (req + 1); 111847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 112b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar req->reqType = opcode; 113b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar req->glxCode = X_GLXChangeDrawableAttributes; 114b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar req->drawable = drawable; 115b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar req->numAttribs = (CARD32) num_attribs; 1162dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier } 1172dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier else { 1186467c9bf4f07f54789d3ed902f04048f4d80ad47Chad Rosier xGLXVendorPrivateWithReplyReq *vpreq; 1192dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier 1206467c9bf4f07f54789d3ed902f04048f4d80ad47Chad Rosier GetReqExtra(GLXVendorPrivateWithReply, 4 + (8 * num_attribs), vpreq); 1216467c9bf4f07f54789d3ed902f04048f4d80ad47Chad Rosier output = (CARD32 *) (vpreq + 1); 1222dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier 1230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar vpreq->reqType = opcode; 1240648262df75d97b464c2be0ed867da3615659785Daniel Dunbar vpreq->glxCode = X_GLXVendorPrivateWithReply; 1250648262df75d97b464c2be0ed867da3615659785Daniel Dunbar vpreq->vendorCode = X_GLXvop_ChangeDrawableAttributesSGIX; 1260648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 1270648262df75d97b464c2be0ed867da3615659785Daniel Dunbar output[0] = (CARD32) drawable; 1281fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier output++; 1291fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier } 1301fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1311fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier (void) memcpy(output, attribs, sizeof(CARD32) * 2 * num_attribs); 1321fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1331fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier UnlockDisplay(dpy); 1341fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier SyncHandle(); 13559f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher 1361fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier for (i = 0; i < num_attribs; i++) { 1371fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier switch(attribs[i * 2]) { 1381fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier case GLX_EVENT_MASK: 1391fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier /* Keep a local copy for masking out DRI2 proto events as needed */ 1401fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier pdraw->eventMask = attribs[i * 2 + 1]; 14159f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher break; 1421fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier } 1431fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier } 1441fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 145582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian return; 14630660a898545416f0fea2d717f16f75640001e38Ted Kremenek} 1471fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 14853cb2b47596b0ca893a449fa81e0912ded658759Chad Rosier 1491fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#ifdef GLX_DIRECT_RENDERING 1501fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic GLenum 1511fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad RosierdetermineTextureTarget(const int *attribs, int numAttribs) 1521fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier{ 1531fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier GLenum target = 0; 1541fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier int i; 1551fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1561fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier for (i = 0; i < numAttribs; i++) { 1571fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) { 1581fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier switch (attribs[2 * i + 1]) { 1591fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier case GLX_TEXTURE_2D_EXT: 1601fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier target = GL_TEXTURE_2D; 1611fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier break; 1621fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier case GLX_TEXTURE_RECTANGLE_EXT: 1631fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier target = GL_TEXTURE_RECTANGLE_ARB; 1641fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier break; 1651fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier } 1661fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier } 167279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar } 168279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 169279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar return target; 170e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar} 171279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 172f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic GLenum 173f78925f633e949f06521d9ffd937019e59f35efcDaniel DunbardetermineTextureFormat(const int *attribs, int numAttribs) 174f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar{ 175f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar int i; 176f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 177f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar for (i = 0; i < numAttribs; i++) { 178eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT) 179eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar return attribs[2 * i + 1]; 180eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar } 181eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar 182eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar return 0; 183eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar} 184f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 185f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic void 186f78925f633e949f06521d9ffd937019e59f35efcDaniel DunbarCreateDRIDrawable(Display *dpy, const __GLcontextModes *fbconfig, 187f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar XID drawable, XID glxdrawable, 188f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar const int *attrib_list, size_t num_attribs) 1895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner{ 190f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar __GLXdisplayPrivate *const priv = __glXInitialize(dpy); 191f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar __GLXDRIdrawable *pdraw; 192f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar __GLXscreenConfigs *psc; 193f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 194f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar psc = priv->screenConfigs[fbconfig->screen]; 195f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar if (psc->driScreen == NULL) 196eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar return; 197eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar 198eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar pdraw = psc->driScreen->createDrawable(psc, drawable, 199eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar glxdrawable, fbconfig); 200eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar if (pdraw == NULL) { 2015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner fprintf(stderr, "failed to create drawable\n"); 2025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner return; 203212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar } 2045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 205212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar if (__glxHashInsert(psc->drawHash, glxdrawable, pdraw)) { 206212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar (*pdraw->destroyDrawable) (pdraw); 207212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar return; /* FIXME: Check what we're supposed to do here... */ 208eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar } 209eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar 210eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar pdraw->textureTarget = determineTextureTarget(attrib_list, num_attribs); 211eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar pdraw->textureFormat = determineTextureFormat(attrib_list, num_attribs); 212eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar} 2137433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 2147433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senstatic void 2155f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerDestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) 216e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar{ 2177433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen int screen; 2187433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen __GLXdisplayPrivate *const priv = __glXInitialize(dpy); 219e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen); 220e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar __GLXscreenConfigs *psc = priv->screenConfigs[screen]; 221e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 222e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar if (pdraw != NULL) { 2237433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen if (destroy_xdrawable) 2247433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen XFreePixmap(psc->dpy, pdraw->xDrawable); 2257433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen (*pdraw->destroyDrawable) (pdraw); 2267433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen __glxHashDelete(psc->drawHash, drawable); 2277433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen } 2287433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen} 2297433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 230e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar#else 231e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 232279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbarstatic void 233f78925f633e949f06521d9ffd937019e59f35efcDaniel DunbarCreateDRIDrawable(Display *dpy, const __GLcontextModes * fbconfig, 234279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar XID drawable, XID glxdrawable, 235a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar const int *attrib_list, size_t num_attribs) 236a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar{ 237a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar} 238a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar 239a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbarstatic void 240a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel DunbarDestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) 241c326b64a4d14ad89d6a5d227d2460050149d5461Daniel Dunbar{ 242a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar} 243a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar 244a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#endif 245279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 246279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar/** 247279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar * Get a drawable's attribute. 2482d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner * 2498f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar * This function is used to implement \c glXGetSelectedEvent and 2508f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar * \c glXGetSelectedEventSGIX. 25159f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher * 252e8cb554c36c94e31e80ea893d9ad528afb491bdfBill Wendling * \note 253815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * This function dynamically determines whether to use the SGIX_pbuffer 254815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * version of the protocol or the GLX 1.3 version of the protocol. 255815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * 256815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * \todo 2576467c9bf4f07f54789d3ed902f04048f4d80ad47Chad Rosier * The number of attributes returned is likely to be small, probably less than 258815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * 10. Given that, this routine should try to use an array on the stack to 259815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * capture the reply rather than always calling Xmalloc. 260815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * 261815eb6b80739ffca9879b9833208932dee55d0cbChad Rosier * \todo 262cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar * This function needs to be modified to work with direct-rendering drivers. 263cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar */ 264cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbarstatic int 265a82318332c9e9b61d3d17371e675ca2859877ee5Daniel DunbarGetDrawableAttribute(Display * dpy, GLXDrawable drawable, 26653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar int attribute, unsigned int *value) 2670648262df75d97b464c2be0ed867da3615659785Daniel Dunbar{ 2687f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner __GLXdisplayPrivate *priv; 2698477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar xGLXGetDrawableAttributesReply reply; 2707ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola CARD32 *data; 2717ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola CARD8 opcode; 2727ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola unsigned int length; 273c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar unsigned int i; 274c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar unsigned int num_attributes; 275c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar GLboolean use_glx_1_3; 2768477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 277365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if ((dpy == NULL) || (drawable == 0)) { 278a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar return 0; 279a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar } 280a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 281a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar priv = __glXInitialize(dpy); 2828477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar use_glx_1_3 = ((priv->majorVersion > 1) || (priv->minorVersion >= 3)); 2838477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2848477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar *value = 0; 285f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar 2868477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2878477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar opcode = __glXSetupForCommand(dpy); 2888477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar if (!opcode) 2898477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar return 0; 290f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar 291f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar LockDisplay(dpy); 2928477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2938477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar if (use_glx_1_3) { 2948477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar xGLXGetDrawableAttributesReq *req; 2958477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2968477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar GetReqExtra(GLXGetDrawableAttributes, 4, req); 2975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner req->reqType = opcode; 2988477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar req->glxCode = X_GLXGetDrawableAttributes; 2998477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar req->drawable = drawable; 3008477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar } 3015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner else { 3028477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar xGLXVendorPrivateWithReplyReq *vpreq; 3038477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 3048477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar GetReqExtra(GLXVendorPrivateWithReply, 4, vpreq); 3058477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar data = (CARD32 *) (vpreq + 1); 3068477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar data[0] = (CARD32) drawable; 307e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar 308e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar vpreq->reqType = opcode; 309365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar vpreq->glxCode = X_GLXVendorPrivateWithReply; 3108477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar vpreq->vendorCode = X_GLXvop_GetDrawableAttributesSGIX; 311a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar } 3128477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 3138477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar _XReply(dpy, (xReply *) & reply, 0, False); 314365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 315365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (reply.type == X_Error) { 3168a988c32b8ac18eb252ef4a58ed56f898255524dJoerg Sonnenberger UnlockDisplay(dpy); 3178a988c32b8ac18eb252ef4a58ed56f898255524dJoerg Sonnenberger SyncHandle(); 3188a988c32b8ac18eb252ef4a58ed56f898255524dJoerg Sonnenberger return 0; 3198a988c32b8ac18eb252ef4a58ed56f898255524dJoerg Sonnenberger } 3208477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 321c4ab3493bb3048014895cf577a8f27505a83603dDaniel Dunbar length = reply.length; 32209982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer if (length) { 32309982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer num_attributes = (use_glx_1_3) ? reply.numAttribs : length / 2; 32409982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer data = (CARD32 *) Xmalloc(length * sizeof(CARD32)); 32509982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer if (data == NULL) { 32609982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer /* Throw data on the floor */ 32709982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer _XEatData(dpy, length); 3288ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger } 3298ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger else { 33005e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger _XRead(dpy, (char *) data, length * sizeof(CARD32)); 33105e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger 332365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar /* Search the set of returned attributes for the attribute requested by 333279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar * the caller. 334279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar */ 335279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar for (i = 0; i < num_attributes; i++) { 33608386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth if (data[i * 2] == attribute) { 33718d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth *value = data[(i * 2) + 1]; 33808386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth break; 33921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar } 34008386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth } 34121549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar 342365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 343365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar { 344be21cd0f07726045367861d3882d18ef30f6a30cDaniel Dunbar __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL); 34521549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar 346365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (pdraw != NULL && !pdraw->textureTarget) 34753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar pdraw->textureTarget = 34821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar determineTextureTarget((const int *) data, num_attributes); 34921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar if (pdraw != NULL && !pdraw->textureFormat) 350cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar pdraw->textureFormat = 351be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier determineTextureFormat((const int *) data, num_attributes); 352be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier } 353be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier#endif 354be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier 3554a04d0b4aa33e98ea9e7b3e787f0490585ce9b6fChandler Carruth Xfree(data); 3564a04d0b4aa33e98ea9e7b3e787f0490585ce9b6fChandler Carruth } 35708386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth } 35865f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger 359be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier UnlockDisplay(dpy); 36053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar SyncHandle(); 361be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier 362be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier return 0; 36353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 36453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 36510ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar/** 36621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar * Create a non-pbuffer GLX drawable. 36753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar * 368ab835430b4f758dd49903251c7c7f21b95933c89Daniel Dunbar * \todo 36921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar * This function needs to be modified to work with direct-rendering drivers. 3708d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbar */ 3718d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbarstatic GLXDrawable 372365c02f65be026f90e67a8e00e7b827cee60e228Daniel DunbarCreateDrawable(Display * dpy, const __GLcontextModes * fbconfig, 373365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar Drawable drawable, const int *attrib_list, CARD8 glxCode) 37459f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher{ 37559f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher xGLXCreateWindowReq *req; 3762b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier CARD32 *data; 3772b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier unsigned int i; 3782b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier CARD8 opcode; 3792639ac628cff5dedb4fa60169082b2a1a9dd8694Chad Rosier 3806467c9bf4f07f54789d3ed902f04048f4d80ad47Chad Rosier i = 0; 3818ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier if (attrib_list) { 3828ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier while (attrib_list[i * 2] != None) 38380ec127fc9af8b83eea326fbd65265a1adc307d8Chad Rosier i++; 3842639ac628cff5dedb4fa60169082b2a1a9dd8694Chad Rosier } 3852639ac628cff5dedb4fa60169082b2a1a9dd8694Chad Rosier 3864f6a4b47675a30e621251fcda1d192a2c17c6eeaChad Rosier opcode = __glXSetupForCommand(dpy); 3874f6a4b47675a30e621251fcda1d192a2c17c6eeaChad Rosier if (!opcode) 3884f6a4b47675a30e621251fcda1d192a2c17c6eeaChad Rosier return None; 3892b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 39013223073a94f8df6527193827192a326d50877fbChad Rosier LockDisplay(dpy); 39113223073a94f8df6527193827192a326d50877fbChad Rosier GetReqExtra(GLXCreateWindow, 8 * i, req); 3922b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier data = (CARD32 *) (req + 1); 3932b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 3942b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier req->reqType = opcode; 3952b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier req->glxCode = glxCode; 396e75d9cfbf41a0ee9e456a665776f91fdd9773b36David Blaikie req->screen = (CARD32) fbconfig->screen; 3972b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier req->fbconfig = fbconfig->fbconfigID; 398ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->window = (CARD32) drawable; 399ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->glxwindow = (GLXWindow) XAllocID(dpy); 400ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->numAttribs = (CARD32) i; 40153d2409a223a14d063faf06e4360ede09c41ed80Chad Rosier 40253d2409a223a14d063faf06e4360ede09c41ed80Chad Rosier if (attrib_list) 40353d2409a223a14d063faf06e4360ede09c41ed80Chad Rosier memcpy(data, attrib_list, 8 * i); 4046467c9bf4f07f54789d3ed902f04048f4d80ad47Chad Rosier 40553d2409a223a14d063faf06e4360ede09c41ed80Chad Rosier UnlockDisplay(dpy); 40653d2409a223a14d063faf06e4360ede09c41ed80Chad Rosier SyncHandle(); 407ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier 408ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier CreateDRIDrawable(dpy, fbconfig, drawable, req->glxwindow, attrib_list, i); 4092b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 4102b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier return (GLXDrawable) req->glxwindow; 411be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier} 412be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier 413be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier 414be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier/** 415be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier * Destroy a non-pbuffer GLX drawable. 4162b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier */ 417137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosierstatic void 41890c88023fd4cb709c8645aa24e9eac420f733b5dChad RosierDestroyDrawable(Display * dpy, GLXDrawable drawable, CARD32 glxCode) 41990c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier{ 42090c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier xGLXDestroyPbufferReq *req; 42190c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier CARD8 opcode; 42290c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier 42390c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier if ((dpy == NULL) || (drawable == 0)) { 42490c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier return; 42590c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier } 42690c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier 42790c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier 42890c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier opcode = __glXSetupForCommand(dpy); 42990c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier if (!opcode) 43090c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier return; 431137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier 432137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier LockDisplay(dpy); 4333060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier 434137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier GetReqExtra(GLXDestroyPbuffer, 4, req); 4353060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier req->reqType = opcode; 436137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier req->glxCode = glxCode; 43790c88023fd4cb709c8645aa24e9eac420f733b5dChad Rosier req->pbuffer = (GLXPbuffer) drawable; 43846e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier 439c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier UnlockDisplay(dpy); 440c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier SyncHandle(); 44146e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier 44246e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier DestroyDRIDrawable(dpy, drawable, GL_FALSE); 44346e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier 44446e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier return; 445c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier} 446c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier 44746e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier 44846e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier/** 449c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier * Create a pbuffer. 450c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier * 451c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier * This function is used to implement \c glXCreatePbuffer and 452c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier * \c glXCreateGLXPbufferSGIX. 453c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier * 454c56389189e7a8b99d7db3a6f60c896adb2b092bfChad Rosier * \note 45546e3908af1ba2af6d7497e8e501f5c9a01acde7eChad Rosier * This function dynamically determines whether to use the SGIX_pbuffer 456137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier * version of the protocol or the GLX 1.3 version of the protocol. 457137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier * 458137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier * \todo 459137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier * This function needs to be modified to work with direct-rendering drivers. 460137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier */ 461137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosierstatic GLXDrawable 4624a04d0b4aa33e98ea9e7b3e787f0490585ce9b6fChandler CarruthCreatePbuffer(Display * dpy, const __GLcontextModes * fbconfig, 4634a04d0b4aa33e98ea9e7b3e787f0490585ce9b6fChandler Carruth unsigned int width, unsigned int height, 46408386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth const int *attrib_list, GLboolean size_in_attribs) 46508386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth{ 46608386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth __GLXdisplayPrivate *priv = __glXInitialize(dpy); 4672b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier GLXDrawable id = 0; 46808386a9769575bd8290024aaaecb2dbad5bfd59dChandler Carruth CARD32 *data; 4692b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier CARD8 opcode; 4702b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier unsigned int i; 4712b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier Pixmap pixmap; 4722b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 4732b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier i = 0; 4742b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if (attrib_list) { 4752b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier while (attrib_list[i * 2]) 4762b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier i++; 4772b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier } 4782b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 4792b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier opcode = __glXSetupForCommand(dpy); 4802b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if (!opcode) 4812b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier return None; 4822b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 4832b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier LockDisplay(dpy); 4842b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier id = XAllocID(dpy); 4852b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 48613223073a94f8df6527193827192a326d50877fbChad Rosier if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 48713223073a94f8df6527193827192a326d50877fbChad Rosier xGLXCreatePbufferReq *req; 48813223073a94f8df6527193827192a326d50877fbChad Rosier unsigned int extra = (size_in_attribs) ? 0 : 2; 4892b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 49059f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher GetReqExtra(GLXCreatePbuffer, (8 * (i + extra)), req); 491ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier data = (CARD32 *) (req + 1); 4922b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 493ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->reqType = opcode; 494ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->glxCode = X_GLXCreatePbuffer; 495ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->screen = (CARD32) fbconfig->screen; 496ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->fbconfig = fbconfig->fbconfigID; 497ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->pbuffer = (GLXPbuffer) id; 498ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier req->numAttribs = (CARD32) (i + extra); 499ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier 500ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier if (!size_in_attribs) { 501ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier data[(2 * i) + 0] = GLX_PBUFFER_WIDTH; 502ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier data[(2 * i) + 1] = width; 503ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier data[(2 * i) + 2] = GLX_PBUFFER_HEIGHT; 504d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier data[(2 * i) + 3] = height; 505cc66b08945099b734b05d06179ea85413c69753dChad Rosier data += 4; 506d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier } 507d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier } 508d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier else { 509d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier xGLXVendorPrivateReq *vpreq; 510d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier 511d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier GetReqExtra(GLXVendorPrivate, 20 + (8 * i), vpreq); 512d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier data = (CARD32 *) (vpreq + 1); 513d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier 514d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier vpreq->reqType = opcode; 515d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier vpreq->glxCode = X_GLXVendorPrivate; 516d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier vpreq->vendorCode = X_GLXvop_CreateGLXPbufferSGIX; 517d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier 518d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier data[0] = (CARD32) fbconfig->screen; 519d83217cbfcfcde7b21a829483347e593e2f2a4a3Chad Rosier data[1] = (CARD32) fbconfig->fbconfigID; 520cc66b08945099b734b05d06179ea85413c69753dChad Rosier data[2] = (CARD32) id; 521cc66b08945099b734b05d06179ea85413c69753dChad Rosier data[3] = (CARD32) width; 522cc66b08945099b734b05d06179ea85413c69753dChad Rosier data[4] = (CARD32) height; 523cc66b08945099b734b05d06179ea85413c69753dChad Rosier data += 5; 52413223073a94f8df6527193827192a326d50877fbChad Rosier } 525cc66b08945099b734b05d06179ea85413c69753dChad Rosier 526cc66b08945099b734b05d06179ea85413c69753dChad Rosier (void) memcpy(data, attrib_list, sizeof(CARD32) * 2 * i); 527cc66b08945099b734b05d06179ea85413c69753dChad Rosier 528cc66b08945099b734b05d06179ea85413c69753dChad Rosier UnlockDisplay(dpy); 529cc66b08945099b734b05d06179ea85413c69753dChad Rosier SyncHandle(); 53044727629b766bf34bc2299c40f5ee8e4c7a71391Chad Rosier 53144727629b766bf34bc2299c40f5ee8e4c7a71391Chad Rosier pixmap = XCreatePixmap(dpy, RootWindow(dpy, fbconfig->screen), 53244727629b766bf34bc2299c40f5ee8e4c7a71391Chad Rosier width, height, fbconfig->rgbBits); 53344727629b766bf34bc2299c40f5ee8e4c7a71391Chad Rosier 53444727629b766bf34bc2299c40f5ee8e4c7a71391Chad Rosier CreateDRIDrawable(dpy, fbconfig, pixmap, id, attrib_list, i); 53544727629b766bf34bc2299c40f5ee8e4c7a71391Chad Rosier 53644727629b766bf34bc2299c40f5ee8e4c7a71391Chad Rosier return id; 5378775485350b2419cb9953518ace61cf68b1c9c18Chad Rosier} 5388775485350b2419cb9953518ace61cf68b1c9c18Chad Rosier 5398775485350b2419cb9953518ace61cf68b1c9c18Chad Rosier/** 5408775485350b2419cb9953518ace61cf68b1c9c18Chad Rosier * Destroy a pbuffer. 5418775485350b2419cb9953518ace61cf68b1c9c18Chad Rosier * 5428775485350b2419cb9953518ace61cf68b1c9c18Chad Rosier * This function is used to implement \c glXDestroyPbuffer and 543ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier * \c glXDestroyGLXPbufferSGIX. 544ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier * 545ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier * \note 546ce50c55f8cb569cc1b71770fd62327a883fdb7baChad Rosier * This function dynamically determines whether to use the SGIX_pbuffer 54713223073a94f8df6527193827192a326d50877fbChad Rosier * version of the protocol or the GLX 1.3 version of the protocol. 54813223073a94f8df6527193827192a326d50877fbChad Rosier */ 5492b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierstatic void 5502b81910618f63e4ce2373c926a26e76b4b91373fChad RosierDestroyPbuffer(Display * dpy, GLXDrawable drawable) 5512b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier{ 5522b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier __GLXdisplayPrivate *priv = __glXInitialize(dpy); 5532b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier CARD8 opcode; 5542b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 5552b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if ((dpy == NULL) || (drawable == 0)) { 5562b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier return; 5572b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier } 5582b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 5592b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier opcode = __glXSetupForCommand(dpy); 5602b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if (!opcode) 561c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar return; 562c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 563c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar LockDisplay(dpy); 564c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 565c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 566c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar xGLXDestroyPbufferReq *req; 567c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 5682b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier GetReq(GLXDestroyPbuffer, req); 569c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar req->reqType = opcode; 570c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar req->glxCode = X_GLXDestroyPbuffer; 571c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar req->pbuffer = (GLXPbuffer) drawable; 572a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar } 573c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar else { 574c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar xGLXVendorPrivateWithReplyReq *vpreq; 575c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar CARD32 *data; 5769fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar 5779fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar GetReqExtra(GLXVendorPrivateWithReply, 4, vpreq); 5789fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar data = (CARD32 *) (vpreq + 1); 5799fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar 5809fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar data[0] = (CARD32) drawable; 5815d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne 582c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar vpreq->reqType = opcode; 583c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar vpreq->glxCode = X_GLXVendorPrivateWithReply; 5845d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne vpreq->vendorCode = X_GLXvop_DestroyGLXPbufferSGIX; 585573ea9683113064d8d72b9f6a119a63136860181NAKAMURA Takumi } 5865d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne 587573ea9683113064d8d72b9f6a119a63136860181NAKAMURA Takumi UnlockDisplay(dpy); 588573ea9683113064d8d72b9f6a119a63136860181NAKAMURA Takumi SyncHandle(); 589573ea9683113064d8d72b9f6a119a63136860181NAKAMURA Takumi 590573ea9683113064d8d72b9f6a119a63136860181NAKAMURA Takumi DestroyDRIDrawable(dpy, drawable, GL_TRUE); 591573ea9683113064d8d72b9f6a119a63136860181NAKAMURA Takumi 592573ea9683113064d8d72b9f6a119a63136860181NAKAMURA Takumi return; 5935d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne} 5945d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne 595c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar/** 5969fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar * Create a new pbuffer. 5979fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar */ 5989fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel DunbarPUBLIC GLXPbufferSGIX 5999fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel DunbarglXCreateGLXPbufferSGIX(Display * dpy, GLXFBConfigSGIX config, 6009fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar unsigned int width, unsigned int height, 6019fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar int *attrib_list) 6029fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar{ 6039fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar return (GLXPbufferSGIX) CreatePbuffer(dpy, (__GLcontextModes *) config, 6049fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar width, height, 6059fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar attrib_list, GL_FALSE); 6069fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar} 6079fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar 608ecff7c80e5ce4ccb1d2765c234c88efafdc1a378Benjamin Kramer#endif /* GLX_USE_APPLEGL */ 6099fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar 6109fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar/** 6119fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar * Create a new pbuffer. 612c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar */ 613c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel DunbarPUBLIC GLXPbuffer 614c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel DunbarglXCreatePbuffer(Display * dpy, GLXFBConfig config, const int *attrib_list) 615c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar{ 616c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar int i, width, height; 617d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbar#ifdef GLX_USE_APPLEGL 6180648262df75d97b464c2be0ed867da3615659785Daniel Dunbar GLXPbuffer result; 619a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar int errorcode; 6200648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#endif 6210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 6220648262df75d97b464c2be0ed867da3615659785Daniel Dunbar width = 0; 6230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar height = 0; 6240648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 6250648262df75d97b464c2be0ed867da3615659785Daniel Dunbar WARN_ONCE_GLX_1_3(dpy, __func__); 6260648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 6270648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#ifdef GLX_USE_APPLEGL 62853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (i = 0; attrib_list[i]; ++i) { 6290648262df75d97b464c2be0ed867da3615659785Daniel Dunbar switch (attrib_list[i]) { 6300648262df75d97b464c2be0ed867da3615659785Daniel Dunbar case GLX_PBUFFER_WIDTH: 6310648262df75d97b464c2be0ed867da3615659785Daniel Dunbar width = attrib_list[i + 1]; 6323ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar ++i; 633dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar break; 634c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar 63543302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar case GLX_PBUFFER_HEIGHT: 63643302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar height = attrib_list[i + 1]; 63791e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar ++i; 63891e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar break; 6395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 640a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar case GLX_LARGEST_PBUFFER: 641a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar /* This is a hint we should probably handle, but how? */ 642a18f1b88a7ef3d2c944bb1d3b6586a2860ce2baaTed Kremenek ++i; 64370c8db1003af49d3627aeef41fcdd7c6c6a7df79Daniel Dunbar break; 644793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar 6453ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar case GLX_PRESERVED_CONTENTS: 6463ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar /* The contents are always preserved with AppleSGLX with CGL. */ 6473ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar ++i; 6483ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar break; 649793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar 650cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar default: 651cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return None; 652c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner } 653c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner } 6545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 655477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis if (apple_glx_pbuffer_create(dpy, config, width, height, &errorcode, 656477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis &result)) { 657477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis /* 658477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis * apple_glx_pbuffer_create only sets the errorcode to core X11 659c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner * errors. 660c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner */ 66121549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar __glXSendError(dpy, errorcode, 0, X_GLXCreatePbuffer, true); 662e82ec0bead14ae262cddbe958b77767a3f6aebcdDaniel Dunbar 663a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar return None; 66491e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar } 665d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar 666d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar return result; 667d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar#else 668d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar for (i = 0; attrib_list[i * 2]; i++) { 669d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar switch (attrib_list[i * 2]) { 670e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar case GLX_PBUFFER_WIDTH: 67195a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar width = attrib_list[i * 2 + 1]; 67295a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar break; 67395a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar case GLX_PBUFFER_HEIGHT: 67495a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar height = attrib_list[i * 2 + 1]; 67595a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar break; 67695a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar } 67795a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar } 678e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar 679e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar return (GLXPbuffer) CreatePbuffer(dpy, (__GLcontextModes *) config, 680f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar width, height, attrib_list, GL_TRUE); 681c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner#endif 682c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner} 683c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner 684c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner 685e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar/** 686bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy * Destroy an existing pbuffer. 687c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar */ 688c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel DunbarPUBLIC void 68991e28afe3503893c69afd71877f11e3bf03fa4ceDaniel DunbarglXDestroyPbuffer(Display * dpy, GLXPbuffer pbuf) 69091e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar{ 69191e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar#ifdef GLX_USE_APPLEGL 6926cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar if (apple_glx_pbuffer_destroy(dpy, pbuf)) { 693a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar __glXSendError(dpy, GLXBadPbuffer, pbuf, X_GLXDestroyPbuffer, false); 694793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar } 6956cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar#else 6966cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar DestroyPbuffer(dpy, pbuf); 6976cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar#endif 698a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar} 69921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar 700793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar 701cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar/** 702cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar * Query an attribute of a drawable. 703cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar */ 70421549237f14505cfc2a18a06416372a36229d0ceDaniel DunbarPUBLIC void 705ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel DunbarglXQueryDrawable(Display * dpy, GLXDrawable drawable, 706ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar int attribute, unsigned int *value) 707ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar{ 708ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar WARN_ONCE_GLX_1_3(dpy, __func__); 709ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar#ifdef GLX_USE_APPLEGL 710ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar Window root; 711ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar int x, y; 712ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar unsigned int width, height, bd, depth; 713ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar 71441ee7a371780d45f43251ee68542b8a9f0cd0fbaPeter Collingbourne if (apple_glx_pixmap_query(drawable, attribute, value)) 71559c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger return; /*done */ 7164762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop 71759c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger if (apple_glx_pbuffer_query(drawable, attribute, value)) 718a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar return; /*done */ 719ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar 72041ee7a371780d45f43251ee68542b8a9f0cd0fbaPeter Collingbourne /* 72159c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger * The OpenGL spec states that we should report GLXBadDrawable if 72259c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger * the drawable is invalid, however doing so would require that we 72359c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger * use XSetErrorHandler(), which is known to not be thread safe. 72459c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger * If we use a round-trip call to validate the drawable, there could 72559c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger * be a race, so instead we just opt in favor of letting the 726ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar * XGetGeometry request fail with a GetGeometry request X error 727ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar * rather than GLXBadDrawable, in what is hoped to be a rare 72891e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar * case of an invalid drawable. In practice most and possibly all 729ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar * X11 apps using GLX shouldn't notice a difference. 730ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar */ 731a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar if (XGetGeometry 732a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar (dpy, drawable, &root, &x, &y, &width, &height, &bd, &depth)) { 73321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar switch (attribute) { 7345ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar case GLX_WIDTH: 735cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar *value = width; 736cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar break; 737cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 73821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar case GLX_HEIGHT: 7395ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar *value = height; 740cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar break; 741cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 742cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 74321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar#else 7445ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar GetDrawableAttribute(dpy, drawable, attribute, value); 745cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar#endif 746cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 747cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 74812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 74912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar#ifndef GLX_USE_APPLEGL 75012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar/** 75112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar * Query an attribute of a pbuffer. 75212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar */ 75312cfe036d809173a25af0104844d4bb66a92252bDaniel DunbarPUBLIC int 75412cfe036d809173a25af0104844d4bb66a92252bDaniel DunbarglXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX drawable, 755a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar int attribute, unsigned int *value) 75612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar{ 75712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar return GetDrawableAttribute(dpy, drawable, attribute, value); 75812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar} 75912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar#endif 76012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 76112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar/** 76212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar * Select the event mask for a drawable. 76312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar */ 76412cfe036d809173a25af0104844d4bb66a92252bDaniel DunbarPUBLIC void 76512cfe036d809173a25af0104844d4bb66a92252bDaniel DunbarglXSelectEvent(Display * dpy, GLXDrawable drawable, unsigned long mask) 76612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar{ 76712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar#ifdef GLX_USE_APPLEGL 76812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar XWindowAttributes xwattr; 76912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 77012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar if (apple_glx_pbuffer_set_event_mask(drawable, mask)) 77112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar return; /*done */ 77212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 77312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar /* 77412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar * The spec allows a window, but currently there are no valid 77512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar * events for a window, so do nothing. 77612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar */ 777a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar if (XGetWindowAttributes(dpy, drawable, &xwattr)) 77812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar return; /*done */ 77912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar /* The drawable seems to be invalid. Report an error. */ 78012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 78112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar __glXSendError(dpy, GLXBadDrawable, drawable, 78212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar X_GLXChangeDrawableAttributes, false); 78312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar#else 78412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar CARD32 attribs[2]; 78512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 78612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar attribs[0] = (CARD32) GLX_EVENT_MASK; 78712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar attribs[1] = (CARD32) mask; 78812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 789cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar ChangeDrawableAttribute(dpy, drawable, attribs, 1); 790cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar#endif 791cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 792a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 793ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 794ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar/** 795ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar * Get the selected event mask for a drawable. 796a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar */ 797ba1021388e6839b76c8968b931189361c7286674Daniel DunbarPUBLIC void 798ba1021388e6839b76c8968b931189361c7286674Daniel DunbarglXGetSelectedEvent(Display * dpy, GLXDrawable drawable, unsigned long *mask) 799a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar{ 800ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar#ifdef GLX_USE_APPLEGL 801a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar XWindowAttributes xwattr; 80210ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar 803ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar if (apple_glx_pbuffer_get_event_mask(drawable, mask)) 8048202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier return; /*done */ 80510ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar 806ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar /* 807ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar * The spec allows a window, but currently there are no valid 808ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar * events for a window, so do nothing, but set the mask to 0. 80910ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar */ 810ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar if (XGetWindowAttributes(dpy, drawable, &xwattr)) { 811ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar /* The window is valid, so set the mask to 0. */ 812ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar *mask = 0; 813ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar return; /*done */ 814ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar } 815ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar /* The drawable seems to be invalid. Report an error. */ 816ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 817ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar __glXSendError(dpy, GLXBadDrawable, drawable, X_GLXGetDrawableAttributes, 818ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar true); 819a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar#else 820ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar unsigned int value; 821ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 822ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 823ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar /* The non-sense with value is required because on LP64 platforms 824ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar * sizeof(unsigned int) != sizeof(unsigned long). On little-endian 82510ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar * we could just type-cast the pointer, but why? 826ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar */ 827a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 82810ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar GetDrawableAttribute(dpy, drawable, GLX_EVENT_MASK_SGIX, &value); 82910ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar *mask = value; 83053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#endif 83153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 8329d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger 8339d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger 8349d0fbeadc455c8292837b738b6af315d27930637Joerg SonnenbergerPUBLIC GLXPixmap 835b5e2f698accd4d3a1379983304a2f31ec194c332Daniel DunbarglXCreatePixmap(Display * dpy, GLXFBConfig config, Pixmap pixmap, 836b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar const int *attrib_list) 837b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar{ 838b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar WARN_ONCE_GLX_1_3(dpy, __func__); 8399d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger 840b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar#ifdef GLX_USE_APPLEGL 841b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar const __GLcontextModes *modes = (const __GLcontextModes *) config; 842b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar 843b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar if (apple_glx_pixmap_create(dpy, modes->screen, pixmap, modes)) 844b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar return None; 84574edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar 84665f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger return pixmap; 847be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier#else 84821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar return CreateDrawable(dpy, (__GLcontextModes *) config, 849a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar (Drawable) pixmap, attrib_list, X_GLXCreatePixmap); 850a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar#endif 851a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar} 8521368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar 8535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 854a82318332c9e9b61d3d17371e675ca2859877ee5Daniel DunbarPUBLIC GLXWindow 8552fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel DunbarglXCreateWindow(Display * dpy, GLXFBConfig config, Window win, 8562fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar const int *attrib_list) 8572fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar{ 858b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar WARN_ONCE_GLX_1_3(dpy, __func__); 85936df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar#ifdef GLX_USE_APPLEGL 86036df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar XWindowAttributes xwattr; 86136df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar XVisualInfo *visinfo; 86236df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar 86336df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar (void) attrib_list; /*unused according to GLX 1.4 */ 86436df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar 86536df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar XGetWindowAttributes(dpy, win, &xwattr); 86636df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar 86736df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar visinfo = glXGetVisualFromFBConfig(dpy, config); 86836df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar 8697587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (NULL == visinfo) { 8703f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar __glXSendError(dpy, GLXBadFBConfig, 0, X_GLXCreateWindow, false); 8713f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar return None; 8722fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 8732fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 8742fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (visinfo->visualid != XVisualIDFromVisual(xwattr.visual)) { 875a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar __glXSendError(dpy, BadMatch, 0, X_GLXCreateWindow, true); 876a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar return None; 87710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar } 8788202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier 8792fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar XFree(visinfo); 880a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 881a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar return win; 882a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar#else 8832fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar return CreateDrawable(dpy, (__GLcontextModes *) config, 8842fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar (Drawable) win, attrib_list, X_GLXCreateWindow); 8852fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#endif 8862fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar} 887a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 88838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar 8892fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel DunbarPUBLIC void 8902fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel DunbarglXDestroyPixmap(Display * dpy, GLXPixmap pixmap) 8912fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar{ 892be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier WARN_ONCE_GLX_1_3(dpy, __func__); 8932fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#ifdef GLX_USE_APPLEGL 894be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar if (apple_glx_pixmap_destroy(dpy, pixmap)) 895be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar __glXSendError(dpy, GLXBadPixmap, pixmap, X_GLXDestroyPixmap, false); 8962fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#else 8972fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar DestroyDrawable(dpy, (GLXDrawable) pixmap, X_GLXDestroyPixmap); 8982fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#endif 899a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar} 900a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 901a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 902a82318332c9e9b61d3d17371e675ca2859877ee5Daniel DunbarPUBLIC void 9032fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel DunbarglXDestroyWindow(Display * dpy, GLXWindow win) 9042fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar{ 9053dbd6c51bcd8a730c3fe58e29d7e0d999a94fa91Daniel Dunbar WARN_ONCE_GLX_1_3(dpy, __func__); 9062fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#ifndef GLX_USE_APPLEGL 9072fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar DestroyDrawable(dpy, (GLXDrawable) win, X_GLXDestroyWindow); 9082fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#endif 9092fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar} 91032c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar 9111368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar#ifndef GLX_USE_APPLEGL 91232c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel DunbarPUBLIC 91332c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel DunbarGLX_ALIAS_VOID(glXDestroyGLXPbufferSGIX, 91432c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar (Display * dpy, GLXPbufferSGIX pbuf), 9152fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar (dpy, pbuf), glXDestroyPbuffer) 916a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 917a82318332c9e9b61d3d17371e675ca2859877ee5Daniel DunbarPUBLIC 9182fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel DunbarGLX_ALIAS_VOID(glXSelectEventSGIX, 9192fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar (Display * dpy, GLXDrawable drawable, 9202fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar unsigned long mask), (dpy, drawable, mask), glXSelectEvent) 9212fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 922be1cc3eec682ca73361edb4109a7969452d3dbebDaniel DunbarPUBLIC 923b822f72c708e235a135fcaf9eb1dba8c20c6a680Eric ChristopherGLX_ALIAS_VOID(glXGetSelectedEventSGIX, 924b822f72c708e235a135fcaf9eb1dba8c20c6a680Eric Christopher (Display * dpy, GLXDrawable drawable, 9256c22939938d9596af43ebd456f68f8e49b42500aDavid Blaikie unsigned long *mask), (dpy, drawable, mask), 9266c22939938d9596af43ebd456f68f8e49b42500aDavid Blaikie glXGetSelectedEvent) 9276c22939938d9596af43ebd456f68f8e49b42500aDavid Blaikie#endif 9286467c9bf4f07f54789d3ed902f04048f4d80ad47Chad Rosier