summaryrefslogtreecommitdiffstats
path: root/src/mesa/tnl/t_imm_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/tnl/t_imm_eval.c')
-rw-r--r--src/mesa/tnl/t_imm_eval.c868
1 files changed, 0 insertions, 868 deletions
diff --git a/src/mesa/tnl/t_imm_eval.c b/src/mesa/tnl/t_imm_eval.c
deleted file mode 100644
index f72ada78350..00000000000
--- a/src/mesa/tnl/t_imm_eval.c
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version: 5.1
- *
- * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Keith Whitwell <[email protected]>
- * Brian Paul - vertex program updates
- */
-
-
-#include "glheader.h"
-#include "colormac.h"
-#include "context.h"
-#include "macros.h"
-#include "imports.h"
-#include "mtypes.h"
-#include "math/m_eval.h"
-
-#include "t_context.h"
-#include "t_imm_debug.h"
-#include "t_imm_eval.h"
-#include "t_imm_exec.h"
-#include "t_imm_fixup.h"
-#include "t_imm_alloc.h"
-
-
-static void eval_points1( GLfloat outcoord[][4],
- GLfloat coord[][4],
- const GLuint *flags,
- GLfloat du, GLfloat u1 )
-{
- GLuint i;
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & VERT_BITS_EVAL_ANY) {
- outcoord[i][0] = coord[i][0];
- outcoord[i][1] = coord[i][1];
- if (flags[i] & VERT_BIT_EVAL_P1)
- outcoord[i][0] = coord[i][0] * du + u1;
- }
-}
-
-static void eval_points2( GLfloat outcoord[][4],
- GLfloat coord[][4],
- const GLuint *flags,
- GLfloat du, GLfloat u1,
- GLfloat dv, GLfloat v1 )
-{
- GLuint i;
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++) {
- if (flags[i] & VERT_BITS_EVAL_ANY) {
- outcoord[i][0] = coord[i][0];
- outcoord[i][1] = coord[i][1];
- if (flags[i] & VERT_BIT_EVAL_P2) {
- outcoord[i][0] = coord[i][0] * du + u1;
- outcoord[i][1] = coord[i][1] * dv + v1;
- }
- }
- }
-}
-
-static const GLubyte dirty_flags[5] = {
- 0, /* not possible */
- VEC_DIRTY_0,
- VEC_DIRTY_1,
- VEC_DIRTY_2,
- VEC_DIRTY_3
-};
-
-
-static void eval1_4f( GLvector4f *dest,
- GLfloat coord[][4],
- const GLuint *flags,
- GLuint dimension,
- const struct gl_1d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- GLfloat (*to)[4] = dest->data;
- GLuint i;
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
- GLfloat u = (coord[i][0] - u1) * du;
- ASSIGN_4V(to[i], 0,0,0,1);
- _math_horner_bezier_curve(map->Points, to[i], u,
- dimension, map->Order);
- }
-
- dest->size = MAX2(dest->size, dimension);
- dest->flags |= dirty_flags[dimension];
-}
-
-
-/* as above, but dest is a gl_client_array */
-static void eval1_4f_ca( struct gl_client_array *dest,
- GLfloat coord[][4],
- const GLuint *flags,
- GLuint dimension,
- const struct gl_1d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- const GLubyte *destData = ADD_POINTERS(dest->Ptr, dest->BufferObj->Data);
- GLfloat (*to)[4] = (GLfloat (*)[4]) destData;
- GLuint i;
-
- ASSERT(dest->Type == GL_FLOAT);
- ASSERT(dest->StrideB == 4 * sizeof(GLfloat));
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
- GLfloat u = (coord[i][0] - u1) * du;
- ASSIGN_4V(to[i], 0,0,0,1);
- _math_horner_bezier_curve(map->Points, to[i], u,
- dimension, map->Order);
- }
-
- dest->Size = MAX2(dest->Size, (GLint) dimension);
-}
-
-
-static void eval1_1ui( GLvector1ui *dest,
- GLfloat coord[][4],
- const GLuint *flags,
- const struct gl_1d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- GLuint *to = dest->data;
- GLuint i;
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
- GLfloat u = (coord[i][0] - u1) * du;
- GLfloat tmp;
- _math_horner_bezier_curve(map->Points, &tmp, u, 1, map->Order);
- to[i] = (GLuint) (GLint) tmp;
- }
-
-}
-
-static void eval1_norm( GLvector4f *dest,
- GLfloat coord[][4],
- const GLuint *flags,
- const struct gl_1d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- GLfloat (*to)[4] = dest->data;
- GLuint i;
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
- GLfloat u = (coord[i][0] - u1) * du;
- _math_horner_bezier_curve(map->Points, to[i], u, 3, map->Order);
- }
-}
-
-
-static void eval2_obj_norm( GLvector4f *obj_ptr,
- GLvector4f *norm_ptr,
- GLfloat coord[][4],
- GLuint *flags,
- GLuint dimension,
- const struct gl_2d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- const GLfloat v1 = map->v1;
- const GLfloat dv = map->dv;
- GLfloat (*obj)[4] = obj_ptr->data;
- GLfloat (*normal)[4] = norm_ptr->data;
- GLuint i;
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
- GLfloat u = (coord[i][0] - u1) * du;
- GLfloat v = (coord[i][1] - v1) * dv;
- GLfloat du[4], dv[4];
-
- ASSIGN_4V(obj[i], 0,0,0,1);
- _math_de_casteljau_surf(map->Points, obj[i], du, dv, u, v, dimension,
- map->Uorder, map->Vorder);
-
- if (dimension == 4) {
- du[0] = du[0]*obj[i][3] - du[3]*obj[i][0];
- du[1] = du[1]*obj[i][3] - du[3]*obj[i][1];
- du[2] = du[2]*obj[i][3] - du[3]*obj[i][2];
-
- dv[0] = dv[0]*obj[i][3] - dv[3]*obj[i][0];
- dv[1] = dv[1]*obj[i][3] - dv[3]*obj[i][1];
- dv[2] = dv[2]*obj[i][3] - dv[3]*obj[i][2];
- }
-
- CROSS3(normal[i], du, dv);
- NORMALIZE_3FV(normal[i]);
- }
-
- obj_ptr->size = MAX2(obj_ptr->size, dimension);
- obj_ptr->flags |= dirty_flags[dimension];
-}
-
-
-static void eval2_4f( GLvector4f *dest,
- GLfloat coord[][4],
- const GLuint *flags,
- GLuint dimension,
- const struct gl_2d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- const GLfloat v1 = map->v1;
- const GLfloat dv = map->dv;
- GLfloat (*to)[4] = dest->data;
- GLuint i;
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
- GLfloat u = (coord[i][0] - u1) * du;
- GLfloat v = (coord[i][1] - v1) * dv;
-
- _math_horner_bezier_surf(map->Points, to[i], u, v, dimension,
- map->Uorder, map->Vorder);
- }
-
- dest->size = MAX2(dest->size, dimension);
- dest->flags |= dirty_flags[dimension];
-}
-
-
-/* as above, but dest is a gl_client_array */
-static void eval2_4f_ca( struct gl_client_array *dest,
- GLfloat coord[][4],
- const GLuint *flags,
- GLuint dimension,
- const struct gl_2d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- const GLfloat v1 = map->v1;
- const GLfloat dv = map->dv;
- const GLubyte *destData = ADD_POINTERS(dest->Ptr, dest->BufferObj->Data);
- GLfloat (*to)[4] = (GLfloat (*)[4]) destData;
- GLuint i;
-
- ASSERT(dest->Type == GL_FLOAT);
- ASSERT(dest->StrideB == 4 * sizeof(GLfloat));
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
- GLfloat u = (coord[i][0] - u1) * du;
- GLfloat v = (coord[i][1] - v1) * dv;
- _math_horner_bezier_surf(map->Points, to[i], u, v, dimension,
- map->Uorder, map->Vorder);
- }
-
- dest->Size = MAX2(dest->Size, (GLint) dimension);
-}
-
-
-static void eval2_norm( GLvector4f *dest,
- GLfloat coord[][4],
- GLuint *flags,
- const struct gl_2d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- const GLfloat v1 = map->v1;
- const GLfloat dv = map->dv;
- GLfloat (*to)[4] = dest->data;
- GLuint i;
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++) {
- if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
- GLfloat u = (coord[i][0] - u1) * du;
- GLfloat v = (coord[i][1] - v1) * dv;
- _math_horner_bezier_surf(map->Points, to[i], u, v, 3,
- map->Uorder, map->Vorder);
- }
- }
-}
-
-
-static void eval2_1ui( GLvector1ui *dest,
- GLfloat coord[][4],
- const GLuint *flags,
- const struct gl_2d_map *map )
-{
- const GLfloat u1 = map->u1;
- const GLfloat du = map->du;
- const GLfloat v1 = map->v1;
- const GLfloat dv = map->dv;
- GLuint *to = dest->data;
- GLuint i;
-
- for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
- if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
- GLfloat u = (coord[i][0] - u1) * du;
- GLfloat v = (coord[i][1] - v1) * dv;
- GLfloat tmp;
- _math_horner_bezier_surf(map->Points, &tmp, u, v, 1,
- map->Uorder, map->Vorder);
-
- to[i] = (GLuint) (GLint) tmp;
- }
-}
-
-
-static void copy_4f( GLfloat to[][4], GLfloat from[][4], GLuint count )
-{
- MEMCPY( to, from, count * sizeof(to[0]));
-}
-
-static void copy_4f_stride( GLfloat to[][4], const GLfloat *from,
- GLuint stride, GLuint count )
-{
- if (stride == 4 * sizeof(GLfloat))
- MEMCPY( to, from, count * sizeof(to[0]));
- else {
- GLuint i;
- for (i = 0 ; i < count ; i++, STRIDE_F(from, stride))
- COPY_4FV( to[i], from );
- }
-}
-
-static void copy_3f( GLfloat to[][4], GLfloat from[][4], GLuint count )
-{
- GLuint i;
- for (i = 0 ; i < count ; i++) {
- COPY_3FV(to[i], from[i]);
- }
-}
-
-
-static void copy_1ui( GLuint to[], const GLuint from[], GLuint count )
-{
- MEMCPY( to, from, (count) * sizeof(to[0]));
-}
-
-
-
-/* Translate eval enabled flags to VERT_* flags.
- */
-static void update_eval( GLcontext *ctx )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- GLuint eval1 = 0, eval2 = 0;
- GLuint i;
-
- if (ctx->Eval.Map1Index)
- eval1 |= VERT_BIT_INDEX;
-
- if (ctx->Eval.Map2Index)
- eval2 |= VERT_BIT_INDEX;
-
- if (ctx->Eval.Map1Color4)
- eval1 |= VERT_BIT_COLOR0;
-
- if (ctx->Eval.Map2Color4)
- eval2 |= VERT_BIT_COLOR0;
-
- if (ctx->Eval.Map1Normal)
- eval1 |= VERT_BIT_NORMAL;
-
- if (ctx->Eval.Map2Normal)
- eval2 |= VERT_BIT_NORMAL;
-
- if (ctx->Eval.Map1TextureCoord4 ||
- ctx->Eval.Map1TextureCoord3 ||
- ctx->Eval.Map1TextureCoord2 ||
- ctx->Eval.Map1TextureCoord1)
- eval1 |= VERT_BIT_TEX0;
-
- if (ctx->Eval.Map2TextureCoord4 ||
- ctx->Eval.Map2TextureCoord3 ||
- ctx->Eval.Map2TextureCoord2 ||
- ctx->Eval.Map2TextureCoord1)
- eval2 |= VERT_BIT_TEX0;
-
- if (ctx->Eval.Map1Vertex4)
- eval1 |= VERT_BITS_OBJ_234;
-
- if (ctx->Eval.Map1Vertex3)
- eval1 |= VERT_BITS_OBJ_23;
-
- if (ctx->Eval.Map2Vertex4) {
- if (ctx->Eval.AutoNormal)
- eval2 |= VERT_BITS_OBJ_234 | VERT_BIT_NORMAL;
- else
- eval2 |= VERT_BITS_OBJ_234;
- }
- else if (ctx->Eval.Map2Vertex3) {
- if (ctx->Eval.AutoNormal)
- eval2 |= VERT_BITS_OBJ_23 | VERT_BIT_NORMAL;
- else
- eval2 |= VERT_BITS_OBJ_23;
- }
-
- tnl->eval.EvalMap1Flags = eval1;
- tnl->eval.EvalMap2Flags = eval2;
-
- /* GL_NV_vertex_program evaluators */
- eval1 = eval2 = 0;
- for (i = 0; i < VERT_ATTRIB_MAX; i++) {
- if (ctx->Eval.Map1Attrib[i])
- eval1 |= (1 << i);
- if (ctx->Eval.Map2Attrib[i])
- eval2 |= (1 << i);
- }
- tnl->eval.EvalMap1AttribFlags = eval1;
- tnl->eval.EvalMap2AttribFlags = eval2;
-
- tnl->eval.EvalNewState = 0;
-}
-
-
-/* This looks a lot like a pipeline stage, but for various reasons is
- * better handled outside the pipeline, and considered the final stage
- * of fixing up an immediate struct for execution.
- *
- * Really want to cache the results of this function in display lists,
- * at least for EvalMesh commands.
- */
-void _tnl_eval_immediate( GLcontext *ctx, struct immediate *IM )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- struct vertex_arrays *tmp = &tnl->imm_inputs;
- struct immediate *store = tnl->eval.im;
- GLuint *flags = IM->Flag + IM->CopyStart;
- GLuint copycount;
- GLuint orflag = IM->OrFlag;
- GLuint any_eval1 = orflag & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1);
- GLuint any_eval2 = orflag & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2);
- GLuint req = 0;
- GLuint purge_flags = 0;
- GLfloat (*coord)[4] = IM->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
- GLuint attr;
-
- if (IM->AndFlag & VERT_BITS_EVAL_ANY)
- copycount = IM->Start - IM->CopyStart; /* just copy copied vertices */
- else
- copycount = IM->Count - IM->CopyStart; /* copy all vertices */
-
- if (!store)
- store = tnl->eval.im = _tnl_alloc_immediate( ctx );
-
- if (tnl->eval.EvalNewState & _NEW_EVAL)
- update_eval( ctx );
-
- if (any_eval1) {
- req |= tnl->pipeline.inputs
- & (tnl->eval.EvalMap1Flags | tnl->eval.EvalMap1AttribFlags);
-
- if (!ctx->Eval.Map1Vertex4 && !ctx->Eval.Map1Vertex3 &&
- !ctx->Eval.Map1Attrib[0])
- purge_flags = (VERT_BIT_EVAL_P1|VERT_BIT_EVAL_C1);
-
- if (orflag & VERT_BIT_EVAL_P1) {
- eval_points1( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart,
- coord, flags,
- ctx->Eval.MapGrid1du,
- ctx->Eval.MapGrid1u1);
-
- coord = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
- }
- }
-
- if (any_eval2) {
- req |= tnl->pipeline.inputs
- & (tnl->eval.EvalMap2Flags | tnl->eval.EvalMap2AttribFlags);
-
- if (!ctx->Eval.Map2Vertex4 && !ctx->Eval.Map2Vertex3 &&
- !ctx->Eval.Map2Attrib[0])
- purge_flags |= (VERT_BIT_EVAL_P2|VERT_BIT_EVAL_C2);
-
- if (orflag & VERT_BIT_EVAL_P2) {
- eval_points2( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart,
- coord, flags,
- ctx->Eval.MapGrid2du,
- ctx->Eval.MapGrid2u1,
- ctx->Eval.MapGrid2dv,
- ctx->Eval.MapGrid2v1 );
-
- coord = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
- }
- }
-
- /* Allocate vertex attribute storage now */
- for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
- if ((req & (1 << attr)) && !store->Attrib[attr]) {
- store->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
- if (!store->Attrib[attr]) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "evaluator processing");
- return;
- }
- }
- }
-
-
- /* Perform the evaluations on active data elements.
- */
- if (req & VERT_BIT_INDEX) {
- GLuint generated = 0;
-
- if (copycount)
- copy_1ui( store->Index + IM->CopyStart, tmp->Index.data, copycount );
-
- tmp->Index.data = store->Index + IM->CopyStart;
- tmp->Index.start = store->Index + IM->CopyStart;
-
- if (ctx->Eval.Map1Index && any_eval1) {
- eval1_1ui( &tmp->Index, coord, flags, &ctx->EvalMap.Map1Index );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
-
- if (ctx->Eval.Map2Index && any_eval2) {
- eval2_1ui( &tmp->Index, coord, flags, &ctx->EvalMap.Map2Index );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- }
-
- if (req & VERT_BIT_COLOR0) {
- GLuint generated = 0;
-
- if (copycount) {
- const GLubyte *destData = ADD_POINTERS(tmp->Color.Ptr, tmp->Color.BufferObj->Data);
- copy_4f_stride( store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart,
- (GLfloat *) destData,
- tmp->Color.StrideB,
- copycount );
- }
-
- tmp->Color.Ptr = (GLubyte *) (store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart);
- tmp->Color.StrideB = 4 * sizeof(GLfloat);
- tmp->Color.Flags = 0;
- tnl->vb.importable_data &= ~VERT_BIT_COLOR0;
-
- if (ctx->VertexProgram.Enabled) {
- tmp->Attribs[VERT_ATTRIB_COLOR0].data =
- store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart;
- tmp->Attribs[VERT_ATTRIB_COLOR0].start =
- (GLfloat *) tmp->Attribs[VERT_ATTRIB_COLOR0].data;
- tmp->Attribs[VERT_ATTRIB_COLOR0].size = 0;
- }
-
- /* Vertex program maps have priority over conventional attribs */
- if (any_eval1) {
- if (ctx->VertexProgram.Enabled
- && ctx->Eval.Map1Attrib[VERT_ATTRIB_COLOR0]) {
- eval1_4f_ca( &tmp->Color, coord, flags, 4,
- &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_COLOR0] );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- else if (ctx->Eval.Map1Color4) {
- eval1_4f_ca( &tmp->Color, coord, flags, 4,
- &ctx->EvalMap.Map1Color4 );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- }
-
- if (any_eval2) {
- if (ctx->VertexProgram.Enabled
- && ctx->Eval.Map2Attrib[VERT_ATTRIB_COLOR0]) {
- eval2_4f_ca( &tmp->Color, coord, flags, 4,
- &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_COLOR0] );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- else if (ctx->Eval.Map2Color4) {
- eval2_4f_ca( &tmp->Color, coord, flags, 4,
- &ctx->EvalMap.Map2Color4 );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- }
- }
-
- if (req & VERT_BIT_TEX0) {
- GLuint generated = 0;
-
- if (copycount)
- copy_4f( store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart,
- tmp->TexCoord[0].data, copycount );
- else
- tmp->TexCoord[0].size = 0;
-
- tmp->TexCoord[0].data = store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart;
- tmp->TexCoord[0].start = (GLfloat *)tmp->TexCoord[0].data;
-
- if (ctx->VertexProgram.Enabled) {
- tmp->Attribs[VERT_ATTRIB_TEX0].data =
- store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart;
- tmp->Attribs[VERT_ATTRIB_TEX0].start =
- (GLfloat *) tmp->Attribs[VERT_ATTRIB_TEX0].data;
- tmp->Attribs[VERT_ATTRIB_TEX0].size = 0;
- }
-
- /* Vertex program maps have priority over conventional attribs */
- if (any_eval1) {
- if (ctx->VertexProgram.Enabled
- && ctx->Eval.Map1Attrib[VERT_ATTRIB_TEX0]) {
- eval1_4f( &tmp->TexCoord[0], coord, flags, 4,
- &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_TEX0] );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- else if (ctx->Eval.Map1TextureCoord4) {
- eval1_4f( &tmp->TexCoord[0], coord, flags, 4,
- &ctx->EvalMap.Map1Texture4 );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- else if (ctx->Eval.Map1TextureCoord3) {
- eval1_4f( &tmp->TexCoord[0], coord, flags, 3,
- &ctx->EvalMap.Map1Texture3 );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- else if (ctx->Eval.Map1TextureCoord2) {
- eval1_4f( &tmp->TexCoord[0], coord, flags, 2,
- &ctx->EvalMap.Map1Texture2 );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- else if (ctx->Eval.Map1TextureCoord1) {
- eval1_4f( &tmp->TexCoord[0], coord, flags, 1,
- &ctx->EvalMap.Map1Texture1 );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- }
-
- if (any_eval2) {
- if (ctx->VertexProgram.Enabled
- && ctx->Eval.Map2Attrib[VERT_ATTRIB_TEX0]) {
- eval2_4f( &tmp->TexCoord[0], coord, flags, 4,
- &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_TEX0] );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- else if (ctx->Eval.Map2TextureCoord4) {
- eval2_4f( &tmp->TexCoord[0], coord, flags, 4,
- &ctx->EvalMap.Map2Texture4 );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- else if (ctx->Eval.Map2TextureCoord3) {
- eval2_4f( &tmp->TexCoord[0], coord, flags, 3,
- &ctx->EvalMap.Map2Texture3 );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- else if (ctx->Eval.Map2TextureCoord2) {
- eval2_4f( &tmp->TexCoord[0], coord, flags, 2,
- &ctx->EvalMap.Map2Texture2 );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- else if (ctx->Eval.Map2TextureCoord1) {
- eval2_4f( &tmp->TexCoord[0], coord, flags, 1,
- &ctx->EvalMap.Map2Texture1 );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- }
- }
-
- if (req & VERT_BIT_NORMAL) {
- GLuint generated = 0;
-
- if (copycount) {
- copy_3f( store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart,
- tmp->Normal.data, copycount );
- }
-
- tmp->Normal.data = store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart;
- tmp->Normal.start = (GLfloat *)tmp->Normal.data;
-
- if (ctx->VertexProgram.Enabled) {
- tmp->Attribs[VERT_ATTRIB_NORMAL].data =
- store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart;
- tmp->Attribs[VERT_ATTRIB_NORMAL].start =
- (GLfloat *) tmp->Attribs[VERT_ATTRIB_NORMAL].data;
- tmp->Attribs[VERT_ATTRIB_NORMAL].size = 0;
- }
-
- if (any_eval1) {
- if (ctx->VertexProgram.Enabled &&
- ctx->Eval.Map1Attrib[VERT_ATTRIB_NORMAL]) {
- eval1_norm( &tmp->Normal, coord, flags,
- &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_NORMAL] );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- else if (ctx->Eval.Map1Normal) {
- eval1_norm( &tmp->Normal, coord, flags, &ctx->EvalMap.Map1Normal );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- }
-
- if (any_eval2) {
- if (ctx->VertexProgram.Enabled &&
- ctx->Eval.Map2Attrib[VERT_ATTRIB_NORMAL]) {
- eval2_norm( &tmp->Normal, coord, flags,
- &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_NORMAL] );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- else if (ctx->Eval.Map2Normal) {
- eval2_norm( &tmp->Normal, coord, flags, &ctx->EvalMap.Map2Normal );
- generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
- }
- }
- }
-
- /* In the AutoNormal case, the copy and assignment of tmp->NormalPtr
- * are done above.
- */
- if (req & VERT_BIT_POS) {
- if (copycount) {
- /* This copy may already have occurred when eliminating
- * glEvalPoint calls:
- */
- if (coord != store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart) {
- copy_4f( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart,
- tmp->Obj.data, copycount );
- }
- }
- else {
- tmp->Obj.size = 0;
- }
-
- tmp->Obj.data = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
- tmp->Obj.start = (GLfloat *) tmp->Obj.data;
-
-#if 1
- /*tmp->Attribs[0].count = count;*/
- tmp->Attribs[0].data = store->Attrib[0] + IM->CopyStart;
- tmp->Attribs[0].start = (GLfloat *) tmp->Attribs[0].data;
- tmp->Attribs[0].size = 0;
-#endif
-
- /* Note: Normal data is already prepared above.
- */
-
- if (any_eval1) {
- if (ctx->VertexProgram.Enabled &&
- ctx->Eval.Map1Attrib[VERT_ATTRIB_POS]) {
- eval1_4f( &tmp->Obj, coord, flags, 4,
- &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_POS] );
- }
- else if (ctx->Eval.Map1Vertex4) {
- eval1_4f( &tmp->Obj, coord, flags, 4,
- &ctx->EvalMap.Map1Vertex4 );
- }
- else if (ctx->Eval.Map1Vertex3) {
- eval1_4f( &tmp->Obj, coord, flags, 3,
- &ctx->EvalMap.Map1Vertex3 );
- }
- }
-
- if (any_eval2) {
- if (ctx->VertexProgram.Enabled &&
- ctx->Eval.Map2Attrib[VERT_ATTRIB_POS]) {
- if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
- eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 4,
- &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_POS] );
- else
- eval2_4f( &tmp->Obj, coord, flags, 4,
- &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_POS] );
- }
- else if (ctx->Eval.Map2Vertex4) {
- if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
- eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 4,
- &ctx->EvalMap.Map2Vertex4 );
- else
- eval2_4f( &tmp->Obj, coord, flags, 4,
- &ctx->EvalMap.Map2Vertex4 );
- }
- else if (ctx->Eval.Map2Vertex3) {
- if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
- eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 3,
- &ctx->EvalMap.Map2Vertex3 );
- else
- eval2_4f( &tmp->Obj, coord, flags, 3,
- &ctx->EvalMap.Map2Vertex3 );
- }
- }
- }
-
-
- if (ctx->VertexProgram.Enabled) {
- /* We already evaluated position, normal, color and texture 0 above.
- * now evaluate any other generic attributes.
- */
- const GLuint skipBits = (VERT_BIT_POS |
- VERT_BIT_NORMAL |
- VERT_BIT_COLOR0 |
- VERT_BIT_TEX0);
- GLuint generated = 0;
- GLuint attr;
- for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
- if ((1 << attr) & req & ~skipBits) {
- if (any_eval1 && ctx->Eval.Map1Attrib[attr]) {
- /* evaluate 1-D vertex attrib map [i] */
- eval1_4f( &tmp->Attribs[attr], coord, flags, 4,
- &ctx->EvalMap.Map1Attrib[attr] );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- if (any_eval2 && ctx->Eval.Map2Attrib[attr]) {
- /* evaluate 2-D vertex attrib map [i] */
- eval2_4f( &tmp->Attribs[attr], coord, flags, 4,
- &ctx->EvalMap.Map2Attrib[attr] );
- generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
- }
- }
- }
- }
-
- /* Calculate new IM->Elts, IM->Primitive, IM->PrimitiveLength for
- * the case where vertex maps are not enabled for some received
- * eval coordinates. In this case those slots in the immediate
- * must be ignored.
- */
- if (purge_flags) {
- const GLuint vertex = VERT_BIT_POS|(VERT_BITS_EVAL_ANY & ~purge_flags);
- GLuint last_new_prim = 0;
- GLuint new_prim_length = 0;
- GLuint next_old_prim = 0;
- struct vertex_buffer *VB = &tnl->vb;
- const GLuint count = VB->Count;
- GLuint i, j;
-
- for (i = 0, j = 0 ; i < count ; i++) {
- if (flags[i] & vertex) {
- store->Elt[j++] = i;
- new_prim_length++;
- }
- if (i == next_old_prim) {
- next_old_prim += VB->PrimitiveLength[i];
- VB->PrimitiveLength[last_new_prim] = new_prim_length;
- VB->Primitive[j] = VB->Primitive[i];
- last_new_prim = j;
- }
- }
-
- VB->Elts = store->Elt;
- _tnl_get_purged_copy_verts( ctx, store );
- }
-
- /* Produce new flags array:
- */
- {
- const GLuint count = tnl->vb.Count + 1;
- GLuint i;
-
- copy_1ui( store->Flag, flags, count );
- tnl->vb.Flag = store->Flag;
- for (i = 0 ; i < count ; i++)
- store->Flag[i] |= req;
- IM->Evaluated = req; /* hack for copying. */
- }
-}