t_context.h revision 352d4dbfb24c65f327759c00c7db7d30a9482e35
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
2515262dcccc87caf8083cb7867155d91ac2f38ffefKeith Whitwell
252ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwelltypedef void (*attrfv_func)( const GLfloat * );
253ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
254b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn {
255b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn *next, *prev;
256bdd15b5749b45929fa642c3e47997f52eb07fbe5Brian Paul   GLuint key;
257c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell   char *code;
258c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell};
259c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
260b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn_lists {
261b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn Vertex[4];
262b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn Attribute[4];
263c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell};
264c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
265b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn_generators {
266b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn *(*Vertex[4])( GLcontext *ctx, int key );
267b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn *(*Attribute[4])( GLcontext *ctx, int key );
268c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell};
269c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
270c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell#define _TNL_MAX_ATTR_CODEGEN 16
271c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
272c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
273ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* The assembly of vertices in immediate mode is separated from
274ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * display list compilation.  This allows a simpler immediate mode
275ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * treatment and a display list compiler better suited to
276ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware-acceleration.
27723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
278ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vtx {
279ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[VERT_BUFFER_SIZE];
280ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
281ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
282ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim prim[TNL_MAX_PRIM];
283ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count;
284ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *vbptr;		      /* cursor, points into buffer */
285ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current vertex */
286ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *attrptr[_TNL_ATTRIB_MAX]; /* points into vertex */
287ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->Current, etc */
288ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint counter, initial_counter;
289ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_copied_vtx copied;
290c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
291c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell   attrfv_func tabfv[_TNL_MAX_ATTR_CODEGEN+1][4]; /* plus 1 for ERROR_ATTRIB */
292c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
293b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn_lists cache;
294b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn_generators gen;
295c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
296ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_eval eval;
297ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean *edgeflag_tmp;
298688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;
299ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
300ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
301ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
30223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
30323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
304ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* For display lists, this structure holds a run of vertices of the
305ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * same format, and a strictly well-formed set of begin/end pairs,
306ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * starting on the first vertex and ending at the last.  Vertex
307ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * copying on buffer breaks is precomputed according to these
308ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * primitives, though there are situations where the copying will need
309ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * correction at execute-time, perhaps by replaying the list as
310ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * immediate mode commands.
311ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell *
312ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * On executing this list, the 'current' values may be updated with
313ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the values of the final vertex, and often no fixup of the start of
314ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the vertex list is required.
315ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell *
316ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * Eval and other commands that don't fit into these vertex lists are
317ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * compiled using the fallback opcode mechanism provided by dlist.c.
31823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
319ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_list {
320ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
321ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
322ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
323ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *buffer;
324ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
325ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint wrap_count;		/* number of copied vertices at start */
326688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;	/* bit of a hack - quick check for materials */
327688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean dangling_attr_ref;	/* current attr implicitly referenced
328ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell				   outside the list */
329ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
330ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *normal_lengths;
331ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim *prim;
332ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count;
333ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
334ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_store *vertex_store;
335ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_primitive_store *prim_store;
336ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
3374c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
338ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* These buffers should be a reasonable size to support upload to
339ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware?  Maybe drivers should stitch them back together, or
340ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * specify a desired size?
341ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell */
342ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_BUFFER_SIZE (16*1024)
343ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_PRIM_SIZE   128
3444c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
345ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* Storage to be shared among several vertex_lists.
34623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
347ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_store {
348ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[SAVE_BUFFER_SIZE];
349ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint used;
350ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint refcount;
351ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
35223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
353ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_primitive_store {
354ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim buffer[SAVE_PRIM_SIZE];
355ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint used;
356ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint refcount;
357ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
35823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
3596d1055c9675fb8c39d3843b550beaa168e031fc9Keith Whitwell
360ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_save {
361ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
362ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
36323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
364ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *buffer;
365ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
366ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint wrap_count;
36723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
368ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim *prim;
369ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count, prim_max;
370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
371ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_store *vertex_store;
372ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_primitive_store *prim_store;
37323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
374ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *vbptr;		   /* cursor, points into buffer */
375ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat vertex[_TNL_ATTRIB_MAX*4];	   /* current values */
376ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *attrptr[_TNL_ATTRIB_MAX];
377ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint counter, initial_counter;
378688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean dangling_attr_ref;
379688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;
380ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
381ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint opcode_vertex_list;
382ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
383ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_copied_vtx copied;
384bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul
385ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */
386ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte *currentsz[_TNL_ATTRIB_MAX];
38786b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
388ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*tabfv[_TNL_ATTRIB_MAX][4])( const GLfloat * );
389cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
3905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
39123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
392ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_arrays
393cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
39405b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul   /* Conventional vertex attribute arrays */
395cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f  Obj;
396bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul   GLvector4f  Normal;
397ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Color;
398ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  SecondaryColor;
39905b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul   GLvector4f  FogCoord;
400610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLvector4f  TexCoord[MAX_TEXTURE_COORD_UNITS];
401ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Index;
402ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
403ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     *EdgeFlag;
404ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      *Elt;
4058856cece54df5183853aaebc1af8c60436d699c0Brian Paul
4068856cece54df5183853aaebc1af8c60436d699c0Brian Paul   /* These attributes don't alias with the conventional attributes.
4078856cece54df5183853aaebc1af8c60436d699c0Brian Paul    * The GL_NV_vertex_program extension defines 16 extra sets of vertex
4088856cece54df5183853aaebc1af8c60436d699c0Brian Paul    * arrays which have precedent over the conventional arrays when enabled.
4098856cece54df5183853aaebc1af8c60436d699c0Brian Paul    */
410ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Attribs[_TNL_ATTRIB_MAX];
41123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
41223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
41323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
4144c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/**
4154c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * Contains the current state of a running pipeline.
41623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
417ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct vertex_buffer
41823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell{
419cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Constant over life of the vertex_buffer.
42023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
421ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      Size;
42223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
423cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Constant over the pipeline.
42423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
425ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      Count;		              /* for everything except Elts */
42623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
427cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Pointers to current data.
42823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
429ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      *Elts;
430ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ObjPtr;		                /* _TNL_BIT_POS */
431ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *EyePtr;		                /* _TNL_BIT_POS */
432ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ClipPtr;	                /* _TNL_BIT_POS */
433ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *NdcPtr;                         /* _TNL_BIT_POS */
434ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     ClipOrMask;	                /* _TNL_BIT_POS */
435352d4dbfb24c65f327759c00c7db7d30a9482e35Keith Whitwell   GLubyte     ClipAndMask;	                /* _TNL_BIT_POS */
436ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     *ClipMask;		        /* _TNL_BIT_POS */
437ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *NormalPtr;	                /* _TNL_BIT_NORMAL */
438ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat     *NormalLengthPtr;	        /* _TNL_BIT_NORMAL */
439ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean   *EdgeFlag;	                /* _TNL_BIT_EDGEFLAG */
440610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLvector4f  *TexCoordPtr[MAX_TEXTURE_COORD_UNITS]; /* VERT_TEX_0..n */
441ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *IndexPtr[2];	                /* _TNL_BIT_INDEX */
442ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ColorPtr[2];	                /* _TNL_BIT_COLOR0 */
443ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *SecondaryColorPtr[2];           /* _TNL_BIT_COLOR1 */
444ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *PointSizePtr;	                /* _TNL_BIT_POS */
445ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *FogCoordPtr;	                /* _TNL_BIT_FOG */
446ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
447ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim  *Primitive;
448ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      PrimitiveCount;
449cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
450363049160da54f4aafe88f99bb2140a9bfed142bBrian Paul   /* Inputs to the vertex program stage */
451ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f *AttribPtr[_TNL_ATTRIB_MAX];      /* GL_NV_vertex_program */
45223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint LastClipped;
45458e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   /* Private data from _tnl_render_stage that has no business being
45522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * in this struct.
45623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
457ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
45823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
45923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
460c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Describes an individual operation on the pipeline.
461cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
46209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_pipeline_stage
46309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
464cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   const char *name;
465cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint check_state;		/* All state referenced in check() --
466cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * When is the pipeline_stage struct
467cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * itself invalidated?  Must be
468cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * constant.
469cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 */
47023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
471cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Usually constant or set by the 'check' callback:
47223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
473cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint run_state;		/* All state referenced in run() --
474cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * When is the cached output of the
47522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				 * stage invalidated?
476cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 */
47722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
478cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLboolean active;		/* True if runnable in current state */
479cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint inputs;		/* VERT_* inputs to the stage */
480cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint outputs;		/* VERT_* outputs of the stage */
481cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
482cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Set in _tnl_run_pipeline():
48323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
484cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint changed_inputs;	/* Generated value -- inputs to the
485cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 * stage that have changed since last
48622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				 * call to 'run'.
487cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				 */
48823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
489790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
490cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Private data for the pipeline stage:
491cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
492b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   void *privatePtr;
49323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
494cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Free private data.  May not be null.
495cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
496ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*destroy)( struct tnl_pipeline_stage * );
49723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
498cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Called from _tnl_validate_pipeline().  Must update all fields in
49922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * the pipeline_stage struct for the current state.
500cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
501ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*check)( GLcontext *ctx, struct tnl_pipeline_stage * );
502cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
503cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Called from _tnl_run_pipeline().  The stage.changed_inputs value
504cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * encodes all inputs to thee struct which have changed.  If
505cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * non-zero, recompute all affected outputs of the stage, otherwise
50622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * execute any 'sideeffects' of the stage.
507cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    *
508cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * Return value: GL_TRUE - keep going
509cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    *               GL_FALSE - finished pipeline
510cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
511ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean (*run)( GLcontext *ctx, struct tnl_pipeline_stage * );
51223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
51323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
514c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Contains the array of all pipeline stages.
515c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * The default values are defined at the end of t_pipeline.c */
516ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_pipeline {
517c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint build_state_trigger;	  /**< state changes which require build */
518c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint build_state_changes;    /**< state changes since last build */
519c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint run_state_changes;	  /**< state changes since last run */
520c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint run_input_changes;	  /**< VERT_* changes since last run */
521c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   GLuint inputs;		  /**< VERT_* inputs to pipeline */
522c8f2f456f94232671511745e1b236339af6b44ceBrian Paul   /** This array has to end with a NULL-pointer. */
523ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_pipeline_stage stages[MAX_PIPELINE_STAGES+1];
524cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint nr_stages;
52523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
52623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
527588225770c60834dfd2a95850435cc549167dc05Keith Whitwellstruct tnl_clipspace_attr;
528588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
529588225770c60834dfd2a95850435cc549167dc05Keith Whitwelltypedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out,
530588225770c60834dfd2a95850435cc549167dc05Keith Whitwell			      const GLubyte *v );
531588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
532588225770c60834dfd2a95850435cc549167dc05Keith Whitwelltypedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v,
533588225770c60834dfd2a95850435cc549167dc05Keith Whitwell			     const GLfloat *in );
534588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
53523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
536fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/**
537fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Describes how to convert/move a vertex attribute from a vertex array
538fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * to a vertex structure.
539fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */
54009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace_attr
54109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
542fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint attrib;          /* which vertex attrib (0=position, etc) */
543fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint vertoffset;      /* position of the attrib in the vertex struct */
544fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint vertattrsize;    /* size of the attribute in bytes */
545588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   GLubyte *inputptr;
546fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint inputstride;
547588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   insert_func *insert;
548588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   insert_func emit;
549588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   extract_func extract;
550fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   const GLfloat *vp;   /* NDC->Viewport mapping matrix */
551790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell};
552790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
553ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
554709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
555709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last );
556709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2 );
557709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*triangle_func)( GLcontext *ctx,
558709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell                               GLuint v1, GLuint v2, GLuint v3 );
559709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*quad_func)( GLcontext *ctx, GLuint v1, GLuint v2,
560709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell                           GLuint v3, GLuint v4 );
561709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*render_func)( GLcontext *ctx, GLuint start, GLuint count,
562709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell			     GLuint flags );
563709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*interp_func)( GLcontext *ctx,
56421f80baa35dca54394f100d2655d28eec10cca0aBrian Paul			     GLfloat t, GLuint dst, GLuint out, GLuint in,
565709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell			     GLboolean force_boundary );
566709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src );
5671182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwelltypedef void (*setup_func)( GLcontext *ctx,
5681182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell			    GLuint start, GLuint end,
5691182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell			    GLuint new_inputs);
570709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
571709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
572fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/**
573fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Used to describe conversion of vertex arrays to vertex structures.
574fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * I.e. Structure of arrays to arrays of structs.
575fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */
57609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace
57709da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
578790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLboolean need_extras;
579790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
580790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint new_inputs;
581790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
582790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLubyte *vertex_buf;
583790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint vertex_size;
584790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint max_vertex_size;
585790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
586790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX];
587790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint attr_count;
588790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
589790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   void (*emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest );
590790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   interp_func interp;
591790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   copy_pv_func copy_pv;
592790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell};
593790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
594790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
59509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_device_driver
59609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
597709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /***
598709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    *** TNL Pipeline
599709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    ***/
600709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
6017954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell   void (*RunPipeline)(GLcontext *ctx);
6027954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell   /* Replaces PipelineStart/PipelineFinish -- intended to allow
6037954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell    * drivers to wrap _tnl_run_pipeline() with code to validate state
6047954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell    * and grab/release hardware locks.
605709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
606709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
6070cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell   void (*NotifyMaterialChange)(GLcontext *ctx);
608306d3fcdbad523428501833405e47e9897896defKeith Whitwell   /* Alert tnl-aware drivers of changes to material.
609306d3fcdbad523428501833405e47e9897896defKeith Whitwell    */
610306d3fcdbad523428501833405e47e9897896defKeith Whitwell
611306d3fcdbad523428501833405e47e9897896defKeith Whitwell   GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
612306d3fcdbad523428501833405e47e9897896defKeith Whitwell   /* Allow drivers to hook in optimized begin/end engines.
613306d3fcdbad523428501833405e47e9897896defKeith Whitwell    * Return value:  GL_TRUE - driver handled the begin
614306d3fcdbad523428501833405e47e9897896defKeith Whitwell    *                GL_FALSE - driver didn't handle the begin
6150cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell    */
6160cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell
617709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /***
6181182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell    *** Rendering -- These functions called only from t_vb_render.c
619709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    ***/
62009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   struct
62109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   {
6221182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*Start)(GLcontext *ctx);
6231182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*Finish)(GLcontext *ctx);
6241182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Called before and after all rendering operations, including DrawPixels,
6251182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands.
6261182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * These are a suitable place for grabbing/releasing hardware locks.
6271182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6281182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6291182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*PrimitiveNotify)(GLcontext *ctx, GLenum mode);
6301182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Called between RenderStart() and RenderFinish() to indicate the
6311182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * type of primitive we're about to draw.  Mode will be one of the
6321182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * modes accepted by glBegin().
6331182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6341182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6351182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      interp_func Interp;
6361182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* The interp function is called by the clipping routines when we need
6371182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * to generate an interpolated vertex.  All pertinant vertex ancilliary
6381182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * data should be computed by interpolating between the 'in' and 'out'
6391182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertices.
6401182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6411182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6421182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      copy_pv_func CopyPV;
6431182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* The copy function is used to make a copy of a vertex.  All pertinant
6441182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertex attributes should be copied.
6451182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6461182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6471182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ClippedPolygon)( GLcontext *ctx, const GLuint *elts, GLuint n );
6481182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render a polygon with <n> vertices whose indexes are in the <elts>
6491182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * array.
6501182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6511182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6521182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 );
6531182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render a line between the two vertices given by indexes v0 and v1. */
6541182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6551182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      points_func           Points; /* must now respect vb->elts */
6561182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      line_func             Line;
6571182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      triangle_func         Triangle;
6581182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      quad_func             Quad;
6591182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* These functions are called in order to render points, lines,
6601182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * triangles and quads.  These are only called via the T&L module.
6611182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6621182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6631182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      render_func          *PrimTabVerts;
6641182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      render_func          *PrimTabElts;
6651182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render whole unclipped primitives (points, lines, linestrips,
6661182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * lineloops, etc).  The tables are indexed by the GL enum of the
6671182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * primitive to be rendered.  RenderTabVerts is used for non-indexed
6681182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * arrays of vertices.  RenderTabElts is used for indexed arrays of
6691182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertices.
6701182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6711182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6721182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ResetLineStipple)( GLcontext *ctx );
6731182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Reset the hardware's line stipple counter.
6741182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6751182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6761182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      setup_func BuildVertices;
6771182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* This function is called whenever new vertices are required for
6781182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * rendering.  The vertices in question are those n such that start
6791182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * <= n < end.  The new_inputs parameter indicates those fields of
6801182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * the vertex which need to be updated, if only a partial repair of
6811182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * the vertex is required.
6821182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       *
6831182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * This function is called only from _tnl_render_stage in tnl/t_render.c.
6841182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6851182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6861182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6871182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      GLboolean (*Multipass)( GLcontext *ctx, GLuint passno );
6881182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Driver may request additional render passes by returning GL_TRUE
6891182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * when this function is called.  This function will be called
6901182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * after the first pass, and passes will be made until the function
6911182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * returns GL_FALSE.  If no function is registered, only one pass
6921182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * is made.
6931182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       *
6941182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * This function will be first invoked with passno == 1.
6951182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6961182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   } Render;
697709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell};
6981182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
699709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
70009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul/**
70109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul * Context state for T&L context.
70209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul */
70309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paultypedef struct
70409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
705709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /* Driver interface.
706709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
707709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   struct tnl_device_driver Driver;
708709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
709ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   /* Execute:
71023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
711ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vtx vtx;
712ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
713ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   /* Compile:
71423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
715ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_save save;
71623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
717cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Pipeline
71823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
719ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_pipeline pipeline;
720cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer vb;
72123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
722cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* GLvectors for binding to vb:
723cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
724ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays vtx_inputs;
725ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays save_inputs;
726ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays current;
727ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays array_inputs;
728ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
729790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   /* Clipspace/ndc/window vertex managment:
730790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell    */
731790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   struct tnl_clipspace clipspace;
732790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
733321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell   /* Probably need a better configuration mechanism:
734321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell    */
73530f51ae067379c2b3573c06b707d25a9704df7beBrian Paul   GLboolean NeedNdcCoords;
73651b36396ae45f9ee9cec8d612787d038641dc6c8Keith Whitwell   GLboolean LoopbackDListCassettes;
73747a28c0b4d4ca27592e3cbb8e4b17d1cd8f7997dKeith Whitwell   GLboolean CalcDListNormalLengths;
7380cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell   GLboolean IsolateMaterials;
73909da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLboolean AllowVertexFog;
7408d407300c2b94f32c955b6dd75c2e18d6d58caa5Brian Paul   GLboolean AllowPixelFog;
741c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell   GLboolean AllowCodegen;
742321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell
74309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLboolean _DoVertexFog;  /* eval fog function at each vertex? */
744790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
74509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLuint render_inputs;
746ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
747ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvertexformat exec_vtxfmt;
748306d3fcdbad523428501833405e47e9897896defKeith Whitwell   GLvertexformat save_vtxfmt;
749ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
75023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell} TNLcontext;
75123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
75223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
75323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
75423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#define TNL_CONTEXT(ctx) ((TNLcontext *)(ctx->swtnl_context))
75523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
75623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
757cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TYPE_IDX(t) ((t) & 0xf)
758cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1      /* 0xa + 1 */
75923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
760cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellextern void _tnl_MakeCurrent( GLcontext *ctx,
761cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			      GLframebuffer *drawBuffer,
762cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			      GLframebuffer *readBuffer );
76323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
76423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
76523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
766cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
76723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#endif
768