xref: /aosp_15_r20/external/mesa3d/src/glx/render2.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 #if !defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE)
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "packrender.h"
11*61046927SAndroid Build Coastguard Worker #include "indirect.h"
12*61046927SAndroid Build Coastguard Worker #include "indirect_size.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker /*
15*61046927SAndroid Build Coastguard Worker ** This file contains routines that might need to be transported as
16*61046927SAndroid Build Coastguard Worker ** GLXRender or GLXRenderLarge commands, and these commands don't
17*61046927SAndroid Build Coastguard Worker ** use the pixel header.  See renderpix.c for those routines.
18*61046927SAndroid Build Coastguard Worker */
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker void
__indirect_glMap1d(GLenum target,GLdouble u1,GLdouble u2,GLint stride,GLint order,const GLdouble * pnts)21*61046927SAndroid Build Coastguard Worker __indirect_glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride,
22*61046927SAndroid Build Coastguard Worker                    GLint order, const GLdouble * pnts)
23*61046927SAndroid Build Coastguard Worker {
24*61046927SAndroid Build Coastguard Worker    __GLX_DECLARE_VARIABLES();
25*61046927SAndroid Build Coastguard Worker    GLint k;
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker    __GLX_LOAD_VARIABLES();
28*61046927SAndroid Build Coastguard Worker    k = __glMap1d_size(target);
29*61046927SAndroid Build Coastguard Worker    if (k == 0) {
30*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
31*61046927SAndroid Build Coastguard Worker       return;
32*61046927SAndroid Build Coastguard Worker    }
33*61046927SAndroid Build Coastguard Worker    else if (stride < k || order <= 0) {
34*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_VALUE);
35*61046927SAndroid Build Coastguard Worker       return;
36*61046927SAndroid Build Coastguard Worker    }
37*61046927SAndroid Build Coastguard Worker    compsize = k * order * __GLX_SIZE_FLOAT64;
38*61046927SAndroid Build Coastguard Worker    cmdlen = 28 + compsize;
39*61046927SAndroid Build Coastguard Worker    if (!gc->currentDpy)
40*61046927SAndroid Build Coastguard Worker       return;
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker    if (cmdlen <= gc->maxSmallRenderCommandSize) {
43*61046927SAndroid Build Coastguard Worker       /* Use GLXRender protocol to send small command */
44*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE(X_GLrop_Map1d, cmdlen);
45*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(4, u1);
46*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(12, u2);
47*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(20, target);
48*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(24, order);
49*61046927SAndroid Build Coastguard Worker       /*
50*61046927SAndroid Build Coastguard Worker        ** NOTE: the doubles that follow are not aligned because of 3
51*61046927SAndroid Build Coastguard Worker        ** longs preceeding
52*61046927SAndroid Build Coastguard Worker        */
53*61046927SAndroid Build Coastguard Worker       __glFillMap1d(k, order, stride, pnts, (pc + 28));
54*61046927SAndroid Build Coastguard Worker       __GLX_END(cmdlen);
55*61046927SAndroid Build Coastguard Worker    }
56*61046927SAndroid Build Coastguard Worker    else {
57*61046927SAndroid Build Coastguard Worker       /* Use GLXRenderLarge protocol to send command */
58*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map1d, cmdlen + 4);
59*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(8, u1);
60*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(16, u2);
61*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(24, target);
62*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(28, order);
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker       /*
65*61046927SAndroid Build Coastguard Worker        ** NOTE: the doubles that follow are not aligned because of 3
66*61046927SAndroid Build Coastguard Worker        ** longs preceeding
67*61046927SAndroid Build Coastguard Worker        */
68*61046927SAndroid Build Coastguard Worker       if (stride != k) {
69*61046927SAndroid Build Coastguard Worker          GLubyte *buf;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker          buf = malloc(compsize);
72*61046927SAndroid Build Coastguard Worker          if (!buf) {
73*61046927SAndroid Build Coastguard Worker             __glXSetError(gc, GL_OUT_OF_MEMORY);
74*61046927SAndroid Build Coastguard Worker             return;
75*61046927SAndroid Build Coastguard Worker          }
76*61046927SAndroid Build Coastguard Worker          __glFillMap1d(k, order, stride, pnts, buf);
77*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 32, buf, compsize);
78*61046927SAndroid Build Coastguard Worker          free((char *) buf);
79*61046927SAndroid Build Coastguard Worker       }
80*61046927SAndroid Build Coastguard Worker       else {
81*61046927SAndroid Build Coastguard Worker          /* Data is already packed.  Just send it out */
82*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 32, pnts, compsize);
83*61046927SAndroid Build Coastguard Worker       }
84*61046927SAndroid Build Coastguard Worker    }
85*61046927SAndroid Build Coastguard Worker }
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker void
__indirect_glMap1f(GLenum target,GLfloat u1,GLfloat u2,GLint stride,GLint order,const GLfloat * pnts)88*61046927SAndroid Build Coastguard Worker __indirect_glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride,
89*61046927SAndroid Build Coastguard Worker                    GLint order, const GLfloat * pnts)
90*61046927SAndroid Build Coastguard Worker {
91*61046927SAndroid Build Coastguard Worker    __GLX_DECLARE_VARIABLES();
92*61046927SAndroid Build Coastguard Worker    GLint k;
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker    __GLX_LOAD_VARIABLES();
95*61046927SAndroid Build Coastguard Worker    k = __glMap1f_size(target);
96*61046927SAndroid Build Coastguard Worker    if (k == 0) {
97*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
98*61046927SAndroid Build Coastguard Worker       return;
99*61046927SAndroid Build Coastguard Worker    }
100*61046927SAndroid Build Coastguard Worker    else if (stride < k || order <= 0) {
101*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_VALUE);
102*61046927SAndroid Build Coastguard Worker       return;
103*61046927SAndroid Build Coastguard Worker    }
104*61046927SAndroid Build Coastguard Worker    compsize = k * order * __GLX_SIZE_FLOAT32;
105*61046927SAndroid Build Coastguard Worker    cmdlen = 20 + compsize;
106*61046927SAndroid Build Coastguard Worker    if (!gc->currentDpy)
107*61046927SAndroid Build Coastguard Worker       return;
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    /*
110*61046927SAndroid Build Coastguard Worker     ** The order that arguments are packed is different from the order
111*61046927SAndroid Build Coastguard Worker     ** for glMap1d.
112*61046927SAndroid Build Coastguard Worker     */
113*61046927SAndroid Build Coastguard Worker    if (cmdlen <= gc->maxSmallRenderCommandSize) {
114*61046927SAndroid Build Coastguard Worker       /* Use GLXRender protocol to send small command */
115*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE(X_GLrop_Map1f, cmdlen);
116*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(4, target);
117*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(8, u1);
118*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(12, u2);
119*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(16, order);
120*61046927SAndroid Build Coastguard Worker       __glFillMap1f(k, order, stride, pnts, (GLubyte *) (pc + 20));
121*61046927SAndroid Build Coastguard Worker       __GLX_END(cmdlen);
122*61046927SAndroid Build Coastguard Worker    }
123*61046927SAndroid Build Coastguard Worker    else {
124*61046927SAndroid Build Coastguard Worker       /* Use GLXRenderLarge protocol to send command */
125*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map1f, cmdlen + 4);
126*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(8, target);
127*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(12, u1);
128*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(16, u2);
129*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(20, order);
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker       if (stride != k) {
132*61046927SAndroid Build Coastguard Worker          GLubyte *buf;
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker          buf = malloc(compsize);
135*61046927SAndroid Build Coastguard Worker          if (!buf) {
136*61046927SAndroid Build Coastguard Worker             __glXSetError(gc, GL_OUT_OF_MEMORY);
137*61046927SAndroid Build Coastguard Worker             return;
138*61046927SAndroid Build Coastguard Worker          }
139*61046927SAndroid Build Coastguard Worker          __glFillMap1f(k, order, stride, pnts, buf);
140*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 24, buf, compsize);
141*61046927SAndroid Build Coastguard Worker          free((char *) buf);
142*61046927SAndroid Build Coastguard Worker       }
143*61046927SAndroid Build Coastguard Worker       else {
144*61046927SAndroid Build Coastguard Worker          /* Data is already packed.  Just send it out */
145*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 24, pnts, compsize);
146*61046927SAndroid Build Coastguard Worker       }
147*61046927SAndroid Build Coastguard Worker    }
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker void
__indirect_glMap2d(GLenum target,GLdouble u1,GLdouble u2,GLint ustr,GLint uord,GLdouble v1,GLdouble v2,GLint vstr,GLint vord,const GLdouble * pnts)151*61046927SAndroid Build Coastguard Worker __indirect_glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustr,
152*61046927SAndroid Build Coastguard Worker                    GLint uord, GLdouble v1, GLdouble v2, GLint vstr,
153*61046927SAndroid Build Coastguard Worker                    GLint vord, const GLdouble * pnts)
154*61046927SAndroid Build Coastguard Worker {
155*61046927SAndroid Build Coastguard Worker    __GLX_DECLARE_VARIABLES();
156*61046927SAndroid Build Coastguard Worker    GLint k;
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker    __GLX_LOAD_VARIABLES();
159*61046927SAndroid Build Coastguard Worker    k = __glMap2d_size(target);
160*61046927SAndroid Build Coastguard Worker    if (k == 0) {
161*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
162*61046927SAndroid Build Coastguard Worker       return;
163*61046927SAndroid Build Coastguard Worker    }
164*61046927SAndroid Build Coastguard Worker    else if (vstr < k || ustr < k || vord <= 0 || uord <= 0) {
165*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_VALUE);
166*61046927SAndroid Build Coastguard Worker       return;
167*61046927SAndroid Build Coastguard Worker    }
168*61046927SAndroid Build Coastguard Worker    compsize = k * uord * vord * __GLX_SIZE_FLOAT64;
169*61046927SAndroid Build Coastguard Worker    cmdlen = 48 + compsize;
170*61046927SAndroid Build Coastguard Worker    if (!gc->currentDpy)
171*61046927SAndroid Build Coastguard Worker       return;
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker    if (cmdlen <= gc->maxSmallRenderCommandSize) {
174*61046927SAndroid Build Coastguard Worker       /* Use GLXRender protocol to send small command */
175*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE(X_GLrop_Map2d, cmdlen);
176*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(4, u1);
177*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(12, u2);
178*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(20, v1);
179*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(28, v2);
180*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(36, target);
181*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(40, uord);
182*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(44, vord);
183*61046927SAndroid Build Coastguard Worker       /*
184*61046927SAndroid Build Coastguard Worker        ** Pack into a u-major ordering.
185*61046927SAndroid Build Coastguard Worker        ** NOTE: the doubles that follow are not aligned because of 5
186*61046927SAndroid Build Coastguard Worker        ** longs preceeding
187*61046927SAndroid Build Coastguard Worker        */
188*61046927SAndroid Build Coastguard Worker       __glFillMap2d(k, uord, vord, ustr, vstr, pnts, (GLdouble *) (pc + 48));
189*61046927SAndroid Build Coastguard Worker       __GLX_END(cmdlen);
190*61046927SAndroid Build Coastguard Worker    }
191*61046927SAndroid Build Coastguard Worker    else {
192*61046927SAndroid Build Coastguard Worker       /* Use GLXRenderLarge protocol to send command */
193*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map2d, cmdlen + 4);
194*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(8, u1);
195*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(16, u2);
196*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(24, v1);
197*61046927SAndroid Build Coastguard Worker       __GLX_PUT_DOUBLE(32, v2);
198*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(40, target);
199*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(44, uord);
200*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(48, vord);
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker       /*
203*61046927SAndroid Build Coastguard Worker        ** NOTE: the doubles that follow are not aligned because of 5
204*61046927SAndroid Build Coastguard Worker        ** longs preceeding
205*61046927SAndroid Build Coastguard Worker        */
206*61046927SAndroid Build Coastguard Worker       if ((vstr != k) || (ustr != k * vord)) {
207*61046927SAndroid Build Coastguard Worker          GLdouble *buf;
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker          buf = malloc(compsize);
210*61046927SAndroid Build Coastguard Worker          if (!buf) {
211*61046927SAndroid Build Coastguard Worker             __glXSetError(gc, GL_OUT_OF_MEMORY);
212*61046927SAndroid Build Coastguard Worker             return;
213*61046927SAndroid Build Coastguard Worker          }
214*61046927SAndroid Build Coastguard Worker          /*
215*61046927SAndroid Build Coastguard Worker           ** Pack into a u-major ordering.
216*61046927SAndroid Build Coastguard Worker           */
217*61046927SAndroid Build Coastguard Worker          __glFillMap2d(k, uord, vord, ustr, vstr, pnts, buf);
218*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 52, buf, compsize);
219*61046927SAndroid Build Coastguard Worker          free((char *) buf);
220*61046927SAndroid Build Coastguard Worker       }
221*61046927SAndroid Build Coastguard Worker       else {
222*61046927SAndroid Build Coastguard Worker          /* Data is already packed.  Just send it out */
223*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 52, pnts, compsize);
224*61046927SAndroid Build Coastguard Worker       }
225*61046927SAndroid Build Coastguard Worker    }
226*61046927SAndroid Build Coastguard Worker }
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker void
__indirect_glMap2f(GLenum target,GLfloat u1,GLfloat u2,GLint ustr,GLint uord,GLfloat v1,GLfloat v2,GLint vstr,GLint vord,const GLfloat * pnts)229*61046927SAndroid Build Coastguard Worker __indirect_glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustr,
230*61046927SAndroid Build Coastguard Worker                    GLint uord, GLfloat v1, GLfloat v2, GLint vstr, GLint vord,
231*61046927SAndroid Build Coastguard Worker                    const GLfloat * pnts)
232*61046927SAndroid Build Coastguard Worker {
233*61046927SAndroid Build Coastguard Worker    __GLX_DECLARE_VARIABLES();
234*61046927SAndroid Build Coastguard Worker    GLint k;
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker    __GLX_LOAD_VARIABLES();
237*61046927SAndroid Build Coastguard Worker    k = __glMap2f_size(target);
238*61046927SAndroid Build Coastguard Worker    if (k == 0) {
239*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
240*61046927SAndroid Build Coastguard Worker       return;
241*61046927SAndroid Build Coastguard Worker    }
242*61046927SAndroid Build Coastguard Worker    else if (vstr < k || ustr < k || vord <= 0 || uord <= 0) {
243*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_VALUE);
244*61046927SAndroid Build Coastguard Worker       return;
245*61046927SAndroid Build Coastguard Worker    }
246*61046927SAndroid Build Coastguard Worker    compsize = k * uord * vord * __GLX_SIZE_FLOAT32;
247*61046927SAndroid Build Coastguard Worker    cmdlen = 32 + compsize;
248*61046927SAndroid Build Coastguard Worker    if (!gc->currentDpy)
249*61046927SAndroid Build Coastguard Worker       return;
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker    /*
252*61046927SAndroid Build Coastguard Worker     ** The order that arguments are packed is different from the order
253*61046927SAndroid Build Coastguard Worker     ** for glMap2d.
254*61046927SAndroid Build Coastguard Worker     */
255*61046927SAndroid Build Coastguard Worker    if (cmdlen <= gc->maxSmallRenderCommandSize) {
256*61046927SAndroid Build Coastguard Worker       /* Use GLXRender protocol to send small command */
257*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE(X_GLrop_Map2f, cmdlen);
258*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(4, target);
259*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(8, u1);
260*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(12, u2);
261*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(16, uord);
262*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(20, v1);
263*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(24, v2);
264*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(28, vord);
265*61046927SAndroid Build Coastguard Worker       /*
266*61046927SAndroid Build Coastguard Worker        ** Pack into a u-major ordering.
267*61046927SAndroid Build Coastguard Worker        */
268*61046927SAndroid Build Coastguard Worker       __glFillMap2f(k, uord, vord, ustr, vstr, pnts, (GLfloat *) (pc + 32));
269*61046927SAndroid Build Coastguard Worker       __GLX_END(cmdlen);
270*61046927SAndroid Build Coastguard Worker    }
271*61046927SAndroid Build Coastguard Worker    else {
272*61046927SAndroid Build Coastguard Worker       /* Use GLXRenderLarge protocol to send command */
273*61046927SAndroid Build Coastguard Worker       __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_Map2f, cmdlen + 4);
274*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(8, target);
275*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(12, u1);
276*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(16, u2);
277*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(20, uord);
278*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(24, v1);
279*61046927SAndroid Build Coastguard Worker       __GLX_PUT_FLOAT(28, v2);
280*61046927SAndroid Build Coastguard Worker       __GLX_PUT_LONG(32, vord);
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker       if ((vstr != k) || (ustr != k * vord)) {
283*61046927SAndroid Build Coastguard Worker          GLfloat *buf;
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker          buf = malloc(compsize);
286*61046927SAndroid Build Coastguard Worker          if (!buf) {
287*61046927SAndroid Build Coastguard Worker             __glXSetError(gc, GL_OUT_OF_MEMORY);
288*61046927SAndroid Build Coastguard Worker             return;
289*61046927SAndroid Build Coastguard Worker          }
290*61046927SAndroid Build Coastguard Worker          /*
291*61046927SAndroid Build Coastguard Worker           ** Pack into a u-major ordering.
292*61046927SAndroid Build Coastguard Worker           */
293*61046927SAndroid Build Coastguard Worker          __glFillMap2f(k, uord, vord, ustr, vstr, pnts, buf);
294*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 36, buf, compsize);
295*61046927SAndroid Build Coastguard Worker          free((char *) buf);
296*61046927SAndroid Build Coastguard Worker       }
297*61046927SAndroid Build Coastguard Worker       else {
298*61046927SAndroid Build Coastguard Worker          /* Data is already packed.  Just send it out */
299*61046927SAndroid Build Coastguard Worker          __glXSendLargeCommand(gc, pc, 36, pnts, compsize);
300*61046927SAndroid Build Coastguard Worker       }
301*61046927SAndroid Build Coastguard Worker    }
302*61046927SAndroid Build Coastguard Worker }
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker void
__indirect_glEnable(GLenum cap)305*61046927SAndroid Build Coastguard Worker __indirect_glEnable(GLenum cap)
306*61046927SAndroid Build Coastguard Worker {
307*61046927SAndroid Build Coastguard Worker    __GLX_DECLARE_VARIABLES();
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker    __GLX_LOAD_VARIABLES();
310*61046927SAndroid Build Coastguard Worker    if (!gc->currentDpy)
311*61046927SAndroid Build Coastguard Worker       return;
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    switch (cap) {
314*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
315*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY:
316*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY:
317*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
318*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
319*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
320*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY:
321*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORD_ARRAY:
322*61046927SAndroid Build Coastguard Worker       __indirect_glEnableClientState(cap);
323*61046927SAndroid Build Coastguard Worker       return;
324*61046927SAndroid Build Coastguard Worker    default:
325*61046927SAndroid Build Coastguard Worker       break;
326*61046927SAndroid Build Coastguard Worker    }
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker    __GLX_BEGIN(X_GLrop_Enable, 8);
329*61046927SAndroid Build Coastguard Worker    __GLX_PUT_LONG(4, cap);
330*61046927SAndroid Build Coastguard Worker    __GLX_END(8);
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker void
__indirect_glDisable(GLenum cap)334*61046927SAndroid Build Coastguard Worker __indirect_glDisable(GLenum cap)
335*61046927SAndroid Build Coastguard Worker {
336*61046927SAndroid Build Coastguard Worker    __GLX_DECLARE_VARIABLES();
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker    __GLX_LOAD_VARIABLES();
339*61046927SAndroid Build Coastguard Worker    if (!gc->currentDpy)
340*61046927SAndroid Build Coastguard Worker       return;
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker    switch (cap) {
343*61046927SAndroid Build Coastguard Worker    case GL_COLOR_ARRAY:
344*61046927SAndroid Build Coastguard Worker    case GL_EDGE_FLAG_ARRAY:
345*61046927SAndroid Build Coastguard Worker    case GL_INDEX_ARRAY:
346*61046927SAndroid Build Coastguard Worker    case GL_NORMAL_ARRAY:
347*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_COORD_ARRAY:
348*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ARRAY:
349*61046927SAndroid Build Coastguard Worker    case GL_SECONDARY_COLOR_ARRAY:
350*61046927SAndroid Build Coastguard Worker    case GL_FOG_COORD_ARRAY:
351*61046927SAndroid Build Coastguard Worker       __indirect_glDisableClientState(cap);
352*61046927SAndroid Build Coastguard Worker       return;
353*61046927SAndroid Build Coastguard Worker    default:
354*61046927SAndroid Build Coastguard Worker       break;
355*61046927SAndroid Build Coastguard Worker    }
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker    __GLX_BEGIN(X_GLrop_Disable, 8);
358*61046927SAndroid Build Coastguard Worker    __GLX_PUT_LONG(4, cap);
359*61046927SAndroid Build Coastguard Worker    __GLX_END(8);
360*61046927SAndroid Build Coastguard Worker }
361*61046927SAndroid Build Coastguard Worker 
362*61046927SAndroid Build Coastguard Worker #endif
363