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