xref: /aosp_15_r20/external/mesa3d/src/glx/single2.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: SGI-B-2.0
6*61046927SAndroid Build Coastguard Worker  */
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <stdio.h>
9*61046927SAndroid Build Coastguard Worker #include <assert.h>
10*61046927SAndroid Build Coastguard Worker #include "glxclient.h"
11*61046927SAndroid Build Coastguard Worker #include "packsingle.h"
12*61046927SAndroid Build Coastguard Worker #include "glxextensions.h"
13*61046927SAndroid Build Coastguard Worker #include "indirect.h"
14*61046927SAndroid Build Coastguard Worker #include "indirect_vertex_array.h"
15*61046927SAndroid Build Coastguard Worker #include "glapi.h"
16*61046927SAndroid Build Coastguard Worker #include <xcb/xcb.h>
17*61046927SAndroid Build Coastguard Worker #include <xcb/glx.h>
18*61046927SAndroid Build Coastguard Worker #include <X11/Xlib-xcb.h>
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #if !defined(__GNUC__)
21*61046927SAndroid Build Coastguard Worker #  define __builtin_expect(x, y) x
22*61046927SAndroid Build Coastguard Worker #endif
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker /* Used for GL_ARB_transpose_matrix */
25*61046927SAndroid Build Coastguard Worker static void
TransposeMatrixf(GLfloat m[16])26*61046927SAndroid Build Coastguard Worker TransposeMatrixf(GLfloat m[16])
27*61046927SAndroid Build Coastguard Worker {
28*61046927SAndroid Build Coastguard Worker    int i, j;
29*61046927SAndroid Build Coastguard Worker    for (i = 0; i < 4; i++) {
30*61046927SAndroid Build Coastguard Worker       for (j = 0; j < i; j++) {
31*61046927SAndroid Build Coastguard Worker          GLfloat tmp = m[i * 4 + j];
32*61046927SAndroid Build Coastguard Worker          m[i * 4 + j] = m[j * 4 + i];
33*61046927SAndroid Build Coastguard Worker          m[j * 4 + i] = tmp;
34*61046927SAndroid Build Coastguard Worker       }
35*61046927SAndroid Build Coastguard Worker    }
36*61046927SAndroid Build Coastguard Worker }
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker /* Used for GL_ARB_transpose_matrix */
39*61046927SAndroid Build Coastguard Worker static void
TransposeMatrixb(GLboolean m[16])40*61046927SAndroid Build Coastguard Worker TransposeMatrixb(GLboolean m[16])
41*61046927SAndroid Build Coastguard Worker {
42*61046927SAndroid Build Coastguard Worker    int i, j;
43*61046927SAndroid Build Coastguard Worker    for (i = 0; i < 4; i++) {
44*61046927SAndroid Build Coastguard Worker       for (j = 0; j < i; j++) {
45*61046927SAndroid Build Coastguard Worker          GLboolean tmp = m[i * 4 + j];
46*61046927SAndroid Build Coastguard Worker          m[i * 4 + j] = m[j * 4 + i];
47*61046927SAndroid Build Coastguard Worker          m[j * 4 + i] = tmp;
48*61046927SAndroid Build Coastguard Worker       }
49*61046927SAndroid Build Coastguard Worker    }
50*61046927SAndroid Build Coastguard Worker }
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker /* Used for GL_ARB_transpose_matrix */
53*61046927SAndroid Build Coastguard Worker static void
TransposeMatrixd(GLdouble m[16])54*61046927SAndroid Build Coastguard Worker TransposeMatrixd(GLdouble m[16])
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker    int i, j;
57*61046927SAndroid Build Coastguard Worker    for (i = 0; i < 4; i++) {
58*61046927SAndroid Build Coastguard Worker       for (j = 0; j < i; j++) {
59*61046927SAndroid Build Coastguard Worker          GLdouble tmp = m[i * 4 + j];
60*61046927SAndroid Build Coastguard Worker          m[i * 4 + j] = m[j * 4 + i];
61*61046927SAndroid Build Coastguard Worker          m[j * 4 + i] = tmp;
62*61046927SAndroid Build Coastguard Worker       }
63*61046927SAndroid Build Coastguard Worker    }
64*61046927SAndroid Build Coastguard Worker }
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker /* Used for GL_ARB_transpose_matrix */
67*61046927SAndroid Build Coastguard Worker static void
TransposeMatrixi(GLint m[16])68*61046927SAndroid Build Coastguard Worker TransposeMatrixi(GLint m[16])
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker    int i, j;
71*61046927SAndroid Build Coastguard Worker    for (i = 0; i < 4; i++) {
72*61046927SAndroid Build Coastguard Worker       for (j = 0; j < i; j++) {
73*61046927SAndroid Build Coastguard Worker          GLint tmp = m[i * 4 + j];
74*61046927SAndroid Build Coastguard Worker          m[i * 4 + j] = m[j * 4 + i];
75*61046927SAndroid Build Coastguard Worker          m[j * 4 + i] = tmp;
76*61046927SAndroid Build Coastguard Worker       }
77*61046927SAndroid Build Coastguard Worker    }
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker /**
82*61046927SAndroid Build Coastguard Worker  * Remap a transpose-matrix enum to a non-transpose-matrix enum.  Enums
83*61046927SAndroid Build Coastguard Worker  * that are not transpose-matrix enums are unaffected.
84*61046927SAndroid Build Coastguard Worker  */
85*61046927SAndroid Build Coastguard Worker static GLenum
RemapTransposeEnum(GLenum e)86*61046927SAndroid Build Coastguard Worker RemapTransposeEnum(GLenum e)
87*61046927SAndroid Build Coastguard Worker {
88*61046927SAndroid Build Coastguard Worker    switch (e) {
89*61046927SAndroid Build Coastguard Worker    case GL_TRANSPOSE_MODELVIEW_MATRIX:
90*61046927SAndroid Build Coastguard Worker    case GL_TRANSPOSE_PROJECTION_MATRIX:
91*61046927SAndroid Build Coastguard Worker    case GL_TRANSPOSE_TEXTURE_MATRIX:
92*61046927SAndroid Build Coastguard Worker       return e - (GL_TRANSPOSE_MODELVIEW_MATRIX - GL_MODELVIEW_MATRIX);
93*61046927SAndroid Build Coastguard Worker    case GL_TRANSPOSE_COLOR_MATRIX:
94*61046927SAndroid Build Coastguard Worker       return GL_COLOR_MATRIX;
95*61046927SAndroid Build Coastguard Worker    default:
96*61046927SAndroid Build Coastguard Worker       return e;
97*61046927SAndroid Build Coastguard Worker    };
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker GLenum
__indirect_glGetError(void)102*61046927SAndroid Build Coastguard Worker __indirect_glGetError(void)
103*61046927SAndroid Build Coastguard Worker {
104*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
105*61046927SAndroid Build Coastguard Worker    GLuint retval = GL_NO_ERROR;
106*61046927SAndroid Build Coastguard Worker    xGLXGetErrorReply reply;
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker    if (gc->error) {
109*61046927SAndroid Build Coastguard Worker       /* Use internal error first */
110*61046927SAndroid Build Coastguard Worker       retval = gc->error;
111*61046927SAndroid Build Coastguard Worker       gc->error = GL_NO_ERROR;
112*61046927SAndroid Build Coastguard Worker       return retval;
113*61046927SAndroid Build Coastguard Worker    }
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
116*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_GetError, 0);
117*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
118*61046927SAndroid Build Coastguard Worker    retval = reply.error;
119*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker    return retval;
122*61046927SAndroid Build Coastguard Worker }
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker /**
126*61046927SAndroid Build Coastguard Worker  * Get the selected attribute from the client state.
127*61046927SAndroid Build Coastguard Worker  *
128*61046927SAndroid Build Coastguard Worker  * \returns
129*61046927SAndroid Build Coastguard Worker  * On success \c GL_TRUE is returned.  Otherwise, \c GL_FALSE is returned.
130*61046927SAndroid Build Coastguard Worker  */
131*61046927SAndroid Build Coastguard Worker static GLboolean
get_client_data(struct glx_context * gc,GLenum cap,GLintptr * data)132*61046927SAndroid Build Coastguard Worker get_client_data(struct glx_context * gc, GLenum cap, GLintptr * data)
133*61046927SAndroid Build Coastguard Worker {
134*61046927SAndroid Build Coastguard Worker    GLboolean retval = GL_TRUE;
135*61046927SAndroid Build Coastguard Worker    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
136*61046927SAndroid Build Coastguard Worker    const GLint tex_unit = __glXGetActiveTextureUnit(state);
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    switch (cap) {
140*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
141*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
142*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
143*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY:
144*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY:
145*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY:
146*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORD_ARRAY:
147*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayEnable(state, cap, 0, data);
148*61046927SAndroid Build Coastguard Worker       break;
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY_SIZE:
151*61046927SAndroid Build Coastguard Worker       retval = __glXGetArraySize(state, GL_VERTEX_ARRAY, 0, data);
152*61046927SAndroid Build Coastguard Worker       break;
153*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY_SIZE:
154*61046927SAndroid Build Coastguard Worker       retval = __glXGetArraySize(state, GL_COLOR_ARRAY, 0, data);
155*61046927SAndroid Build Coastguard Worker       break;
156*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY_SIZE:
157*61046927SAndroid Build Coastguard Worker       retval = __glXGetArraySize(state, GL_SECONDARY_COLOR_ARRAY, 0, data);
158*61046927SAndroid Build Coastguard Worker       break;
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY_TYPE:
161*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayType(state, GL_VERTEX_ARRAY, 0, data);
162*61046927SAndroid Build Coastguard Worker       break;
163*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY_TYPE:
164*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayType(state, GL_NORMAL_ARRAY, 0, data);
165*61046927SAndroid Build Coastguard Worker       break;
166*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY_TYPE:
167*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayType(state, GL_INDEX_ARRAY, 0, data);
168*61046927SAndroid Build Coastguard Worker       break;
169*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY_TYPE:
170*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayType(state, GL_COLOR_ARRAY, 0, data);
171*61046927SAndroid Build Coastguard Worker       break;
172*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY_TYPE:
173*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayType(state, GL_SECONDARY_COLOR_ARRAY, 0, data);
174*61046927SAndroid Build Coastguard Worker       break;
175*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORD_ARRAY_TYPE:
176*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayType(state, GL_FOG_COORD_ARRAY, 0, data);
177*61046927SAndroid Build Coastguard Worker       break;
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY_STRIDE:
180*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayStride(state, GL_VERTEX_ARRAY, 0, data);
181*61046927SAndroid Build Coastguard Worker       break;
182*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY_STRIDE:
183*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayStride(state, GL_NORMAL_ARRAY, 0, data);
184*61046927SAndroid Build Coastguard Worker       break;
185*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY_STRIDE:
186*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayStride(state, GL_INDEX_ARRAY, 0, data);
187*61046927SAndroid Build Coastguard Worker       break;
188*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY_STRIDE:
189*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayStride(state, GL_EDGE_FLAG_ARRAY, 0, data);
190*61046927SAndroid Build Coastguard Worker       break;
191*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY_STRIDE:
192*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayStride(state, GL_COLOR_ARRAY, 0, data);
193*61046927SAndroid Build Coastguard Worker       break;
194*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY_STRIDE:
195*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayStride(state, GL_SECONDARY_COLOR_ARRAY, 0, data);
196*61046927SAndroid Build Coastguard Worker       break;
197*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORD_ARRAY_STRIDE:
198*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayStride(state, GL_FOG_COORD_ARRAY, 0, data);
199*61046927SAndroid Build Coastguard Worker       break;
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
202*61046927SAndroid Build Coastguard Worker       retval =
203*61046927SAndroid Build Coastguard Worker          __glXGetArrayEnable(state, GL_TEXTURE_COORD_ARRAY, tex_unit, data);
204*61046927SAndroid Build Coastguard Worker       break;
205*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY_SIZE:
206*61046927SAndroid Build Coastguard Worker       retval =
207*61046927SAndroid Build Coastguard Worker          __glXGetArraySize(state, GL_TEXTURE_COORD_ARRAY, tex_unit, data);
208*61046927SAndroid Build Coastguard Worker       break;
209*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY_TYPE:
210*61046927SAndroid Build Coastguard Worker       retval =
211*61046927SAndroid Build Coastguard Worker          __glXGetArrayType(state, GL_TEXTURE_COORD_ARRAY, tex_unit, data);
212*61046927SAndroid Build Coastguard Worker       break;
213*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY_STRIDE:
214*61046927SAndroid Build Coastguard Worker       retval =
215*61046927SAndroid Build Coastguard Worker          __glXGetArrayStride(state, GL_TEXTURE_COORD_ARRAY, tex_unit, data);
216*61046927SAndroid Build Coastguard Worker       break;
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker    case GL_MAX_ELEMENTS_VERTICES:
219*61046927SAndroid Build Coastguard Worker    case GL_MAX_ELEMENTS_INDICES:
220*61046927SAndroid Build Coastguard Worker       retval = GL_TRUE;
221*61046927SAndroid Build Coastguard Worker       *data = ~0UL;
222*61046927SAndroid Build Coastguard Worker       break;
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker    case GL_PACK_ROW_LENGTH:
226*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.rowLength;
227*61046927SAndroid Build Coastguard Worker       break;
228*61046927SAndroid Build Coastguard Worker    case GL_PACK_IMAGE_HEIGHT:
229*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.imageHeight;
230*61046927SAndroid Build Coastguard Worker       break;
231*61046927SAndroid Build Coastguard Worker    case GL_PACK_SKIP_ROWS:
232*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.skipRows;
233*61046927SAndroid Build Coastguard Worker       break;
234*61046927SAndroid Build Coastguard Worker    case GL_PACK_SKIP_PIXELS:
235*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.skipPixels;
236*61046927SAndroid Build Coastguard Worker       break;
237*61046927SAndroid Build Coastguard Worker    case GL_PACK_SKIP_IMAGES:
238*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.skipImages;
239*61046927SAndroid Build Coastguard Worker       break;
240*61046927SAndroid Build Coastguard Worker    case GL_PACK_ALIGNMENT:
241*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.alignment;
242*61046927SAndroid Build Coastguard Worker       break;
243*61046927SAndroid Build Coastguard Worker    case GL_PACK_SWAP_BYTES:
244*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.swapEndian;
245*61046927SAndroid Build Coastguard Worker       break;
246*61046927SAndroid Build Coastguard Worker    case GL_PACK_LSB_FIRST:
247*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storePack.lsbFirst;
248*61046927SAndroid Build Coastguard Worker       break;
249*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_ROW_LENGTH:
250*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.rowLength;
251*61046927SAndroid Build Coastguard Worker       break;
252*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_IMAGE_HEIGHT:
253*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.imageHeight;
254*61046927SAndroid Build Coastguard Worker       break;
255*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_SKIP_ROWS:
256*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.skipRows;
257*61046927SAndroid Build Coastguard Worker       break;
258*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_SKIP_PIXELS:
259*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.skipPixels;
260*61046927SAndroid Build Coastguard Worker       break;
261*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_SKIP_IMAGES:
262*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.skipImages;
263*61046927SAndroid Build Coastguard Worker       break;
264*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_ALIGNMENT:
265*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.alignment;
266*61046927SAndroid Build Coastguard Worker       break;
267*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_SWAP_BYTES:
268*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.swapEndian;
269*61046927SAndroid Build Coastguard Worker       break;
270*61046927SAndroid Build Coastguard Worker    case GL_UNPACK_LSB_FIRST:
271*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) state->storeUnpack.lsbFirst;
272*61046927SAndroid Build Coastguard Worker       break;
273*61046927SAndroid Build Coastguard Worker    case GL_CLIENT_ATTRIB_STACK_DEPTH:
274*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) (gc->attributes.stackPointer - gc->attributes.stack);
275*61046927SAndroid Build Coastguard Worker       break;
276*61046927SAndroid Build Coastguard Worker    case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
277*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) __GL_CLIENT_ATTRIB_STACK_DEPTH;
278*61046927SAndroid Build Coastguard Worker       break;
279*61046927SAndroid Build Coastguard Worker    case GL_CLIENT_ACTIVE_TEXTURE:
280*61046927SAndroid Build Coastguard Worker       *data = (GLintptr) (tex_unit + GL_TEXTURE0);
281*61046927SAndroid Build Coastguard Worker       break;
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker    default:
284*61046927SAndroid Build Coastguard Worker       retval = GL_FALSE;
285*61046927SAndroid Build Coastguard Worker       break;
286*61046927SAndroid Build Coastguard Worker    }
287*61046927SAndroid Build Coastguard Worker 
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    return retval;
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker void
__indirect_glGetBooleanv(GLenum val,GLboolean * b)294*61046927SAndroid Build Coastguard Worker __indirect_glGetBooleanv(GLenum val, GLboolean * b)
295*61046927SAndroid Build Coastguard Worker {
296*61046927SAndroid Build Coastguard Worker    const GLenum origVal = val;
297*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
298*61046927SAndroid Build Coastguard Worker    xGLXSingleReply reply;
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker    val = RemapTransposeEnum(val);
301*61046927SAndroid Build Coastguard Worker 
302*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
303*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_GetBooleanv, 4);
304*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, val);
305*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
306*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_GET_SIZE(compsize);
307*61046927SAndroid Build Coastguard Worker 
308*61046927SAndroid Build Coastguard Worker    if (compsize == 0) {
309*61046927SAndroid Build Coastguard Worker       /*
310*61046927SAndroid Build Coastguard Worker        ** Error occurred; don't modify user's buffer.
311*61046927SAndroid Build Coastguard Worker        */
312*61046927SAndroid Build Coastguard Worker    }
313*61046927SAndroid Build Coastguard Worker    else {
314*61046927SAndroid Build Coastguard Worker       GLintptr data;
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker       /*
317*61046927SAndroid Build Coastguard Worker        ** We still needed to send the request to the server in order to
318*61046927SAndroid Build Coastguard Worker        ** find out whether it was legal to make a query (it's illegal,
319*61046927SAndroid Build Coastguard Worker        ** for example, to call a query between glBegin() and glEnd()).
320*61046927SAndroid Build Coastguard Worker        */
321*61046927SAndroid Build Coastguard Worker 
322*61046927SAndroid Build Coastguard Worker       if (get_client_data(gc, val, &data)) {
323*61046927SAndroid Build Coastguard Worker          *b = (GLboolean) data;
324*61046927SAndroid Build Coastguard Worker       }
325*61046927SAndroid Build Coastguard Worker       else {
326*61046927SAndroid Build Coastguard Worker          /*
327*61046927SAndroid Build Coastguard Worker           ** Not a local value, so use what we got from the server.
328*61046927SAndroid Build Coastguard Worker           */
329*61046927SAndroid Build Coastguard Worker          if (compsize == 1) {
330*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_CHAR(b);
331*61046927SAndroid Build Coastguard Worker          }
332*61046927SAndroid Build Coastguard Worker          else {
333*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_CHAR_ARRAY(b, compsize);
334*61046927SAndroid Build Coastguard Worker             if (val != origVal) {
335*61046927SAndroid Build Coastguard Worker                /* matrix transpose */
336*61046927SAndroid Build Coastguard Worker                TransposeMatrixb(b);
337*61046927SAndroid Build Coastguard Worker             }
338*61046927SAndroid Build Coastguard Worker          }
339*61046927SAndroid Build Coastguard Worker       }
340*61046927SAndroid Build Coastguard Worker    }
341*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
342*61046927SAndroid Build Coastguard Worker }
343*61046927SAndroid Build Coastguard Worker 
344*61046927SAndroid Build Coastguard Worker void
__indirect_glGetDoublev(GLenum val,GLdouble * d)345*61046927SAndroid Build Coastguard Worker __indirect_glGetDoublev(GLenum val, GLdouble * d)
346*61046927SAndroid Build Coastguard Worker {
347*61046927SAndroid Build Coastguard Worker    const GLenum origVal = val;
348*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
349*61046927SAndroid Build Coastguard Worker    xGLXSingleReply reply;
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    val = RemapTransposeEnum(val);
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
354*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_GetDoublev, 4);
355*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, val);
356*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
357*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_GET_SIZE(compsize);
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker    if (compsize == 0) {
360*61046927SAndroid Build Coastguard Worker       /*
361*61046927SAndroid Build Coastguard Worker        ** Error occurred; don't modify user's buffer.
362*61046927SAndroid Build Coastguard Worker        */
363*61046927SAndroid Build Coastguard Worker    }
364*61046927SAndroid Build Coastguard Worker    else {
365*61046927SAndroid Build Coastguard Worker       GLintptr data;
366*61046927SAndroid Build Coastguard Worker 
367*61046927SAndroid Build Coastguard Worker       /*
368*61046927SAndroid Build Coastguard Worker        ** We still needed to send the request to the server in order to
369*61046927SAndroid Build Coastguard Worker        ** find out whether it was legal to make a query (it's illegal,
370*61046927SAndroid Build Coastguard Worker        ** for example, to call a query between glBegin() and glEnd()).
371*61046927SAndroid Build Coastguard Worker        */
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker       if (get_client_data(gc, val, &data)) {
374*61046927SAndroid Build Coastguard Worker          *d = (GLdouble) data;
375*61046927SAndroid Build Coastguard Worker       }
376*61046927SAndroid Build Coastguard Worker       else {
377*61046927SAndroid Build Coastguard Worker          /*
378*61046927SAndroid Build Coastguard Worker           ** Not a local value, so use what we got from the server.
379*61046927SAndroid Build Coastguard Worker           */
380*61046927SAndroid Build Coastguard Worker          if (compsize == 1) {
381*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_DOUBLE(d);
382*61046927SAndroid Build Coastguard Worker          }
383*61046927SAndroid Build Coastguard Worker          else {
384*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_DOUBLE_ARRAY(d, compsize);
385*61046927SAndroid Build Coastguard Worker             if (val != origVal) {
386*61046927SAndroid Build Coastguard Worker                /* matrix transpose */
387*61046927SAndroid Build Coastguard Worker                TransposeMatrixd(d);
388*61046927SAndroid Build Coastguard Worker             }
389*61046927SAndroid Build Coastguard Worker          }
390*61046927SAndroid Build Coastguard Worker       }
391*61046927SAndroid Build Coastguard Worker    }
392*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
393*61046927SAndroid Build Coastguard Worker }
394*61046927SAndroid Build Coastguard Worker 
395*61046927SAndroid Build Coastguard Worker void
__indirect_glGetFloatv(GLenum val,GLfloat * f)396*61046927SAndroid Build Coastguard Worker __indirect_glGetFloatv(GLenum val, GLfloat * f)
397*61046927SAndroid Build Coastguard Worker {
398*61046927SAndroid Build Coastguard Worker    const GLenum origVal = val;
399*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
400*61046927SAndroid Build Coastguard Worker    xGLXSingleReply reply;
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker    val = RemapTransposeEnum(val);
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
405*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_GetFloatv, 4);
406*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, val);
407*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
408*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_GET_SIZE(compsize);
409*61046927SAndroid Build Coastguard Worker 
410*61046927SAndroid Build Coastguard Worker    if (compsize == 0) {
411*61046927SAndroid Build Coastguard Worker       /*
412*61046927SAndroid Build Coastguard Worker        ** Error occurred; don't modify user's buffer.
413*61046927SAndroid Build Coastguard Worker        */
414*61046927SAndroid Build Coastguard Worker    }
415*61046927SAndroid Build Coastguard Worker    else {
416*61046927SAndroid Build Coastguard Worker       GLintptr data;
417*61046927SAndroid Build Coastguard Worker 
418*61046927SAndroid Build Coastguard Worker       /*
419*61046927SAndroid Build Coastguard Worker        ** We still needed to send the request to the server in order to
420*61046927SAndroid Build Coastguard Worker        ** find out whether it was legal to make a query (it's illegal,
421*61046927SAndroid Build Coastguard Worker        ** for example, to call a query between glBegin() and glEnd()).
422*61046927SAndroid Build Coastguard Worker        */
423*61046927SAndroid Build Coastguard Worker 
424*61046927SAndroid Build Coastguard Worker       if (get_client_data(gc, val, &data)) {
425*61046927SAndroid Build Coastguard Worker          *f = (GLfloat) data;
426*61046927SAndroid Build Coastguard Worker       }
427*61046927SAndroid Build Coastguard Worker       else {
428*61046927SAndroid Build Coastguard Worker          /*
429*61046927SAndroid Build Coastguard Worker           ** Not a local value, so use what we got from the server.
430*61046927SAndroid Build Coastguard Worker           */
431*61046927SAndroid Build Coastguard Worker          if (compsize == 1) {
432*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_FLOAT(f);
433*61046927SAndroid Build Coastguard Worker          }
434*61046927SAndroid Build Coastguard Worker          else {
435*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_FLOAT_ARRAY(f, compsize);
436*61046927SAndroid Build Coastguard Worker             if (val != origVal) {
437*61046927SAndroid Build Coastguard Worker                /* matrix transpose */
438*61046927SAndroid Build Coastguard Worker                TransposeMatrixf(f);
439*61046927SAndroid Build Coastguard Worker             }
440*61046927SAndroid Build Coastguard Worker          }
441*61046927SAndroid Build Coastguard Worker       }
442*61046927SAndroid Build Coastguard Worker    }
443*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
444*61046927SAndroid Build Coastguard Worker }
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker void
__indirect_glGetIntegerv(GLenum val,GLint * i)447*61046927SAndroid Build Coastguard Worker __indirect_glGetIntegerv(GLenum val, GLint * i)
448*61046927SAndroid Build Coastguard Worker {
449*61046927SAndroid Build Coastguard Worker    const GLenum origVal = val;
450*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
451*61046927SAndroid Build Coastguard Worker    xGLXSingleReply reply;
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    val = RemapTransposeEnum(val);
454*61046927SAndroid Build Coastguard Worker 
455*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
456*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_GetIntegerv, 4);
457*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, val);
458*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
459*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_GET_SIZE(compsize);
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker    if (compsize == 0) {
462*61046927SAndroid Build Coastguard Worker       /*
463*61046927SAndroid Build Coastguard Worker        ** Error occurred; don't modify user's buffer.
464*61046927SAndroid Build Coastguard Worker        */
465*61046927SAndroid Build Coastguard Worker    }
466*61046927SAndroid Build Coastguard Worker    else {
467*61046927SAndroid Build Coastguard Worker       GLintptr data;
468*61046927SAndroid Build Coastguard Worker 
469*61046927SAndroid Build Coastguard Worker       /*
470*61046927SAndroid Build Coastguard Worker        ** We still needed to send the request to the server in order to
471*61046927SAndroid Build Coastguard Worker        ** find out whether it was legal to make a query (it's illegal,
472*61046927SAndroid Build Coastguard Worker        ** for example, to call a query between glBegin() and glEnd()).
473*61046927SAndroid Build Coastguard Worker        */
474*61046927SAndroid Build Coastguard Worker 
475*61046927SAndroid Build Coastguard Worker       if (get_client_data(gc, val, &data)) {
476*61046927SAndroid Build Coastguard Worker          *i = (GLint) data;
477*61046927SAndroid Build Coastguard Worker       }
478*61046927SAndroid Build Coastguard Worker       else {
479*61046927SAndroid Build Coastguard Worker          /*
480*61046927SAndroid Build Coastguard Worker           ** Not a local value, so use what we got from the server.
481*61046927SAndroid Build Coastguard Worker           */
482*61046927SAndroid Build Coastguard Worker          if (compsize == 1) {
483*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_LONG(i);
484*61046927SAndroid Build Coastguard Worker          }
485*61046927SAndroid Build Coastguard Worker          else {
486*61046927SAndroid Build Coastguard Worker             __GLX_SINGLE_GET_LONG_ARRAY(i, compsize);
487*61046927SAndroid Build Coastguard Worker             if (val != origVal) {
488*61046927SAndroid Build Coastguard Worker                /* matrix transpose */
489*61046927SAndroid Build Coastguard Worker                TransposeMatrixi(i);
490*61046927SAndroid Build Coastguard Worker             }
491*61046927SAndroid Build Coastguard Worker          }
492*61046927SAndroid Build Coastguard Worker       }
493*61046927SAndroid Build Coastguard Worker    }
494*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
495*61046927SAndroid Build Coastguard Worker }
496*61046927SAndroid Build Coastguard Worker 
497*61046927SAndroid Build Coastguard Worker /*
498*61046927SAndroid Build Coastguard Worker ** Send all pending commands to server.
499*61046927SAndroid Build Coastguard Worker */
500*61046927SAndroid Build Coastguard Worker void
__indirect_glFlush(void)501*61046927SAndroid Build Coastguard Worker __indirect_glFlush(void)
502*61046927SAndroid Build Coastguard Worker {
503*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
504*61046927SAndroid Build Coastguard Worker 
505*61046927SAndroid Build Coastguard Worker    if (!dpy)
506*61046927SAndroid Build Coastguard Worker       return;
507*61046927SAndroid Build Coastguard Worker 
508*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
509*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_Flush, 0);
510*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
511*61046927SAndroid Build Coastguard Worker 
512*61046927SAndroid Build Coastguard Worker    /* And finally flush the X protocol data */
513*61046927SAndroid Build Coastguard Worker    XFlush(dpy);
514*61046927SAndroid Build Coastguard Worker }
515*61046927SAndroid Build Coastguard Worker 
516*61046927SAndroid Build Coastguard Worker void
__indirect_glFeedbackBuffer(GLsizei size,GLenum type,GLfloat * buffer)517*61046927SAndroid Build Coastguard Worker __indirect_glFeedbackBuffer(GLsizei size, GLenum type, GLfloat * buffer)
518*61046927SAndroid Build Coastguard Worker {
519*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
520*61046927SAndroid Build Coastguard Worker 
521*61046927SAndroid Build Coastguard Worker    if (!dpy)
522*61046927SAndroid Build Coastguard Worker       return;
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
525*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_FeedbackBuffer, 8);
526*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, size);
527*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(4, type);
528*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker    gc->feedbackBuf = buffer;
531*61046927SAndroid Build Coastguard Worker }
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker void
__indirect_glSelectBuffer(GLsizei numnames,GLuint * buffer)534*61046927SAndroid Build Coastguard Worker __indirect_glSelectBuffer(GLsizei numnames, GLuint * buffer)
535*61046927SAndroid Build Coastguard Worker {
536*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
537*61046927SAndroid Build Coastguard Worker 
538*61046927SAndroid Build Coastguard Worker    if (!dpy)
539*61046927SAndroid Build Coastguard Worker       return;
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
542*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_SelectBuffer, 4);
543*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, numnames);
544*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
545*61046927SAndroid Build Coastguard Worker 
546*61046927SAndroid Build Coastguard Worker    gc->selectBuf = buffer;
547*61046927SAndroid Build Coastguard Worker }
548*61046927SAndroid Build Coastguard Worker 
549*61046927SAndroid Build Coastguard Worker GLint
__indirect_glRenderMode(GLenum mode)550*61046927SAndroid Build Coastguard Worker __indirect_glRenderMode(GLenum mode)
551*61046927SAndroid Build Coastguard Worker {
552*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
553*61046927SAndroid Build Coastguard Worker    GLint retval = 0;
554*61046927SAndroid Build Coastguard Worker    xGLXRenderModeReply reply;
555*61046927SAndroid Build Coastguard Worker 
556*61046927SAndroid Build Coastguard Worker    if (!dpy)
557*61046927SAndroid Build Coastguard Worker       return -1;
558*61046927SAndroid Build Coastguard Worker 
559*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
560*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_RenderMode, 4);
561*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, mode);
562*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
563*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_GET_RETVAL(retval, GLint);
564*61046927SAndroid Build Coastguard Worker 
565*61046927SAndroid Build Coastguard Worker    if (reply.newMode != mode) {
566*61046927SAndroid Build Coastguard Worker       /*
567*61046927SAndroid Build Coastguard Worker        ** Switch to new mode did not take effect, therefore an error
568*61046927SAndroid Build Coastguard Worker        ** occurred.  When an error happens the server won't send us any
569*61046927SAndroid Build Coastguard Worker        ** other data.
570*61046927SAndroid Build Coastguard Worker        */
571*61046927SAndroid Build Coastguard Worker    }
572*61046927SAndroid Build Coastguard Worker    else {
573*61046927SAndroid Build Coastguard Worker       /* Read the feedback or selection data */
574*61046927SAndroid Build Coastguard Worker       if (gc->renderMode == GL_FEEDBACK) {
575*61046927SAndroid Build Coastguard Worker          __GLX_SINGLE_GET_SIZE(compsize);
576*61046927SAndroid Build Coastguard Worker          __GLX_SINGLE_GET_FLOAT_ARRAY(gc->feedbackBuf, compsize);
577*61046927SAndroid Build Coastguard Worker       }
578*61046927SAndroid Build Coastguard Worker       else if (gc->renderMode == GL_SELECT) {
579*61046927SAndroid Build Coastguard Worker          __GLX_SINGLE_GET_SIZE(compsize);
580*61046927SAndroid Build Coastguard Worker          __GLX_SINGLE_GET_LONG_ARRAY(gc->selectBuf, compsize);
581*61046927SAndroid Build Coastguard Worker       }
582*61046927SAndroid Build Coastguard Worker       gc->renderMode = mode;
583*61046927SAndroid Build Coastguard Worker    }
584*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
585*61046927SAndroid Build Coastguard Worker 
586*61046927SAndroid Build Coastguard Worker    return retval;
587*61046927SAndroid Build Coastguard Worker }
588*61046927SAndroid Build Coastguard Worker 
589*61046927SAndroid Build Coastguard Worker void
__indirect_glFinish(void)590*61046927SAndroid Build Coastguard Worker __indirect_glFinish(void)
591*61046927SAndroid Build Coastguard Worker {
592*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
593*61046927SAndroid Build Coastguard Worker    xGLXSingleReply reply;
594*61046927SAndroid Build Coastguard Worker 
595*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
596*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_Finish, 0);
597*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
598*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker 
601*61046927SAndroid Build Coastguard Worker 
602*61046927SAndroid Build Coastguard Worker /**
603*61046927SAndroid Build Coastguard Worker  * Extract the major and minor version numbers from a version string.
604*61046927SAndroid Build Coastguard Worker  */
605*61046927SAndroid Build Coastguard Worker static void
version_from_string(const char * ver,int * major_version,int * minor_version)606*61046927SAndroid Build Coastguard Worker version_from_string(const char *ver, int *major_version, int *minor_version)
607*61046927SAndroid Build Coastguard Worker {
608*61046927SAndroid Build Coastguard Worker    const char *end;
609*61046927SAndroid Build Coastguard Worker    long major;
610*61046927SAndroid Build Coastguard Worker    long minor;
611*61046927SAndroid Build Coastguard Worker 
612*61046927SAndroid Build Coastguard Worker    major = strtol(ver, (char **) &end, 10);
613*61046927SAndroid Build Coastguard Worker    minor = strtol(end + 1, NULL, 10);
614*61046927SAndroid Build Coastguard Worker    *major_version = major;
615*61046927SAndroid Build Coastguard Worker    *minor_version = minor;
616*61046927SAndroid Build Coastguard Worker }
617*61046927SAndroid Build Coastguard Worker 
618*61046927SAndroid Build Coastguard Worker 
619*61046927SAndroid Build Coastguard Worker const GLubyte *
__indirect_glGetString(GLenum name)620*61046927SAndroid Build Coastguard Worker __indirect_glGetString(GLenum name)
621*61046927SAndroid Build Coastguard Worker {
622*61046927SAndroid Build Coastguard Worker    struct glx_context *gc = __glXGetCurrentContext();
623*61046927SAndroid Build Coastguard Worker    Display *dpy = gc->currentDpy;
624*61046927SAndroid Build Coastguard Worker    GLubyte *s = NULL;
625*61046927SAndroid Build Coastguard Worker 
626*61046927SAndroid Build Coastguard Worker    if (!dpy)
627*61046927SAndroid Build Coastguard Worker       return NULL;
628*61046927SAndroid Build Coastguard Worker 
629*61046927SAndroid Build Coastguard Worker    /*
630*61046927SAndroid Build Coastguard Worker     ** Return the cached copy if the string has already been fetched
631*61046927SAndroid Build Coastguard Worker     */
632*61046927SAndroid Build Coastguard Worker    switch (name) {
633*61046927SAndroid Build Coastguard Worker    case GL_VENDOR:
634*61046927SAndroid Build Coastguard Worker       if (gc->vendor)
635*61046927SAndroid Build Coastguard Worker          return gc->vendor;
636*61046927SAndroid Build Coastguard Worker       break;
637*61046927SAndroid Build Coastguard Worker    case GL_RENDERER:
638*61046927SAndroid Build Coastguard Worker       if (gc->renderer)
639*61046927SAndroid Build Coastguard Worker          return gc->renderer;
640*61046927SAndroid Build Coastguard Worker       break;
641*61046927SAndroid Build Coastguard Worker    case GL_VERSION:
642*61046927SAndroid Build Coastguard Worker       if (gc->version)
643*61046927SAndroid Build Coastguard Worker          return gc->version;
644*61046927SAndroid Build Coastguard Worker       break;
645*61046927SAndroid Build Coastguard Worker    case GL_EXTENSIONS:
646*61046927SAndroid Build Coastguard Worker       if (gc->extensions)
647*61046927SAndroid Build Coastguard Worker          return gc->extensions;
648*61046927SAndroid Build Coastguard Worker       break;
649*61046927SAndroid Build Coastguard Worker    default:
650*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
651*61046927SAndroid Build Coastguard Worker       return NULL;
652*61046927SAndroid Build Coastguard Worker    }
653*61046927SAndroid Build Coastguard Worker 
654*61046927SAndroid Build Coastguard Worker    /*
655*61046927SAndroid Build Coastguard Worker     ** Get requested string from server
656*61046927SAndroid Build Coastguard Worker     */
657*61046927SAndroid Build Coastguard Worker 
658*61046927SAndroid Build Coastguard Worker    (void) __glXFlushRenderBuffer(gc, gc->pc);
659*61046927SAndroid Build Coastguard Worker    s = (GLubyte *) __glXGetString(dpy, gc->currentContextTag, name);
660*61046927SAndroid Build Coastguard Worker    if (!s) {
661*61046927SAndroid Build Coastguard Worker       /* Throw data on the floor */
662*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_OUT_OF_MEMORY);
663*61046927SAndroid Build Coastguard Worker    }
664*61046927SAndroid Build Coastguard Worker    else {
665*61046927SAndroid Build Coastguard Worker       /*
666*61046927SAndroid Build Coastguard Worker        ** Update local cache
667*61046927SAndroid Build Coastguard Worker        */
668*61046927SAndroid Build Coastguard Worker       switch (name) {
669*61046927SAndroid Build Coastguard Worker       case GL_VENDOR:
670*61046927SAndroid Build Coastguard Worker          gc->vendor = s;
671*61046927SAndroid Build Coastguard Worker          break;
672*61046927SAndroid Build Coastguard Worker 
673*61046927SAndroid Build Coastguard Worker       case GL_RENDERER:
674*61046927SAndroid Build Coastguard Worker          gc->renderer = s;
675*61046927SAndroid Build Coastguard Worker          break;
676*61046927SAndroid Build Coastguard Worker 
677*61046927SAndroid Build Coastguard Worker       case GL_VERSION:{
678*61046927SAndroid Build Coastguard Worker             const int client_major = 1;
679*61046927SAndroid Build Coastguard Worker             const int client_minor = 4;
680*61046927SAndroid Build Coastguard Worker 
681*61046927SAndroid Build Coastguard Worker             version_from_string((char *) s,
682*61046927SAndroid Build Coastguard Worker                                 &gc->server_major, &gc->server_minor);
683*61046927SAndroid Build Coastguard Worker 
684*61046927SAndroid Build Coastguard Worker             if ((gc->server_major < client_major)
685*61046927SAndroid Build Coastguard Worker                 || ((gc->server_major == client_major)
686*61046927SAndroid Build Coastguard Worker                     && (gc->server_minor <= client_minor))) {
687*61046927SAndroid Build Coastguard Worker                gc->version = s;
688*61046927SAndroid Build Coastguard Worker             }
689*61046927SAndroid Build Coastguard Worker             else {
690*61046927SAndroid Build Coastguard Worker                /* Allow 7 bytes for the client-side GL version.  This allows
691*61046927SAndroid Build Coastguard Worker                 * for upto version 999.999.  I'm not holding my breath for
692*61046927SAndroid Build Coastguard Worker                 * that one!  The extra 4 is for the ' ()\0' that will be
693*61046927SAndroid Build Coastguard Worker                 * added.
694*61046927SAndroid Build Coastguard Worker                 */
695*61046927SAndroid Build Coastguard Worker                const size_t size = 7 + strlen((char *) s) + 4;
696*61046927SAndroid Build Coastguard Worker 
697*61046927SAndroid Build Coastguard Worker                gc->version = malloc(size);
698*61046927SAndroid Build Coastguard Worker                if (gc->version == NULL) {
699*61046927SAndroid Build Coastguard Worker                   /* If we couldn't allocate memory for the new string,
700*61046927SAndroid Build Coastguard Worker                    * make a best-effort and just copy the client-side version
701*61046927SAndroid Build Coastguard Worker                    * to the string and use that.  It probably doesn't
702*61046927SAndroid Build Coastguard Worker                    * matter what is done here.  If there not memory available
703*61046927SAndroid Build Coastguard Worker                    * for a short string, the system is probably going to die
704*61046927SAndroid Build Coastguard Worker                    * soon anyway.
705*61046927SAndroid Build Coastguard Worker                    */
706*61046927SAndroid Build Coastguard Worker                   snprintf((char *) s, strlen((char *) s) + 1, "%u.%u",
707*61046927SAndroid Build Coastguard Worker                            client_major, client_minor);
708*61046927SAndroid Build Coastguard Worker                   gc->version = s;
709*61046927SAndroid Build Coastguard Worker                }
710*61046927SAndroid Build Coastguard Worker                else {
711*61046927SAndroid Build Coastguard Worker                   snprintf((char *) gc->version, size, "%u.%u (%s)",
712*61046927SAndroid Build Coastguard Worker                            client_major, client_minor, s);
713*61046927SAndroid Build Coastguard Worker                   free(s);
714*61046927SAndroid Build Coastguard Worker                   s = gc->version;
715*61046927SAndroid Build Coastguard Worker                }
716*61046927SAndroid Build Coastguard Worker             }
717*61046927SAndroid Build Coastguard Worker             break;
718*61046927SAndroid Build Coastguard Worker          }
719*61046927SAndroid Build Coastguard Worker 
720*61046927SAndroid Build Coastguard Worker       case GL_EXTENSIONS:{
721*61046927SAndroid Build Coastguard Worker             __glXCalculateUsableGLExtensions(gc, (char *) s);
722*61046927SAndroid Build Coastguard Worker             free(s);
723*61046927SAndroid Build Coastguard Worker             s = gc->extensions;
724*61046927SAndroid Build Coastguard Worker             break;
725*61046927SAndroid Build Coastguard Worker          }
726*61046927SAndroid Build Coastguard Worker       }
727*61046927SAndroid Build Coastguard Worker    }
728*61046927SAndroid Build Coastguard Worker    return s;
729*61046927SAndroid Build Coastguard Worker }
730*61046927SAndroid Build Coastguard Worker 
731*61046927SAndroid Build Coastguard Worker GLboolean
__indirect_glIsEnabled(GLenum cap)732*61046927SAndroid Build Coastguard Worker __indirect_glIsEnabled(GLenum cap)
733*61046927SAndroid Build Coastguard Worker {
734*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_DECLARE_VARIABLES();
735*61046927SAndroid Build Coastguard Worker    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
736*61046927SAndroid Build Coastguard Worker    xGLXSingleReply reply;
737*61046927SAndroid Build Coastguard Worker    GLboolean retval = 0;
738*61046927SAndroid Build Coastguard Worker    GLintptr enable;
739*61046927SAndroid Build Coastguard Worker 
740*61046927SAndroid Build Coastguard Worker    if (!dpy)
741*61046927SAndroid Build Coastguard Worker       return 0;
742*61046927SAndroid Build Coastguard Worker 
743*61046927SAndroid Build Coastguard Worker    switch (cap) {
744*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
745*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
746*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
747*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY:
748*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY:
749*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY:
750*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORD_ARRAY:
751*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayEnable(state, cap, 0, &enable);
752*61046927SAndroid Build Coastguard Worker       assert(retval);
753*61046927SAndroid Build Coastguard Worker       return (GLboolean) enable;
754*61046927SAndroid Build Coastguard Worker       break;
755*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
756*61046927SAndroid Build Coastguard Worker       retval = __glXGetArrayEnable(state, GL_TEXTURE_COORD_ARRAY,
757*61046927SAndroid Build Coastguard Worker                                    __glXGetActiveTextureUnit(state), &enable);
758*61046927SAndroid Build Coastguard Worker       assert(retval);
759*61046927SAndroid Build Coastguard Worker       return (GLboolean) enable;
760*61046927SAndroid Build Coastguard Worker       break;
761*61046927SAndroid Build Coastguard Worker    }
762*61046927SAndroid Build Coastguard Worker 
763*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_LOAD_VARIABLES();
764*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_BEGIN(X_GLsop_IsEnabled, 4);
765*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_PUT_LONG(0, cap);
766*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_READ_XREPLY();
767*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_GET_RETVAL(retval, GLboolean);
768*61046927SAndroid Build Coastguard Worker    __GLX_SINGLE_END();
769*61046927SAndroid Build Coastguard Worker    return retval;
770*61046927SAndroid Build Coastguard Worker }
771*61046927SAndroid Build Coastguard Worker 
772*61046927SAndroid Build Coastguard Worker void
__indirect_glGetPointerv(GLenum pname,void ** params)773*61046927SAndroid Build Coastguard Worker __indirect_glGetPointerv(GLenum pname, void **params)
774*61046927SAndroid Build Coastguard Worker {
775*61046927SAndroid Build Coastguard Worker    struct glx_context *gc = __glXGetCurrentContext();
776*61046927SAndroid Build Coastguard Worker    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
777*61046927SAndroid Build Coastguard Worker    Display *dpy = gc->currentDpy;
778*61046927SAndroid Build Coastguard Worker 
779*61046927SAndroid Build Coastguard Worker    if (!dpy)
780*61046927SAndroid Build Coastguard Worker       return;
781*61046927SAndroid Build Coastguard Worker 
782*61046927SAndroid Build Coastguard Worker    switch (pname) {
783*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY_POINTER:
784*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY_POINTER:
785*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY_POINTER:
786*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY_POINTER:
787*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY_POINTER:
788*61046927SAndroid Build Coastguard Worker       __glXGetArrayPointer(state, pname - GL_VERTEX_ARRAY_POINTER
789*61046927SAndroid Build Coastguard Worker                            + GL_VERTEX_ARRAY, 0, params);
790*61046927SAndroid Build Coastguard Worker       return;
791*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY_POINTER:
792*61046927SAndroid Build Coastguard Worker       __glXGetArrayPointer(state, GL_TEXTURE_COORD_ARRAY,
793*61046927SAndroid Build Coastguard Worker                            __glXGetActiveTextureUnit(state), params);
794*61046927SAndroid Build Coastguard Worker       return;
795*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY_POINTER:
796*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORD_ARRAY_POINTER:
797*61046927SAndroid Build Coastguard Worker       __glXGetArrayPointer(state, pname - GL_FOG_COORD_ARRAY_POINTER
798*61046927SAndroid Build Coastguard Worker                            + GL_FOG_COORD_ARRAY, 0, params);
799*61046927SAndroid Build Coastguard Worker       return;
800*61046927SAndroid Build Coastguard Worker    case GL_FEEDBACK_BUFFER_POINTER:
801*61046927SAndroid Build Coastguard Worker       *params = (void *) gc->feedbackBuf;
802*61046927SAndroid Build Coastguard Worker       return;
803*61046927SAndroid Build Coastguard Worker    case GL_SELECTION_BUFFER_POINTER:
804*61046927SAndroid Build Coastguard Worker       *params = (void *) gc->selectBuf;
805*61046927SAndroid Build Coastguard Worker       return;
806*61046927SAndroid Build Coastguard Worker    default:
807*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
808*61046927SAndroid Build Coastguard Worker       return;
809*61046927SAndroid Build Coastguard Worker    }
810*61046927SAndroid Build Coastguard Worker }
811*61046927SAndroid Build Coastguard Worker 
812*61046927SAndroid Build Coastguard Worker 
813*61046927SAndroid Build Coastguard Worker 
814*61046927SAndroid Build Coastguard Worker /**
815*61046927SAndroid Build Coastguard Worker  * This was previously auto-generated, but we need to special-case
816*61046927SAndroid Build Coastguard Worker  * how we handle writing into the 'residences' buffer when n%4!=0.
817*61046927SAndroid Build Coastguard Worker  */
818*61046927SAndroid Build Coastguard Worker #define X_GLsop_AreTexturesResident 143
819*61046927SAndroid Build Coastguard Worker GLboolean
__indirect_glAreTexturesResident(GLsizei n,const GLuint * textures,GLboolean * residences)820*61046927SAndroid Build Coastguard Worker __indirect_glAreTexturesResident(GLsizei n, const GLuint * textures,
821*61046927SAndroid Build Coastguard Worker                                  GLboolean * residences)
822*61046927SAndroid Build Coastguard Worker {
823*61046927SAndroid Build Coastguard Worker    struct glx_context *const gc = __glXGetCurrentContext();
824*61046927SAndroid Build Coastguard Worker    Display *const dpy = gc->currentDpy;
825*61046927SAndroid Build Coastguard Worker    GLboolean retval = (GLboolean) 0;
826*61046927SAndroid Build Coastguard Worker    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
827*61046927SAndroid Build Coastguard Worker       xcb_connection_t *c = XGetXCBConnection(dpy);
828*61046927SAndroid Build Coastguard Worker       xcb_glx_are_textures_resident_reply_t *reply;
829*61046927SAndroid Build Coastguard Worker       (void) __glXFlushRenderBuffer(gc, gc->pc);
830*61046927SAndroid Build Coastguard Worker       reply =
831*61046927SAndroid Build Coastguard Worker          xcb_glx_are_textures_resident_reply(c,
832*61046927SAndroid Build Coastguard Worker                                              xcb_glx_are_textures_resident
833*61046927SAndroid Build Coastguard Worker                                              (c, gc->currentContextTag, n,
834*61046927SAndroid Build Coastguard Worker                                               textures), NULL);
835*61046927SAndroid Build Coastguard Worker       (void) memcpy(residences, xcb_glx_are_textures_resident_data(reply),
836*61046927SAndroid Build Coastguard Worker                     xcb_glx_are_textures_resident_data_length(reply) *
837*61046927SAndroid Build Coastguard Worker                     sizeof(GLboolean));
838*61046927SAndroid Build Coastguard Worker       retval = reply->ret_val;
839*61046927SAndroid Build Coastguard Worker       free(reply);
840*61046927SAndroid Build Coastguard Worker    }
841*61046927SAndroid Build Coastguard Worker    return retval;
842*61046927SAndroid Build Coastguard Worker }
843*61046927SAndroid Build Coastguard Worker 
844*61046927SAndroid Build Coastguard Worker 
845*61046927SAndroid Build Coastguard Worker /**
846*61046927SAndroid Build Coastguard Worker  * This was previously auto-generated, but we need to special-case
847*61046927SAndroid Build Coastguard Worker  * how we handle writing into the 'residences' buffer when n%4!=0.
848*61046927SAndroid Build Coastguard Worker  */
849*61046927SAndroid Build Coastguard Worker #define X_GLvop_AreTexturesResidentEXT 11
850*61046927SAndroid Build Coastguard Worker GLboolean
glAreTexturesResidentEXT(GLsizei n,const GLuint * textures,GLboolean * residences)851*61046927SAndroid Build Coastguard Worker glAreTexturesResidentEXT(GLsizei n, const GLuint * textures,
852*61046927SAndroid Build Coastguard Worker                          GLboolean * residences)
853*61046927SAndroid Build Coastguard Worker {
854*61046927SAndroid Build Coastguard Worker    struct glx_context *const gc = __glXGetCurrentContext();
855*61046927SAndroid Build Coastguard Worker 
856*61046927SAndroid Build Coastguard Worker    if (gc->isDirect) {
857*61046927SAndroid Build Coastguard Worker       const _glapi_proc *const table = (_glapi_proc *) GET_DISPATCH();
858*61046927SAndroid Build Coastguard Worker       PFNGLARETEXTURESRESIDENTEXTPROC p =
859*61046927SAndroid Build Coastguard Worker          (PFNGLARETEXTURESRESIDENTEXTPROC) table[332];
860*61046927SAndroid Build Coastguard Worker 
861*61046927SAndroid Build Coastguard Worker       return p(n, textures, residences);
862*61046927SAndroid Build Coastguard Worker    }
863*61046927SAndroid Build Coastguard Worker    else {
864*61046927SAndroid Build Coastguard Worker       struct glx_context *const gc = __glXGetCurrentContext();
865*61046927SAndroid Build Coastguard Worker       Display *const dpy = gc->currentDpy;
866*61046927SAndroid Build Coastguard Worker       GLboolean retval = (GLboolean) 0;
867*61046927SAndroid Build Coastguard Worker       const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
868*61046927SAndroid Build Coastguard Worker       if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
869*61046927SAndroid Build Coastguard Worker          GLubyte const *pc =
870*61046927SAndroid Build Coastguard Worker             __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
871*61046927SAndroid Build Coastguard Worker                                     X_GLvop_AreTexturesResidentEXT,
872*61046927SAndroid Build Coastguard Worker                                     cmdlen);
873*61046927SAndroid Build Coastguard Worker          (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
874*61046927SAndroid Build Coastguard Worker          (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
875*61046927SAndroid Build Coastguard Worker          if (n & 3) {
876*61046927SAndroid Build Coastguard Worker             /* see comments in __indirect_glAreTexturesResident() */
877*61046927SAndroid Build Coastguard Worker             GLboolean *res4 = malloc((n + 3) & ~3);
878*61046927SAndroid Build Coastguard Worker             retval = (GLboolean) __glXReadReply(dpy, 1, res4, GL_TRUE);
879*61046927SAndroid Build Coastguard Worker             memcpy(residences, res4, n);
880*61046927SAndroid Build Coastguard Worker             free(res4);
881*61046927SAndroid Build Coastguard Worker          }
882*61046927SAndroid Build Coastguard Worker          else {
883*61046927SAndroid Build Coastguard Worker             retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_TRUE);
884*61046927SAndroid Build Coastguard Worker          }
885*61046927SAndroid Build Coastguard Worker          UnlockDisplay(dpy);
886*61046927SAndroid Build Coastguard Worker          SyncHandle();
887*61046927SAndroid Build Coastguard Worker       }
888*61046927SAndroid Build Coastguard Worker       return retval;
889*61046927SAndroid Build Coastguard Worker    }
890*61046927SAndroid Build Coastguard Worker }
891