1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  6.1
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Keith Whitwell <keith@tungstengraphics.com>
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "math/m_eval.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/dispatch.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo_exec.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void clear_active_eval1( struct vbo_exec_context *exec, GLuint attr )
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(attr < Elements(exec->eval.map1));
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->eval.map1[attr].map = NULL;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void clear_active_eval2( struct vbo_exec_context *exec, GLuint attr )
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(attr < Elements(exec->eval.map2));
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->eval.map2[attr].map = NULL;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_active_eval1( struct vbo_exec_context *exec, GLuint attr, GLuint dim,
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      struct gl_1d_map *map )
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(attr < Elements(exec->eval.map1));
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!exec->eval.map1[attr].map) {
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->eval.map1[attr].map = map;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->eval.map1[attr].sz = dim;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_active_eval2( struct vbo_exec_context *exec, GLuint attr, GLuint dim,
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      struct gl_2d_map *map )
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(attr < Elements(exec->eval.map2));
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!exec->eval.map2[attr].map) {
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->eval.map2[attr].map = map;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exec->eval.map2[attr].sz = dim;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_eval_update( struct vbo_exec_context *exec )
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = exec->ctx;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint attr;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Vertex program maps have priority over conventional attribs */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (attr = 0; attr < VBO_ATTRIB_FIRST_MATERIAL; attr++) {
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      clear_active_eval1( exec, attr );
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      clear_active_eval2( exec, attr );
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map1Color4)
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_COLOR0, 4, &ctx->EvalMap.Map1Color4 );
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map2Color4)
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_COLOR0, 4, &ctx->EvalMap.Map2Color4 );
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map1TextureCoord4)
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_TEX0, 4, &ctx->EvalMap.Map1Texture4 );
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map1TextureCoord3)
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_TEX0, 3, &ctx->EvalMap.Map1Texture3 );
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map1TextureCoord2)
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_TEX0, 2, &ctx->EvalMap.Map1Texture2 );
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map1TextureCoord1)
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_TEX0, 1, &ctx->EvalMap.Map1Texture1 );
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map2TextureCoord4)
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_TEX0, 4, &ctx->EvalMap.Map2Texture4 );
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map2TextureCoord3)
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_TEX0, 3, &ctx->EvalMap.Map2Texture3 );
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map2TextureCoord2)
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_TEX0, 2, &ctx->EvalMap.Map2Texture2 );
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map2TextureCoord1)
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_TEX0, 1, &ctx->EvalMap.Map2Texture1 );
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map1Normal)
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_NORMAL, 3, &ctx->EvalMap.Map1Normal );
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map2Normal)
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_NORMAL, 3, &ctx->EvalMap.Map2Normal );
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map1Vertex4)
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_POS, 4, &ctx->EvalMap.Map1Vertex4 );
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map1Vertex3)
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval1( exec, VBO_ATTRIB_POS, 3, &ctx->EvalMap.Map1Vertex3 );
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Eval.Map2Vertex4)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_POS, 4, &ctx->EvalMap.Map2Vertex4 );
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->Eval.Map2Vertex3)
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_active_eval2( exec, VBO_ATTRIB_POS, 3, &ctx->EvalMap.Map2Vertex3 );
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_PROGRAM */
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->VertexProgram._Enabled) {
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* These are the 16 evaluators which GL_NV_vertex_program defines.
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * They alias and override the conventional vertex attributs.
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (attr = 0; attr < 16; attr++) {
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* _NEW_EVAL */
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(attr < Elements(ctx->Eval.Map1Attrib));
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Eval.Map1Attrib[attr])
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            set_active_eval1( exec, attr, 4, &ctx->EvalMap.Map1Attrib[attr] );
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(attr < Elements(ctx->Eval.Map2Attrib));
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Eval.Map2Attrib[attr])
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            set_active_eval2( exec, attr, 4, &ctx->EvalMap.Map2Attrib[attr] );
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec->eval.recalculate_maps = 0;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_do_EvalCoord1f(struct vbo_exec_context *exec, GLfloat u)
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint attr;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (attr = 1; attr <= VBO_ATTRIB_TEX7; attr++) {
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_1d_map *map = exec->eval.map1[attr].map;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (map) {
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLfloat uu = (u - map->u1) * map->du;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLfloat data[4];
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ASSIGN_4V(data, 0, 0, 0, 1);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _math_horner_bezier_curve(map->Points, data, uu,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   exec->eval.map1[attr].sz,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   map->Order);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 COPY_SZ_4V( exec->vtx.attrptr[attr],
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     exec->vtx.attrsz[attr],
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     data );
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Vertex -- EvalCoord1f is a noop if this map not enabled:
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    **/
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->eval.map1[0].map) {
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_1d_map *map = exec->eval.map1[0].map;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat uu = (u - map->u1) * map->du;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat vertex[4];
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSIGN_4V(vertex, 0, 0, 0, 1);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _math_horner_bezier_curve(map->Points, vertex, uu,
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				exec->eval.map1[0].sz,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				map->Order);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->eval.map1[0].sz == 4)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Vertex4fv(GET_DISPATCH(), ( vertex ));
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Vertex3fv(GET_DISPATCH(), ( vertex ));
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vbo_exec_do_EvalCoord2f( struct vbo_exec_context *exec,
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLfloat u, GLfloat v )
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint attr;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (attr = 1; attr <= VBO_ATTRIB_TEX7; attr++) {
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_2d_map *map = exec->eval.map2[attr].map;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (map) {
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLfloat uu = (u - map->u1) * map->du;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLfloat vv = (v - map->v1) * map->dv;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLfloat data[4];
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ASSIGN_4V(data, 0, 0, 0, 1);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _math_horner_bezier_surf(map->Points,
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  data,
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  uu, vv,
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  exec->eval.map2[attr].sz,
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  map->Uorder, map->Vorder);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 COPY_SZ_4V( exec->vtx.attrptr[attr],
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     exec->vtx.attrsz[attr],
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     data );
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Vertex -- EvalCoord2f is a noop if this map not enabled:
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    **/
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exec->eval.map2[0].map) {
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_2d_map *map = exec->eval.map2[0].map;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat uu = (u - map->u1) * map->du;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat vv = (v - map->v1) * map->dv;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat vertex[4];
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSIGN_4V(vertex, 0, 0, 0, 1);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->ctx->Eval.AutoNormal) {
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLfloat normal[4];
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLfloat du[4], dv[4];
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _math_de_casteljau_surf(map->Points, vertex, du, dv, uu, vv,
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 exec->eval.map2[0].sz,
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 map->Uorder, map->Vorder);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (exec->eval.map2[0].sz == 4) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    du[0] = du[0]*vertex[3] - du[3]*vertex[0];
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    du[1] = du[1]*vertex[3] - du[3]*vertex[1];
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    du[2] = du[2]*vertex[3] - du[3]*vertex[2];
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dv[0] = dv[0]*vertex[3] - dv[3]*vertex[0];
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dv[1] = dv[1]*vertex[3] - dv[3]*vertex[1];
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dv[2] = dv[2]*vertex[3] - dv[3]*vertex[2];
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         CROSS3(normal, du, dv);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         NORMALIZE_3FV(normal);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 normal[3] = 1.0;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 COPY_SZ_4V( exec->vtx.attrptr[VBO_ATTRIB_NORMAL],
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     exec->vtx.attrsz[VBO_ATTRIB_NORMAL],
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     normal );
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _math_horner_bezier_surf(map->Points, vertex, uu, vv,
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  exec->eval.map2[0].sz,
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  map->Uorder, map->Vorder);
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (exec->vtx.attrsz[0] == 4)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Vertex4fv(GET_DISPATCH(), ( vertex ));
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_Vertex3fv(GET_DISPATCH(), ( vertex ));
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264