t_context.h revision fde4c53a7d460a7fed929ef457172f3b245d875d
123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell/*
2ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * mesa 3-D graphics library
3610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul * Version:  5.1
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * copy of this software and associated documentation files (the "Software"),
923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * to deal in the Software without restriction, including without limitation
1023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
1223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
1423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * The above copyright notice and this permission notice shall be included
1523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
1723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
234c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul */
244c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
254c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/**
264c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * \file t_context.h
274c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * \brief TnL module datatypes and definitions.
284c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * \author Keith Whitwell
2923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
3023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
31c8f2f456f94232671511745e1b236339af6b44ceBrian Paul
32c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/**
33c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * \mainpage The TNL-module
34c8f2f456f94232671511745e1b236339af6b44ceBrian Paul *
35c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * TNL stands for "transform and lighting", i.e. this module implements
36c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * a pipeline that receives as input a buffer of vertices and does all
37c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * necessary transformations (rotations, clipping, vertex shader etc.)
38c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * and passes then the output to the rasterizer.
39c8f2f456f94232671511745e1b236339af6b44ceBrian Paul *
40ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * The tnl_pipeline contains the array of all stages, which should be
41e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * applied. Each stage is a black-box, which is described by an
42ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * tnl_pipeline_stage. The function ::_tnl_run_pipeline applies all the
43e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * stages to the vertex_buffer TNLcontext::vb, where the vertex data
44e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * is stored. The last stage in the pipeline is the rasterizer.
45c8f2f456f94232671511745e1b236339af6b44ceBrian Paul *
46e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * The initial vertex_buffer data may either come from an ::immediate
47e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * structure or client vertex_arrays or display lists:
48c8f2f456f94232671511745e1b236339af6b44ceBrian Paul *
49e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul *
50e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * - The ::immediate structure records all the GL commands issued between
51e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * glBegin and glEnd.  \n
52e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * The structure accumulates data, until it is either full or it is
53e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * flushed (usually by a state change). Before starting then the pipeline,
54e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * the collected vertex data in ::immediate has to be pushed into
55e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * TNLcontext::vb.
56e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * This happens in ::_tnl_vb_bind_immediate. The pipeline is then run by
57e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * calling tnl_device_driver::RunPipeline = ::_tnl_run_pipeline, which
58e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * is stored in TNLcontext::Driver.   \n
59e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * An ::immediate does (for performance reasons) usually not finish with a
60e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * glEnd, and hence it also does not need to start with a glBegin.
61e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * This means that the last vertices of one ::immediate may need to be
62e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * saved for the next one.
63e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul *
64e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul *
65e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * - NOT SURE ABOUT THIS: The vertex_arrays structure is used to handle
66e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * glDrawArrays etc.  \n
67e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * Here, the data of the vertex_arrays is copied by ::_tnl_vb_bind_arrays
68e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * into TNLcontext::vb, so that the pipeline can be started.
69c8f2f456f94232671511745e1b236339af6b44ceBrian Paul */
70c8f2f456f94232671511745e1b236339af6b44ceBrian Paul
71e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul
7223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#ifndef _T_CONTEXT_H
7323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#define _T_CONTEXT_H
7423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
7523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "glheader.h"
765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
7723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
7823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "math/m_matrix.h"
7923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "math/m_vector.h"
8023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "math/m_xform.h"
8123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
8223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
83cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define MAX_PIPELINE_STAGES     30
8423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
8523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
8641c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul/*
8741c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * Note: The first attributes match the VERT_ATTRIB_* definitions
8841c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * in mtypes.h.  However, the tnl module has additional attributes
8941c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * for materials, color indexes, edge flags, etc.
9041c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul */
91588225770c60834dfd2a95850435cc549167dc05Keith Whitwell/* Note: These are currently being used to define both inputs and
92588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * outputs from the tnl pipeline.  A better solution (which would also
93588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * releive the congestion to slightly prolong the life of the bitmask
94588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * below) is to have the fixed function pipeline populate a set of
95588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * arrays named after those produced by the vertex program stage, and
96588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * have the rest the mesa backend work on those.
97588225770c60834dfd2a95850435cc549167dc05Keith Whitwell */
98ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellenum {
99ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_POS = 0,
100ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_WEIGHT = 1,
101ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_NORMAL = 2,
102ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_COLOR0 = 3,
103ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_COLOR1 = 4,
104ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_FOG = 5,
105ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_SIX = 6,
106ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_SEVEN = 7,
107ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX0 = 8,
108ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX1 = 9,
109ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX2 = 10,
110ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX3 = 11,
111ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX4 = 12,
112ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX5 = 13,
113ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX6 = 14,
114ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX7 = 15,
115ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_AMBIENT = 16,
116ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_AMBIENT = 17,
117ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_DIFFUSE = 18,
118ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_DIFFUSE = 19,
119ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_SPECULAR = 20,
120ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_SPECULAR = 21,
121ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_EMISSION = 22,
122ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_EMISSION = 23,
123ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_SHININESS = 24,
124ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_SHININESS = 25,
125ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_INDEXES = 26,
126ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_INDEXES = 27,
127ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_INDEX = 28,
128ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_EDGEFLAG = 29,
129588225770c60834dfd2a95850435cc549167dc05Keith Whitwell	_TNL_ATTRIB_POINTSIZE = 30,
130588225770c60834dfd2a95850435cc549167dc05Keith Whitwell	_TNL_ATTRIB_MAX = 31
131ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell} ;
132ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
133ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* Will probably have to revise this scheme fairly shortly, eg. by
134ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * compacting all the MAT flags down to one bit, or by using two
135ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * dwords to store the flags.
13623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
137ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_POS                 (1<<0)
138ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_WEIGHT              (1<<1)
139ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_NORMAL              (1<<2)
140ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_COLOR0              (1<<3)
141ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_COLOR1              (1<<4)
142ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_FOG                 (1<<5)
143ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_SIX                 (1<<6)
144ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_SEVEN               (1<<7)
145ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX0                (1<<8)
146ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX1                (1<<9)
147ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX2                (1<<10)
148ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX3                (1<<11)
149ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX4                (1<<12)
150ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX5                (1<<13)
151ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX6                (1<<14)
152ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX7                (1<<15)
153ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_AMBIENT   (1<<16)
154ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_AMBIENT    (1<<17)
155ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_DIFFUSE   (1<<18)
156ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_DIFFUSE    (1<<19)
157ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_SPECULAR  (1<<20)
158ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_SPECULAR   (1<<21)
159ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_EMISSION  (1<<22)
160ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_EMISSION   (1<<23)
161ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_SHININESS (1<<24)
162ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_SHININESS  (1<<25)
163ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_INDEXES   (1<<26)
164ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_INDEXES    (1<<27)
165ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_INDEX               (1<<28)
166ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_EDGEFLAG            (1<<29)
167588225770c60834dfd2a95850435cc549167dc05Keith Whitwell#define _TNL_BIT_POINTSIZE           (1<<30)
168ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
169ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX(u)  (1 << (_TNL_ATTRIB_TEX0 + (u)))
170ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
171ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
172790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
173ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_MAT_ANY  (_TNL_BIT_MAT_FRONT_AMBIENT   | 	\
174ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_AMBIENT    | 	\
175ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_DIFFUSE   | 	\
176ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_DIFFUSE    | 	\
177ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_SPECULAR  | 	\
178ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_SPECULAR   | 	\
179ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_EMISSION  | 	\
180ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_EMISSION   | 	\
181ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_SHININESS | 	\
182ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_SHININESS  | 	\
183ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_INDEXES   | 	\
184ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_INDEXES)
185ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
186ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
187ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_TEX_ANY  (_TNL_BIT_TEX0 |	\
188ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX1 |	\
189ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX2 |	\
190ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX3 |	\
191ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX4 |	\
192ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX5 |	\
193ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX6 |	\
194ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX7)
195ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
196ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
197ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_PROG_ANY   (_TNL_BIT_POS    |		\
198ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_WEIGHT |		\
199ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_NORMAL |		\
200ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_COLOR0 |		\
201ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_COLOR1 |		\
202ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_FOG    |		\
203ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_SIX    |		\
204ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_SEVEN  |		\
205ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BITS_TEX_ANY)
206ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
207ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
208ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
209ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_BEGIN     0x10
210ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_END       0x20
211ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_WEAK      0x40
212ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_MODE_MASK 0x0f
213ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
214ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/*
215ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell */
216ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_prim {
217ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint mode;
218ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint start;
219ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
220ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
22123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
22223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
22323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
224ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval1_map {
225ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct gl_1d_map *map;
226ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint sz;
227ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
229ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval2_map {
230ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct gl_2d_map *map;
231ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint sz;
232ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
233ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
234ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval {
235ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint new_state;
236ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_eval1_map map1[_TNL_ATTRIB_INDEX + 1];
237ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_eval2_map map2[_TNL_ATTRIB_INDEX + 1];
238ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
23923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
24023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
241ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define TNL_MAX_PRIM 16
242ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define TNL_MAX_COPIED_VERTS 3
243ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
244ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_copied_vtx {
245ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[_TNL_ATTRIB_MAX * 4 * TNL_MAX_COPIED_VERTS];
246ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint nr;
247ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
248ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
249ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define VERT_BUFFER_SIZE 2048	/* 8kbytes */
250ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
251ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwelltypedef void (*attrfv_func)( const GLfloat * );
252ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
253ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* The assembly of vertices in immediate mode is separated from
254ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * display list compilation.  This allows a simpler immediate mode
255ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * treatment and a display list compiler better suited to
256ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware-acceleration.
25723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
258ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vtx {
259ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[VERT_BUFFER_SIZE];
260ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
261ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
262ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim prim[TNL_MAX_PRIM];
263ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count;
264ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *vbptr;		      /* cursor, points into buffer */
265ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current vertex */
266ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *attrptr[_TNL_ATTRIB_MAX]; /* points into vertex */
267ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->Current, etc */
268ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint counter, initial_counter;
269ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_copied_vtx copied;
270ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   attrfv_func tabfv[_TNL_ATTRIB_MAX][4];
271ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_eval eval;
272ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean *edgeflag_tmp;
273688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;
274ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
275ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
276ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
27723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
27823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
279ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* For display lists, this structure holds a run of vertices of the
280ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * same format, and a strictly well-formed set of begin/end pairs,
281ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * starting on the first vertex and ending at the last.  Vertex
282ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * copying on buffer breaks is precomputed according to these
283ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * primitives, though there are situations where the copying will need
284ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * correction at execute-time, perhaps by replaying the list as
285ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * immediate mode commands.
286ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell *
287ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * On executing this list, the 'current' values may be updated with
288ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the values of the final vertex, and often no fixup of the start of
289ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the vertex list is required.
290ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell *
291ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * Eval and other commands that don't fit into these vertex lists are
292ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * compiled using the fallback opcode mechanism provided by dlist.c.
29323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
294ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_list {
295ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
296ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
297ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
298ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *buffer;
299ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
300ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint wrap_count;		/* number of copied vertices at start */
301688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;	/* bit of a hack - quick check for materials */
302688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean dangling_attr_ref;	/* current attr implicitly referenced
303ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell				   outside the list */
304ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
305ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *normal_lengths;
306ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim *prim;
307ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count;
308ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
309ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_store *vertex_store;
310ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_primitive_store *prim_store;
311ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
3124c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
313ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* These buffers should be a reasonable size to support upload to
314ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware?  Maybe drivers should stitch them back together, or
315ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * specify a desired size?
316ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell */
317ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_BUFFER_SIZE (16*1024)
318ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_PRIM_SIZE   128
3194c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
320ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* Storage to be shared among several vertex_lists.
32123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
322ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_store {
323ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[SAVE_BUFFER_SIZE];
324ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint used;
325ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint refcount;
326ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
32723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
328ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_primitive_store {
329ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim buffer[SAVE_PRIM_SIZE];
330ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint used;
331ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint refcount;
332ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
33323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
3346d1055c9675fb8c39d3843b550beaa168e031fc9Keith Whitwell
335ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_save {
336ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
337ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
33823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
339ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *buffer;
340ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
341ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint wrap_count;
34223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
343ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim *prim;
344ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count, prim_max;
345cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
346ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_store *vertex_store;
347ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_primitive_store *prim_store;
34823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
349ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *vbptr;		   /* cursor, points into buffer */
350ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat vertex[_TNL_ATTRIB_MAX*4];	   /* current values */
351ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *attrptr[_TNL_ATTRIB_MAX];
352ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint counter, initial_counter;
353688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean dangling_attr_ref;
354688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;
355ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
356ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint opcode_vertex_list;
357ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
358ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_copied_vtx copied;
359bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul
360ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */
361ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte *currentsz[_TNL_ATTRIB_MAX];
36286b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
363ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*tabfv[_TNL_ATTRIB_MAX][4])( const GLfloat * );
364cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
3655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
36623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
367ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_arrays
368cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
36905b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul   /* Conventional vertex attribute arrays */
370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f  Obj;
371bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul   GLvector4f  Normal;
372ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Color;
373ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  SecondaryColor;
37405b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul   GLvector4f  FogCoord;
375610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLvector4f  TexCoord[MAX_TEXTURE_COORD_UNITS];
376ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Index;
377ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
378ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     *EdgeFlag;
379ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      *Elt;
3808856cece54df5183853aaebc1af8c60436d699c0Brian Paul
3818856cece54df5183853aaebc1af8c60436d699c0Brian Paul   /* These attributes don't alias with the conventional attributes.
3828856cece54df5183853aaebc1af8c60436d699c0Brian Paul    * The GL_NV_vertex_program extension defines 16 extra sets of vertex
3838856cece54df5183853aaebc1af8c60436d699c0Brian Paul    * arrays which have precedent over the conventional arrays when enabled.
3848856cece54df5183853aaebc1af8c60436d699c0Brian Paul    */
385ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Attribs[_TNL_ATTRIB_MAX];
38623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
38723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
38823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
3894c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/**
3904c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * Contains the current state of a running pipeline.
39123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
392ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct vertex_buffer
39323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell{
394cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Constant over life of the vertex_buffer.
39523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
396ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      Size;
39723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
398cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Constant over the pipeline.
39923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
400ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      Count;		              /* for everything except Elts */
40123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
402cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Pointers to current data.
40323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
404ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      *Elts;
405ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ObjPtr;		                /* _TNL_BIT_POS */
406ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *EyePtr;		                /* _TNL_BIT_POS */
407ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ClipPtr;	                /* _TNL_BIT_POS */
408ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *NdcPtr;                         /* _TNL_BIT_POS */
409ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     ClipOrMask;	                /* _TNL_BIT_POS */
410ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     *ClipMask;		        /* _TNL_BIT_POS */
411ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *NormalPtr;	                /* _TNL_BIT_NORMAL */
412ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat     *NormalLengthPtr;	        /* _TNL_BIT_NORMAL */
413ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean   *EdgeFlag;	                /* _TNL_BIT_EDGEFLAG */
414610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLvector4f  *TexCoordPtr[MAX_TEXTURE_COORD_UNITS]; /* VERT_TEX_0..n */
415ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *IndexPtr[2];	                /* _TNL_BIT_INDEX */
416ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ColorPtr[2];	                /* _TNL_BIT_COLOR0 */
417ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *SecondaryColorPtr[2];           /* _TNL_BIT_COLOR1 */
418ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *PointSizePtr;	                /* _TNL_BIT_POS */
419ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *FogCoordPtr;	                /* _TNL_BIT_FOG */
420ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
421ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim  *Primitive;
422ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      PrimitiveCount;
423cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
424363049160da54f4aafe88f99bb2140a9bfed142bBrian Paul   /* Inputs to the vertex program stage */
425ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f *AttribPtr[_TNL_ATTRIB_MAX];      /* GL_NV_vertex_program */
42623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
427cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint LastClipped;
42858e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   /* Private data from _tnl_render_stage that has no business being
42922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * in this struct.
43023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
431ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
43223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
43323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
434c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Describes an individual operation on the pipeline.
435cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
43609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_pipeline_stage
43709da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
438cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   const char *name;
439cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint check_state;		/* All state referenced in check() --
440cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * When is the pipeline_stage struct
441cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * itself invalidated?  Must be
442cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * constant.
443cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 */
44423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
445cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Usually constant or set by the 'check' callback:
44623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
447cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint run_state;		/* All state referenced in run() --
448cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * When is the cached output of the
44922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				 * stage invalidated?
450cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 */
45122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
452cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLboolean active;		/* True if runnable in current state */
453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint inputs;		/* VERT_* inputs to the stage */
454cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint outputs;		/* VERT_* outputs of the stage */
455cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
456cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Set in _tnl_run_pipeline():
45723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
458cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint changed_inputs;	/* Generated value -- inputs to the
459cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * stage that have changed since last
46022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				 * call to 'run'.
461cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 */
46223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
463790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
464cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Private data for the pipeline stage:
465cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
466b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   void *privatePtr;
46723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
468cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Free private data.  May not be null.
469cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
470ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*destroy)( struct tnl_pipeline_stage * );
47123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
472cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Called from _tnl_validate_pipeline().  Must update all fields in
47322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * the pipeline_stage struct for the current state.
474cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
475ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*check)( GLcontext *ctx, struct tnl_pipeline_stage * );
476cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
477cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Called from _tnl_run_pipeline().  The stage.changed_inputs value
478cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * encodes all inputs to thee struct which have changed.  If
479cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * non-zero, recompute all affected outputs of the stage, otherwise
48022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * execute any 'sideeffects' of the stage.
481cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    *
482cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * Return value: GL_TRUE - keep going
483cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    *               GL_FALSE - finished pipeline
484cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
485ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean (*run)( GLcontext *ctx, struct tnl_pipeline_stage * );
48623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
48723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
488c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Contains the array of all pipeline stages.
489c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * The default values are defined at the end of t_pipeline.c */
490ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_pipeline {
491c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint build_state_trigger;	  /**< state changes which require build */
492c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint build_state_changes;    /**< state changes since last build */
493c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint run_state_changes;	  /**< state changes since last run */
494c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint run_input_changes;	  /**< VERT_* changes since last run */
495c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint inputs;		  /**< VERT_* inputs to pipeline */
496c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   /** This array has to end with a NULL-pointer. */
497ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_pipeline_stage stages[MAX_PIPELINE_STAGES+1];
498cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint nr_stages;
49923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
50023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
501588225770c60834dfd2a95850435cc549167dc05Keith Whitwellstruct tnl_clipspace_attr;
502588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
503588225770c60834dfd2a95850435cc549167dc05Keith Whitwelltypedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out,
504588225770c60834dfd2a95850435cc549167dc05Keith Whitwell			      const GLubyte *v );
505588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
506588225770c60834dfd2a95850435cc549167dc05Keith Whitwelltypedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v,
507588225770c60834dfd2a95850435cc549167dc05Keith Whitwell			     const GLfloat *in );
508588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
50923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
510fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/**
511fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Describes how to convert/move a vertex attribute from a vertex array
512fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * to a vertex structure.
513fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */
51409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace_attr
51509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
516fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint attrib;          /* which vertex attrib (0=position, etc) */
517fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint vertoffset;      /* position of the attrib in the vertex struct */
518fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint vertattrsize;    /* size of the attribute in bytes */
519588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   GLubyte *inputptr;
520fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint inputstride;
521588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   insert_func *insert;
522588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   insert_func emit;
523588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   extract_func extract;
524fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   const GLfloat *vp;   /* NDC->Viewport mapping matrix */
525790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell};
526790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
527ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
528709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
529709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last );
530709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2 );
531709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*triangle_func)( GLcontext *ctx,
532709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell                               GLuint v1, GLuint v2, GLuint v3 );
533709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*quad_func)( GLcontext *ctx, GLuint v1, GLuint v2,
534709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell                           GLuint v3, GLuint v4 );
535709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*render_func)( GLcontext *ctx, GLuint start, GLuint count,
536709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell			     GLuint flags );
537709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*interp_func)( GLcontext *ctx,
53821f80baa35dca54394f100d2655d28eec10cca0aBrian Paul			     GLfloat t, GLuint dst, GLuint out, GLuint in,
539709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell			     GLboolean force_boundary );
540709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src );
5411182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwelltypedef void (*setup_func)( GLcontext *ctx,
5421182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell			    GLuint start, GLuint end,
5431182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell			    GLuint new_inputs);
544709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
545709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
546fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/**
547fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Used to describe conversion of vertex arrays to vertex structures.
548fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * I.e. Structure of arrays to arrays of structs.
549fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */
55009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace
55109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
552790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLboolean need_extras;
553790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
554790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint new_inputs;
555790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
556790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLubyte *vertex_buf;
557790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint vertex_size;
558790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint max_vertex_size;
559790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
560790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX];
561790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint attr_count;
562790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
563790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   void (*emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest );
564790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   interp_func interp;
565790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   copy_pv_func copy_pv;
566790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell};
567790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
568790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
56909da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_device_driver
57009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
571709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /***
572709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    *** TNL Pipeline
573709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    ***/
574709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
5757954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell   void (*RunPipeline)(GLcontext *ctx);
5767954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell   /* Replaces PipelineStart/PipelineFinish -- intended to allow
5777954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell    * drivers to wrap _tnl_run_pipeline() with code to validate state
5787954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell    * and grab/release hardware locks.
579709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
580709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
5810cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell   void (*NotifyMaterialChange)(GLcontext *ctx);
582306d3fcdbad523428501833405e47e9897896defKeith Whitwell   /* Alert tnl-aware drivers of changes to material.
583306d3fcdbad523428501833405e47e9897896defKeith Whitwell    */
584306d3fcdbad523428501833405e47e9897896defKeith Whitwell
585306d3fcdbad523428501833405e47e9897896defKeith Whitwell   GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
586306d3fcdbad523428501833405e47e9897896defKeith Whitwell   /* Allow drivers to hook in optimized begin/end engines.
587306d3fcdbad523428501833405e47e9897896defKeith Whitwell    * Return value:  GL_TRUE - driver handled the begin
588306d3fcdbad523428501833405e47e9897896defKeith Whitwell    *                GL_FALSE - driver didn't handle the begin
5890cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell    */
5900cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell
591709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /***
5921182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell    *** Rendering -- These functions called only from t_vb_render.c
593709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    ***/
59409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   struct
59509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   {
5961182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*Start)(GLcontext *ctx);
5971182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*Finish)(GLcontext *ctx);
5981182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Called before and after all rendering operations, including DrawPixels,
5991182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands.
6001182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * These are a suitable place for grabbing/releasing hardware locks.
6011182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6021182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6031182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*PrimitiveNotify)(GLcontext *ctx, GLenum mode);
6041182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Called between RenderStart() and RenderFinish() to indicate the
6051182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * type of primitive we're about to draw.  Mode will be one of the
6061182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * modes accepted by glBegin().
6071182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6081182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6091182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      interp_func Interp;
6101182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* The interp function is called by the clipping routines when we need
6111182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * to generate an interpolated vertex.  All pertinant vertex ancilliary
6121182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * data should be computed by interpolating between the 'in' and 'out'
6131182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertices.
6141182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6151182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6161182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      copy_pv_func CopyPV;
6171182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* The copy function is used to make a copy of a vertex.  All pertinant
6181182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertex attributes should be copied.
6191182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6201182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6211182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ClippedPolygon)( GLcontext *ctx, const GLuint *elts, GLuint n );
6221182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render a polygon with <n> vertices whose indexes are in the <elts>
6231182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * array.
6241182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6251182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6261182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 );
6271182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render a line between the two vertices given by indexes v0 and v1. */
6281182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6291182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      points_func           Points; /* must now respect vb->elts */
6301182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      line_func             Line;
6311182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      triangle_func         Triangle;
6321182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      quad_func             Quad;
6331182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* These functions are called in order to render points, lines,
6341182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * triangles and quads.  These are only called via the T&L module.
6351182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6361182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6371182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      render_func          *PrimTabVerts;
6381182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      render_func          *PrimTabElts;
6391182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render whole unclipped primitives (points, lines, linestrips,
6401182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * lineloops, etc).  The tables are indexed by the GL enum of the
6411182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * primitive to be rendered.  RenderTabVerts is used for non-indexed
6421182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * arrays of vertices.  RenderTabElts is used for indexed arrays of
6431182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertices.
6441182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6451182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6461182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ResetLineStipple)( GLcontext *ctx );
6471182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Reset the hardware's line stipple counter.
6481182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6491182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6501182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      setup_func BuildVertices;
6511182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* This function is called whenever new vertices are required for
6521182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * rendering.  The vertices in question are those n such that start
6531182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * <= n < end.  The new_inputs parameter indicates those fields of
6541182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * the vertex which need to be updated, if only a partial repair of
6551182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * the vertex is required.
6561182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       *
6571182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * This function is called only from _tnl_render_stage in tnl/t_render.c.
6581182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6591182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6601182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6611182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      GLboolean (*Multipass)( GLcontext *ctx, GLuint passno );
6621182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Driver may request additional render passes by returning GL_TRUE
6631182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * when this function is called.  This function will be called
6641182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * after the first pass, and passes will be made until the function
6651182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * returns GL_FALSE.  If no function is registered, only one pass
6661182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * is made.
6671182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       *
6681182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * This function will be first invoked with passno == 1.
6691182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6701182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   } Render;
671709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell};
6721182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
673709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
67409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul/**
67509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul * Context state for T&L context.
67609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul */
67709da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paultypedef struct
67809da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
679709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /* Driver interface.
680709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
681709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   struct tnl_device_driver Driver;
682709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
683ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   /* Execute:
68423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
685ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vtx vtx;
686ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
687ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   /* Compile:
68823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
689ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_save save;
69023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
691cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Pipeline
69223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
693ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_pipeline pipeline;
694cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer vb;
69523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
696cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* GLvectors for binding to vb:
697cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
698ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays vtx_inputs;
699ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays save_inputs;
700ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays current;
701ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays array_inputs;
702ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
703790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   /* Clipspace/ndc/window vertex managment:
704790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell    */
705790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   struct tnl_clipspace clipspace;
706790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
707321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell   /* Probably need a better configuration mechanism:
708321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell    */
70930f51ae067379c2b3573c06b707d25a9704df7beBrian Paul   GLboolean NeedNdcCoords;
71051b36396ae45f9ee9cec8d612787d038641dc6c8Keith Whitwell   GLboolean LoopbackDListCassettes;
71147a28c0b4d4ca27592e3cbb8e4b17d1cd8f7997dKeith Whitwell   GLboolean CalcDListNormalLengths;
7120cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell   GLboolean IsolateMaterials;
71309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLboolean AllowVertexFog;
7148d407300c2b94f32c955b6dd75c2e18d6d58caa5Brian Paul   GLboolean AllowPixelFog;
715321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell
71609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLboolean _DoVertexFog;  /* eval fog function at each vertex? */
717790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
71809da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLuint render_inputs;
719ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
720ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvertexformat exec_vtxfmt;
721306d3fcdbad523428501833405e47e9897896defKeith Whitwell   GLvertexformat save_vtxfmt;
722ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
72323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell} TNLcontext;
72423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
72523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
72623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
72723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#define TNL_CONTEXT(ctx) ((TNLcontext *)(ctx->swtnl_context))
72823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
72923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
730cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TYPE_IDX(t) ((t) & 0xf)
731cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1      /* 0xa + 1 */
73223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
733cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellextern void _tnl_MakeCurrent( GLcontext *ctx,
734cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			      GLframebuffer *drawBuffer,
735cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			      GLframebuffer *readBuffer );
73623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
73723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
73823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
739cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
74023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#endif
741