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