t_context.h revision b43671c8bf0ff640243c670ff98225d2a3c10632
123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell/*
2ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * mesa 3-D graphics library
3b43671c8bf0ff640243c670ff98225d2a3c10632Brian Paul * Version:  6.5
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
580875253ce0e166bd8f529ba9b869139ce82902aBrian Paul * Copyright (C) 1999-2005  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
8541c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul/*
8641c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * Note: The first attributes match the VERT_ATTRIB_* definitions
8741c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * in mtypes.h.  However, the tnl module has additional attributes
8841c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * for materials, color indexes, edge flags, etc.
8941c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul */
906f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell/* Although it's nice to use these as bit indexes in a DWORD flag, we
916f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell * could manage without if necessary.  Another limit currently is the
926f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell * number of bits allocated for these numbers in places like vertex
936f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell * program instruction formats and register layouts.
94588225770c60834dfd2a95850435cc549167dc05Keith Whitwell */
95ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellenum {
96ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_POS = 0,
97ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_WEIGHT = 1,
98ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_NORMAL = 2,
99ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_COLOR0 = 3,
100ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_COLOR1 = 4,
101ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_FOG = 5,
102ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_SIX = 6,
103ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_SEVEN = 7,
104ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX0 = 8,
105ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX1 = 9,
106ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX2 = 10,
107ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX3 = 11,
108ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX4 = 12,
109ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX5 = 13,
110ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX6 = 14,
111ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_TEX7 = 15,
112ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_AMBIENT = 16,
113ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_AMBIENT = 17,
114ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_DIFFUSE = 18,
115ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_DIFFUSE = 19,
116ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_SPECULAR = 20,
117ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_SPECULAR = 21,
118ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_EMISSION = 22,
119ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_EMISSION = 23,
120ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_SHININESS = 24,
121ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_SHININESS = 25,
122ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_FRONT_INDEXES = 26,
123ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_MAT_BACK_INDEXES = 27,
124ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_INDEX = 28,
125ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	_TNL_ATTRIB_EDGEFLAG = 29,
126588225770c60834dfd2a95850435cc549167dc05Keith Whitwell	_TNL_ATTRIB_POINTSIZE = 30,
127588225770c60834dfd2a95850435cc549167dc05Keith Whitwell	_TNL_ATTRIB_MAX = 31
128ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell} ;
129ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
130ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* Will probably have to revise this scheme fairly shortly, eg. by
131ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * compacting all the MAT flags down to one bit, or by using two
132ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * dwords to store the flags.
13323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
134ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_POS                 (1<<0)
135ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_WEIGHT              (1<<1)
136ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_NORMAL              (1<<2)
137ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_COLOR0              (1<<3)
138ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_COLOR1              (1<<4)
139ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_FOG                 (1<<5)
140ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_SIX                 (1<<6)
141ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_SEVEN               (1<<7)
142ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX0                (1<<8)
143ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX1                (1<<9)
144ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX2                (1<<10)
145ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX3                (1<<11)
146ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX4                (1<<12)
147ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX5                (1<<13)
148ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX6                (1<<14)
149ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX7                (1<<15)
150ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_AMBIENT   (1<<16)
151ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_AMBIENT    (1<<17)
152ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_DIFFUSE   (1<<18)
153ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_DIFFUSE    (1<<19)
154ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_SPECULAR  (1<<20)
155ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_SPECULAR   (1<<21)
156ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_EMISSION  (1<<22)
157ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_EMISSION   (1<<23)
158ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_SHININESS (1<<24)
159ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_SHININESS  (1<<25)
160ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_INDEXES   (1<<26)
161ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_INDEXES    (1<<27)
162ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_INDEX               (1<<28)
163ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_EDGEFLAG            (1<<29)
164588225770c60834dfd2a95850435cc549167dc05Keith Whitwell#define _TNL_BIT_POINTSIZE           (1<<30)
165ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
166ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX(u)  (1 << (_TNL_ATTRIB_TEX0 + (u)))
167ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
168ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
169790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
170ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_MAT_ANY  (_TNL_BIT_MAT_FRONT_AMBIENT   | 	\
171ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_AMBIENT    | 	\
172ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_DIFFUSE   | 	\
173ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_DIFFUSE    | 	\
174ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_SPECULAR  | 	\
175ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_SPECULAR   | 	\
176ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_EMISSION  | 	\
177ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_EMISSION   | 	\
178ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_SHININESS | 	\
179ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_SHININESS  | 	\
180ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_FRONT_INDEXES   | 	\
181ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			    _TNL_BIT_MAT_BACK_INDEXES)
182ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
183ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
184ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_TEX_ANY  (_TNL_BIT_TEX0 |	\
185ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX1 |	\
186ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX2 |	\
187ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX3 |	\
188ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX4 |	\
189ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX5 |	\
190ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX6 |	\
191ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell                            _TNL_BIT_TEX7)
192ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
193ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
194ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_PROG_ANY   (_TNL_BIT_POS    |		\
195ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_WEIGHT |		\
196ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_NORMAL |		\
197ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_COLOR0 |		\
198ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_COLOR1 |		\
199ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_FOG    |		\
200ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_SIX    |		\
201ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BIT_SEVEN  |		\
202ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell			      _TNL_BITS_TEX_ANY)
203ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
204ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
205ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
206ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_BEGIN     0x10
207ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_END       0x20
208ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_WEAK      0x40
209ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_MODE_MASK 0x0f
210ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
211ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/*
212ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell */
213ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_prim {
214ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint mode;
215ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint start;
216ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
217ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
21823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
21923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
22023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
221ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval1_map {
222ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct gl_1d_map *map;
223ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint sz;
224ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
225cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
226ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval2_map {
227ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct gl_2d_map *map;
228ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint sz;
229ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
230ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
231ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval {
232ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint new_state;
233ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_eval1_map map1[_TNL_ATTRIB_INDEX + 1];
234ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_eval2_map map2[_TNL_ATTRIB_INDEX + 1];
235ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
23623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
23723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
238ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define TNL_MAX_PRIM 16
239ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define TNL_MAX_COPIED_VERTS 3
240ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
241ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_copied_vtx {
242ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[_TNL_ATTRIB_MAX * 4 * TNL_MAX_COPIED_VERTS];
243ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint nr;
244ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
245ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
246ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define VERT_BUFFER_SIZE 2048	/* 8kbytes */
247ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
2485262dcccc87caf8083cb7867155d91ac2f38ffefKeith Whitwell
2493d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_attrfv_func)( const GLfloat * );
250ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
251b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn {
252b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn *next, *prev;
253bdd15b5749b45929fa642c3e47997f52eb07fbe5Brian Paul   GLuint key;
254c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell   char *code;
255c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell};
256c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
257b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn_lists {
258b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn Vertex[4];
259b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn Attribute[4];
260c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell};
261c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
262b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn_generators {
263b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn *(*Vertex[4])( GLcontext *ctx, int key );
264b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn *(*Attribute[4])( GLcontext *ctx, int key );
265c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell};
266c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
267c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell#define _TNL_MAX_ATTR_CODEGEN 16
268c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
269c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
270ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* The assembly of vertices in immediate mode is separated from
271ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * display list compilation.  This allows a simpler immediate mode
272ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * treatment and a display list compiler better suited to
273ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware-acceleration.
27423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
275ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vtx {
276ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[VERT_BUFFER_SIZE];
277ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
278ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
279ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim prim[TNL_MAX_PRIM];
280ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count;
281ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *vbptr;		      /* cursor, points into buffer */
282ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current vertex */
283ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *attrptr[_TNL_ATTRIB_MAX]; /* points into vertex */
284ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->Current, etc */
285df943a40411d2b71381e5053d7c59e8cd2400fffKeith Whitwell   GLfloat CurrentFloatEdgeFlag;
286ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint counter, initial_counter;
287ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_copied_vtx copied;
288c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
2893d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_attrfv_func tabfv[_TNL_MAX_ATTR_CODEGEN+1][4]; /* plus 1 for ERROR_ATTRIB */
290c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
291b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn_lists cache;
292b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell   struct _tnl_dynfn_generators gen;
293c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell
294ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_eval eval;
295ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean *edgeflag_tmp;
296688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;
297ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
298ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
299ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
30023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
30123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
302ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* For display lists, this structure holds a run of vertices of the
303ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * same format, and a strictly well-formed set of begin/end pairs,
304ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * starting on the first vertex and ending at the last.  Vertex
305ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * copying on buffer breaks is precomputed according to these
306ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * primitives, though there are situations where the copying will need
307ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * correction at execute-time, perhaps by replaying the list as
308ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * immediate mode commands.
309ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell *
310ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * On executing this list, the 'current' values may be updated with
311ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the values of the final vertex, and often no fixup of the start of
312ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the vertex list is required.
313ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell *
314ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * Eval and other commands that don't fit into these vertex lists are
315ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * compiled using the fallback opcode mechanism provided by dlist.c.
31623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
317ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_list {
318ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
319ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
320ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
321ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *buffer;
322ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
323ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint wrap_count;		/* number of copied vertices at start */
324688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;	/* bit of a hack - quick check for materials */
325688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean dangling_attr_ref;	/* current attr implicitly referenced
326ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell				   outside the list */
327ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
328ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *normal_lengths;
329ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim *prim;
330ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count;
331ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
332ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_store *vertex_store;
333ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_primitive_store *prim_store;
334ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
3354c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
336ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* These buffers should be a reasonable size to support upload to
337ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware?  Maybe drivers should stitch them back together, or
338ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * specify a desired size?
339ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell */
340ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_BUFFER_SIZE (16*1024)
341ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_PRIM_SIZE   128
3424c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
343ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* Storage to be shared among several vertex_lists.
34423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
345ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_store {
346ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat buffer[SAVE_BUFFER_SIZE];
347ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint used;
348ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint refcount;
349ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
35023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
351ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_primitive_store {
352ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim buffer[SAVE_PRIM_SIZE];
353ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint used;
354ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint refcount;
355ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
35623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
3576d1055c9675fb8c39d3843b550beaa168e031fc9Keith Whitwell
358ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_save {
359ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte attrsz[_TNL_ATTRIB_MAX];
360ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint vertex_size;
36123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
362ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *buffer;
363ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint count;
364ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint wrap_count;
36536a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell   GLuint replay_flags;
36623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
367ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim *prim;
368ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint prim_count, prim_max;
369cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
370ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_store *vertex_store;
371ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_primitive_store *prim_store;
37223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
373ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *vbptr;		   /* cursor, points into buffer */
374ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat vertex[_TNL_ATTRIB_MAX*4];	   /* current values */
375ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *attrptr[_TNL_ATTRIB_MAX];
376ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint counter, initial_counter;
377688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean dangling_attr_ref;
378688193800789d0ad883ca72edf2da392295cf734Keith Whitwell   GLboolean have_materials;
379ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
380ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint opcode_vertex_list;
381ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
382ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_copied_vtx copied;
383df943a40411d2b71381e5053d7c59e8cd2400fffKeith Whitwell
384df943a40411d2b71381e5053d7c59e8cd2400fffKeith Whitwell   GLfloat CurrentFloatEdgeFlag;
385bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul
386ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */
387ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte *currentsz[_TNL_ATTRIB_MAX];
38886b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
389ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*tabfv[_TNL_ATTRIB_MAX][4])( const GLfloat * );
390cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
3915e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
39223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
393ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_arrays
394cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
39505b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul   /* Conventional vertex attribute arrays */
396cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f  Obj;
397bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul   GLvector4f  Normal;
398ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Color;
399ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  SecondaryColor;
40005b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul   GLvector4f  FogCoord;
401610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLvector4f  TexCoord[MAX_TEXTURE_COORD_UNITS];
402ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Index;
403ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
404ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     *EdgeFlag;
405ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      *Elt;
4068856cece54df5183853aaebc1af8c60436d699c0Brian Paul
4078856cece54df5183853aaebc1af8c60436d699c0Brian Paul   /* These attributes don't alias with the conventional attributes.
4088856cece54df5183853aaebc1af8c60436d699c0Brian Paul    * The GL_NV_vertex_program extension defines 16 extra sets of vertex
4098856cece54df5183853aaebc1af8c60436d699c0Brian Paul    * arrays which have precedent over the conventional arrays when enabled.
4108856cece54df5183853aaebc1af8c60436d699c0Brian Paul    */
411ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  Attribs[_TNL_ATTRIB_MAX];
41223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
41323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
41423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
4154c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/**
4164c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * Contains the current state of a running pipeline.
41723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */
418ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct vertex_buffer
41923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell{
420cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Constant over life of the vertex_buffer.
42123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
422ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      Size;
42323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
424cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Constant over the pipeline.
42523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
426ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      Count;		              /* for everything except Elts */
42723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
428cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Pointers to current data.
42923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
430ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      *Elts;
431ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ObjPtr;		                /* _TNL_BIT_POS */
432ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *EyePtr;		                /* _TNL_BIT_POS */
433ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ClipPtr;	                /* _TNL_BIT_POS */
434ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *NdcPtr;                         /* _TNL_BIT_POS */
435ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     ClipOrMask;	                /* _TNL_BIT_POS */
436352d4dbfb24c65f327759c00c7db7d30a9482e35Keith Whitwell   GLubyte     ClipAndMask;	                /* _TNL_BIT_POS */
437ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte     *ClipMask;		        /* _TNL_BIT_POS */
438ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *NormalPtr;	                /* _TNL_BIT_NORMAL */
439ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat     *NormalLengthPtr;	        /* _TNL_BIT_NORMAL */
440ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean   *EdgeFlag;	                /* _TNL_BIT_EDGEFLAG */
441610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLvector4f  *TexCoordPtr[MAX_TEXTURE_COORD_UNITS]; /* VERT_TEX_0..n */
442ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *IndexPtr[2];	                /* _TNL_BIT_INDEX */
443ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *ColorPtr[2];	                /* _TNL_BIT_COLOR0 */
444ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *SecondaryColorPtr[2];           /* _TNL_BIT_COLOR1 */
445ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *PointSizePtr;	                /* _TNL_BIT_POS */
446ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f  *FogCoordPtr;	                /* _TNL_BIT_FOG */
447ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
448ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_prim  *Primitive;
449ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint      PrimitiveCount;
450cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
451363049160da54f4aafe88f99bb2140a9bfed142bBrian Paul   /* Inputs to the vertex program stage */
452ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvector4f *AttribPtr[_TNL_ATTRIB_MAX];      /* GL_NV_vertex_program */
45323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
454cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint LastClipped;
45558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   /* Private data from _tnl_render_stage that has no business being
45622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * in this struct.
45723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
458ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
45923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
46023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
461c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Describes an individual operation on the pipeline.
462cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
46309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_pipeline_stage
46409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
465cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   const char *name;
466790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
467cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Private data for the pipeline stage:
468cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
469b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   void *privatePtr;
47023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
4716f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   /* Allocate private data
4726f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell    */
4736f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   GLboolean (*create)( GLcontext *ctx, struct tnl_pipeline_stage * );
4746f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
4756f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   /* Free private data.
476cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
477ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   void (*destroy)( struct tnl_pipeline_stage * );
47823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
4796f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   /* Called on any statechange or input array size change or
4806f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell    * input array change to/from zero stride.
481cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
4826f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   void (*validate)( GLcontext *ctx, struct tnl_pipeline_stage * );
483cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
484cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Called from _tnl_run_pipeline().  The stage.changed_inputs value
485cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * encodes all inputs to thee struct which have changed.  If
486cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * non-zero, recompute all affected outputs of the stage, otherwise
48722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * execute any 'sideeffects' of the stage.
488cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    *
489cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * Return value: GL_TRUE - keep going
490cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    *               GL_FALSE - finished pipeline
491cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
492ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLboolean (*run)( GLcontext *ctx, struct tnl_pipeline_stage * );
49323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
49423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
4956f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
4966f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
497c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Contains the array of all pipeline stages.
4986f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell * The default values are defined at the end of t_pipeline.c
4996f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell */
500ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_pipeline {
5016f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
5026f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   GLuint last_attrib_stride[_TNL_ATTRIB_MAX];
5036f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   GLuint last_attrib_size[_TNL_ATTRIB_MAX];
5046f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   GLuint input_changes;
5056f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   GLuint new_state;
5066f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
507ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_pipeline_stage stages[MAX_PIPELINE_STAGES+1];
508cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint nr_stages;
50923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell};
51023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
511009aa3ef5ea6bc13c903d6f902b7039adef8fc74Keith Whitwellstruct tnl_clipspace;
512588225770c60834dfd2a95850435cc549167dc05Keith Whitwellstruct tnl_clipspace_attr;
513588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
5143d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_extract_func)( const struct tnl_clipspace_attr *a,
5153d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				  GLfloat *out,
5163d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				  const GLubyte *v );
517588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
5183d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_insert_func)( const struct tnl_clipspace_attr *a,
5193d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				 GLubyte *v,
5203d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				 const GLfloat *in );
521588225770c60834dfd2a95850435cc549167dc05Keith Whitwell
5223d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_emit_func)( GLcontext *ctx,
5239a8a9fb01fa5beeb843415277b48b086b099aa97Keith Whitwell			       GLuint count,
5249a8a9fb01fa5beeb843415277b48b086b099aa97Keith Whitwell			       GLubyte *dest );
525009aa3ef5ea6bc13c903d6f902b7039adef8fc74Keith Whitwell
52623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
527fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/**
528fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Describes how to convert/move a vertex attribute from a vertex array
529fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * to a vertex structure.
530fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */
53109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace_attr
53209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
533fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint attrib;          /* which vertex attrib (0=position, etc) */
534009aa3ef5ea6bc13c903d6f902b7039adef8fc74Keith Whitwell   GLuint format;
535fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint vertoffset;      /* position of the attrib in the vertex struct */
536fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint vertattrsize;    /* size of the attribute in bytes */
537588225770c60834dfd2a95850435cc549167dc05Keith Whitwell   GLubyte *inputptr;
538fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   GLuint inputstride;
5392b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLuint inputsize;
540c07ec046b7492602f32f9139a13bfcc8db0253c3Brian Paul   const tnl_insert_func *insert;
5413d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_insert_func emit;
5423d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_extract_func extract;
543fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul   const GLfloat *vp;   /* NDC->Viewport mapping matrix */
544790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell};
545790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
546ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
547009aa3ef5ea6bc13c903d6f902b7039adef8fc74Keith Whitwell
548709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
5493d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_points_func)( GLcontext *ctx, GLuint first, GLuint last );
5503d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_line_func)( GLcontext *ctx, GLuint v1, GLuint v2 );
5513d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_triangle_func)( GLcontext *ctx,
5523d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				   GLuint v1, GLuint v2, GLuint v3 );
5533d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_quad_func)( GLcontext *ctx, GLuint v1, GLuint v2,
5543d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell			       GLuint v3, GLuint v4 );
5553d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_render_func)( GLcontext *ctx, GLuint start, GLuint count,
5563d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				 GLuint flags );
5573d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_interp_func)( GLcontext *ctx,
5583d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				 GLfloat t, GLuint dst, GLuint out, GLuint in,
5593d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				 GLboolean force_boundary );
5603d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src );
5613d38361b718d490e1e7fda64519952ec887cd149Keith Whitwelltypedef void (*tnl_setup_func)( GLcontext *ctx,
5623d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				GLuint start, GLuint end,
5633d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell				GLuint new_inputs);
564709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
565709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
5662b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwellstruct tnl_clipspace_fastpath {
5672b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLuint vertex_size;
5682b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLuint attr_count;
5692b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLboolean match_strides;
5702b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell
5712b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   struct {
5722b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell      GLuint format;
57318a74321aa825c355392f98f1563a971871794ccKeith Whitwell      GLuint size;
5742b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell      GLuint stride;
57518a74321aa825c355392f98f1563a971871794ccKeith Whitwell      GLuint offset;
5762b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   } *attr;
5772b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell
5782b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   tnl_emit_func func;
5792b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   struct tnl_clipspace_fastpath *next;
5802b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell};
5812b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell
582fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/**
583fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Used to describe conversion of vertex arrays to vertex structures.
584fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * I.e. Structure of arrays to arrays of structs.
585fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */
58609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace
58709da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
588790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLboolean need_extras;
589790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
590790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint new_inputs;
591790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
592790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLubyte *vertex_buf;
593790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint vertex_size;
594790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint max_vertex_size;
595790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
596790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX];
597790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   GLuint attr_count;
598790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
5993d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_emit_func emit;
6003d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_interp_func interp;
6013d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_copy_pv_func copy_pv;
602009aa3ef5ea6bc13c903d6f902b7039adef8fc74Keith Whitwell
6032b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   /* Parameters and constants for codegen:
6042b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell    */
6052b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLboolean need_viewport;
6062b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLfloat vp_scale[4];
6072b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLfloat vp_xlate[4];
6082b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLfloat chan_scale[4];
6092b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   GLfloat identity[4];
6102b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell
6112b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   struct tnl_clipspace_fastpath *fastpath;
6122b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell
6132b2bd08589099cb480b983835b01cc76a766a3c4Keith Whitwell   void (*codegen_emit)( GLcontext *ctx );
614790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell};
615790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
616790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
61781032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell
61881032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwellstruct tnl_cache {
61981032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell   GLuint hash;
62081032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell   void *key;
62181032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell   void *data;
62281032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell   struct tnl_cache *next;
62381032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell};
62481032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell
62581032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell
62609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_device_driver
62709da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
628709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /***
629709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    *** TNL Pipeline
630709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    ***/
631709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
6327954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell   void (*RunPipeline)(GLcontext *ctx);
6337954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell   /* Replaces PipelineStart/PipelineFinish -- intended to allow
6347954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell    * drivers to wrap _tnl_run_pipeline() with code to validate state
6357954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell    * and grab/release hardware locks.
636709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
637709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
6380cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell   void (*NotifyMaterialChange)(GLcontext *ctx);
639306d3fcdbad523428501833405e47e9897896defKeith Whitwell   /* Alert tnl-aware drivers of changes to material.
640306d3fcdbad523428501833405e47e9897896defKeith Whitwell    */
641306d3fcdbad523428501833405e47e9897896defKeith Whitwell
642306d3fcdbad523428501833405e47e9897896defKeith Whitwell   GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
643306d3fcdbad523428501833405e47e9897896defKeith Whitwell   /* Allow drivers to hook in optimized begin/end engines.
644306d3fcdbad523428501833405e47e9897896defKeith Whitwell    * Return value:  GL_TRUE - driver handled the begin
645306d3fcdbad523428501833405e47e9897896defKeith Whitwell    *                GL_FALSE - driver didn't handle the begin
6460cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell    */
6470cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell
648709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /***
6491182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell    *** Rendering -- These functions called only from t_vb_render.c
650709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    ***/
65109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   struct
65209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   {
6531182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*Start)(GLcontext *ctx);
6541182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*Finish)(GLcontext *ctx);
6551182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Called before and after all rendering operations, including DrawPixels,
6561182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands.
6571182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * These are a suitable place for grabbing/releasing hardware locks.
6581182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6591182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6601182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*PrimitiveNotify)(GLcontext *ctx, GLenum mode);
6611182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Called between RenderStart() and RenderFinish() to indicate the
6621182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * type of primitive we're about to draw.  Mode will be one of the
6631182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * modes accepted by glBegin().
6641182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6651182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6663d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_interp_func Interp;
6671182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* The interp function is called by the clipping routines when we need
6681182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * to generate an interpolated vertex.  All pertinant vertex ancilliary
6691182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * data should be computed by interpolating between the 'in' and 'out'
6701182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertices.
6711182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6721182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6733d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_copy_pv_func CopyPV;
6741182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* The copy function is used to make a copy of a vertex.  All pertinant
6751182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertex attributes should be copied.
6761182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6771182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6781182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ClippedPolygon)( GLcontext *ctx, const GLuint *elts, GLuint n );
6791182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render a polygon with <n> vertices whose indexes are in the <elts>
6801182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * array.
6811182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6821182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6831182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 );
6841182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render a line between the two vertices given by indexes v0 and v1. */
6851182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6863d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_points_func           Points; /* must now respect vb->elts */
6873d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_line_func             Line;
6883d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_triangle_func         Triangle;
6893d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_quad_func             Quad;
6901182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* These functions are called in order to render points, lines,
6911182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * triangles and quads.  These are only called via the T&L module.
6921182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
6931182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
6943d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_render_func          *PrimTabVerts;
6953d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_render_func          *PrimTabElts;
6961182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Render whole unclipped primitives (points, lines, linestrips,
6971182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * lineloops, etc).  The tables are indexed by the GL enum of the
6981182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * primitive to be rendered.  RenderTabVerts is used for non-indexed
6991182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * arrays of vertices.  RenderTabElts is used for indexed arrays of
7001182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * vertices.
7011182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
7021182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
7031182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      void (*ResetLineStipple)( GLcontext *ctx );
7041182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Reset the hardware's line stipple counter.
7051182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
7061182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
7073d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell      tnl_setup_func BuildVertices;
7081182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* This function is called whenever new vertices are required for
7091182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * rendering.  The vertices in question are those n such that start
7101182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * <= n < end.  The new_inputs parameter indicates those fields of
7111182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * the vertex which need to be updated, if only a partial repair of
7121182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * the vertex is required.
7131182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       *
7141182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * This function is called only from _tnl_render_stage in tnl/t_render.c.
7151182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
7161182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
7171182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
7181182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      GLboolean (*Multipass)( GLcontext *ctx, GLuint passno );
7191182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell      /* Driver may request additional render passes by returning GL_TRUE
7201182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * when this function is called.  This function will be called
7211182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * after the first pass, and passes will be made until the function
7221182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * returns GL_FALSE.  If no function is registered, only one pass
7231182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * is made.
7241182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       *
7251182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       * This function will be first invoked with passno == 1.
7261182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell       */
7271182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell   } Render;
728709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell};
7291182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell
730709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
73109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul/**
73209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul * Context state for T&L context.
73309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul */
73409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paultypedef struct
73509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{
736709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /* Driver interface.
737709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
738709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   struct tnl_device_driver Driver;
739709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
740ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   /* Execute:
74123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
742ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vtx vtx;
743ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
744ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   /* Compile:
74523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
746ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_save save;
74723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
748cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Pipeline
74923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
750ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_pipeline pipeline;
751cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer vb;
75223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
753cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* GLvectors for binding to vb:
754cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
755ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays vtx_inputs;
756ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays save_inputs;
757ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays current;
758ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   struct tnl_vertex_arrays array_inputs;
759ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
760790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   /* Clipspace/ndc/window vertex managment:
761790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell    */
762790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell   struct tnl_clipspace clipspace;
763790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
764321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell   /* Probably need a better configuration mechanism:
765321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell    */
76630f51ae067379c2b3573c06b707d25a9704df7beBrian Paul   GLboolean NeedNdcCoords;
76751b36396ae45f9ee9cec8d612787d038641dc6c8Keith Whitwell   GLboolean LoopbackDListCassettes;
76847a28c0b4d4ca27592e3cbb8e4b17d1cd8f7997dKeith Whitwell   GLboolean CalcDListNormalLengths;
7690cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell   GLboolean IsolateMaterials;
77009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLboolean AllowVertexFog;
7718d407300c2b94f32c955b6dd75c2e18d6d58caa5Brian Paul   GLboolean AllowPixelFog;
772c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell   GLboolean AllowCodegen;
773321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell
77409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLboolean _DoVertexFog;  /* eval fog function at each vertex? */
775790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell
77609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul   GLuint render_inputs;
777ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
778ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvertexformat exec_vtxfmt;
779306d3fcdbad523428501833405e47e9897896defKeith Whitwell   GLvertexformat save_vtxfmt;
780ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
78181032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell   struct tnl_cache *vp_cache;
78281032030ff42dd78133d85f7cabab5fb4c9aaf1eKeith Whitwell
78323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell} TNLcontext;
78423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
78523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
78623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
78780875253ce0e166bd8f529ba9b869139ce82902aBrian Paul#define TNL_CONTEXT(ctx) ((TNLcontext *)((ctx)->swtnl_context))
78823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
78923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
790cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TYPE_IDX(t) ((t) & 0xf)
791cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1      /* 0xa + 1 */
79223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
793cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
79423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#endif
795