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