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