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