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