eval.c revision 848b8605
1848b8605Smrg 2848b8605Smrg/* 3848b8605Smrg * Mesa 3-D graphics library 4848b8605Smrg * 5848b8605Smrg * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. 6848b8605Smrg * 7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 8848b8605Smrg * copy of this software and associated documentation files (the "Software"), 9848b8605Smrg * to deal in the Software without restriction, including without limitation 10848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 12848b8605Smrg * Software is furnished to do so, subject to the following conditions: 13848b8605Smrg * 14848b8605Smrg * The above copyright notice and this permission notice shall be included 15848b8605Smrg * in all copies or substantial portions of the Software. 16848b8605Smrg * 17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE. 24848b8605Smrg */ 25848b8605Smrg 26848b8605Smrg 27848b8605Smrg/* 28848b8605Smrg * eval.c was written by 29848b8605Smrg * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and 30848b8605Smrg * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de). 31848b8605Smrg * 32848b8605Smrg * My original implementation of evaluators was simplistic and didn't 33848b8605Smrg * compute surface normal vectors properly. Bernd and Volker applied 34848b8605Smrg * used more sophisticated methods to get better results. 35848b8605Smrg * 36848b8605Smrg * Thanks guys! 37848b8605Smrg */ 38848b8605Smrg 39848b8605Smrg 40848b8605Smrg#include "glheader.h" 41848b8605Smrg#include "imports.h" 42848b8605Smrg#include "colormac.h" 43848b8605Smrg#include "context.h" 44848b8605Smrg#include "eval.h" 45848b8605Smrg#include "macros.h" 46848b8605Smrg#include "mtypes.h" 47848b8605Smrg#include "main/dispatch.h" 48848b8605Smrg 49848b8605Smrg 50848b8605Smrg/* 51848b8605Smrg * Return the number of components per control point for any type of 52848b8605Smrg * evaluator. Return 0 if bad target. 53848b8605Smrg * See table 5.1 in the OpenGL 1.2 spec. 54848b8605Smrg */ 55848b8605SmrgGLuint _mesa_evaluator_components( GLenum target ) 56848b8605Smrg{ 57848b8605Smrg switch (target) { 58848b8605Smrg case GL_MAP1_VERTEX_3: return 3; 59848b8605Smrg case GL_MAP1_VERTEX_4: return 4; 60848b8605Smrg case GL_MAP1_INDEX: return 1; 61848b8605Smrg case GL_MAP1_COLOR_4: return 4; 62848b8605Smrg case GL_MAP1_NORMAL: return 3; 63848b8605Smrg case GL_MAP1_TEXTURE_COORD_1: return 1; 64848b8605Smrg case GL_MAP1_TEXTURE_COORD_2: return 2; 65848b8605Smrg case GL_MAP1_TEXTURE_COORD_3: return 3; 66848b8605Smrg case GL_MAP1_TEXTURE_COORD_4: return 4; 67848b8605Smrg case GL_MAP2_VERTEX_3: return 3; 68848b8605Smrg case GL_MAP2_VERTEX_4: return 4; 69848b8605Smrg case GL_MAP2_INDEX: return 1; 70848b8605Smrg case GL_MAP2_COLOR_4: return 4; 71848b8605Smrg case GL_MAP2_NORMAL: return 3; 72848b8605Smrg case GL_MAP2_TEXTURE_COORD_1: return 1; 73848b8605Smrg case GL_MAP2_TEXTURE_COORD_2: return 2; 74848b8605Smrg case GL_MAP2_TEXTURE_COORD_3: return 3; 75848b8605Smrg case GL_MAP2_TEXTURE_COORD_4: return 4; 76848b8605Smrg default: break; 77848b8605Smrg } 78848b8605Smrg 79848b8605Smrg return 0; 80848b8605Smrg} 81848b8605Smrg 82848b8605Smrg 83848b8605Smrg/* 84848b8605Smrg * Return pointer to the gl_1d_map struct for the named target. 85848b8605Smrg */ 86848b8605Smrgstatic struct gl_1d_map * 87848b8605Smrgget_1d_map( struct gl_context *ctx, GLenum target ) 88848b8605Smrg{ 89848b8605Smrg switch (target) { 90848b8605Smrg case GL_MAP1_VERTEX_3: 91848b8605Smrg return &ctx->EvalMap.Map1Vertex3; 92848b8605Smrg case GL_MAP1_VERTEX_4: 93848b8605Smrg return &ctx->EvalMap.Map1Vertex4; 94848b8605Smrg case GL_MAP1_INDEX: 95848b8605Smrg return &ctx->EvalMap.Map1Index; 96848b8605Smrg case GL_MAP1_COLOR_4: 97848b8605Smrg return &ctx->EvalMap.Map1Color4; 98848b8605Smrg case GL_MAP1_NORMAL: 99848b8605Smrg return &ctx->EvalMap.Map1Normal; 100848b8605Smrg case GL_MAP1_TEXTURE_COORD_1: 101848b8605Smrg return &ctx->EvalMap.Map1Texture1; 102848b8605Smrg case GL_MAP1_TEXTURE_COORD_2: 103848b8605Smrg return &ctx->EvalMap.Map1Texture2; 104848b8605Smrg case GL_MAP1_TEXTURE_COORD_3: 105848b8605Smrg return &ctx->EvalMap.Map1Texture3; 106848b8605Smrg case GL_MAP1_TEXTURE_COORD_4: 107848b8605Smrg return &ctx->EvalMap.Map1Texture4; 108848b8605Smrg default: 109848b8605Smrg return NULL; 110848b8605Smrg } 111848b8605Smrg} 112848b8605Smrg 113848b8605Smrg 114848b8605Smrg/* 115848b8605Smrg * Return pointer to the gl_2d_map struct for the named target. 116848b8605Smrg */ 117848b8605Smrgstatic struct gl_2d_map * 118848b8605Smrgget_2d_map( struct gl_context *ctx, GLenum target ) 119848b8605Smrg{ 120848b8605Smrg switch (target) { 121848b8605Smrg case GL_MAP2_VERTEX_3: 122848b8605Smrg return &ctx->EvalMap.Map2Vertex3; 123848b8605Smrg case GL_MAP2_VERTEX_4: 124848b8605Smrg return &ctx->EvalMap.Map2Vertex4; 125848b8605Smrg case GL_MAP2_INDEX: 126848b8605Smrg return &ctx->EvalMap.Map2Index; 127848b8605Smrg case GL_MAP2_COLOR_4: 128848b8605Smrg return &ctx->EvalMap.Map2Color4; 129848b8605Smrg case GL_MAP2_NORMAL: 130848b8605Smrg return &ctx->EvalMap.Map2Normal; 131848b8605Smrg case GL_MAP2_TEXTURE_COORD_1: 132848b8605Smrg return &ctx->EvalMap.Map2Texture1; 133848b8605Smrg case GL_MAP2_TEXTURE_COORD_2: 134848b8605Smrg return &ctx->EvalMap.Map2Texture2; 135848b8605Smrg case GL_MAP2_TEXTURE_COORD_3: 136848b8605Smrg return &ctx->EvalMap.Map2Texture3; 137848b8605Smrg case GL_MAP2_TEXTURE_COORD_4: 138848b8605Smrg return &ctx->EvalMap.Map2Texture4; 139848b8605Smrg default: 140848b8605Smrg return NULL; 141848b8605Smrg } 142848b8605Smrg} 143848b8605Smrg 144848b8605Smrg 145848b8605Smrg/**********************************************************************/ 146848b8605Smrg/*** Copy and deallocate control points ***/ 147848b8605Smrg/**********************************************************************/ 148848b8605Smrg 149848b8605Smrg 150848b8605Smrg/* 151848b8605Smrg * Copy 1-parametric evaluator control points from user-specified 152848b8605Smrg * memory space to a buffer of contiguous control points. 153848b8605Smrg * \param see glMap1f for details 154848b8605Smrg * \return pointer to buffer of contiguous control points or NULL if out 155848b8605Smrg * of memory. 156848b8605Smrg */ 157848b8605SmrgGLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder, 158848b8605Smrg const GLfloat *points ) 159848b8605Smrg{ 160848b8605Smrg GLfloat *buffer, *p; 161848b8605Smrg GLint i, k, size = _mesa_evaluator_components(target); 162848b8605Smrg 163848b8605Smrg if (!points || !size) 164848b8605Smrg return NULL; 165848b8605Smrg 166848b8605Smrg buffer = malloc(uorder * size * sizeof(GLfloat)); 167848b8605Smrg 168848b8605Smrg if (buffer) 169848b8605Smrg for (i = 0, p = buffer; i < uorder; i++, points += ustride) 170848b8605Smrg for (k = 0; k < size; k++) 171848b8605Smrg *p++ = points[k]; 172848b8605Smrg 173848b8605Smrg return buffer; 174848b8605Smrg} 175848b8605Smrg 176848b8605Smrg 177848b8605Smrg 178848b8605Smrg/* 179848b8605Smrg * Same as above but convert doubles to floats. 180848b8605Smrg */ 181848b8605SmrgGLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder, 182848b8605Smrg const GLdouble *points ) 183848b8605Smrg{ 184848b8605Smrg GLfloat *buffer, *p; 185848b8605Smrg GLint i, k, size = _mesa_evaluator_components(target); 186848b8605Smrg 187848b8605Smrg if (!points || !size) 188848b8605Smrg return NULL; 189848b8605Smrg 190848b8605Smrg buffer = malloc(uorder * size * sizeof(GLfloat)); 191848b8605Smrg 192848b8605Smrg if (buffer) 193848b8605Smrg for (i = 0, p = buffer; i < uorder; i++, points += ustride) 194848b8605Smrg for (k = 0; k < size; k++) 195848b8605Smrg *p++ = (GLfloat) points[k]; 196848b8605Smrg 197848b8605Smrg return buffer; 198848b8605Smrg} 199848b8605Smrg 200848b8605Smrg 201848b8605Smrg 202848b8605Smrg/* 203848b8605Smrg * Copy 2-parametric evaluator control points from user-specified 204848b8605Smrg * memory space to a buffer of contiguous control points. 205848b8605Smrg * Additional memory is allocated to be used by the horner and 206848b8605Smrg * de Casteljau evaluation schemes. 207848b8605Smrg * 208848b8605Smrg * \param see glMap2f for details 209848b8605Smrg * \return pointer to buffer of contiguous control points or NULL if out 210848b8605Smrg * of memory. 211848b8605Smrg */ 212848b8605SmrgGLfloat *_mesa_copy_map_points2f( GLenum target, 213848b8605Smrg GLint ustride, GLint uorder, 214848b8605Smrg GLint vstride, GLint vorder, 215848b8605Smrg const GLfloat *points ) 216848b8605Smrg{ 217848b8605Smrg GLfloat *buffer, *p; 218848b8605Smrg GLint i, j, k, size, dsize, hsize; 219848b8605Smrg GLint uinc; 220848b8605Smrg 221848b8605Smrg size = _mesa_evaluator_components(target); 222848b8605Smrg 223848b8605Smrg if (!points || size==0) { 224848b8605Smrg return NULL; 225848b8605Smrg } 226848b8605Smrg 227848b8605Smrg /* max(uorder, vorder) additional points are used in */ 228848b8605Smrg /* horner evaluation and uorder*vorder additional */ 229848b8605Smrg /* values are needed for de Casteljau */ 230848b8605Smrg dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 231848b8605Smrg hsize = (uorder > vorder ? uorder : vorder)*size; 232848b8605Smrg 233848b8605Smrg if(hsize>dsize) 234848b8605Smrg buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat)); 235848b8605Smrg else 236848b8605Smrg buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat)); 237848b8605Smrg 238848b8605Smrg /* compute the increment value for the u-loop */ 239848b8605Smrg uinc = ustride - vorder*vstride; 240848b8605Smrg 241848b8605Smrg if (buffer) 242848b8605Smrg for (i=0, p=buffer; i<uorder; i++, points += uinc) 243848b8605Smrg for (j=0; j<vorder; j++, points += vstride) 244848b8605Smrg for (k=0; k<size; k++) 245848b8605Smrg *p++ = points[k]; 246848b8605Smrg 247848b8605Smrg return buffer; 248848b8605Smrg} 249848b8605Smrg 250848b8605Smrg 251848b8605Smrg 252848b8605Smrg/* 253848b8605Smrg * Same as above but convert doubles to floats. 254848b8605Smrg */ 255848b8605SmrgGLfloat *_mesa_copy_map_points2d(GLenum target, 256848b8605Smrg GLint ustride, GLint uorder, 257848b8605Smrg GLint vstride, GLint vorder, 258848b8605Smrg const GLdouble *points ) 259848b8605Smrg{ 260848b8605Smrg GLfloat *buffer, *p; 261848b8605Smrg GLint i, j, k, size, hsize, dsize; 262848b8605Smrg GLint uinc; 263848b8605Smrg 264848b8605Smrg size = _mesa_evaluator_components(target); 265848b8605Smrg 266848b8605Smrg if (!points || size==0) { 267848b8605Smrg return NULL; 268848b8605Smrg } 269848b8605Smrg 270848b8605Smrg /* max(uorder, vorder) additional points are used in */ 271848b8605Smrg /* horner evaluation and uorder*vorder additional */ 272848b8605Smrg /* values are needed for de Casteljau */ 273848b8605Smrg dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 274848b8605Smrg hsize = (uorder > vorder ? uorder : vorder)*size; 275848b8605Smrg 276848b8605Smrg if(hsize>dsize) 277848b8605Smrg buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat)); 278848b8605Smrg else 279848b8605Smrg buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat)); 280848b8605Smrg 281848b8605Smrg /* compute the increment value for the u-loop */ 282848b8605Smrg uinc = ustride - vorder*vstride; 283848b8605Smrg 284848b8605Smrg if (buffer) 285848b8605Smrg for (i=0, p=buffer; i<uorder; i++, points += uinc) 286848b8605Smrg for (j=0; j<vorder; j++, points += vstride) 287848b8605Smrg for (k=0; k<size; k++) 288848b8605Smrg *p++ = (GLfloat) points[k]; 289848b8605Smrg 290848b8605Smrg return buffer; 291848b8605Smrg} 292848b8605Smrg 293848b8605Smrg 294848b8605Smrg 295848b8605Smrg 296848b8605Smrg/**********************************************************************/ 297848b8605Smrg/*** API entry points ***/ 298848b8605Smrg/**********************************************************************/ 299848b8605Smrg 300848b8605Smrg 301848b8605Smrg/* 302848b8605Smrg * This does the work of glMap1[fd]. 303848b8605Smrg */ 304848b8605Smrgstatic void 305848b8605Smrgmap1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, 306848b8605Smrg GLint uorder, const GLvoid *points, GLenum type ) 307848b8605Smrg{ 308848b8605Smrg GET_CURRENT_CONTEXT(ctx); 309848b8605Smrg GLint k; 310848b8605Smrg GLfloat *pnts; 311848b8605Smrg struct gl_1d_map *map = NULL; 312848b8605Smrg 313848b8605Smrg ASSERT(type == GL_FLOAT || type == GL_DOUBLE); 314848b8605Smrg 315848b8605Smrg if (u1 == u2) { 316848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" ); 317848b8605Smrg return; 318848b8605Smrg } 319848b8605Smrg if (uorder < 1 || uorder > MAX_EVAL_ORDER) { 320848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" ); 321848b8605Smrg return; 322848b8605Smrg } 323848b8605Smrg if (!points) { 324848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" ); 325848b8605Smrg return; 326848b8605Smrg } 327848b8605Smrg 328848b8605Smrg k = _mesa_evaluator_components( target ); 329848b8605Smrg if (k == 0) { 330848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 331848b8605Smrg return; 332848b8605Smrg } 333848b8605Smrg 334848b8605Smrg if (ustride < k) { 335848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" ); 336848b8605Smrg return; 337848b8605Smrg } 338848b8605Smrg 339848b8605Smrg if (ctx->Texture.CurrentUnit != 0) { 340848b8605Smrg /* See OpenGL 1.2.1 spec, section F.2.13 */ 341848b8605Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" ); 342848b8605Smrg return; 343848b8605Smrg } 344848b8605Smrg 345848b8605Smrg map = get_1d_map(ctx, target); 346848b8605Smrg if (!map) { 347848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 348848b8605Smrg return; 349848b8605Smrg } 350848b8605Smrg 351848b8605Smrg /* make copy of the control points */ 352848b8605Smrg if (type == GL_FLOAT) 353848b8605Smrg pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points); 354848b8605Smrg else 355848b8605Smrg pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points); 356848b8605Smrg 357848b8605Smrg 358848b8605Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 359848b8605Smrg map->Order = uorder; 360848b8605Smrg map->u1 = u1; 361848b8605Smrg map->u2 = u2; 362848b8605Smrg map->du = 1.0F / (u2 - u1); 363848b8605Smrg free(map->Points); 364848b8605Smrg map->Points = pnts; 365848b8605Smrg} 366848b8605Smrg 367848b8605Smrg 368848b8605Smrg 369848b8605Smrgvoid GLAPIENTRY 370848b8605Smrg_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, 371848b8605Smrg GLint order, const GLfloat *points ) 372848b8605Smrg{ 373848b8605Smrg map1(target, u1, u2, stride, order, points, GL_FLOAT); 374848b8605Smrg} 375848b8605Smrg 376848b8605Smrg 377848b8605Smrgvoid GLAPIENTRY 378848b8605Smrg_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, 379848b8605Smrg GLint order, const GLdouble *points ) 380848b8605Smrg{ 381848b8605Smrg map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE); 382848b8605Smrg} 383848b8605Smrg 384848b8605Smrg 385848b8605Smrgstatic void 386848b8605Smrgmap2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 387848b8605Smrg GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 388848b8605Smrg const GLvoid *points, GLenum type ) 389848b8605Smrg{ 390848b8605Smrg GET_CURRENT_CONTEXT(ctx); 391848b8605Smrg GLint k; 392848b8605Smrg GLfloat *pnts; 393848b8605Smrg struct gl_2d_map *map = NULL; 394848b8605Smrg 395848b8605Smrg ASSERT(type == GL_FLOAT || type == GL_DOUBLE); 396848b8605Smrg 397848b8605Smrg if (u1==u2) { 398848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" ); 399848b8605Smrg return; 400848b8605Smrg } 401848b8605Smrg 402848b8605Smrg if (v1==v2) { 403848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" ); 404848b8605Smrg return; 405848b8605Smrg } 406848b8605Smrg 407848b8605Smrg if (uorder<1 || uorder>MAX_EVAL_ORDER) { 408848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" ); 409848b8605Smrg return; 410848b8605Smrg } 411848b8605Smrg 412848b8605Smrg if (vorder<1 || vorder>MAX_EVAL_ORDER) { 413848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" ); 414848b8605Smrg return; 415848b8605Smrg } 416848b8605Smrg 417848b8605Smrg k = _mesa_evaluator_components( target ); 418848b8605Smrg if (k==0) { 419848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 420848b8605Smrg return; 421848b8605Smrg } 422848b8605Smrg 423848b8605Smrg if (ustride < k) { 424848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" ); 425848b8605Smrg return; 426848b8605Smrg } 427848b8605Smrg if (vstride < k) { 428848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" ); 429848b8605Smrg return; 430848b8605Smrg } 431848b8605Smrg 432848b8605Smrg if (ctx->Texture.CurrentUnit != 0) { 433848b8605Smrg /* See OpenGL 1.2.1 spec, section F.2.13 */ 434848b8605Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" ); 435848b8605Smrg return; 436848b8605Smrg } 437848b8605Smrg 438848b8605Smrg map = get_2d_map(ctx, target); 439848b8605Smrg if (!map) { 440848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 441848b8605Smrg return; 442848b8605Smrg } 443848b8605Smrg 444848b8605Smrg /* make copy of the control points */ 445848b8605Smrg if (type == GL_FLOAT) 446848b8605Smrg pnts = _mesa_copy_map_points2f(target, ustride, uorder, 447848b8605Smrg vstride, vorder, (GLfloat*) points); 448848b8605Smrg else 449848b8605Smrg pnts = _mesa_copy_map_points2d(target, ustride, uorder, 450848b8605Smrg vstride, vorder, (GLdouble*) points); 451848b8605Smrg 452848b8605Smrg 453848b8605Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 454848b8605Smrg map->Uorder = uorder; 455848b8605Smrg map->u1 = u1; 456848b8605Smrg map->u2 = u2; 457848b8605Smrg map->du = 1.0F / (u2 - u1); 458848b8605Smrg map->Vorder = vorder; 459848b8605Smrg map->v1 = v1; 460848b8605Smrg map->v2 = v2; 461848b8605Smrg map->dv = 1.0F / (v2 - v1); 462848b8605Smrg free(map->Points); 463848b8605Smrg map->Points = pnts; 464848b8605Smrg} 465848b8605Smrg 466848b8605Smrg 467848b8605Smrgvoid GLAPIENTRY 468848b8605Smrg_mesa_Map2f( GLenum target, 469848b8605Smrg GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 470848b8605Smrg GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 471848b8605Smrg const GLfloat *points) 472848b8605Smrg{ 473848b8605Smrg map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, 474848b8605Smrg points, GL_FLOAT); 475848b8605Smrg} 476848b8605Smrg 477848b8605Smrg 478848b8605Smrgvoid GLAPIENTRY 479848b8605Smrg_mesa_Map2d( GLenum target, 480848b8605Smrg GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, 481848b8605Smrg GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, 482848b8605Smrg const GLdouble *points ) 483848b8605Smrg{ 484848b8605Smrg map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder, 485848b8605Smrg (GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE); 486848b8605Smrg} 487848b8605Smrg 488848b8605Smrg 489848b8605Smrg 490848b8605Smrgvoid GLAPIENTRY 491848b8605Smrg_mesa_GetnMapdvARB( GLenum target, GLenum query, GLsizei bufSize, GLdouble *v ) 492848b8605Smrg{ 493848b8605Smrg GET_CURRENT_CONTEXT(ctx); 494848b8605Smrg struct gl_1d_map *map1d; 495848b8605Smrg struct gl_2d_map *map2d; 496848b8605Smrg GLint i, n; 497848b8605Smrg GLfloat *data; 498848b8605Smrg GLuint comps; 499848b8605Smrg GLsizei numBytes; 500848b8605Smrg 501848b8605Smrg comps = _mesa_evaluator_components(target); 502848b8605Smrg if (!comps) { 503848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" ); 504848b8605Smrg return; 505848b8605Smrg } 506848b8605Smrg 507848b8605Smrg map1d = get_1d_map(ctx, target); 508848b8605Smrg map2d = get_2d_map(ctx, target); 509848b8605Smrg ASSERT(map1d || map2d); 510848b8605Smrg 511848b8605Smrg switch (query) { 512848b8605Smrg case GL_COEFF: 513848b8605Smrg if (map1d) { 514848b8605Smrg data = map1d->Points; 515848b8605Smrg n = map1d->Order * comps; 516848b8605Smrg } 517848b8605Smrg else { 518848b8605Smrg data = map2d->Points; 519848b8605Smrg n = map2d->Uorder * map2d->Vorder * comps; 520848b8605Smrg } 521848b8605Smrg if (data) { 522848b8605Smrg numBytes = n * sizeof *v; 523848b8605Smrg if (bufSize < numBytes) 524848b8605Smrg goto overflow; 525848b8605Smrg for (i=0;i<n;i++) { 526848b8605Smrg v[i] = data[i]; 527848b8605Smrg } 528848b8605Smrg } 529848b8605Smrg break; 530848b8605Smrg case GL_ORDER: 531848b8605Smrg if (map1d) { 532848b8605Smrg numBytes = 1 * sizeof *v; 533848b8605Smrg if (bufSize < numBytes) 534848b8605Smrg goto overflow; 535848b8605Smrg v[0] = (GLdouble) map1d->Order; 536848b8605Smrg } 537848b8605Smrg else { 538848b8605Smrg numBytes = 2 * sizeof *v; 539848b8605Smrg if (bufSize < numBytes) 540848b8605Smrg goto overflow; 541848b8605Smrg v[0] = (GLdouble) map2d->Uorder; 542848b8605Smrg v[1] = (GLdouble) map2d->Vorder; 543848b8605Smrg } 544848b8605Smrg break; 545848b8605Smrg case GL_DOMAIN: 546848b8605Smrg if (map1d) { 547848b8605Smrg numBytes = 2 * sizeof *v; 548848b8605Smrg if (bufSize < numBytes) 549848b8605Smrg goto overflow; 550848b8605Smrg v[0] = (GLdouble) map1d->u1; 551848b8605Smrg v[1] = (GLdouble) map1d->u2; 552848b8605Smrg } 553848b8605Smrg else { 554848b8605Smrg numBytes = 4 * sizeof *v; 555848b8605Smrg if (bufSize < numBytes) 556848b8605Smrg goto overflow; 557848b8605Smrg v[0] = (GLdouble) map2d->u1; 558848b8605Smrg v[1] = (GLdouble) map2d->u2; 559848b8605Smrg v[2] = (GLdouble) map2d->v1; 560848b8605Smrg v[3] = (GLdouble) map2d->v2; 561848b8605Smrg } 562848b8605Smrg break; 563848b8605Smrg default: 564848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" ); 565848b8605Smrg } 566848b8605Smrg return; 567848b8605Smrg 568848b8605Smrgoverflow: 569848b8605Smrg _mesa_error( ctx, GL_INVALID_OPERATION, 570848b8605Smrg "glGetnMapdvARB(out of bounds: bufSize is %d," 571848b8605Smrg " but %d bytes are required)", bufSize, numBytes ); 572848b8605Smrg} 573848b8605Smrg 574848b8605Smrgvoid GLAPIENTRY 575848b8605Smrg_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v ) 576848b8605Smrg{ 577848b8605Smrg _mesa_GetnMapdvARB(target, query, INT_MAX, v); 578848b8605Smrg} 579848b8605Smrg 580848b8605Smrgvoid GLAPIENTRY 581848b8605Smrg_mesa_GetnMapfvARB( GLenum target, GLenum query, GLsizei bufSize, GLfloat *v ) 582848b8605Smrg{ 583848b8605Smrg GET_CURRENT_CONTEXT(ctx); 584848b8605Smrg struct gl_1d_map *map1d; 585848b8605Smrg struct gl_2d_map *map2d; 586848b8605Smrg GLint i, n; 587848b8605Smrg GLfloat *data; 588848b8605Smrg GLuint comps; 589848b8605Smrg GLsizei numBytes; 590848b8605Smrg 591848b8605Smrg comps = _mesa_evaluator_components(target); 592848b8605Smrg if (!comps) { 593848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" ); 594848b8605Smrg return; 595848b8605Smrg } 596848b8605Smrg 597848b8605Smrg map1d = get_1d_map(ctx, target); 598848b8605Smrg map2d = get_2d_map(ctx, target); 599848b8605Smrg ASSERT(map1d || map2d); 600848b8605Smrg 601848b8605Smrg switch (query) { 602848b8605Smrg case GL_COEFF: 603848b8605Smrg if (map1d) { 604848b8605Smrg data = map1d->Points; 605848b8605Smrg n = map1d->Order * comps; 606848b8605Smrg } 607848b8605Smrg else { 608848b8605Smrg data = map2d->Points; 609848b8605Smrg n = map2d->Uorder * map2d->Vorder * comps; 610848b8605Smrg } 611848b8605Smrg if (data) { 612848b8605Smrg numBytes = n * sizeof *v; 613848b8605Smrg if (bufSize < numBytes) 614848b8605Smrg goto overflow; 615848b8605Smrg for (i=0;i<n;i++) { 616848b8605Smrg v[i] = data[i]; 617848b8605Smrg } 618848b8605Smrg } 619848b8605Smrg break; 620848b8605Smrg case GL_ORDER: 621848b8605Smrg if (map1d) { 622848b8605Smrg numBytes = 1 * sizeof *v; 623848b8605Smrg if (bufSize < numBytes) 624848b8605Smrg goto overflow; 625848b8605Smrg v[0] = (GLfloat) map1d->Order; 626848b8605Smrg } 627848b8605Smrg else { 628848b8605Smrg numBytes = 2 * sizeof *v; 629848b8605Smrg if (bufSize < numBytes) 630848b8605Smrg goto overflow; 631848b8605Smrg v[0] = (GLfloat) map2d->Uorder; 632848b8605Smrg v[1] = (GLfloat) map2d->Vorder; 633848b8605Smrg } 634848b8605Smrg break; 635848b8605Smrg case GL_DOMAIN: 636848b8605Smrg if (map1d) { 637848b8605Smrg numBytes = 2 * sizeof *v; 638848b8605Smrg if (bufSize < numBytes) 639848b8605Smrg goto overflow; 640848b8605Smrg v[0] = map1d->u1; 641848b8605Smrg v[1] = map1d->u2; 642848b8605Smrg } 643848b8605Smrg else { 644848b8605Smrg numBytes = 4 * sizeof *v; 645848b8605Smrg if (bufSize < numBytes) 646848b8605Smrg goto overflow; 647848b8605Smrg v[0] = map2d->u1; 648848b8605Smrg v[1] = map2d->u2; 649848b8605Smrg v[2] = map2d->v1; 650848b8605Smrg v[3] = map2d->v2; 651848b8605Smrg } 652848b8605Smrg break; 653848b8605Smrg default: 654848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" ); 655848b8605Smrg } 656848b8605Smrg return; 657848b8605Smrg 658848b8605Smrgoverflow: 659848b8605Smrg _mesa_error( ctx, GL_INVALID_OPERATION, 660848b8605Smrg "glGetnMapfvARB(out of bounds: bufSize is %d," 661848b8605Smrg " but %d bytes are required)", bufSize, numBytes ); 662848b8605Smrg} 663848b8605Smrg 664848b8605Smrg 665848b8605Smrgvoid GLAPIENTRY 666848b8605Smrg_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v ) 667848b8605Smrg{ 668848b8605Smrg _mesa_GetnMapfvARB(target, query, INT_MAX, v); 669848b8605Smrg} 670848b8605Smrg 671848b8605Smrg 672848b8605Smrgvoid GLAPIENTRY 673848b8605Smrg_mesa_GetnMapivARB( GLenum target, GLenum query, GLsizei bufSize, GLint *v ) 674848b8605Smrg{ 675848b8605Smrg GET_CURRENT_CONTEXT(ctx); 676848b8605Smrg struct gl_1d_map *map1d; 677848b8605Smrg struct gl_2d_map *map2d; 678848b8605Smrg GLuint i, n; 679848b8605Smrg GLfloat *data; 680848b8605Smrg GLuint comps; 681848b8605Smrg GLsizei numBytes; 682848b8605Smrg 683848b8605Smrg comps = _mesa_evaluator_components(target); 684848b8605Smrg if (!comps) { 685848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" ); 686848b8605Smrg return; 687848b8605Smrg } 688848b8605Smrg 689848b8605Smrg map1d = get_1d_map(ctx, target); 690848b8605Smrg map2d = get_2d_map(ctx, target); 691848b8605Smrg ASSERT(map1d || map2d); 692848b8605Smrg 693848b8605Smrg switch (query) { 694848b8605Smrg case GL_COEFF: 695848b8605Smrg if (map1d) { 696848b8605Smrg data = map1d->Points; 697848b8605Smrg n = map1d->Order * comps; 698848b8605Smrg } 699848b8605Smrg else { 700848b8605Smrg data = map2d->Points; 701848b8605Smrg n = map2d->Uorder * map2d->Vorder * comps; 702848b8605Smrg } 703848b8605Smrg if (data) { 704848b8605Smrg numBytes = n * sizeof *v; 705848b8605Smrg if (bufSize < numBytes) 706848b8605Smrg goto overflow; 707848b8605Smrg for (i=0;i<n;i++) { 708848b8605Smrg v[i] = IROUND(data[i]); 709848b8605Smrg } 710848b8605Smrg } 711848b8605Smrg break; 712848b8605Smrg case GL_ORDER: 713848b8605Smrg if (map1d) { 714848b8605Smrg numBytes = 1 * sizeof *v; 715848b8605Smrg if (bufSize < numBytes) 716848b8605Smrg goto overflow; 717848b8605Smrg v[0] = map1d->Order; 718848b8605Smrg } 719848b8605Smrg else { 720848b8605Smrg numBytes = 2 * sizeof *v; 721848b8605Smrg if (bufSize < numBytes) 722848b8605Smrg goto overflow; 723848b8605Smrg v[0] = map2d->Uorder; 724848b8605Smrg v[1] = map2d->Vorder; 725848b8605Smrg } 726848b8605Smrg break; 727848b8605Smrg case GL_DOMAIN: 728848b8605Smrg if (map1d) { 729848b8605Smrg numBytes = 2 * sizeof *v; 730848b8605Smrg if (bufSize < numBytes) 731848b8605Smrg goto overflow; 732848b8605Smrg v[0] = IROUND(map1d->u1); 733848b8605Smrg v[1] = IROUND(map1d->u2); 734848b8605Smrg } 735848b8605Smrg else { 736848b8605Smrg numBytes = 4 * sizeof *v; 737848b8605Smrg if (bufSize < numBytes) 738848b8605Smrg goto overflow; 739848b8605Smrg v[0] = IROUND(map2d->u1); 740848b8605Smrg v[1] = IROUND(map2d->u2); 741848b8605Smrg v[2] = IROUND(map2d->v1); 742848b8605Smrg v[3] = IROUND(map2d->v2); 743848b8605Smrg } 744848b8605Smrg break; 745848b8605Smrg default: 746848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" ); 747848b8605Smrg } 748848b8605Smrg return; 749848b8605Smrg 750848b8605Smrgoverflow: 751848b8605Smrg _mesa_error( ctx, GL_INVALID_OPERATION, 752848b8605Smrg "glGetnMapivARB(out of bounds: bufSize is %d," 753848b8605Smrg " but %d bytes are required)", bufSize, numBytes ); 754848b8605Smrg} 755848b8605Smrg 756848b8605Smrg 757848b8605Smrgvoid GLAPIENTRY 758848b8605Smrg_mesa_GetMapiv( GLenum target, GLenum query, GLint *v ) 759848b8605Smrg{ 760848b8605Smrg _mesa_GetnMapivARB(target, query, INT_MAX, v); 761848b8605Smrg} 762848b8605Smrg 763848b8605Smrg 764848b8605Smrgvoid GLAPIENTRY 765848b8605Smrg_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) 766848b8605Smrg{ 767848b8605Smrg GET_CURRENT_CONTEXT(ctx); 768848b8605Smrg 769848b8605Smrg if (un<1) { 770848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" ); 771848b8605Smrg return; 772848b8605Smrg } 773848b8605Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 774848b8605Smrg ctx->Eval.MapGrid1un = un; 775848b8605Smrg ctx->Eval.MapGrid1u1 = u1; 776848b8605Smrg ctx->Eval.MapGrid1u2 = u2; 777848b8605Smrg ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un; 778848b8605Smrg} 779848b8605Smrg 780848b8605Smrg 781848b8605Smrgvoid GLAPIENTRY 782848b8605Smrg_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) 783848b8605Smrg{ 784848b8605Smrg _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 ); 785848b8605Smrg} 786848b8605Smrg 787848b8605Smrg 788848b8605Smrgvoid GLAPIENTRY 789848b8605Smrg_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, 790848b8605Smrg GLint vn, GLfloat v1, GLfloat v2 ) 791848b8605Smrg{ 792848b8605Smrg GET_CURRENT_CONTEXT(ctx); 793848b8605Smrg 794848b8605Smrg if (un<1) { 795848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" ); 796848b8605Smrg return; 797848b8605Smrg } 798848b8605Smrg if (vn<1) { 799848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" ); 800848b8605Smrg return; 801848b8605Smrg } 802848b8605Smrg 803848b8605Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 804848b8605Smrg ctx->Eval.MapGrid2un = un; 805848b8605Smrg ctx->Eval.MapGrid2u1 = u1; 806848b8605Smrg ctx->Eval.MapGrid2u2 = u2; 807848b8605Smrg ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un; 808848b8605Smrg ctx->Eval.MapGrid2vn = vn; 809848b8605Smrg ctx->Eval.MapGrid2v1 = v1; 810848b8605Smrg ctx->Eval.MapGrid2v2 = v2; 811848b8605Smrg ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn; 812848b8605Smrg} 813848b8605Smrg 814848b8605Smrg 815848b8605Smrgvoid GLAPIENTRY 816848b8605Smrg_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, 817848b8605Smrg GLint vn, GLdouble v1, GLdouble v2 ) 818848b8605Smrg{ 819848b8605Smrg _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2, 820848b8605Smrg vn, (GLfloat) v1, (GLfloat) v2 ); 821848b8605Smrg} 822848b8605Smrg 823848b8605Smrg 824848b8605Smrgvoid 825848b8605Smrg_mesa_install_eval_vtxfmt(struct _glapi_table *disp, 826848b8605Smrg const GLvertexformat *vfmt) 827848b8605Smrg{ 828848b8605Smrg SET_EvalCoord1f(disp, vfmt->EvalCoord1f); 829848b8605Smrg SET_EvalCoord1fv(disp, vfmt->EvalCoord1fv); 830848b8605Smrg SET_EvalCoord2f(disp, vfmt->EvalCoord2f); 831848b8605Smrg SET_EvalCoord2fv(disp, vfmt->EvalCoord2fv); 832848b8605Smrg SET_EvalPoint1(disp, vfmt->EvalPoint1); 833848b8605Smrg SET_EvalPoint2(disp, vfmt->EvalPoint2); 834848b8605Smrg} 835848b8605Smrg 836848b8605Smrg 837848b8605Smrg/**********************************************************************/ 838848b8605Smrg/***** Initialization *****/ 839848b8605Smrg/**********************************************************************/ 840848b8605Smrg 841848b8605Smrg/** 842848b8605Smrg * Initialize a 1-D evaluator map. 843848b8605Smrg */ 844848b8605Smrgstatic void 845848b8605Smrginit_1d_map( struct gl_1d_map *map, int n, const float *initial ) 846848b8605Smrg{ 847848b8605Smrg map->Order = 1; 848848b8605Smrg map->u1 = 0.0; 849848b8605Smrg map->u2 = 1.0; 850848b8605Smrg map->Points = malloc(n * sizeof(GLfloat)); 851848b8605Smrg if (map->Points) { 852848b8605Smrg GLint i; 853848b8605Smrg for (i=0;i<n;i++) 854848b8605Smrg map->Points[i] = initial[i]; 855848b8605Smrg } 856848b8605Smrg} 857848b8605Smrg 858848b8605Smrg 859848b8605Smrg/** 860848b8605Smrg * Initialize a 2-D evaluator map 861848b8605Smrg */ 862848b8605Smrgstatic void 863848b8605Smrginit_2d_map( struct gl_2d_map *map, int n, const float *initial ) 864848b8605Smrg{ 865848b8605Smrg map->Uorder = 1; 866848b8605Smrg map->Vorder = 1; 867848b8605Smrg map->u1 = 0.0; 868848b8605Smrg map->u2 = 1.0; 869848b8605Smrg map->v1 = 0.0; 870848b8605Smrg map->v2 = 1.0; 871848b8605Smrg map->Points = malloc(n * sizeof(GLfloat)); 872848b8605Smrg if (map->Points) { 873848b8605Smrg GLint i; 874848b8605Smrg for (i=0;i<n;i++) 875848b8605Smrg map->Points[i] = initial[i]; 876848b8605Smrg } 877848b8605Smrg} 878848b8605Smrg 879848b8605Smrg 880848b8605Smrgvoid _mesa_init_eval( struct gl_context *ctx ) 881848b8605Smrg{ 882848b8605Smrg /* Evaluators group */ 883848b8605Smrg ctx->Eval.Map1Color4 = GL_FALSE; 884848b8605Smrg ctx->Eval.Map1Index = GL_FALSE; 885848b8605Smrg ctx->Eval.Map1Normal = GL_FALSE; 886848b8605Smrg ctx->Eval.Map1TextureCoord1 = GL_FALSE; 887848b8605Smrg ctx->Eval.Map1TextureCoord2 = GL_FALSE; 888848b8605Smrg ctx->Eval.Map1TextureCoord3 = GL_FALSE; 889848b8605Smrg ctx->Eval.Map1TextureCoord4 = GL_FALSE; 890848b8605Smrg ctx->Eval.Map1Vertex3 = GL_FALSE; 891848b8605Smrg ctx->Eval.Map1Vertex4 = GL_FALSE; 892848b8605Smrg ctx->Eval.Map2Color4 = GL_FALSE; 893848b8605Smrg ctx->Eval.Map2Index = GL_FALSE; 894848b8605Smrg ctx->Eval.Map2Normal = GL_FALSE; 895848b8605Smrg ctx->Eval.Map2TextureCoord1 = GL_FALSE; 896848b8605Smrg ctx->Eval.Map2TextureCoord2 = GL_FALSE; 897848b8605Smrg ctx->Eval.Map2TextureCoord3 = GL_FALSE; 898848b8605Smrg ctx->Eval.Map2TextureCoord4 = GL_FALSE; 899848b8605Smrg ctx->Eval.Map2Vertex3 = GL_FALSE; 900848b8605Smrg ctx->Eval.Map2Vertex4 = GL_FALSE; 901848b8605Smrg ctx->Eval.AutoNormal = GL_FALSE; 902848b8605Smrg ctx->Eval.MapGrid1un = 1; 903848b8605Smrg ctx->Eval.MapGrid1u1 = 0.0; 904848b8605Smrg ctx->Eval.MapGrid1u2 = 1.0; 905848b8605Smrg ctx->Eval.MapGrid2un = 1; 906848b8605Smrg ctx->Eval.MapGrid2vn = 1; 907848b8605Smrg ctx->Eval.MapGrid2u1 = 0.0; 908848b8605Smrg ctx->Eval.MapGrid2u2 = 1.0; 909848b8605Smrg ctx->Eval.MapGrid2v1 = 0.0; 910848b8605Smrg ctx->Eval.MapGrid2v2 = 1.0; 911848b8605Smrg 912848b8605Smrg /* Evaluator data */ 913848b8605Smrg { 914848b8605Smrg static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 }; 915848b8605Smrg static GLfloat normal[3] = { 0.0, 0.0, 1.0 }; 916848b8605Smrg static GLfloat index[1] = { 1.0 }; 917848b8605Smrg static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 }; 918848b8605Smrg static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 }; 919848b8605Smrg 920848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex ); 921848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex ); 922848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Index, 1, index ); 923848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Color4, 4, color ); 924848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal ); 925848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord ); 926848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord ); 927848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord ); 928848b8605Smrg init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord ); 929848b8605Smrg 930848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex ); 931848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex ); 932848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Index, 1, index ); 933848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Color4, 4, color ); 934848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal ); 935848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord ); 936848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord ); 937848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord ); 938848b8605Smrg init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord ); 939848b8605Smrg } 940848b8605Smrg} 941848b8605Smrg 942848b8605Smrg 943848b8605Smrgvoid _mesa_free_eval_data( struct gl_context *ctx ) 944848b8605Smrg{ 945848b8605Smrg /* Free evaluator data */ 946848b8605Smrg free(ctx->EvalMap.Map1Vertex3.Points); 947848b8605Smrg free(ctx->EvalMap.Map1Vertex4.Points); 948848b8605Smrg free(ctx->EvalMap.Map1Index.Points); 949848b8605Smrg free(ctx->EvalMap.Map1Color4.Points); 950848b8605Smrg free(ctx->EvalMap.Map1Normal.Points); 951848b8605Smrg free(ctx->EvalMap.Map1Texture1.Points); 952848b8605Smrg free(ctx->EvalMap.Map1Texture2.Points); 953848b8605Smrg free(ctx->EvalMap.Map1Texture3.Points); 954848b8605Smrg free(ctx->EvalMap.Map1Texture4.Points); 955848b8605Smrg 956848b8605Smrg free(ctx->EvalMap.Map2Vertex3.Points); 957848b8605Smrg free(ctx->EvalMap.Map2Vertex4.Points); 958848b8605Smrg free(ctx->EvalMap.Map2Index.Points); 959848b8605Smrg free(ctx->EvalMap.Map2Color4.Points); 960848b8605Smrg free(ctx->EvalMap.Map2Normal.Points); 961848b8605Smrg free(ctx->EvalMap.Map2Texture1.Points); 962848b8605Smrg free(ctx->EvalMap.Map2Texture2.Points); 963848b8605Smrg free(ctx->EvalMap.Map2Texture3.Points); 964848b8605Smrg free(ctx->EvalMap.Map2Texture4.Points); 965848b8605Smrg} 966