summaryrefslogtreecommitdiff
path: root/src/mesa/tnl/t_imm_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/tnl/t_imm_api.c')
-rw-r--r--src/mesa/tnl/t_imm_api.c1387
1 files changed, 0 insertions, 1387 deletions
diff --git a/src/mesa/tnl/t_imm_api.c b/src/mesa/tnl/t_imm_api.c
deleted file mode 100644
index 52c20285cc..0000000000
--- a/src/mesa/tnl/t_imm_api.c
+++ /dev/null
@@ -1,1387 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version: 5.1
- *
- * Copyright (C) 1999-2002 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 <keith@tungstengraphics.com>
- */
-
-
-
-#include "glheader.h"
-#include "context.h"
-#include "dlist.h"
-#include "enums.h"
-#include "light.h"
-#include "imports.h"
-#include "state.h"
-#include "colormac.h"
-#include "macros.h"
-#include "vtxfmt.h"
-
-#include "t_context.h"
-#include "t_imm_api.h"
-#include "t_imm_elt.h"
-#include "t_imm_exec.h"
-#include "t_imm_dlist.h"
-
-
-/* A cassette is full or flushed on a statechange.
- */
-void _tnl_flush_immediate( GLcontext *ctx, struct immediate *IM )
-{
- if (!ctx) {
- /* We were called by glVertex, glEvalCoord, glArrayElement, etc.
- * The current context is corresponds to the IM structure.
- */
- GET_CURRENT_CONTEXT(context);
- ctx = context;
- }
-
- if (MESA_VERBOSE & VERBOSE_IMMEDIATE)
- _mesa_debug(ctx, "_tnl_flush_immediate IM: %d compiling: %d\n",
- IM->id, ctx->CompileFlag);
-
- if (IM->FlushElt == FLUSH_ELT_EAGER) {
- _tnl_translate_array_elts( ctx, IM, IM->LastPrimitive, IM->Count );
- }
-
- /* Mark the last primitive:
- */
- IM->PrimitiveLength[IM->LastPrimitive] = IM->Count - IM->LastPrimitive;
- IM->Primitive[IM->LastPrimitive] |= PRIM_LAST;
-
- if (ctx->CompileFlag)
- _tnl_compile_cassette( ctx, IM );
- else
- _tnl_execute_cassette( ctx, IM );
-}
-
-
-/* Hook for ctx->Driver.FlushVertices:
- */
-void _tnl_flush_vertices( GLcontext *ctx, GLuint flags )
-{
- struct immediate *IM = TNL_CURRENT_IM(ctx);
-
- if (MESA_VERBOSE & VERBOSE_IMMEDIATE)
- _mesa_debug(ctx,
- "_tnl_flush_vertices flags %x IM(%d) %d..%d Flag[%d]: %x\n",
- flags, IM->id, IM->Start, IM->Count, IM->Start,
- IM->Flag[IM->Start]);
-
- if (IM->Flag[IM->Start]) {
- if ((flags & FLUSH_UPDATE_CURRENT) ||
- IM->Count > IM->Start ||
- (IM->Flag[IM->Start] & (VERT_BIT_BEGIN | VERT_BIT_END))) {
- _tnl_flush_immediate( ctx, IM );
- }
- }
-}
-
-
-void GLAPIENTRY
-_tnl_save_Begin( GLenum mode )
-{
- GET_CURRENT_CONTEXT(ctx);
- struct immediate *IM = TNL_CURRENT_IM(ctx);
- GLuint inflags, state;
-
-/* _mesa_debug(ctx, "%s: before: %x\n", __FUNCTION__, IM->BeginState); */
-
- if (mode > GL_POLYGON) {
- _mesa_compile_error( ctx, GL_INVALID_ENUM, "_tnl_Begin" );
- return;
- }
-
- if (ctx->NewState)
- _mesa_update_state(ctx);
-
-#if 000
- /* if only a very few slots left, might as well flush now
- */
- if (IM->Count > IMM_MAXDATA-8) {
- _tnl_flush_immediate( ctx, IM );
- IM = TNL_CURRENT_IM(ctx);
- }
-#endif
-
- if (IM->Count > IMM_MAXDATA-8) {
- _tnl_flush_immediate( ctx, IM );
- IM = TNL_CURRENT_IM(ctx);
- }
-
- /* Check for and flush buffered vertices from internal operations.
- */
- if (IM->SavedBeginState) {
- _tnl_flush_immediate( ctx, IM );
- IM = TNL_CURRENT_IM(ctx);
- IM->BeginState = IM->SavedBeginState;
- IM->SavedBeginState = 0;
- }
-
- state = IM->BeginState;
- inflags = state & (VERT_BEGIN_0|VERT_BEGIN_1);
- state |= inflags << 2; /* set error conditions */
-
- if (inflags != (VERT_BEGIN_0|VERT_BEGIN_1))
- {
- GLuint count = IM->Count;
- GLuint last = IM->LastPrimitive;
-
- state |= (VERT_BEGIN_0|VERT_BEGIN_1);
- IM->Flag[count] |= VERT_BIT_BEGIN;
- IM->Primitive[count] = mode | PRIM_BEGIN;
- IM->PrimitiveLength[IM->LastPrimitive] = count - IM->LastPrimitive;
- IM->LastPrimitive = count;
-
- /* Not quite right. Need to use the fallback '_aa_ArrayElement'
- * when not known to be inside begin/end and arrays are
- * unlocked.
- */
- if (IM->FlushElt == FLUSH_ELT_EAGER) {
- _tnl_translate_array_elts( ctx, IM, last, count );
- }
- }
-
- ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
- IM->BeginState = state;
-
- /* Update save_primitive now. Don't touch ExecPrimitive as this is
- * updated in the replay of this cassette if we are in
- * COMPILE_AND_EXECUTE mode.
- */
- if (ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN)
- ctx->Driver.CurrentSavePrimitive = PRIM_INSIDE_UNKNOWN_PRIM;
- else if (ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END)
- ctx->Driver.CurrentSavePrimitive = mode;
-}
-
-
-void GLAPIENTRY
-_tnl_Begin( GLenum mode )
-{
- GET_CURRENT_CONTEXT(ctx);
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- ASSERT (!ctx->CompileFlag);
-
- if (mode > GL_POLYGON) {
- _mesa_error( ctx, GL_INVALID_ENUM, "_tnl_Begin(0x%x)", mode );
- return;
- }
-
- if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {
- _mesa_error( ctx, GL_INVALID_OPERATION, "_tnl_Begin" );
- return;
- }
-
- if (ctx->NewState)
- _mesa_update_state(ctx);
-
- {
- struct immediate *IM = TNL_CURRENT_IM(ctx);
- if (IM->Count > IMM_MAXDATA-8) {
- _tnl_flush_immediate( ctx, IM );
- IM = TNL_CURRENT_IM(ctx);
- }
- }
-
-
- {
- struct immediate *IM = TNL_CURRENT_IM(ctx);
- GLuint count = IM->Count;
- GLuint last = IM->LastPrimitive;
-
- if (IM->Start == IM->Count &&
- tnl->Driver.NotifyBegin &&
- tnl->Driver.NotifyBegin( ctx, mode )) {
- return;
- }
-
- assert( (IM->SavedBeginState & (VERT_BEGIN_0|VERT_BEGIN_1)) == 0 );
- assert( (IM->BeginState & (VERT_BEGIN_0|VERT_BEGIN_1)) == 0 );
-
- /* Not quite right. Need to use the fallback '_aa_ArrayElement'
- * when not known to be inside begin/end and arrays are
- * unlocked.
- */
- if (IM->FlushElt == FLUSH_ELT_EAGER) {
- _tnl_translate_array_elts( ctx, IM, last, count );
- }
-
- IM->Flag[count] |= VERT_BIT_BEGIN;
- IM->Primitive[count] = mode | PRIM_BEGIN;
- IM->PrimitiveLength[last] = count - last;
- IM->LastPrimitive = count;
- IM->BeginState = (VERT_BEGIN_0|VERT_BEGIN_1);
-
-/* _mesa_debug(ctx, "%s: %x\n", __FUNCTION__, IM->BeginState); */
-
- ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
- ctx->Driver.CurrentExecPrimitive = mode;
- }
-}
-
-
-/* Function which allows operations like 'glRectf' to decompose to a
- * begin/end object and vertices without worrying about what happens
- * with display lists.
- */
-GLboolean
-_tnl_hard_begin( GLcontext *ctx, GLenum p )
-{
-/* _mesa_debug(ctx, "%s\n", __FUNCTION__); */
-
- if (!ctx->CompileFlag) {
- /* If not compiling, treat as a normal begin().
- */
-/* _mesa_debug(ctx, "%s: treating as glBegin\n", __FUNCTION__); */
- glBegin( p );
- return GL_TRUE;
- }
- else {
- /* Otherwise, need to do special processing to preserve the
- * condition that these vertices will only be replayed outside
- * future begin/end objects.
- */
- struct immediate *IM = TNL_CURRENT_IM(ctx);
-
- if (ctx->NewState)
- _mesa_update_state(ctx);
-
- if (IM->Count > IMM_MAXDATA-8) {
- _tnl_flush_immediate( ctx, IM );
- IM = TNL_CURRENT_IM(ctx);
- }
-
- /* A lot depends on the degree to which the display list has
- * constrained the possible begin/end states at this point:
- */
- switch (IM->BeginState & (VERT_BEGIN_0|VERT_BEGIN_1)) {
- case VERT_BEGIN_0|VERT_BEGIN_1:
- /* This is an immediate known to be inside a begin/end object.
- */
- ASSERT(ctx->Driver.CurrentSavePrimitive <= GL_POLYGON);
- IM->BeginState |= (VERT_ERROR_1|VERT_ERROR_0);
- return GL_FALSE;
-
- case VERT_BEGIN_0:
- case VERT_BEGIN_1:
- /* This is a display-list immediate in an unknown begin/end
- * state. Assert it is empty and convert it to a 'hard' one.
- */
- ASSERT(IM->SavedBeginState == 0);
- ASSERT(ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN);
-
- /* Push current beginstate, to be restored later. Don't worry
- * about raising errors.
- */
- IM->SavedBeginState = IM->BeginState;
-
- /* FALLTHROUGH */
-
- case 0:
- /* Unless we have fallen through, this is an immediate known to
- * be outside begin/end objects.
- */
- ASSERT(ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN ||
- ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END);
- ASSERT (IM->FlushElt != FLUSH_ELT_EAGER);
-
- IM->BeginState |= VERT_BEGIN_0|VERT_BEGIN_1;
- IM->Flag[IM->Count] |= VERT_BIT_BEGIN;
- IM->Primitive[IM->Count] = p | PRIM_BEGIN;
- IM->PrimitiveLength[IM->LastPrimitive] = IM->Count - IM->LastPrimitive;
- IM->LastPrimitive = IM->Count;
-
- /* This is necessary as this immediate will not be flushed in
- * _tnl_end() -- we leave it active, hoping to pick up more
- * vertices before the next state change.
- */
- ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
- return GL_TRUE;
-
- default:
- assert (0);
- return GL_TRUE;
- }
- }
-}
-
-
-/* Both streams now outside begin/end.
- *
- * Leave SavedBeginState untouched -- attempt to gather several
- * rects/arrays together in a single immediate struct.
- */
-void
-_tnl_end_ctx( GLcontext *ctx )
-{
- struct immediate *IM = TNL_CURRENT_IM(ctx);
- GLuint state = IM->BeginState;
- GLuint inflags = (~state) & (VERT_BEGIN_0|VERT_BEGIN_1);
-
- /* Not the case if vertices emitted without calling glBegin first:
- */
-/* assert( ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES ); */
-
-
- state |= inflags << 2; /* errors */
-
- if (inflags != (VERT_BEGIN_0|VERT_BEGIN_1))
- {
- GLuint count = IM->Count;
- GLuint last = IM->LastPrimitive;
-
- state &= ~(VERT_BEGIN_0|VERT_BEGIN_1); /* update state */
- IM->Flag[count] |= VERT_BIT_END;
- IM->Primitive[last] |= PRIM_END;
- IM->PrimitiveLength[last] = count - last;
- IM->Primitive[count] = PRIM_OUTSIDE_BEGIN_END; /* removes PRIM_BEGIN
- * flag if length == 0
- */
- IM->LastPrimitive = count;
-
- if (IM->FlushElt == FLUSH_ELT_EAGER) {
- _tnl_translate_array_elts( ctx, IM, last, count );
- }
- }
-
- IM->BeginState = state;
-
- if (!ctx->CompileFlag) {
- if (ctx->Driver.CurrentExecPrimitive == PRIM_OUTSIDE_BEGIN_END)
- _mesa_error( ctx, GL_INVALID_OPERATION, "_tnl_End" );
- else
- ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
- }
-
- /* You can set this flag to get the old 'flush_vb on glEnd()'
- * behaviour.
- */
- if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
- _tnl_flush_immediate( ctx, IM );
-}
-
-void GLAPIENTRY
-_tnl_End(void)
-{
- GET_CURRENT_CONTEXT(ctx);
-
- _tnl_end_ctx( ctx );
-
- /* Need to keep save primitive uptodate in COMPILE and
- * COMPILE_AND_EXEC modes, need to keep exec primitive uptodate
- * otherwise.
- */
- if (ctx->CompileFlag)
- ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
-}
-
-
-/* If the given vertex attribute array hasn't been allocated yet,
- * allocate it now.
- */
-#define CHECK_ATTRIB_ARRAY(IM, ATTR) \
- if (!IM->Attrib[ATTR]) { \
- IM->Attrib[ATTR] = \
- (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat)); \
- if (!IM->Attrib[ATTR]) { \
- GET_CURRENT_CONTEXT(ctx); \
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glVertex/Normal/etc"); \
- return; \
- } \
- }
-
-
-#define COLOR( r, g, b, a ) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- GLfloat *color; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_COLOR0); \
- color = IM->Attrib[VERT_ATTRIB_COLOR0][count]; \
- color[0] = r; \
- color[1] = g; \
- color[2] = b; \
- color[3] = a; \
- IM->Flag[count] |= VERT_BIT_COLOR0; \
-}
-
-static void GLAPIENTRY
-_tnl_Color3f( GLfloat red, GLfloat green, GLfloat blue )
-{
- COLOR( red, green, blue, 1.0 );
-}
-
-static void GLAPIENTRY
-_tnl_Color3ub( GLubyte red, GLubyte green, GLubyte blue )
-{
- COLOR(UBYTE_TO_FLOAT(red),
- UBYTE_TO_FLOAT(green),
- UBYTE_TO_FLOAT(blue),
- 1.0);
-}
-
-static void GLAPIENTRY
-_tnl_Color4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
-{
- COLOR( red, green, blue, alpha );
-}
-
-static void GLAPIENTRY
-_tnl_Color4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha )
-{
- COLOR(UBYTE_TO_FLOAT(red),
- UBYTE_TO_FLOAT(green),
- UBYTE_TO_FLOAT(blue),
- UBYTE_TO_FLOAT(alpha));
-}
-
-static void GLAPIENTRY
-_tnl_Color3fv( const GLfloat *v )
-{
- COLOR( v[0], v[1], v[2], 1.0 );
-}
-
-static void GLAPIENTRY
-_tnl_Color3ubv( const GLubyte *v )
-{
- COLOR(UBYTE_TO_FLOAT(v[0]),
- UBYTE_TO_FLOAT(v[1]),
- UBYTE_TO_FLOAT(v[2]),
- 1.0 );
-}
-
-static void GLAPIENTRY
-_tnl_Color4fv( const GLfloat *v )
-{
- COLOR( v[0], v[1], v[2], v[3] );
-}
-
-static void GLAPIENTRY
-_tnl_Color4ubv( const GLubyte *v)
-{
- COLOR(UBYTE_TO_FLOAT(v[0]),
- UBYTE_TO_FLOAT(v[1]),
- UBYTE_TO_FLOAT(v[2]),
- UBYTE_TO_FLOAT(v[3]));
-}
-
-
-
-#define SECONDARY_COLOR( r, g, b ) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- GLfloat *color; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_COLOR1); \
- color = IM->Attrib[VERT_ATTRIB_COLOR1][count]; \
- color[0] = r; \
- color[1] = g; \
- color[2] = b; \
- IM->Flag[count] |= VERT_BIT_COLOR1; \
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3fEXT( GLfloat red, GLfloat green, GLfloat blue )
-{
- SECONDARY_COLOR( red, green, blue );
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3ubEXT( GLubyte red, GLubyte green, GLubyte blue )
-{
- SECONDARY_COLOR(UBYTE_TO_FLOAT(red),
- UBYTE_TO_FLOAT(green),
- UBYTE_TO_FLOAT(blue));
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3fvEXT( const GLfloat *v )
-{
- SECONDARY_COLOR( v[0], v[1], v[2] );
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3ubvEXT( const GLubyte *v )
-{
- SECONDARY_COLOR(UBYTE_TO_FLOAT(v[0]),
- UBYTE_TO_FLOAT(v[1]),
- UBYTE_TO_FLOAT(v[2]));
-}
-
-
-static void GLAPIENTRY
-_tnl_EdgeFlag( GLboolean flag )
-{
- GLuint count;
- GET_IMMEDIATE;
- count = IM->Count;
- IM->EdgeFlag[count] = flag;
- IM->Flag[count] |= VERT_BIT_EDGEFLAG;
-}
-
-
-static void GLAPIENTRY
-_tnl_EdgeFlagv( const GLboolean *flag )
-{
- GLuint count;
- GET_IMMEDIATE;
- count = IM->Count;
- IM->EdgeFlag[count] = *flag;
- IM->Flag[count] |= VERT_BIT_EDGEFLAG;
-}
-
-
-static void GLAPIENTRY
-_tnl_FogCoordfEXT( GLfloat f )
-{
- GET_IMMEDIATE;
- GLuint count = IM->Count;
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_FOG);
- IM->Attrib[VERT_ATTRIB_FOG][count][0] = f;
- IM->Flag[count] |= VERT_BIT_FOG;
-}
-
-static void GLAPIENTRY
-_tnl_FogCoordfvEXT( const GLfloat *v )
-{
- GET_IMMEDIATE;
- GLuint count = IM->Count;
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_FOG);
- IM->Attrib[VERT_ATTRIB_FOG][count][0] = v[0];
- IM->Flag[count] |= VERT_BIT_FOG;
-}
-
-
-static void GLAPIENTRY
-_tnl_Indexi( GLint c )
-{
- GLuint count;
- GET_IMMEDIATE;
- count = IM->Count;
- IM->Index[count] = c;
- IM->Flag[count] |= VERT_BIT_INDEX;
-}
-
-
-static void GLAPIENTRY
-_tnl_Indexiv( const GLint *c )
-{
- GLuint count;
- GET_IMMEDIATE;
- count = IM->Count;
- IM->Index[count] = *c;
- IM->Flag[count] |= VERT_BIT_INDEX;
-}
-
-
-#define NORMAL( x, y, z ) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- GLfloat *normal; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_NORMAL); \
- normal = IM->Attrib[VERT_ATTRIB_NORMAL][count]; \
- ASSIGN_3V(normal, x,y,z); \
- IM->Flag[count] |= VERT_BIT_NORMAL; \
-}
-
-#if defined(USE_IEEE_foo)
-#define NORMALF( x, y, z ) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- fi_type *normal; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_NORMAL); \
- normal = (fi_type *)IM->Attrib[VERT_ATTRIB_NORMAL][count]; \
- normal[0].i = ((fi_type *)&(x))->i; \
- normal[1].i = ((fi_type *)&(y))->i; \
- normal[2].i = ((fi_type *)&(z))->i; \
- IM->Flag[count] |= VERT_BIT_NORMAL; \
-}
-#else
-#define NORMALF NORMAL
-#endif
-
-static void GLAPIENTRY
-_tnl_Normal3f( GLfloat nx, GLfloat ny, GLfloat nz )
-{
- NORMALF(nx, ny, nz);
-}
-
-
-static void GLAPIENTRY
-_tnl_Normal3fv( const GLfloat *v )
-{
- NORMALF( v[0], v[1], v[2] );
-}
-
-
-
-#define TEXCOORD1(s) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- GLfloat *tc; \
- IM->Flag[count] |= VERT_BIT_TEX0; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0][count]; \
- ASSIGN_4V(tc,s,0,0,1); \
-}
-
-#define TEXCOORD2(s, t) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- GLfloat *tc; \
- IM->Flag[count] |= VERT_BIT_TEX0; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0][count]; \
- ASSIGN_4V(tc, s, t, 0, 1); \
-}
-
-#define TEXCOORD3(s, t, u) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- GLfloat *tc; \
- IM->Flag[count] |= VERT_BIT_TEX0; \
- IM->TexSize |= TEX_0_SIZE_3; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0][count]; \
- ASSIGN_4V(tc, s, t, u, 1); \
-}
-
-#define TEXCOORD4(s, t, u, v) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- GLfloat *tc; \
- IM->Flag[count] |= VERT_BIT_TEX0; \
- IM->TexSize |= TEX_0_SIZE_4; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0][count]; \
- ASSIGN_4V(tc, s, t, u, v); \
-}
-
-#if defined(USE_IEEE)
-#define TEXCOORD2F(s, t) \
-{ \
- GET_IMMEDIATE; \
- GLuint count = IM->Count; \
- fi_type *tc; \
- IM->Flag[count] |= VERT_BIT_TEX0; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0); \
- tc = (fi_type *)IM->Attrib[VERT_ATTRIB_TEX0][count]; \
- tc[0].i = ((fi_type *)&(s))->i; \
- tc[1].i = ((fi_type *)&(t))->i; \
- tc[2].i = 0; \
- tc[3].i = IEEE_ONE; \
-}
-#else
-#define TEXCOORD2F TEXCOORD2
-#endif
-
-static void GLAPIENTRY
-_tnl_TexCoord1f( GLfloat s )
-{
- TEXCOORD1(s);
-}
-
-
-static void GLAPIENTRY
-_tnl_TexCoord2f( GLfloat s, GLfloat t )
-{
- TEXCOORD2F(s, t);
-}
-
-
-static void GLAPIENTRY
-_tnl_TexCoord3f( GLfloat s, GLfloat t, GLfloat r )
-{
- TEXCOORD3(s, t, r);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q )
-{
- TEXCOORD4(s, t, r, q)
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord1fv( const GLfloat *v )
-{
- TEXCOORD1(v[0]);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord2fv( const GLfloat *v )
-{
- TEXCOORD2F(v[0], v[1]);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord3fv( const GLfloat *v )
-{
- TEXCOORD3(v[0], v[1], v[2]);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord4fv( const GLfloat *v )
-{
- TEXCOORD4(v[0], v[1], v[2], v[3]);
-}
-
-
-
-/* KW: Run into bad problems in vertex copying if we don't fully pad
- * the incoming vertices.
- */
-#define VERTEX2(IM, x,y) \
-{ \
- GLuint count = IM->Count++; \
- GLfloat *dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BIT_POS; \
- ASSIGN_4V(dest, x, y, 0, 1); \
- /*ASSERT(IM->Flag[IM->Count]==0);*/ \
- if (count == IMM_MAXDATA - 1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-#define VERTEX3(IM,x,y,z) \
-{ \
- GLuint count = IM->Count++; \
- GLfloat *dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BITS_OBJ_23; \
- ASSIGN_4V(dest, x, y, z, 1); \
- /*ASSERT(IM->Flag[IM->Count]==0);*/ \
- if (count == IMM_MAXDATA - 1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-#define VERTEX4(IM, x,y,z,w) \
-{ \
- GLuint count = IM->Count++; \
- GLfloat *dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BITS_OBJ_234; \
- ASSIGN_4V(dest, x, y, z, w); \
- if (count == IMM_MAXDATA - 1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-#if defined(USE_IEEE)
-#define VERTEX2F(IM, x, y) \
-{ \
- GLuint count = IM->Count++; \
- fi_type *dest = (fi_type *)IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BIT_POS; \
- dest[0].i = ((fi_type *)&(x))->i; \
- dest[1].i = ((fi_type *)&(y))->i; \
- dest[2].i = 0; \
- dest[3].i = IEEE_ONE; \
- /*ASSERT(IM->Flag[IM->Count]==0);*/ \
- if (count == IMM_MAXDATA - 1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-#else
-#define VERTEX2F VERTEX2
-#endif
-
-#if defined(USE_IEEE)
-#define VERTEX3F(IM, x, y, z) \
-{ \
- GLuint count = IM->Count++; \
- fi_type *dest = (fi_type *)IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BITS_OBJ_23; \
- dest[0].i = ((fi_type *)&(x))->i; \
- dest[1].i = ((fi_type *)&(y))->i; \
- dest[2].i = ((fi_type *)&(z))->i; \
- dest[3].i = IEEE_ONE; \
- /*ASSERT(IM->Flag[IM->Count]==0);*/ \
- if (count == IMM_MAXDATA - 1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-#else
-#define VERTEX3F VERTEX3
-#endif
-
-#if defined(USE_IEEE)
-#define VERTEX4F(IM, x, y, z, w) \
-{ \
- GLuint count = IM->Count++; \
- fi_type *dest = (fi_type *)IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BITS_OBJ_234; \
- dest[0].i = ((fi_type *)&(x))->i; \
- dest[1].i = ((fi_type *)&(y))->i; \
- dest[2].i = ((fi_type *)&(z))->i; \
- dest[3].i = ((fi_type *)&(w))->i; \
- if (count == IMM_MAXDATA - 1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-#else
-#define VERTEX4F VERTEX4
-#endif
-
-
-
-static void GLAPIENTRY
-_tnl_Vertex2f( GLfloat x, GLfloat y )
-{
- GET_IMMEDIATE;
- VERTEX2F( IM, x, y );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex3f( GLfloat x, GLfloat y, GLfloat z )
-{
- GET_IMMEDIATE;
- VERTEX3F( IM, x, y, z );
-}
-static void GLAPIENTRY
-_tnl_Vertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
-{
- GET_IMMEDIATE;
- VERTEX4F( IM, x, y, z, w );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex2fv( const GLfloat *v )
-{
- GET_IMMEDIATE;
- VERTEX2F( IM, v[0], v[1] );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex3fv( const GLfloat *v )
-{
- GET_IMMEDIATE;
- VERTEX3F( IM, v[0], v[1], v[2] );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex4fv( const GLfloat *v )
-{
- GET_IMMEDIATE;
- VERTEX4F( IM, v[0], v[1], v[2], v[3] );
-}
-
-
-
-
-/*
- * GL_ARB_multitexture
- *
- * Note: the multitexture spec says that specifying an invalid target
- * has undefined results and does not have to generate an error. Just
- * don't crash. We no-op on invalid targets.
- */
-
-#define MAX_TARGET (GL_TEXTURE0_ARB + MAX_TEXTURE_COORD_UNITS)
-
-#define MULTI_TEXCOORD1(target, s) \
-{ \
- GET_IMMEDIATE; \
- const GLuint texunit = target - GL_TEXTURE0_ARB; \
- if (texunit < IM->MaxTextureUnits) { \
- const GLuint count = IM->Count; \
- GLfloat *tc; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count]; \
- ASSIGN_4V(tc, s, 0.0F, 0.0F, 1.0F); \
- IM->Flag[count] |= VERT_BIT_TEX(texunit); \
- } \
-}
-
-#define MULTI_TEXCOORD2(target, s, t) \
-{ \
- GET_IMMEDIATE; \
- const GLuint texunit = target - GL_TEXTURE0_ARB; \
- if (texunit < IM->MaxTextureUnits) { \
- const GLuint count = IM->Count; \
- GLfloat *tc; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count]; \
- ASSIGN_4V(tc, s, t, 0.0F, 1.0F); \
- IM->Flag[count] |= VERT_BIT_TEX(texunit); \
- } \
-}
-
-#define MULTI_TEXCOORD3(target, s, t, u) \
-{ \
- GET_IMMEDIATE; \
- const GLuint texunit = target - GL_TEXTURE0_ARB; \
- if (texunit < IM->MaxTextureUnits) { \
- const GLuint count = IM->Count; \
- GLfloat *tc; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count]; \
- ASSIGN_4V(tc, s, t, u, 1.0F); \
- IM->Flag[count] |= VERT_BIT_TEX(texunit); \
- IM->TexSize |= TEX_SIZE_3(texunit); \
- } \
-}
-
-#define MULTI_TEXCOORD4(target, s, t, u, v) \
-{ \
- GET_IMMEDIATE; \
- const GLuint texunit = target - GL_TEXTURE0_ARB; \
- if (texunit < IM->MaxTextureUnits) { \
- const GLuint count = IM->Count; \
- GLfloat *tc; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit); \
- tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count]; \
- ASSIGN_4V(tc, s, t, u, v); \
- IM->Flag[count] |= VERT_BIT_TEX(texunit); \
- IM->TexSize |= TEX_SIZE_4(texunit); \
- } \
-}
-
-#if defined(USE_IEEE)
-#define MULTI_TEXCOORD2F(target, s, t) \
-{ \
- GET_IMMEDIATE; \
- const GLuint texunit = target - GL_TEXTURE0_ARB; \
- if (texunit < IM->MaxTextureUnits) { \
- const GLuint count = IM->Count; \
- fi_type *tc; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit); \
- tc = (fi_type *)IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count]; \
- IM->Flag[count] |= VERT_BIT_TEX(texunit); \
- tc[0].i = ((fi_type *)&(s))->i; \
- tc[1].i = ((fi_type *)&(t))->i; \
- tc[2].i = 0; \
- tc[3].i = IEEE_ONE; \
- } \
-}
-#else
-#define MULTI_TEXCOORD2F MULTI_TEXCOORD2
-#endif
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord1fARB(GLenum target, GLfloat s)
-{
- MULTI_TEXCOORD1( target, s );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord1fvARB(GLenum target, const GLfloat *v)
-{
- MULTI_TEXCOORD1( target, v[0] );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t)
-{
- MULTI_TEXCOORD2F( target, s, t );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord2fvARB(GLenum target, const GLfloat *v)
-{
- MULTI_TEXCOORD2F( target, v[0], v[1] );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- MULTI_TEXCOORD3( target, s, t, r );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord3fvARB(GLenum target, const GLfloat *v)
-{
- MULTI_TEXCOORD3( target, v[0], v[1], v[2] );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- MULTI_TEXCOORD4( target, s, t, r, q );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord4fvARB(GLenum target, const GLfloat *v)
-{
- MULTI_TEXCOORD4( target, v[0], v[1], v[2], v[3] );
-}
-
-
-
-/* KW: Because the eval values don't become 'current', fixup will flow
- * through these vertices, and then evaluation will write on top
- * of the fixup results.
- *
- * Note: using Obj to hold eval coord data.
- */
-#define EVALCOORD1(IM, x) \
-{ \
- const GLuint count = IM->Count++; \
- GLfloat *dest; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS); \
- dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BIT_EVAL_C1; \
- ASSIGN_4V(dest, x, 0, 0, 1); \
- if (count == IMM_MAXDATA-1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-#define EVALCOORD2(IM, x, y) \
-{ \
- const GLuint count = IM->Count++; \
- GLfloat *dest; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS); \
- dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BIT_EVAL_C2; \
- ASSIGN_4V(dest, x, y, 0, 1); \
- if (count == IMM_MAXDATA-1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-#define EVALPOINT1(IM, x) \
-{ \
- const GLuint count = IM->Count++; \
- GLfloat *dest; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS); \
- dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BIT_EVAL_P1; \
- ASSIGN_4V(dest, x, 0, 0, 1); \
- if (count == IMM_MAXDATA-1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-#define EVALPOINT2(IM, x, y) \
-{ \
- const GLuint count = IM->Count++; \
- GLfloat *dest; \
- CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS); \
- dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
- IM->Flag[count] |= VERT_BIT_EVAL_P2; \
- ASSIGN_4V(dest, x, y, 0, 1); \
- if (count == IMM_MAXDATA-1) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord1f( GLfloat u )
-{
- GET_IMMEDIATE;
- EVALCOORD1( IM, u );
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord1fv( const GLfloat *u )
-{
- GET_IMMEDIATE;
- EVALCOORD1( IM, (GLfloat) *u );
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord2f( GLfloat u, GLfloat v )
-{
- GET_IMMEDIATE;
- EVALCOORD2( IM, u, v );
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord2fv( const GLfloat *u )
-{
- GET_IMMEDIATE;
- EVALCOORD2( IM, u[0], u[1] );
-}
-
-
-static void GLAPIENTRY
-_tnl_EvalPoint1( GLint i )
-{
- GET_IMMEDIATE;
- EVALPOINT1( IM, (GLfloat) i );
-}
-
-
-static void GLAPIENTRY
-_tnl_EvalPoint2( GLint i, GLint j )
-{
- GET_IMMEDIATE;
- EVALPOINT2( IM, (GLfloat) i, (GLfloat) j );
-}
-
-
-/* Need to use the default array-elt outside begin/end for strict
- * conformance.
- * XXX If ctx->Const.CheckArrayBounds is true, we need to test i against
- * ctx->Array._MaxElement
- */
-#define ARRAY_ELT( IM, i ) \
-{ \
- GLuint count = IM->Count; \
- IM->Elt[count] = i; \
- IM->Flag[count] &= IM->ArrayEltFlags; \
- IM->Flag[count] |= VERT_BIT_ELT; \
- IM->FlushElt = IM->ArrayEltFlush; \
- IM->Count += IM->ArrayEltIncr; \
- if (IM->Count == IMM_MAXDATA) \
- _tnl_flush_immediate( NULL, IM ); \
-}
-
-
-static void GLAPIENTRY
-_tnl_ArrayElement( GLint i )
-{
- GET_IMMEDIATE;
- ARRAY_ELT( IM, i );
-}
-
-
-/* Internal functions. These are safe to use providing either:
- *
- * - It is determined that a display list is not being compiled, or
- * if so that these commands won't be compiled into the list (see
- * t_eval.c for an example).
- *
- * - _tnl_hard_begin() is used instead of _tnl_[bB]egin, and tested
- * for a GL_TRUE return value. See _tnl_Rectf, below.
- */
-void
-_tnl_eval_coord1f( GLcontext *CC, GLfloat u )
-{
- struct immediate *i = TNL_CURRENT_IM(CC);
- EVALCOORD1( i, u );
-}
-
-void
-_tnl_eval_coord2f( GLcontext *CC, GLfloat u, GLfloat v )
-{
- struct immediate *i = TNL_CURRENT_IM(CC);
- EVALCOORD2( i, u, v );
-}
-
-
-
-
-/*
- * NV_vertex_program
- */
-
-static void GLAPIENTRY
-_tnl_VertexAttrib4fNV( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
-{
- if (index < VERT_ATTRIB_MAX) {
- GET_IMMEDIATE;
- const GLuint count = IM->Count;
- GLfloat *attrib;
- CHECK_ATTRIB_ARRAY(IM, index);
- attrib = IM->Attrib[index][count];
- ASSIGN_4V(attrib, x, y, z, w);
- IM->Flag[count] |= (1 << index);
- if (index == 0) {
- IM->Count++;
- if (count == IMM_MAXDATA - 1)
- _tnl_flush_immediate( NULL, IM );
- }
- }
- else {
- GET_CURRENT_CONTEXT(ctx);
- _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribNV(index > 15)");
- }
-}
-
-static void GLAPIENTRY
-_tnl_VertexAttrib4fvNV( GLuint index, const GLfloat *v )
-{
- if (index < VERT_ATTRIB_MAX) {
- GET_IMMEDIATE;
- const GLuint count = IM->Count;
- GLfloat *attrib;
- CHECK_ATTRIB_ARRAY(IM, index);
- attrib = IM->Attrib[index][count];
- COPY_4V(attrib, v);
- IM->Flag[count] |= (1 << index);
- if (index == 0) {
- IM->Count++;
- if (count == IMM_MAXDATA - 1)
- _tnl_flush_immediate( NULL, IM );
- }
- }
- else {
- GET_CURRENT_CONTEXT(ctx);
- _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribNV(index > 15)");
- }
-}
-
-
-/* Execute a glRectf() function. _tnl_hard_begin() ensures the check
- * on outside_begin_end is executed even in compiled lists. These
- * vertices can now participate in the same immediate as regular ones,
- * even in most display lists.
- */
-static void GLAPIENTRY
-_tnl_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 )
-{
- GET_CURRENT_CONTEXT(ctx);
-
- if (_tnl_hard_begin( ctx, GL_QUADS )) {
- glVertex2f( x1, y1 );
- glVertex2f( x2, y1 );
- glVertex2f( x2, y2 );
- glVertex2f( x1, y2 );
- glEnd();
- }
-}
-
-static void GLAPIENTRY
-_tnl_Materialfv( GLenum face, GLenum pname, const GLfloat *params )
-{
- GET_CURRENT_CONTEXT(ctx);
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- struct immediate *IM = TNL_CURRENT_IM(ctx);
- GLuint count = IM->Count;
- struct gl_material *mat;
- GLuint bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, "Materialfv");
- int i, nr;
-
- if (bitmask == 0)
- return;
-
- if (MESA_VERBOSE & VERBOSE_API)
- _mesa_debug(ctx, "_tnl_Materialfv\n");
-
- if (tnl->IsolateMaterials &&
- !(IM->BeginState & VERT_BEGIN_1)) /* heuristic */
- {
- _tnl_flush_immediate( ctx, IM );
- IM = TNL_CURRENT_IM(ctx);
- count = IM->Count;
- }
-
- if (!(IM->Flag[count] & VERT_BIT_MATERIAL)) {
- if (!IM->Material) {
- IM->Material = (struct gl_material *)
- MALLOC( sizeof(struct gl_material) * IMM_SIZE );
- IM->MaterialMask = (GLuint *) MALLOC( sizeof(GLuint) * IMM_SIZE );
- IM->MaterialMask[IM->LastMaterial] = 0;
- }
- else if (IM->MaterialOrMask & ~bitmask) {
- _mesa_copy_materials( &IM->Material[count],
- &IM->Material[IM->LastMaterial],
- IM->MaterialOrMask & ~bitmask );
- }
-
- IM->Flag[count] |= VERT_BIT_MATERIAL;
- IM->MaterialMask[count] = 0;
- IM->MaterialAndMask &= IM->MaterialMask[IM->LastMaterial];
- IM->LastMaterial = count;
- }
-
- IM->MaterialOrMask |= bitmask;
- IM->MaterialMask[count] |= bitmask;
- mat = &IM->Material[count];
-
- switch (face) {
- case GL_SHININESS: nr = 1; break;
- case GL_COLOR_INDEXES: nr = 3; break;
- default: nr = 4 ; break;
- }
-
- for (i = 0 ; i < MAT_ATTRIB_MAX ; i++)
- if (bitmask & (1<<i))
- COPY_SZ_4V( mat->Attrib[i], nr, params );
-
- if (tnl->IsolateMaterials &&
- !(IM->BeginState & VERT_BEGIN_1)) /* heuristic */
- {
- _tnl_flush_immediate( ctx, IM );
- }
-}
-
-void _tnl_imm_vtxfmt_init( GLcontext *ctx )
-{
- GLvertexformat *vfmt = &(TNL_CONTEXT(ctx)->vtxfmt);
-
- /* All begin/end operations are handled by this vertex format:
- */
- vfmt->ArrayElement = _tnl_ArrayElement;
- vfmt->Begin = _tnl_Begin;
- vfmt->Color3f = _tnl_Color3f;
- vfmt->Color3fv = _tnl_Color3fv;
- vfmt->Color3ub = _tnl_Color3ub;
- vfmt->Color3ubv = _tnl_Color3ubv;
- vfmt->Color4f = _tnl_Color4f;
- vfmt->Color4fv = _tnl_Color4fv;
- vfmt->Color4ub = _tnl_Color4ub;
- vfmt->Color4ubv = _tnl_Color4ubv;
- vfmt->EdgeFlag = _tnl_EdgeFlag;
- vfmt->EdgeFlagv = _tnl_EdgeFlagv;
- vfmt->End = _tnl_End;
- vfmt->EvalCoord1f = _tnl_EvalCoord1f;
- vfmt->EvalCoord1fv = _tnl_EvalCoord1fv;
- vfmt->EvalCoord2f = _tnl_EvalCoord2f;
- vfmt->EvalCoord2fv = _tnl_EvalCoord2fv;
- vfmt->EvalPoint1 = _tnl_EvalPoint1;
- vfmt->EvalPoint2 = _tnl_EvalPoint2;
- vfmt->FogCoordfEXT = _tnl_FogCoordfEXT;
- vfmt->FogCoordfvEXT = _tnl_FogCoordfvEXT;
- vfmt->Indexi = _tnl_Indexi;
- vfmt->Indexiv = _tnl_Indexiv;
- vfmt->Materialfv = _tnl_Materialfv;
- vfmt->MultiTexCoord1fARB = _tnl_MultiTexCoord1fARB;
- vfmt->MultiTexCoord1fvARB = _tnl_MultiTexCoord1fvARB;
- vfmt->MultiTexCoord2fARB = _tnl_MultiTexCoord2fARB;
- vfmt->MultiTexCoord2fvARB = _tnl_MultiTexCoord2fvARB;
- vfmt->MultiTexCoord3fARB = _tnl_MultiTexCoord3fARB;
- vfmt->MultiTexCoord3fvARB = _tnl_MultiTexCoord3fvARB;
- vfmt->MultiTexCoord4fARB = _tnl_MultiTexCoord4fARB;
- vfmt->MultiTexCoord4fvARB = _tnl_MultiTexCoord4fvARB;
- vfmt->Normal3f = _tnl_Normal3f;
- vfmt->Normal3fv = _tnl_Normal3fv;
- vfmt->SecondaryColor3fEXT = _tnl_SecondaryColor3fEXT;
- vfmt->SecondaryColor3fvEXT = _tnl_SecondaryColor3fvEXT;
- vfmt->SecondaryColor3ubEXT = _tnl_SecondaryColor3ubEXT;
- vfmt->SecondaryColor3ubvEXT = _tnl_SecondaryColor3ubvEXT;
- vfmt->TexCoord1f = _tnl_TexCoord1f;
- vfmt->TexCoord1fv = _tnl_TexCoord1fv;
- vfmt->TexCoord2f = _tnl_TexCoord2f;
- vfmt->TexCoord2fv = _tnl_TexCoord2fv;
- vfmt->TexCoord3f = _tnl_TexCoord3f;
- vfmt->TexCoord3fv = _tnl_TexCoord3fv;
- vfmt->TexCoord4f = _tnl_TexCoord4f;
- vfmt->TexCoord4fv = _tnl_TexCoord4fv;
- vfmt->Vertex2f = _tnl_Vertex2f;
- vfmt->Vertex2fv = _tnl_Vertex2fv;
- vfmt->Vertex3f = _tnl_Vertex3f;
- vfmt->Vertex3fv = _tnl_Vertex3fv;
- vfmt->Vertex4f = _tnl_Vertex4f;
- vfmt->Vertex4fv = _tnl_Vertex4fv;
- vfmt->VertexAttrib4fNV = _tnl_VertexAttrib4fNV;
- vfmt->VertexAttrib4fvNV = _tnl_VertexAttrib4fvNV;
-
- /* Outside begin/end functions (from t_varray.c, t_eval.c, ...):
- */
- vfmt->Rectf = _tnl_Rectf;
-
- /* Just use the core function:
- */
- vfmt->CallList = _mesa_CallList;
-
- vfmt->prefer_float_colors = GL_FALSE;
-}