xref: /aosp_15_r20/external/mesa3d/src/mesa/main/eval.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker 
2*61046927SAndroid Build Coastguard Worker /*
3*61046927SAndroid Build Coastguard Worker  * Mesa 3-D graphics library
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
9*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
10*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
12*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
15*61046927SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
16*61046927SAndroid Build Coastguard Worker  *
17*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21*61046927SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23*61046927SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
24*61046927SAndroid Build Coastguard Worker  */
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker /*
28*61046927SAndroid Build Coastguard Worker  * eval.c was written by
29*61046927SAndroid Build Coastguard Worker  * Bernd Barsuhn ([email protected]) and
30*61046927SAndroid Build Coastguard Worker  * Volker Weiss ([email protected]).
31*61046927SAndroid Build Coastguard Worker  *
32*61046927SAndroid Build Coastguard Worker  * My original implementation of evaluators was simplistic and didn't
33*61046927SAndroid Build Coastguard Worker  * compute surface normal vectors properly.  Bernd and Volker applied
34*61046927SAndroid Build Coastguard Worker  * used more sophisticated methods to get better results.
35*61046927SAndroid Build Coastguard Worker  *
36*61046927SAndroid Build Coastguard Worker  * Thanks guys!
37*61046927SAndroid Build Coastguard Worker  */
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
41*61046927SAndroid Build Coastguard Worker #include "context.h"
42*61046927SAndroid Build Coastguard Worker #include "eval.h"
43*61046927SAndroid Build Coastguard Worker #include "macros.h"
44*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
45*61046927SAndroid Build Coastguard Worker #include "main/dispatch.h"
46*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker /*
50*61046927SAndroid Build Coastguard Worker  * Return the number of components per control point for any type of
51*61046927SAndroid Build Coastguard Worker  * evaluator.  Return 0 if bad target.
52*61046927SAndroid Build Coastguard Worker  * See table 5.1 in the OpenGL 1.2 spec.
53*61046927SAndroid Build Coastguard Worker  */
_mesa_evaluator_components(GLenum target)54*61046927SAndroid Build Coastguard Worker GLuint _mesa_evaluator_components( GLenum target )
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker    switch (target) {
57*61046927SAndroid Build Coastguard Worker       case GL_MAP1_VERTEX_3:		return 3;
58*61046927SAndroid Build Coastguard Worker       case GL_MAP1_VERTEX_4:		return 4;
59*61046927SAndroid Build Coastguard Worker       case GL_MAP1_INDEX:		return 1;
60*61046927SAndroid Build Coastguard Worker       case GL_MAP1_COLOR_4:		return 4;
61*61046927SAndroid Build Coastguard Worker       case GL_MAP1_NORMAL:		return 3;
62*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_1:	return 1;
63*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_2:	return 2;
64*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_3:	return 3;
65*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_4:	return 4;
66*61046927SAndroid Build Coastguard Worker       case GL_MAP2_VERTEX_3:		return 3;
67*61046927SAndroid Build Coastguard Worker       case GL_MAP2_VERTEX_4:		return 4;
68*61046927SAndroid Build Coastguard Worker       case GL_MAP2_INDEX:		return 1;
69*61046927SAndroid Build Coastguard Worker       case GL_MAP2_COLOR_4:		return 4;
70*61046927SAndroid Build Coastguard Worker       case GL_MAP2_NORMAL:		return 3;
71*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_1:	return 1;
72*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_2:	return 2;
73*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_3:	return 3;
74*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_4:	return 4;
75*61046927SAndroid Build Coastguard Worker       default:				break;
76*61046927SAndroid Build Coastguard Worker    }
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker    return 0;
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker /*
83*61046927SAndroid Build Coastguard Worker  * Return pointer to the gl_1d_map struct for the named target.
84*61046927SAndroid Build Coastguard Worker  */
85*61046927SAndroid Build Coastguard Worker static struct gl_1d_map *
get_1d_map(struct gl_context * ctx,GLenum target)86*61046927SAndroid Build Coastguard Worker get_1d_map( struct gl_context *ctx, GLenum target )
87*61046927SAndroid Build Coastguard Worker {
88*61046927SAndroid Build Coastguard Worker    switch (target) {
89*61046927SAndroid Build Coastguard Worker       case GL_MAP1_VERTEX_3:
90*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Vertex3;
91*61046927SAndroid Build Coastguard Worker       case GL_MAP1_VERTEX_4:
92*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Vertex4;
93*61046927SAndroid Build Coastguard Worker       case GL_MAP1_INDEX:
94*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Index;
95*61046927SAndroid Build Coastguard Worker       case GL_MAP1_COLOR_4:
96*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Color4;
97*61046927SAndroid Build Coastguard Worker       case GL_MAP1_NORMAL:
98*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Normal;
99*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_1:
100*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Texture1;
101*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_2:
102*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Texture2;
103*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_3:
104*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Texture3;
105*61046927SAndroid Build Coastguard Worker       case GL_MAP1_TEXTURE_COORD_4:
106*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map1Texture4;
107*61046927SAndroid Build Coastguard Worker       default:
108*61046927SAndroid Build Coastguard Worker          return NULL;
109*61046927SAndroid Build Coastguard Worker    }
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker /*
114*61046927SAndroid Build Coastguard Worker  * Return pointer to the gl_2d_map struct for the named target.
115*61046927SAndroid Build Coastguard Worker  */
116*61046927SAndroid Build Coastguard Worker static struct gl_2d_map *
get_2d_map(struct gl_context * ctx,GLenum target)117*61046927SAndroid Build Coastguard Worker get_2d_map( struct gl_context *ctx, GLenum target )
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker    switch (target) {
120*61046927SAndroid Build Coastguard Worker       case GL_MAP2_VERTEX_3:
121*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Vertex3;
122*61046927SAndroid Build Coastguard Worker       case GL_MAP2_VERTEX_4:
123*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Vertex4;
124*61046927SAndroid Build Coastguard Worker       case GL_MAP2_INDEX:
125*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Index;
126*61046927SAndroid Build Coastguard Worker       case GL_MAP2_COLOR_4:
127*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Color4;
128*61046927SAndroid Build Coastguard Worker       case GL_MAP2_NORMAL:
129*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Normal;
130*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_1:
131*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Texture1;
132*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_2:
133*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Texture2;
134*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_3:
135*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Texture3;
136*61046927SAndroid Build Coastguard Worker       case GL_MAP2_TEXTURE_COORD_4:
137*61046927SAndroid Build Coastguard Worker          return &ctx->EvalMap.Map2Texture4;
138*61046927SAndroid Build Coastguard Worker       default:
139*61046927SAndroid Build Coastguard Worker          return NULL;
140*61046927SAndroid Build Coastguard Worker    }
141*61046927SAndroid Build Coastguard Worker }
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker /**********************************************************************/
145*61046927SAndroid Build Coastguard Worker /***            Copy and deallocate control points                  ***/
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  * Copy 1-parametric evaluator control points from user-specified
151*61046927SAndroid Build Coastguard Worker  * memory space to a buffer of contiguous control points.
152*61046927SAndroid Build Coastguard Worker  * \param see glMap1f for details
153*61046927SAndroid Build Coastguard Worker  * \return pointer to buffer of contiguous control points or NULL if out
154*61046927SAndroid Build Coastguard Worker  *          of memory.
155*61046927SAndroid Build Coastguard Worker  */
_mesa_copy_map_points1f(GLenum target,GLint ustride,GLint uorder,const GLfloat * points)156*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
157*61046927SAndroid Build Coastguard Worker                                   const GLfloat *points )
158*61046927SAndroid Build Coastguard Worker {
159*61046927SAndroid Build Coastguard Worker    GLfloat *buffer, *p;
160*61046927SAndroid Build Coastguard Worker    GLint i, k, size = _mesa_evaluator_components(target);
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker    if (!points || !size)
163*61046927SAndroid Build Coastguard Worker       return NULL;
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker    buffer = malloc(uorder * size * sizeof(GLfloat));
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker    if (buffer)
168*61046927SAndroid Build Coastguard Worker       for (i = 0, p = buffer; i < uorder; i++, points += ustride)
169*61046927SAndroid Build Coastguard Worker 	for (k = 0; k < size; k++)
170*61046927SAndroid Build Coastguard Worker 	  *p++ = points[k];
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    return buffer;
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker /*
178*61046927SAndroid Build Coastguard Worker  * Same as above but convert doubles to floats.
179*61046927SAndroid Build Coastguard Worker  */
_mesa_copy_map_points1d(GLenum target,GLint ustride,GLint uorder,const GLdouble * points)180*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
181*61046927SAndroid Build Coastguard Worker                                   const GLdouble *points )
182*61046927SAndroid Build Coastguard Worker {
183*61046927SAndroid Build Coastguard Worker    GLfloat *buffer, *p;
184*61046927SAndroid Build Coastguard Worker    GLint i, k, size = _mesa_evaluator_components(target);
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker    if (!points || !size)
187*61046927SAndroid Build Coastguard Worker       return NULL;
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker    buffer = malloc(uorder * size * sizeof(GLfloat));
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    if (buffer)
192*61046927SAndroid Build Coastguard Worker       for (i = 0, p = buffer; i < uorder; i++, points += ustride)
193*61046927SAndroid Build Coastguard Worker 	for (k = 0; k < size; k++)
194*61046927SAndroid Build Coastguard Worker 	  *p++ = (GLfloat) points[k];
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker    return buffer;
197*61046927SAndroid Build Coastguard Worker }
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker /*
202*61046927SAndroid Build Coastguard Worker  * Copy 2-parametric evaluator control points from user-specified
203*61046927SAndroid Build Coastguard Worker  * memory space to a buffer of contiguous control points.
204*61046927SAndroid Build Coastguard Worker  * Additional memory is allocated to be used by the horner and
205*61046927SAndroid Build Coastguard Worker  * de Casteljau evaluation schemes.
206*61046927SAndroid Build Coastguard Worker  *
207*61046927SAndroid Build Coastguard Worker  * \param see glMap2f for details
208*61046927SAndroid Build Coastguard Worker  * \return pointer to buffer of contiguous control points or NULL if out
209*61046927SAndroid Build Coastguard Worker  *          of memory.
210*61046927SAndroid Build Coastguard Worker  */
_mesa_copy_map_points2f(GLenum target,GLint ustride,GLint uorder,GLint vstride,GLint vorder,const GLfloat * points)211*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points2f( GLenum target,
212*61046927SAndroid Build Coastguard Worker                                   GLint ustride, GLint uorder,
213*61046927SAndroid Build Coastguard Worker                                   GLint vstride, GLint vorder,
214*61046927SAndroid Build Coastguard Worker                                   const GLfloat *points )
215*61046927SAndroid Build Coastguard Worker {
216*61046927SAndroid Build Coastguard Worker    GLfloat *buffer, *p;
217*61046927SAndroid Build Coastguard Worker    GLint i, j, k, size, dsize, hsize;
218*61046927SAndroid Build Coastguard Worker    GLint uinc;
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker    size = _mesa_evaluator_components(target);
221*61046927SAndroid Build Coastguard Worker 
222*61046927SAndroid Build Coastguard Worker    if (!points || size==0) {
223*61046927SAndroid Build Coastguard Worker       return NULL;
224*61046927SAndroid Build Coastguard Worker    }
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    /* max(uorder, vorder) additional points are used in      */
227*61046927SAndroid Build Coastguard Worker    /* horner evaluation and uorder*vorder additional */
228*61046927SAndroid Build Coastguard Worker    /* values are needed for de Casteljau                     */
229*61046927SAndroid Build Coastguard Worker    dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
230*61046927SAndroid Build Coastguard Worker    hsize = (uorder > vorder ? uorder : vorder)*size;
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    if(hsize>dsize)
233*61046927SAndroid Build Coastguard Worker      buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
234*61046927SAndroid Build Coastguard Worker    else
235*61046927SAndroid Build Coastguard Worker      buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    /* compute the increment value for the u-loop */
238*61046927SAndroid Build Coastguard Worker    uinc = ustride - vorder*vstride;
239*61046927SAndroid Build Coastguard Worker 
240*61046927SAndroid Build Coastguard Worker    if (buffer)
241*61046927SAndroid Build Coastguard Worker       for (i=0, p=buffer; i<uorder; i++, points += uinc)
242*61046927SAndroid Build Coastguard Worker 	 for (j=0; j<vorder; j++, points += vstride)
243*61046927SAndroid Build Coastguard Worker 	    for (k=0; k<size; k++)
244*61046927SAndroid Build Coastguard Worker 	       *p++ = points[k];
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker    return buffer;
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker /*
252*61046927SAndroid Build Coastguard Worker  * Same as above but convert doubles to floats.
253*61046927SAndroid Build Coastguard Worker  */
_mesa_copy_map_points2d(GLenum target,GLint ustride,GLint uorder,GLint vstride,GLint vorder,const GLdouble * points)254*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points2d(GLenum target,
255*61046927SAndroid Build Coastguard Worker                                  GLint ustride, GLint uorder,
256*61046927SAndroid Build Coastguard Worker                                  GLint vstride, GLint vorder,
257*61046927SAndroid Build Coastguard Worker                                  const GLdouble *points )
258*61046927SAndroid Build Coastguard Worker {
259*61046927SAndroid Build Coastguard Worker    GLfloat *buffer, *p;
260*61046927SAndroid Build Coastguard Worker    GLint i, j, k, size, hsize, dsize;
261*61046927SAndroid Build Coastguard Worker    GLint uinc;
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker    size = _mesa_evaluator_components(target);
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker    if (!points || size==0) {
266*61046927SAndroid Build Coastguard Worker       return NULL;
267*61046927SAndroid Build Coastguard Worker    }
268*61046927SAndroid Build Coastguard Worker 
269*61046927SAndroid Build Coastguard Worker    /* max(uorder, vorder) additional points are used in      */
270*61046927SAndroid Build Coastguard Worker    /* horner evaluation and uorder*vorder additional */
271*61046927SAndroid Build Coastguard Worker    /* values are needed for de Casteljau                     */
272*61046927SAndroid Build Coastguard Worker    dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
273*61046927SAndroid Build Coastguard Worker    hsize = (uorder > vorder ? uorder : vorder)*size;
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker    if(hsize>dsize)
276*61046927SAndroid Build Coastguard Worker      buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
277*61046927SAndroid Build Coastguard Worker    else
278*61046927SAndroid Build Coastguard Worker      buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker    /* compute the increment value for the u-loop */
281*61046927SAndroid Build Coastguard Worker    uinc = ustride - vorder*vstride;
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker    if (buffer)
284*61046927SAndroid Build Coastguard Worker       for (i=0, p=buffer; i<uorder; i++, points += uinc)
285*61046927SAndroid Build Coastguard Worker 	 for (j=0; j<vorder; j++, points += vstride)
286*61046927SAndroid Build Coastguard Worker 	    for (k=0; k<size; k++)
287*61046927SAndroid Build Coastguard Worker 	       *p++ = (GLfloat) points[k];
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    return buffer;
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker /**********************************************************************/
296*61046927SAndroid Build Coastguard Worker /***                      API entry points                          ***/
297*61046927SAndroid Build Coastguard Worker /**********************************************************************/
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker /*
301*61046927SAndroid Build Coastguard Worker  * This does the work of glMap1[fd].
302*61046927SAndroid Build Coastguard Worker  */
303*61046927SAndroid Build Coastguard Worker static void
map1(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,const GLvoid * points,GLenum type)304*61046927SAndroid Build Coastguard Worker map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
305*61046927SAndroid Build Coastguard Worker      GLint uorder, const GLvoid *points, GLenum type )
306*61046927SAndroid Build Coastguard Worker {
307*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
308*61046927SAndroid Build Coastguard Worker    GLint k;
309*61046927SAndroid Build Coastguard Worker    GLfloat *pnts;
310*61046927SAndroid Build Coastguard Worker    struct gl_1d_map *map = NULL;
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker    assert(type == GL_FLOAT || type == GL_DOUBLE);
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker    if (u1 == u2) {
315*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
316*61046927SAndroid Build Coastguard Worker       return;
317*61046927SAndroid Build Coastguard Worker    }
318*61046927SAndroid Build Coastguard Worker    if (uorder < 1 || uorder > MAX_EVAL_ORDER) {
319*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
320*61046927SAndroid Build Coastguard Worker       return;
321*61046927SAndroid Build Coastguard Worker    }
322*61046927SAndroid Build Coastguard Worker    if (!points) {
323*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" );
324*61046927SAndroid Build Coastguard Worker       return;
325*61046927SAndroid Build Coastguard Worker    }
326*61046927SAndroid Build Coastguard Worker 
327*61046927SAndroid Build Coastguard Worker    k = _mesa_evaluator_components( target );
328*61046927SAndroid Build Coastguard Worker    if (k == 0) {
329*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
330*61046927SAndroid Build Coastguard Worker       return;
331*61046927SAndroid Build Coastguard Worker    }
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker    if (ustride < k) {
334*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
335*61046927SAndroid Build Coastguard Worker       return;
336*61046927SAndroid Build Coastguard Worker    }
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker    if (ctx->Texture.CurrentUnit != 0) {
339*61046927SAndroid Build Coastguard Worker       /* See OpenGL 1.2.1 spec, section F.2.13 */
340*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
341*61046927SAndroid Build Coastguard Worker       return;
342*61046927SAndroid Build Coastguard Worker    }
343*61046927SAndroid Build Coastguard Worker 
344*61046927SAndroid Build Coastguard Worker    map = get_1d_map(ctx, target);
345*61046927SAndroid Build Coastguard Worker    if (!map) {
346*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
347*61046927SAndroid Build Coastguard Worker       return;
348*61046927SAndroid Build Coastguard Worker    }
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    /* make copy of the control points */
351*61046927SAndroid Build Coastguard Worker    if (type == GL_FLOAT)
352*61046927SAndroid Build Coastguard Worker       pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points);
353*61046927SAndroid Build Coastguard Worker    else
354*61046927SAndroid Build Coastguard Worker       pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points);
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
358*61046927SAndroid Build Coastguard Worker    vbo_exec_update_eval_maps(ctx);
359*61046927SAndroid Build Coastguard Worker    map->Order = uorder;
360*61046927SAndroid Build Coastguard Worker    map->u1 = u1;
361*61046927SAndroid Build Coastguard Worker    map->u2 = u2;
362*61046927SAndroid Build Coastguard Worker    map->du = 1.0F / (u2 - u1);
363*61046927SAndroid Build Coastguard Worker    free(map->Points);
364*61046927SAndroid Build Coastguard Worker    map->Points = pnts;
365*61046927SAndroid Build Coastguard Worker }
366*61046927SAndroid Build Coastguard Worker 
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker 
369*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map1f(GLenum target,GLfloat u1,GLfloat u2,GLint stride,GLint order,const GLfloat * points)370*61046927SAndroid Build Coastguard Worker _mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
371*61046927SAndroid Build Coastguard Worker              GLint order, const GLfloat *points )
372*61046927SAndroid Build Coastguard Worker {
373*61046927SAndroid Build Coastguard Worker    map1(target, u1, u2, stride, order, points, GL_FLOAT);
374*61046927SAndroid Build Coastguard Worker }
375*61046927SAndroid Build Coastguard Worker 
376*61046927SAndroid Build Coastguard Worker 
377*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map1d(GLenum target,GLdouble u1,GLdouble u2,GLint stride,GLint order,const GLdouble * points)378*61046927SAndroid Build Coastguard Worker _mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
379*61046927SAndroid Build Coastguard Worker              GLint order, const GLdouble *points )
380*61046927SAndroid Build Coastguard Worker {
381*61046927SAndroid Build Coastguard Worker    map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE);
382*61046927SAndroid Build Coastguard Worker }
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker 
385*61046927SAndroid Build Coastguard Worker static void
map2(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,GLfloat v1,GLfloat v2,GLint vstride,GLint vorder,const GLvoid * points,GLenum type)386*61046927SAndroid Build Coastguard Worker map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
387*61046927SAndroid Build Coastguard Worker       GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
388*61046927SAndroid Build Coastguard Worker       const GLvoid *points, GLenum type )
389*61046927SAndroid Build Coastguard Worker {
390*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
391*61046927SAndroid Build Coastguard Worker    GLint k;
392*61046927SAndroid Build Coastguard Worker    GLfloat *pnts;
393*61046927SAndroid Build Coastguard Worker    struct gl_2d_map *map = NULL;
394*61046927SAndroid Build Coastguard Worker 
395*61046927SAndroid Build Coastguard Worker    assert(type == GL_FLOAT || type == GL_DOUBLE);
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker    if (u1==u2) {
398*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
399*61046927SAndroid Build Coastguard Worker       return;
400*61046927SAndroid Build Coastguard Worker    }
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker    if (v1==v2) {
403*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
404*61046927SAndroid Build Coastguard Worker       return;
405*61046927SAndroid Build Coastguard Worker    }
406*61046927SAndroid Build Coastguard Worker 
407*61046927SAndroid Build Coastguard Worker    if (uorder<1 || uorder>MAX_EVAL_ORDER) {
408*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
409*61046927SAndroid Build Coastguard Worker       return;
410*61046927SAndroid Build Coastguard Worker    }
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker    if (vorder<1 || vorder>MAX_EVAL_ORDER) {
413*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
414*61046927SAndroid Build Coastguard Worker       return;
415*61046927SAndroid Build Coastguard Worker    }
416*61046927SAndroid Build Coastguard Worker 
417*61046927SAndroid Build Coastguard Worker    k = _mesa_evaluator_components( target );
418*61046927SAndroid Build Coastguard Worker    if (k==0) {
419*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
420*61046927SAndroid Build Coastguard Worker       return;
421*61046927SAndroid Build Coastguard Worker    }
422*61046927SAndroid Build Coastguard Worker 
423*61046927SAndroid Build Coastguard Worker    if (ustride < k) {
424*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
425*61046927SAndroid Build Coastguard Worker       return;
426*61046927SAndroid Build Coastguard Worker    }
427*61046927SAndroid Build Coastguard Worker    if (vstride < k) {
428*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
429*61046927SAndroid Build Coastguard Worker       return;
430*61046927SAndroid Build Coastguard Worker    }
431*61046927SAndroid Build Coastguard Worker 
432*61046927SAndroid Build Coastguard Worker    if (ctx->Texture.CurrentUnit != 0) {
433*61046927SAndroid Build Coastguard Worker       /* See OpenGL 1.2.1 spec, section F.2.13 */
434*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
435*61046927SAndroid Build Coastguard Worker       return;
436*61046927SAndroid Build Coastguard Worker    }
437*61046927SAndroid Build Coastguard Worker 
438*61046927SAndroid Build Coastguard Worker    map = get_2d_map(ctx, target);
439*61046927SAndroid Build Coastguard Worker    if (!map) {
440*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
441*61046927SAndroid Build Coastguard Worker       return;
442*61046927SAndroid Build Coastguard Worker    }
443*61046927SAndroid Build Coastguard Worker 
444*61046927SAndroid Build Coastguard Worker    /* make copy of the control points */
445*61046927SAndroid Build Coastguard Worker    if (type == GL_FLOAT)
446*61046927SAndroid Build Coastguard Worker       pnts = _mesa_copy_map_points2f(target, ustride, uorder,
447*61046927SAndroid Build Coastguard Worker                                   vstride, vorder, (GLfloat*) points);
448*61046927SAndroid Build Coastguard Worker    else
449*61046927SAndroid Build Coastguard Worker       pnts = _mesa_copy_map_points2d(target, ustride, uorder,
450*61046927SAndroid Build Coastguard Worker                                   vstride, vorder, (GLdouble*) points);
451*61046927SAndroid Build Coastguard Worker 
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
454*61046927SAndroid Build Coastguard Worker    vbo_exec_update_eval_maps(ctx);
455*61046927SAndroid Build Coastguard Worker    map->Uorder = uorder;
456*61046927SAndroid Build Coastguard Worker    map->u1 = u1;
457*61046927SAndroid Build Coastguard Worker    map->u2 = u2;
458*61046927SAndroid Build Coastguard Worker    map->du = 1.0F / (u2 - u1);
459*61046927SAndroid Build Coastguard Worker    map->Vorder = vorder;
460*61046927SAndroid Build Coastguard Worker    map->v1 = v1;
461*61046927SAndroid Build Coastguard Worker    map->v2 = v2;
462*61046927SAndroid Build Coastguard Worker    map->dv = 1.0F / (v2 - v1);
463*61046927SAndroid Build Coastguard Worker    free(map->Points);
464*61046927SAndroid Build Coastguard Worker    map->Points = pnts;
465*61046927SAndroid Build Coastguard Worker }
466*61046927SAndroid Build Coastguard Worker 
467*61046927SAndroid Build Coastguard Worker 
468*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map2f(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,GLfloat v1,GLfloat v2,GLint vstride,GLint vorder,const GLfloat * points)469*61046927SAndroid Build Coastguard Worker _mesa_Map2f( GLenum target,
470*61046927SAndroid Build Coastguard Worker              GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
471*61046927SAndroid Build Coastguard Worker              GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
472*61046927SAndroid Build Coastguard Worker              const GLfloat *points)
473*61046927SAndroid Build Coastguard Worker {
474*61046927SAndroid Build Coastguard Worker    map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
475*61046927SAndroid Build Coastguard Worker         points, GL_FLOAT);
476*61046927SAndroid Build Coastguard Worker }
477*61046927SAndroid Build Coastguard Worker 
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map2d(GLenum target,GLdouble u1,GLdouble u2,GLint ustride,GLint uorder,GLdouble v1,GLdouble v2,GLint vstride,GLint vorder,const GLdouble * points)480*61046927SAndroid Build Coastguard Worker _mesa_Map2d( GLenum target,
481*61046927SAndroid Build Coastguard Worker              GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
482*61046927SAndroid Build Coastguard Worker              GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
483*61046927SAndroid Build Coastguard Worker              const GLdouble *points )
484*61046927SAndroid Build Coastguard Worker {
485*61046927SAndroid Build Coastguard Worker    map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder,
486*61046927SAndroid Build Coastguard Worker 	(GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE);
487*61046927SAndroid Build Coastguard Worker }
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker 
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnMapdvARB(GLenum target,GLenum query,GLsizei bufSize,GLdouble * v)492*61046927SAndroid Build Coastguard Worker _mesa_GetnMapdvARB( GLenum target, GLenum query, GLsizei bufSize, GLdouble *v )
493*61046927SAndroid Build Coastguard Worker {
494*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
495*61046927SAndroid Build Coastguard Worker    struct gl_1d_map *map1d;
496*61046927SAndroid Build Coastguard Worker    struct gl_2d_map *map2d;
497*61046927SAndroid Build Coastguard Worker    GLint i, n;
498*61046927SAndroid Build Coastguard Worker    GLfloat *data;
499*61046927SAndroid Build Coastguard Worker    GLuint comps;
500*61046927SAndroid Build Coastguard Worker    GLsizei numBytes;
501*61046927SAndroid Build Coastguard Worker 
502*61046927SAndroid Build Coastguard Worker    comps = _mesa_evaluator_components(target);
503*61046927SAndroid Build Coastguard Worker    if (!comps) {
504*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
505*61046927SAndroid Build Coastguard Worker       return;
506*61046927SAndroid Build Coastguard Worker    }
507*61046927SAndroid Build Coastguard Worker 
508*61046927SAndroid Build Coastguard Worker    map1d = get_1d_map(ctx, target);
509*61046927SAndroid Build Coastguard Worker    map2d = get_2d_map(ctx, target);
510*61046927SAndroid Build Coastguard Worker    assert(map1d || map2d);
511*61046927SAndroid Build Coastguard Worker 
512*61046927SAndroid Build Coastguard Worker    switch (query) {
513*61046927SAndroid Build Coastguard Worker       case GL_COEFF:
514*61046927SAndroid Build Coastguard Worker          if (map1d) {
515*61046927SAndroid Build Coastguard Worker             data = map1d->Points;
516*61046927SAndroid Build Coastguard Worker             n = map1d->Order * comps;
517*61046927SAndroid Build Coastguard Worker          }
518*61046927SAndroid Build Coastguard Worker          else {
519*61046927SAndroid Build Coastguard Worker             data = map2d->Points;
520*61046927SAndroid Build Coastguard Worker             n = map2d->Uorder * map2d->Vorder * comps;
521*61046927SAndroid Build Coastguard Worker          }
522*61046927SAndroid Build Coastguard Worker 	 if (data) {
523*61046927SAndroid Build Coastguard Worker             numBytes = n * sizeof *v;
524*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
525*61046927SAndroid Build Coastguard Worker                goto overflow;
526*61046927SAndroid Build Coastguard Worker 	    for (i=0;i<n;i++) {
527*61046927SAndroid Build Coastguard Worker 	       v[i] = data[i];
528*61046927SAndroid Build Coastguard Worker 	    }
529*61046927SAndroid Build Coastguard Worker 	 }
530*61046927SAndroid Build Coastguard Worker          break;
531*61046927SAndroid Build Coastguard Worker       case GL_ORDER:
532*61046927SAndroid Build Coastguard Worker          if (map1d) {
533*61046927SAndroid Build Coastguard Worker             numBytes = 1 * sizeof *v;
534*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
535*61046927SAndroid Build Coastguard Worker                goto overflow;
536*61046927SAndroid Build Coastguard Worker             v[0] = (GLdouble) map1d->Order;
537*61046927SAndroid Build Coastguard Worker          }
538*61046927SAndroid Build Coastguard Worker          else {
539*61046927SAndroid Build Coastguard Worker             numBytes = 2 * sizeof *v;
540*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
541*61046927SAndroid Build Coastguard Worker                goto overflow;
542*61046927SAndroid Build Coastguard Worker             v[0] = (GLdouble) map2d->Uorder;
543*61046927SAndroid Build Coastguard Worker             v[1] = (GLdouble) map2d->Vorder;
544*61046927SAndroid Build Coastguard Worker          }
545*61046927SAndroid Build Coastguard Worker          break;
546*61046927SAndroid Build Coastguard Worker       case GL_DOMAIN:
547*61046927SAndroid Build Coastguard Worker          if (map1d) {
548*61046927SAndroid Build Coastguard Worker             numBytes = 2 * sizeof *v;
549*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
550*61046927SAndroid Build Coastguard Worker               goto overflow;
551*61046927SAndroid Build Coastguard Worker             v[0] = (GLdouble) map1d->u1;
552*61046927SAndroid Build Coastguard Worker             v[1] = (GLdouble) map1d->u2;
553*61046927SAndroid Build Coastguard Worker          }
554*61046927SAndroid Build Coastguard Worker          else {
555*61046927SAndroid Build Coastguard Worker             numBytes = 4 * sizeof *v;
556*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
557*61046927SAndroid Build Coastguard Worker                goto overflow;
558*61046927SAndroid Build Coastguard Worker             v[0] = (GLdouble) map2d->u1;
559*61046927SAndroid Build Coastguard Worker             v[1] = (GLdouble) map2d->u2;
560*61046927SAndroid Build Coastguard Worker             v[2] = (GLdouble) map2d->v1;
561*61046927SAndroid Build Coastguard Worker             v[3] = (GLdouble) map2d->v2;
562*61046927SAndroid Build Coastguard Worker          }
563*61046927SAndroid Build Coastguard Worker          break;
564*61046927SAndroid Build Coastguard Worker       default:
565*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
566*61046927SAndroid Build Coastguard Worker    }
567*61046927SAndroid Build Coastguard Worker    return;
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker overflow:
570*61046927SAndroid Build Coastguard Worker    _mesa_error( ctx, GL_INVALID_OPERATION,
571*61046927SAndroid Build Coastguard Worker                "glGetnMapdvARB(out of bounds: bufSize is %d,"
572*61046927SAndroid Build Coastguard Worker                " but %d bytes are required)", bufSize, numBytes );
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMapdv(GLenum target,GLenum query,GLdouble * v)576*61046927SAndroid Build Coastguard Worker _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
577*61046927SAndroid Build Coastguard Worker {
578*61046927SAndroid Build Coastguard Worker    _mesa_GetnMapdvARB(target, query, INT_MAX, v);
579*61046927SAndroid Build Coastguard Worker }
580*61046927SAndroid Build Coastguard Worker 
581*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnMapfvARB(GLenum target,GLenum query,GLsizei bufSize,GLfloat * v)582*61046927SAndroid Build Coastguard Worker _mesa_GetnMapfvARB( GLenum target, GLenum query, GLsizei bufSize, GLfloat *v )
583*61046927SAndroid Build Coastguard Worker {
584*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
585*61046927SAndroid Build Coastguard Worker    struct gl_1d_map *map1d;
586*61046927SAndroid Build Coastguard Worker    struct gl_2d_map *map2d;
587*61046927SAndroid Build Coastguard Worker    GLint i, n;
588*61046927SAndroid Build Coastguard Worker    GLfloat *data;
589*61046927SAndroid Build Coastguard Worker    GLuint comps;
590*61046927SAndroid Build Coastguard Worker    GLsizei numBytes;
591*61046927SAndroid Build Coastguard Worker 
592*61046927SAndroid Build Coastguard Worker    comps = _mesa_evaluator_components(target);
593*61046927SAndroid Build Coastguard Worker    if (!comps) {
594*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
595*61046927SAndroid Build Coastguard Worker       return;
596*61046927SAndroid Build Coastguard Worker    }
597*61046927SAndroid Build Coastguard Worker 
598*61046927SAndroid Build Coastguard Worker    map1d = get_1d_map(ctx, target);
599*61046927SAndroid Build Coastguard Worker    map2d = get_2d_map(ctx, target);
600*61046927SAndroid Build Coastguard Worker    assert(map1d || map2d);
601*61046927SAndroid Build Coastguard Worker 
602*61046927SAndroid Build Coastguard Worker    switch (query) {
603*61046927SAndroid Build Coastguard Worker       case GL_COEFF:
604*61046927SAndroid Build Coastguard Worker          if (map1d) {
605*61046927SAndroid Build Coastguard Worker             data = map1d->Points;
606*61046927SAndroid Build Coastguard Worker             n = map1d->Order * comps;
607*61046927SAndroid Build Coastguard Worker          }
608*61046927SAndroid Build Coastguard Worker          else {
609*61046927SAndroid Build Coastguard Worker             data = map2d->Points;
610*61046927SAndroid Build Coastguard Worker             n = map2d->Uorder * map2d->Vorder * comps;
611*61046927SAndroid Build Coastguard Worker          }
612*61046927SAndroid Build Coastguard Worker 	 if (data) {
613*61046927SAndroid Build Coastguard Worker             numBytes = n * sizeof *v;
614*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
615*61046927SAndroid Build Coastguard Worker                goto overflow;
616*61046927SAndroid Build Coastguard Worker 	    for (i=0;i<n;i++) {
617*61046927SAndroid Build Coastguard Worker 	       v[i] = data[i];
618*61046927SAndroid Build Coastguard Worker 	    }
619*61046927SAndroid Build Coastguard Worker 	 }
620*61046927SAndroid Build Coastguard Worker          break;
621*61046927SAndroid Build Coastguard Worker       case GL_ORDER:
622*61046927SAndroid Build Coastguard Worker          if (map1d) {
623*61046927SAndroid Build Coastguard Worker             numBytes = 1 * sizeof *v;
624*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
625*61046927SAndroid Build Coastguard Worker                goto overflow;
626*61046927SAndroid Build Coastguard Worker             v[0] = (GLfloat) map1d->Order;
627*61046927SAndroid Build Coastguard Worker          }
628*61046927SAndroid Build Coastguard Worker          else {
629*61046927SAndroid Build Coastguard Worker             numBytes = 2 * sizeof *v;
630*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
631*61046927SAndroid Build Coastguard Worker                goto overflow;
632*61046927SAndroid Build Coastguard Worker             v[0] = (GLfloat) map2d->Uorder;
633*61046927SAndroid Build Coastguard Worker             v[1] = (GLfloat) map2d->Vorder;
634*61046927SAndroid Build Coastguard Worker          }
635*61046927SAndroid Build Coastguard Worker          break;
636*61046927SAndroid Build Coastguard Worker       case GL_DOMAIN:
637*61046927SAndroid Build Coastguard Worker          if (map1d) {
638*61046927SAndroid Build Coastguard Worker             numBytes = 2 * sizeof *v;
639*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
640*61046927SAndroid Build Coastguard Worker                goto overflow;
641*61046927SAndroid Build Coastguard Worker             v[0] = map1d->u1;
642*61046927SAndroid Build Coastguard Worker             v[1] = map1d->u2;
643*61046927SAndroid Build Coastguard Worker          }
644*61046927SAndroid Build Coastguard Worker          else {
645*61046927SAndroid Build Coastguard Worker             numBytes = 4 * sizeof *v;
646*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
647*61046927SAndroid Build Coastguard Worker                goto overflow;
648*61046927SAndroid Build Coastguard Worker             v[0] = map2d->u1;
649*61046927SAndroid Build Coastguard Worker             v[1] = map2d->u2;
650*61046927SAndroid Build Coastguard Worker             v[2] = map2d->v1;
651*61046927SAndroid Build Coastguard Worker             v[3] = map2d->v2;
652*61046927SAndroid Build Coastguard Worker          }
653*61046927SAndroid Build Coastguard Worker          break;
654*61046927SAndroid Build Coastguard Worker       default:
655*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
656*61046927SAndroid Build Coastguard Worker    }
657*61046927SAndroid Build Coastguard Worker    return;
658*61046927SAndroid Build Coastguard Worker 
659*61046927SAndroid Build Coastguard Worker overflow:
660*61046927SAndroid Build Coastguard Worker    _mesa_error( ctx, GL_INVALID_OPERATION,
661*61046927SAndroid Build Coastguard Worker                "glGetnMapfvARB(out of bounds: bufSize is %d,"
662*61046927SAndroid Build Coastguard Worker                " but %d bytes are required)", bufSize, numBytes );
663*61046927SAndroid Build Coastguard Worker }
664*61046927SAndroid Build Coastguard Worker 
665*61046927SAndroid Build Coastguard Worker 
666*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMapfv(GLenum target,GLenum query,GLfloat * v)667*61046927SAndroid Build Coastguard Worker _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
668*61046927SAndroid Build Coastguard Worker {
669*61046927SAndroid Build Coastguard Worker    _mesa_GetnMapfvARB(target, query, INT_MAX, v);
670*61046927SAndroid Build Coastguard Worker }
671*61046927SAndroid Build Coastguard Worker 
672*61046927SAndroid Build Coastguard Worker 
673*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnMapivARB(GLenum target,GLenum query,GLsizei bufSize,GLint * v)674*61046927SAndroid Build Coastguard Worker _mesa_GetnMapivARB( GLenum target, GLenum query, GLsizei bufSize, GLint *v )
675*61046927SAndroid Build Coastguard Worker {
676*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
677*61046927SAndroid Build Coastguard Worker    struct gl_1d_map *map1d;
678*61046927SAndroid Build Coastguard Worker    struct gl_2d_map *map2d;
679*61046927SAndroid Build Coastguard Worker    GLuint i, n;
680*61046927SAndroid Build Coastguard Worker    GLfloat *data;
681*61046927SAndroid Build Coastguard Worker    GLuint comps;
682*61046927SAndroid Build Coastguard Worker    GLsizei numBytes;
683*61046927SAndroid Build Coastguard Worker 
684*61046927SAndroid Build Coastguard Worker    comps = _mesa_evaluator_components(target);
685*61046927SAndroid Build Coastguard Worker    if (!comps) {
686*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
687*61046927SAndroid Build Coastguard Worker       return;
688*61046927SAndroid Build Coastguard Worker    }
689*61046927SAndroid Build Coastguard Worker 
690*61046927SAndroid Build Coastguard Worker    map1d = get_1d_map(ctx, target);
691*61046927SAndroid Build Coastguard Worker    map2d = get_2d_map(ctx, target);
692*61046927SAndroid Build Coastguard Worker    assert(map1d || map2d);
693*61046927SAndroid Build Coastguard Worker 
694*61046927SAndroid Build Coastguard Worker    switch (query) {
695*61046927SAndroid Build Coastguard Worker       case GL_COEFF:
696*61046927SAndroid Build Coastguard Worker          if (map1d) {
697*61046927SAndroid Build Coastguard Worker             data = map1d->Points;
698*61046927SAndroid Build Coastguard Worker             n = map1d->Order * comps;
699*61046927SAndroid Build Coastguard Worker          }
700*61046927SAndroid Build Coastguard Worker          else {
701*61046927SAndroid Build Coastguard Worker             data = map2d->Points;
702*61046927SAndroid Build Coastguard Worker             n = map2d->Uorder * map2d->Vorder * comps;
703*61046927SAndroid Build Coastguard Worker          }
704*61046927SAndroid Build Coastguard Worker 	 if (data) {
705*61046927SAndroid Build Coastguard Worker             numBytes = n * sizeof *v;
706*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
707*61046927SAndroid Build Coastguard Worker                goto overflow;
708*61046927SAndroid Build Coastguard Worker 	    for (i=0;i<n;i++) {
709*61046927SAndroid Build Coastguard Worker 	       v[i] = lroundf(data[i]);
710*61046927SAndroid Build Coastguard Worker 	    }
711*61046927SAndroid Build Coastguard Worker 	 }
712*61046927SAndroid Build Coastguard Worker          break;
713*61046927SAndroid Build Coastguard Worker       case GL_ORDER:
714*61046927SAndroid Build Coastguard Worker          if (map1d) {
715*61046927SAndroid Build Coastguard Worker             numBytes = 1 * sizeof *v;
716*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
717*61046927SAndroid Build Coastguard Worker                goto overflow;
718*61046927SAndroid Build Coastguard Worker             v[0] = map1d->Order;
719*61046927SAndroid Build Coastguard Worker          }
720*61046927SAndroid Build Coastguard Worker          else {
721*61046927SAndroid Build Coastguard Worker             numBytes = 2 * sizeof *v;
722*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
723*61046927SAndroid Build Coastguard Worker                goto overflow;
724*61046927SAndroid Build Coastguard Worker             v[0] = map2d->Uorder;
725*61046927SAndroid Build Coastguard Worker             v[1] = map2d->Vorder;
726*61046927SAndroid Build Coastguard Worker          }
727*61046927SAndroid Build Coastguard Worker          break;
728*61046927SAndroid Build Coastguard Worker       case GL_DOMAIN:
729*61046927SAndroid Build Coastguard Worker          if (map1d) {
730*61046927SAndroid Build Coastguard Worker             numBytes = 2 * sizeof *v;
731*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
732*61046927SAndroid Build Coastguard Worker                goto overflow;
733*61046927SAndroid Build Coastguard Worker             v[0] = lroundf(map1d->u1);
734*61046927SAndroid Build Coastguard Worker             v[1] = lroundf(map1d->u2);
735*61046927SAndroid Build Coastguard Worker          }
736*61046927SAndroid Build Coastguard Worker          else {
737*61046927SAndroid Build Coastguard Worker             numBytes = 4 * sizeof *v;
738*61046927SAndroid Build Coastguard Worker             if (bufSize < numBytes)
739*61046927SAndroid Build Coastguard Worker                goto overflow;
740*61046927SAndroid Build Coastguard Worker             v[0] = lroundf(map2d->u1);
741*61046927SAndroid Build Coastguard Worker             v[1] = lroundf(map2d->u2);
742*61046927SAndroid Build Coastguard Worker             v[2] = lroundf(map2d->v1);
743*61046927SAndroid Build Coastguard Worker             v[3] = lroundf(map2d->v2);
744*61046927SAndroid Build Coastguard Worker          }
745*61046927SAndroid Build Coastguard Worker          break;
746*61046927SAndroid Build Coastguard Worker       default:
747*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
748*61046927SAndroid Build Coastguard Worker    }
749*61046927SAndroid Build Coastguard Worker    return;
750*61046927SAndroid Build Coastguard Worker 
751*61046927SAndroid Build Coastguard Worker overflow:
752*61046927SAndroid Build Coastguard Worker    _mesa_error( ctx, GL_INVALID_OPERATION,
753*61046927SAndroid Build Coastguard Worker                "glGetnMapivARB(out of bounds: bufSize is %d,"
754*61046927SAndroid Build Coastguard Worker                " but %d bytes are required)", bufSize, numBytes );
755*61046927SAndroid Build Coastguard Worker }
756*61046927SAndroid Build Coastguard Worker 
757*61046927SAndroid Build Coastguard Worker 
758*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMapiv(GLenum target,GLenum query,GLint * v)759*61046927SAndroid Build Coastguard Worker _mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
760*61046927SAndroid Build Coastguard Worker {
761*61046927SAndroid Build Coastguard Worker    _mesa_GetnMapivARB(target, query, INT_MAX, v);
762*61046927SAndroid Build Coastguard Worker }
763*61046927SAndroid Build Coastguard Worker 
764*61046927SAndroid Build Coastguard Worker 
765*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid1f(GLint un,GLfloat u1,GLfloat u2)766*61046927SAndroid Build Coastguard Worker _mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
767*61046927SAndroid Build Coastguard Worker {
768*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
769*61046927SAndroid Build Coastguard Worker 
770*61046927SAndroid Build Coastguard Worker    if (un<1) {
771*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
772*61046927SAndroid Build Coastguard Worker       return;
773*61046927SAndroid Build Coastguard Worker    }
774*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
775*61046927SAndroid Build Coastguard Worker    vbo_exec_update_eval_maps(ctx);
776*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid1un = un;
777*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid1u1 = u1;
778*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid1u2 = u2;
779*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
780*61046927SAndroid Build Coastguard Worker }
781*61046927SAndroid Build Coastguard Worker 
782*61046927SAndroid Build Coastguard Worker 
783*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid1d(GLint un,GLdouble u1,GLdouble u2)784*61046927SAndroid Build Coastguard Worker _mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
785*61046927SAndroid Build Coastguard Worker {
786*61046927SAndroid Build Coastguard Worker    _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 );
787*61046927SAndroid Build Coastguard Worker }
788*61046927SAndroid Build Coastguard Worker 
789*61046927SAndroid Build Coastguard Worker 
790*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid2f(GLint un,GLfloat u1,GLfloat u2,GLint vn,GLfloat v1,GLfloat v2)791*61046927SAndroid Build Coastguard Worker _mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
792*61046927SAndroid Build Coastguard Worker                  GLint vn, GLfloat v1, GLfloat v2 )
793*61046927SAndroid Build Coastguard Worker {
794*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
795*61046927SAndroid Build Coastguard Worker 
796*61046927SAndroid Build Coastguard Worker    if (un<1) {
797*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
798*61046927SAndroid Build Coastguard Worker       return;
799*61046927SAndroid Build Coastguard Worker    }
800*61046927SAndroid Build Coastguard Worker    if (vn<1) {
801*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
802*61046927SAndroid Build Coastguard Worker       return;
803*61046927SAndroid Build Coastguard Worker    }
804*61046927SAndroid Build Coastguard Worker 
805*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
806*61046927SAndroid Build Coastguard Worker    vbo_exec_update_eval_maps(ctx);
807*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2un = un;
808*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2u1 = u1;
809*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2u2 = u2;
810*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
811*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2vn = vn;
812*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2v1 = v1;
813*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2v2 = v2;
814*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
815*61046927SAndroid Build Coastguard Worker }
816*61046927SAndroid Build Coastguard Worker 
817*61046927SAndroid Build Coastguard Worker 
818*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid2d(GLint un,GLdouble u1,GLdouble u2,GLint vn,GLdouble v1,GLdouble v2)819*61046927SAndroid Build Coastguard Worker _mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
820*61046927SAndroid Build Coastguard Worker                  GLint vn, GLdouble v1, GLdouble v2 )
821*61046927SAndroid Build Coastguard Worker {
822*61046927SAndroid Build Coastguard Worker    _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2,
823*61046927SAndroid Build Coastguard Worker 		    vn, (GLfloat) v1, (GLfloat) v2 );
824*61046927SAndroid Build Coastguard Worker }
825*61046927SAndroid Build Coastguard Worker 
826*61046927SAndroid Build Coastguard Worker 
827*61046927SAndroid Build Coastguard Worker /**********************************************************************/
828*61046927SAndroid Build Coastguard Worker /*****                      Initialization                        *****/
829*61046927SAndroid Build Coastguard Worker /**********************************************************************/
830*61046927SAndroid Build Coastguard Worker 
831*61046927SAndroid Build Coastguard Worker /**
832*61046927SAndroid Build Coastguard Worker  * Initialize a 1-D evaluator map.
833*61046927SAndroid Build Coastguard Worker  */
834*61046927SAndroid Build Coastguard Worker static void
init_1d_map(struct gl_1d_map * map,int n,const float * initial)835*61046927SAndroid Build Coastguard Worker init_1d_map( struct gl_1d_map *map, int n, const float *initial )
836*61046927SAndroid Build Coastguard Worker {
837*61046927SAndroid Build Coastguard Worker    map->Order = 1;
838*61046927SAndroid Build Coastguard Worker    map->u1 = 0.0;
839*61046927SAndroid Build Coastguard Worker    map->u2 = 1.0;
840*61046927SAndroid Build Coastguard Worker    map->Points = malloc(n * sizeof(GLfloat));
841*61046927SAndroid Build Coastguard Worker    if (map->Points) {
842*61046927SAndroid Build Coastguard Worker       GLint i;
843*61046927SAndroid Build Coastguard Worker       for (i=0;i<n;i++)
844*61046927SAndroid Build Coastguard Worker          map->Points[i] = initial[i];
845*61046927SAndroid Build Coastguard Worker    }
846*61046927SAndroid Build Coastguard Worker }
847*61046927SAndroid Build Coastguard Worker 
848*61046927SAndroid Build Coastguard Worker 
849*61046927SAndroid Build Coastguard Worker /**
850*61046927SAndroid Build Coastguard Worker  * Initialize a 2-D evaluator map
851*61046927SAndroid Build Coastguard Worker  */
852*61046927SAndroid Build Coastguard Worker static void
init_2d_map(struct gl_2d_map * map,int n,const float * initial)853*61046927SAndroid Build Coastguard Worker init_2d_map( struct gl_2d_map *map, int n, const float *initial )
854*61046927SAndroid Build Coastguard Worker {
855*61046927SAndroid Build Coastguard Worker    map->Uorder = 1;
856*61046927SAndroid Build Coastguard Worker    map->Vorder = 1;
857*61046927SAndroid Build Coastguard Worker    map->u1 = 0.0;
858*61046927SAndroid Build Coastguard Worker    map->u2 = 1.0;
859*61046927SAndroid Build Coastguard Worker    map->v1 = 0.0;
860*61046927SAndroid Build Coastguard Worker    map->v2 = 1.0;
861*61046927SAndroid Build Coastguard Worker    map->Points = malloc(n * sizeof(GLfloat));
862*61046927SAndroid Build Coastguard Worker    if (map->Points) {
863*61046927SAndroid Build Coastguard Worker       GLint i;
864*61046927SAndroid Build Coastguard Worker       for (i=0;i<n;i++)
865*61046927SAndroid Build Coastguard Worker          map->Points[i] = initial[i];
866*61046927SAndroid Build Coastguard Worker    }
867*61046927SAndroid Build Coastguard Worker }
868*61046927SAndroid Build Coastguard Worker 
869*61046927SAndroid Build Coastguard Worker 
_mesa_init_eval(struct gl_context * ctx)870*61046927SAndroid Build Coastguard Worker void _mesa_init_eval( struct gl_context *ctx )
871*61046927SAndroid Build Coastguard Worker {
872*61046927SAndroid Build Coastguard Worker    /* Evaluators group */
873*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1Color4 = GL_FALSE;
874*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1Index = GL_FALSE;
875*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1Normal = GL_FALSE;
876*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1TextureCoord1 = GL_FALSE;
877*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1TextureCoord2 = GL_FALSE;
878*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1TextureCoord3 = GL_FALSE;
879*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1TextureCoord4 = GL_FALSE;
880*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1Vertex3 = GL_FALSE;
881*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map1Vertex4 = GL_FALSE;
882*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2Color4 = GL_FALSE;
883*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2Index = GL_FALSE;
884*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2Normal = GL_FALSE;
885*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2TextureCoord1 = GL_FALSE;
886*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2TextureCoord2 = GL_FALSE;
887*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2TextureCoord3 = GL_FALSE;
888*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2TextureCoord4 = GL_FALSE;
889*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2Vertex3 = GL_FALSE;
890*61046927SAndroid Build Coastguard Worker    ctx->Eval.Map2Vertex4 = GL_FALSE;
891*61046927SAndroid Build Coastguard Worker    ctx->Eval.AutoNormal = GL_FALSE;
892*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid1un = 1;
893*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid1u1 = 0.0;
894*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid1u2 = 1.0;
895*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2un = 1;
896*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2vn = 1;
897*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2u1 = 0.0;
898*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2u2 = 1.0;
899*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2v1 = 0.0;
900*61046927SAndroid Build Coastguard Worker    ctx->Eval.MapGrid2v2 = 1.0;
901*61046927SAndroid Build Coastguard Worker 
902*61046927SAndroid Build Coastguard Worker    /* Evaluator data */
903*61046927SAndroid Build Coastguard Worker    {
904*61046927SAndroid Build Coastguard Worker       static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
905*61046927SAndroid Build Coastguard Worker       static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
906*61046927SAndroid Build Coastguard Worker       static GLfloat index[1] = { 1.0 };
907*61046927SAndroid Build Coastguard Worker       static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
908*61046927SAndroid Build Coastguard Worker       static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
909*61046927SAndroid Build Coastguard Worker 
910*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
911*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
912*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
913*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
914*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
915*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
916*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
917*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
918*61046927SAndroid Build Coastguard Worker       init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
919*61046927SAndroid Build Coastguard Worker 
920*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
921*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
922*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
923*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
924*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
925*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
926*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
927*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
928*61046927SAndroid Build Coastguard Worker       init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
929*61046927SAndroid Build Coastguard Worker    }
930*61046927SAndroid Build Coastguard Worker }
931*61046927SAndroid Build Coastguard Worker 
932*61046927SAndroid Build Coastguard Worker 
_mesa_free_eval_data(struct gl_context * ctx)933*61046927SAndroid Build Coastguard Worker void _mesa_free_eval_data( struct gl_context *ctx )
934*61046927SAndroid Build Coastguard Worker {
935*61046927SAndroid Build Coastguard Worker    /* Free evaluator data */
936*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Vertex3.Points);
937*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Vertex4.Points);
938*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Index.Points);
939*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Color4.Points);
940*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Normal.Points);
941*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Texture1.Points);
942*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Texture2.Points);
943*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Texture3.Points);
944*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map1Texture4.Points);
945*61046927SAndroid Build Coastguard Worker 
946*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Vertex3.Points);
947*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Vertex4.Points);
948*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Index.Points);
949*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Color4.Points);
950*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Normal.Points);
951*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Texture1.Points);
952*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Texture2.Points);
953*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Texture3.Points);
954*61046927SAndroid Build Coastguard Worker    free(ctx->EvalMap.Map2Texture4.Points);
955*61046927SAndroid Build Coastguard Worker }
956