t_context.h revision 352d4dbfb24c65f327759c00c7db7d30a9482e35
123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell/* 2ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * mesa 3-D graphics library 3610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul * Version: 5.1 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 5c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * copy of this software and associated documentation files (the "Software"), 923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * to deal in the Software without restriction, including without limitation 1023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 1223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * Software is furnished to do so, subject to the following conditions: 135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 1423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * The above copyright notice and this permission notice shall be included 1523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * in all copies or substantial portions of the Software. 165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 1723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 234c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul */ 244c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul 254c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/** 264c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * \file t_context.h 274c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * \brief TnL module datatypes and definitions. 284c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * \author Keith Whitwell 2923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 3023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 31c8f2f456f94232671511745e1b236339af6b44ceBrian Paul 32c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** 33c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * \mainpage The TNL-module 34c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * 35c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * TNL stands for "transform and lighting", i.e. this module implements 36c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * a pipeline that receives as input a buffer of vertices and does all 37c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * necessary transformations (rotations, clipping, vertex shader etc.) 38c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * and passes then the output to the rasterizer. 39c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * 40ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * The tnl_pipeline contains the array of all stages, which should be 41e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * applied. Each stage is a black-box, which is described by an 42ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * tnl_pipeline_stage. The function ::_tnl_run_pipeline applies all the 43e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * stages to the vertex_buffer TNLcontext::vb, where the vertex data 44e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * is stored. The last stage in the pipeline is the rasterizer. 45c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * 46e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * The initial vertex_buffer data may either come from an ::immediate 47e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * structure or client vertex_arrays or display lists: 48c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * 49e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * 50e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * - The ::immediate structure records all the GL commands issued between 51e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * glBegin and glEnd. \n 52e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * The structure accumulates data, until it is either full or it is 53e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * flushed (usually by a state change). Before starting then the pipeline, 54e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * the collected vertex data in ::immediate has to be pushed into 55e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * TNLcontext::vb. 56e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * This happens in ::_tnl_vb_bind_immediate. The pipeline is then run by 57e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * calling tnl_device_driver::RunPipeline = ::_tnl_run_pipeline, which 58e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * is stored in TNLcontext::Driver. \n 59e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * An ::immediate does (for performance reasons) usually not finish with a 60e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * glEnd, and hence it also does not need to start with a glBegin. 61e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * This means that the last vertices of one ::immediate may need to be 62e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * saved for the next one. 63e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * 64e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * 65e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * - NOT SURE ABOUT THIS: The vertex_arrays structure is used to handle 66e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * glDrawArrays etc. \n 67e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * Here, the data of the vertex_arrays is copied by ::_tnl_vb_bind_arrays 68e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul * into TNLcontext::vb, so that the pipeline can be started. 69c8f2f456f94232671511745e1b236339af6b44ceBrian Paul */ 70c8f2f456f94232671511745e1b236339af6b44ceBrian Paul 71e53aa5022f5d70abe81d5b97dccebcb389cf4647Brian Paul 7223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#ifndef _T_CONTEXT_H 7323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#define _T_CONTEXT_H 7423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 7523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "glheader.h" 765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 7723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 7823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "math/m_matrix.h" 7923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "math/m_vector.h" 8023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "math/m_xform.h" 8123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 8223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 83cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define MAX_PIPELINE_STAGES 30 8423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 8523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 8641c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul/* 8741c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * Note: The first attributes match the VERT_ATTRIB_* definitions 8841c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * in mtypes.h. However, the tnl module has additional attributes 8941c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul * for materials, color indexes, edge flags, etc. 9041c310b20a97a9719100f61c6871e9fd4b3ff5f9Brian Paul */ 91588225770c60834dfd2a95850435cc549167dc05Keith Whitwell/* Note: These are currently being used to define both inputs and 92588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * outputs from the tnl pipeline. A better solution (which would also 93588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * releive the congestion to slightly prolong the life of the bitmask 94588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * below) is to have the fixed function pipeline populate a set of 95588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * arrays named after those produced by the vertex program stage, and 96588225770c60834dfd2a95850435cc549167dc05Keith Whitwell * have the rest the mesa backend work on those. 97588225770c60834dfd2a95850435cc549167dc05Keith Whitwell */ 98ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellenum { 99ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_POS = 0, 100ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_WEIGHT = 1, 101ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_NORMAL = 2, 102ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_COLOR0 = 3, 103ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_COLOR1 = 4, 104ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_FOG = 5, 105ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_SIX = 6, 106ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_SEVEN = 7, 107ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX0 = 8, 108ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX1 = 9, 109ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX2 = 10, 110ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX3 = 11, 111ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX4 = 12, 112ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX5 = 13, 113ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX6 = 14, 114ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_TEX7 = 15, 115ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_FRONT_AMBIENT = 16, 116ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_BACK_AMBIENT = 17, 117ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_FRONT_DIFFUSE = 18, 118ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_BACK_DIFFUSE = 19, 119ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_FRONT_SPECULAR = 20, 120ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_BACK_SPECULAR = 21, 121ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_FRONT_EMISSION = 22, 122ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_BACK_EMISSION = 23, 123ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_FRONT_SHININESS = 24, 124ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_BACK_SHININESS = 25, 125ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_FRONT_INDEXES = 26, 126ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_MAT_BACK_INDEXES = 27, 127ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_INDEX = 28, 128ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_ATTRIB_EDGEFLAG = 29, 129588225770c60834dfd2a95850435cc549167dc05Keith Whitwell _TNL_ATTRIB_POINTSIZE = 30, 130588225770c60834dfd2a95850435cc549167dc05Keith Whitwell _TNL_ATTRIB_MAX = 31 131ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell} ; 132ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 133ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* Will probably have to revise this scheme fairly shortly, eg. by 134ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * compacting all the MAT flags down to one bit, or by using two 135ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * dwords to store the flags. 13623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 137ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_POS (1<<0) 138ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_WEIGHT (1<<1) 139ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_NORMAL (1<<2) 140ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_COLOR0 (1<<3) 141ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_COLOR1 (1<<4) 142ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_FOG (1<<5) 143ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_SIX (1<<6) 144ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_SEVEN (1<<7) 145ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX0 (1<<8) 146ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX1 (1<<9) 147ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX2 (1<<10) 148ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX3 (1<<11) 149ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX4 (1<<12) 150ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX5 (1<<13) 151ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX6 (1<<14) 152ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX7 (1<<15) 153ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_AMBIENT (1<<16) 154ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_AMBIENT (1<<17) 155ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_DIFFUSE (1<<18) 156ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_DIFFUSE (1<<19) 157ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_SPECULAR (1<<20) 158ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_SPECULAR (1<<21) 159ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_EMISSION (1<<22) 160ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_EMISSION (1<<23) 161ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_SHININESS (1<<24) 162ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_SHININESS (1<<25) 163ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_FRONT_INDEXES (1<<26) 164ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_MAT_BACK_INDEXES (1<<27) 165ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_INDEX (1<<28) 166ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_EDGEFLAG (1<<29) 167588225770c60834dfd2a95850435cc549167dc05Keith Whitwell#define _TNL_BIT_POINTSIZE (1<<30) 168ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 169ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BIT_TEX(u) (1 << (_TNL_ATTRIB_TEX0 + (u))) 170ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 171ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 172790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 173ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_MAT_ANY (_TNL_BIT_MAT_FRONT_AMBIENT | \ 174ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_BACK_AMBIENT | \ 175ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_FRONT_DIFFUSE | \ 176ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_BACK_DIFFUSE | \ 177ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_FRONT_SPECULAR | \ 178ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_BACK_SPECULAR | \ 179ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_FRONT_EMISSION | \ 180ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_BACK_EMISSION | \ 181ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_FRONT_SHININESS | \ 182ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_BACK_SHININESS | \ 183ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_FRONT_INDEXES | \ 184ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_MAT_BACK_INDEXES) 185ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 186ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 187ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_TEX_ANY (_TNL_BIT_TEX0 | \ 188ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_TEX1 | \ 189ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_TEX2 | \ 190ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_TEX3 | \ 191ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_TEX4 | \ 192ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_TEX5 | \ 193ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_TEX6 | \ 194ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_TEX7) 195ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 196ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 197ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define _TNL_BITS_PROG_ANY (_TNL_BIT_POS | \ 198ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_WEIGHT | \ 199ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_NORMAL | \ 200ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_COLOR0 | \ 201ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_COLOR1 | \ 202ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_FOG | \ 203ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_SIX | \ 204ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BIT_SEVEN | \ 205ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell _TNL_BITS_TEX_ANY) 206ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 207ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 208ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 209ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_BEGIN 0x10 210ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_END 0x20 211ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_WEAK 0x40 212ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define PRIM_MODE_MASK 0x0f 213ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 214ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* 215ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell */ 216ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_prim { 217ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint mode; 218ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint start; 219ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint count; 220ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 22123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 22223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 22323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 224ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval1_map { 225ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct gl_1d_map *map; 226ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint sz; 227ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 229ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval2_map { 230ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct gl_2d_map *map; 231ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint sz; 232ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 233ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 234ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_eval { 235ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint new_state; 236ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_eval1_map map1[_TNL_ATTRIB_INDEX + 1]; 237ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_eval2_map map2[_TNL_ATTRIB_INDEX + 1]; 238ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 23923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 24023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 241ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define TNL_MAX_PRIM 16 242ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define TNL_MAX_COPIED_VERTS 3 243ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 244ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_copied_vtx { 245ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat buffer[_TNL_ATTRIB_MAX * 4 * TNL_MAX_COPIED_VERTS]; 246ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint nr; 247ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 248ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 249ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define VERT_BUFFER_SIZE 2048 /* 8kbytes */ 250ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 2515262dcccc87caf8083cb7867155d91ac2f38ffefKeith Whitwell 252ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwelltypedef void (*attrfv_func)( const GLfloat * ); 253ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 254b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn { 255b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell struct _tnl_dynfn *next, *prev; 256bdd15b5749b45929fa642c3e47997f52eb07fbe5Brian Paul GLuint key; 257c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell char *code; 258c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell}; 259c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 260b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn_lists { 261b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell struct _tnl_dynfn Vertex[4]; 262b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell struct _tnl_dynfn Attribute[4]; 263c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell}; 264c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 265b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwellstruct _tnl_dynfn_generators { 266b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell struct _tnl_dynfn *(*Vertex[4])( GLcontext *ctx, int key ); 267b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell struct _tnl_dynfn *(*Attribute[4])( GLcontext *ctx, int key ); 268c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell}; 269c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 270c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell#define _TNL_MAX_ATTR_CODEGEN 16 271c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 272c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 273ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* The assembly of vertices in immediate mode is separated from 274ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * display list compilation. This allows a simpler immediate mode 275ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * treatment and a display list compiler better suited to 276ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware-acceleration. 27723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 278ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vtx { 279ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat buffer[VERT_BUFFER_SIZE]; 280ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLubyte attrsz[_TNL_ATTRIB_MAX]; 281ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint vertex_size; 282ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_prim prim[TNL_MAX_PRIM]; 283ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint prim_count; 284ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *vbptr; /* cursor, points into buffer */ 285ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current vertex */ 286ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *attrptr[_TNL_ATTRIB_MAX]; /* points into vertex */ 287ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->Current, etc */ 288ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint counter, initial_counter; 289ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_copied_vtx copied; 290c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 291c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell attrfv_func tabfv[_TNL_MAX_ATTR_CODEGEN+1][4]; /* plus 1 for ERROR_ATTRIB */ 292c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 293b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell struct _tnl_dynfn_lists cache; 294b48c575983dcd6bbffa3925565d45cadbb95fae2Keith Whitwell struct _tnl_dynfn_generators gen; 295c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell 296ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_eval eval; 297ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLboolean *edgeflag_tmp; 298688193800789d0ad883ca72edf2da392295cf734Keith Whitwell GLboolean have_materials; 299ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 300ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 301ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 30223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 30323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 304ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* For display lists, this structure holds a run of vertices of the 305ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * same format, and a strictly well-formed set of begin/end pairs, 306ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * starting on the first vertex and ending at the last. Vertex 307ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * copying on buffer breaks is precomputed according to these 308ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * primitives, though there are situations where the copying will need 309ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * correction at execute-time, perhaps by replaying the list as 310ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * immediate mode commands. 311ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * 312ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * On executing this list, the 'current' values may be updated with 313ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the values of the final vertex, and often no fixup of the start of 314ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * the vertex list is required. 315ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * 316ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * Eval and other commands that don't fit into these vertex lists are 317ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * compiled using the fallback opcode mechanism provided by dlist.c. 31823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 319ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_list { 320ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLubyte attrsz[_TNL_ATTRIB_MAX]; 321ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint vertex_size; 322ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 323ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *buffer; 324ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint count; 325ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint wrap_count; /* number of copied vertices at start */ 326688193800789d0ad883ca72edf2da392295cf734Keith Whitwell GLboolean have_materials; /* bit of a hack - quick check for materials */ 327688193800789d0ad883ca72edf2da392295cf734Keith Whitwell GLboolean dangling_attr_ref; /* current attr implicitly referenced 328ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell outside the list */ 329ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 330ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *normal_lengths; 331ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_prim *prim; 332ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint prim_count; 333ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 334ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_vertex_store *vertex_store; 335ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_primitive_store *prim_store; 336ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 3374c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul 338ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* These buffers should be a reasonable size to support upload to 339ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * hardware? Maybe drivers should stitch them back together, or 340ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell * specify a desired size? 341ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell */ 342ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_BUFFER_SIZE (16*1024) 343ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define SAVE_PRIM_SIZE 128 3444c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul 345ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* Storage to be shared among several vertex_lists. 34623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 347ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_store { 348ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat buffer[SAVE_BUFFER_SIZE]; 349ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint used; 350ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint refcount; 351ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 35223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 353ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_primitive_store { 354ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_prim buffer[SAVE_PRIM_SIZE]; 355ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint used; 356ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint refcount; 357ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 35823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 3596d1055c9675fb8c39d3843b550beaa168e031fc9Keith Whitwell 360ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_save { 361ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLubyte attrsz[_TNL_ATTRIB_MAX]; 362ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint vertex_size; 36323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 364ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *buffer; 365ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint count; 366ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint wrap_count; 36723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 368ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_prim *prim; 369ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint prim_count, prim_max; 370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 371ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_vertex_store *vertex_store; 372ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_primitive_store *prim_store; 37323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 374ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *vbptr; /* cursor, points into buffer */ 375ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current values */ 376ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *attrptr[_TNL_ATTRIB_MAX]; 377ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint counter, initial_counter; 378688193800789d0ad883ca72edf2da392295cf734Keith Whitwell GLboolean dangling_attr_ref; 379688193800789d0ad883ca72edf2da392295cf734Keith Whitwell GLboolean have_materials; 380ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 381ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint opcode_vertex_list; 382ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 383ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_copied_vtx copied; 384bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul 385ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */ 386ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLubyte *currentsz[_TNL_ATTRIB_MAX]; 38786b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul 388ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell void (*tabfv[_TNL_ATTRIB_MAX][4])( const GLfloat * ); 389cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 3905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 39123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 392ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_vertex_arrays 393cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 39405b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul /* Conventional vertex attribute arrays */ 395cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f Obj; 396bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul GLvector4f Normal; 397ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f Color; 398ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f SecondaryColor; 39905b26510668fc1e5039c6c9088247f9b3c508cb7Brian Paul GLvector4f FogCoord; 400610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul GLvector4f TexCoord[MAX_TEXTURE_COORD_UNITS]; 401ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f Index; 402ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 403ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLubyte *EdgeFlag; 404ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint *Elt; 4058856cece54df5183853aaebc1af8c60436d699c0Brian Paul 4068856cece54df5183853aaebc1af8c60436d699c0Brian Paul /* These attributes don't alias with the conventional attributes. 4078856cece54df5183853aaebc1af8c60436d699c0Brian Paul * The GL_NV_vertex_program extension defines 16 extra sets of vertex 4088856cece54df5183853aaebc1af8c60436d699c0Brian Paul * arrays which have precedent over the conventional arrays when enabled. 4098856cece54df5183853aaebc1af8c60436d699c0Brian Paul */ 410ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f Attribs[_TNL_ATTRIB_MAX]; 41123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell}; 41223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 41323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 4144c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/** 4154c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * Contains the current state of a running pipeline. 41623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 417ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct vertex_buffer 41823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell{ 419cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Constant over life of the vertex_buffer. 42023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 421ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint Size; 42223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 423cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Constant over the pipeline. 42423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 425ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint Count; /* for everything except Elts */ 42623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 427cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Pointers to current data. 42823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 429ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint *Elts; 430ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *ObjPtr; /* _TNL_BIT_POS */ 431ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *EyePtr; /* _TNL_BIT_POS */ 432ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *ClipPtr; /* _TNL_BIT_POS */ 433ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *NdcPtr; /* _TNL_BIT_POS */ 434ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLubyte ClipOrMask; /* _TNL_BIT_POS */ 435352d4dbfb24c65f327759c00c7db7d30a9482e35Keith Whitwell GLubyte ClipAndMask; /* _TNL_BIT_POS */ 436ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLubyte *ClipMask; /* _TNL_BIT_POS */ 437ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *NormalPtr; /* _TNL_BIT_NORMAL */ 438ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat *NormalLengthPtr; /* _TNL_BIT_NORMAL */ 439ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLboolean *EdgeFlag; /* _TNL_BIT_EDGEFLAG */ 440610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul GLvector4f *TexCoordPtr[MAX_TEXTURE_COORD_UNITS]; /* VERT_TEX_0..n */ 441ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *IndexPtr[2]; /* _TNL_BIT_INDEX */ 442ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *ColorPtr[2]; /* _TNL_BIT_COLOR0 */ 443ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *SecondaryColorPtr[2]; /* _TNL_BIT_COLOR1 */ 444ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *PointSizePtr; /* _TNL_BIT_POS */ 445ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *FogCoordPtr; /* _TNL_BIT_FOG */ 446ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 447ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_prim *Primitive; 448ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLuint PrimitiveCount; 449cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 450363049160da54f4aafe88f99bb2140a9bfed142bBrian Paul /* Inputs to the vertex program stage */ 451ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvector4f *AttribPtr[_TNL_ATTRIB_MAX]; /* GL_NV_vertex_program */ 45223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint LastClipped; 45458e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell /* Private data from _tnl_render_stage that has no business being 45522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * in this struct. 45623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 457ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell}; 45823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 45923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 460c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Describes an individual operation on the pipeline. 461cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 46209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_pipeline_stage 46309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{ 464cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const char *name; 465cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint check_state; /* All state referenced in check() -- 466cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * When is the pipeline_stage struct 467cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * itself invalidated? Must be 468cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * constant. 469cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 47023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 471cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Usually constant or set by the 'check' callback: 47223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 473cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint run_state; /* All state referenced in run() -- 474cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * When is the cached output of the 47522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * stage invalidated? 476cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 47722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 478cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLboolean active; /* True if runnable in current state */ 479cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint inputs; /* VERT_* inputs to the stage */ 480cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint outputs; /* VERT_* outputs of the stage */ 481cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 482cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Set in _tnl_run_pipeline(): 48323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 484cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint changed_inputs; /* Generated value -- inputs to the 485cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * stage that have changed since last 48622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * call to 'run'. 487cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 48823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 489790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 490cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Private data for the pipeline stage: 491cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 492b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul void *privatePtr; 49323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 494cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Free private data. May not be null. 495cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 496ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell void (*destroy)( struct tnl_pipeline_stage * ); 49723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 498cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Called from _tnl_validate_pipeline(). Must update all fields in 49922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * the pipeline_stage struct for the current state. 500cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 501ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell void (*check)( GLcontext *ctx, struct tnl_pipeline_stage * ); 502cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 503cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Called from _tnl_run_pipeline(). The stage.changed_inputs value 504cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * encodes all inputs to thee struct which have changed. If 505cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * non-zero, recompute all affected outputs of the stage, otherwise 50622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * execute any 'sideeffects' of the stage. 507cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 508cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Return value: GL_TRUE - keep going 509cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * GL_FALSE - finished pipeline 510cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 511ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLboolean (*run)( GLcontext *ctx, struct tnl_pipeline_stage * ); 51223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell}; 51323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 514c8f2f456f94232671511745e1b236339af6b44ceBrian Paul/** Contains the array of all pipeline stages. 515c8f2f456f94232671511745e1b236339af6b44ceBrian Paul * The default values are defined at the end of t_pipeline.c */ 516ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstruct tnl_pipeline { 517c8f2f456f94232671511745e1b236339af6b44ceBrian Paul GLuint build_state_trigger; /**< state changes which require build */ 518c8f2f456f94232671511745e1b236339af6b44ceBrian Paul GLuint build_state_changes; /**< state changes since last build */ 519c8f2f456f94232671511745e1b236339af6b44ceBrian Paul GLuint run_state_changes; /**< state changes since last run */ 520c8f2f456f94232671511745e1b236339af6b44ceBrian Paul GLuint run_input_changes; /**< VERT_* changes since last run */ 521c8f2f456f94232671511745e1b236339af6b44ceBrian Paul GLuint inputs; /**< VERT_* inputs to pipeline */ 522c8f2f456f94232671511745e1b236339af6b44ceBrian Paul /** This array has to end with a NULL-pointer. */ 523ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage stages[MAX_PIPELINE_STAGES+1]; 524cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint nr_stages; 52523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell}; 52623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 527588225770c60834dfd2a95850435cc549167dc05Keith Whitwellstruct tnl_clipspace_attr; 528588225770c60834dfd2a95850435cc549167dc05Keith Whitwell 529588225770c60834dfd2a95850435cc549167dc05Keith Whitwelltypedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out, 530588225770c60834dfd2a95850435cc549167dc05Keith Whitwell const GLubyte *v ); 531588225770c60834dfd2a95850435cc549167dc05Keith Whitwell 532588225770c60834dfd2a95850435cc549167dc05Keith Whitwelltypedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v, 533588225770c60834dfd2a95850435cc549167dc05Keith Whitwell const GLfloat *in ); 534588225770c60834dfd2a95850435cc549167dc05Keith Whitwell 53523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 536fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/** 537fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Describes how to convert/move a vertex attribute from a vertex array 538fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * to a vertex structure. 539fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */ 54009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace_attr 54109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{ 542fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul GLuint attrib; /* which vertex attrib (0=position, etc) */ 543fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul GLuint vertoffset; /* position of the attrib in the vertex struct */ 544fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul GLuint vertattrsize; /* size of the attribute in bytes */ 545588225770c60834dfd2a95850435cc549167dc05Keith Whitwell GLubyte *inputptr; 546fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul GLuint inputstride; 547588225770c60834dfd2a95850435cc549167dc05Keith Whitwell insert_func *insert; 548588225770c60834dfd2a95850435cc549167dc05Keith Whitwell insert_func emit; 549588225770c60834dfd2a95850435cc549167dc05Keith Whitwell extract_func extract; 550fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul const GLfloat *vp; /* NDC->Viewport mapping matrix */ 551790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell}; 552790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 553ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 554709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 555709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last ); 556709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2 ); 557709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*triangle_func)( GLcontext *ctx, 558709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell GLuint v1, GLuint v2, GLuint v3 ); 559709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*quad_func)( GLcontext *ctx, GLuint v1, GLuint v2, 560709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell GLuint v3, GLuint v4 ); 561709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*render_func)( GLcontext *ctx, GLuint start, GLuint count, 562709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell GLuint flags ); 563709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*interp_func)( GLcontext *ctx, 56421f80baa35dca54394f100d2655d28eec10cca0aBrian Paul GLfloat t, GLuint dst, GLuint out, GLuint in, 565709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell GLboolean force_boundary ); 566709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwelltypedef void (*copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src ); 5671182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwelltypedef void (*setup_func)( GLcontext *ctx, 5681182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell GLuint start, GLuint end, 5691182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell GLuint new_inputs); 570709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 571709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 572fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul/** 573fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * Used to describe conversion of vertex arrays to vertex structures. 574fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul * I.e. Structure of arrays to arrays of structs. 575fde4c53a7d460a7fed929ef457172f3b245d875dBrian Paul */ 57609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_clipspace 57709da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{ 578790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell GLboolean need_extras; 579790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 580790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell GLuint new_inputs; 581790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 582790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell GLubyte *vertex_buf; 583790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell GLuint vertex_size; 584790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell GLuint max_vertex_size; 585790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 586790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX]; 587790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell GLuint attr_count; 588790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 589790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell void (*emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest ); 590790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell interp_func interp; 591790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell copy_pv_func copy_pv; 592790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell}; 593790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 594790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 59509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paulstruct tnl_device_driver 59609da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{ 597709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell /*** 598709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell *** TNL Pipeline 599709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ***/ 600709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 6017954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell void (*RunPipeline)(GLcontext *ctx); 6027954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell /* Replaces PipelineStart/PipelineFinish -- intended to allow 6037954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell * drivers to wrap _tnl_run_pipeline() with code to validate state 6047954a0cafdce545cde193e8ec317afa85be2b736Keith Whitwell * and grab/release hardware locks. 605709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell */ 606709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 6070cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell void (*NotifyMaterialChange)(GLcontext *ctx); 608306d3fcdbad523428501833405e47e9897896defKeith Whitwell /* Alert tnl-aware drivers of changes to material. 609306d3fcdbad523428501833405e47e9897896defKeith Whitwell */ 610306d3fcdbad523428501833405e47e9897896defKeith Whitwell 611306d3fcdbad523428501833405e47e9897896defKeith Whitwell GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p); 612306d3fcdbad523428501833405e47e9897896defKeith Whitwell /* Allow drivers to hook in optimized begin/end engines. 613306d3fcdbad523428501833405e47e9897896defKeith Whitwell * Return value: GL_TRUE - driver handled the begin 614306d3fcdbad523428501833405e47e9897896defKeith Whitwell * GL_FALSE - driver didn't handle the begin 6150cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell */ 6160cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell 617709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell /*** 6181182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell *** Rendering -- These functions called only from t_vb_render.c 619709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ***/ 62009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul struct 62109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul { 6221182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell void (*Start)(GLcontext *ctx); 6231182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell void (*Finish)(GLcontext *ctx); 6241182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* Called before and after all rendering operations, including DrawPixels, 6251182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands. 6261182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * These are a suitable place for grabbing/releasing hardware locks. 6271182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6281182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6291182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell void (*PrimitiveNotify)(GLcontext *ctx, GLenum mode); 6301182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* Called between RenderStart() and RenderFinish() to indicate the 6311182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * type of primitive we're about to draw. Mode will be one of the 6321182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * modes accepted by glBegin(). 6331182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6341182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6351182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell interp_func Interp; 6361182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* The interp function is called by the clipping routines when we need 6371182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * to generate an interpolated vertex. All pertinant vertex ancilliary 6381182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * data should be computed by interpolating between the 'in' and 'out' 6391182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * vertices. 6401182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6411182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6421182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell copy_pv_func CopyPV; 6431182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* The copy function is used to make a copy of a vertex. All pertinant 6441182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * vertex attributes should be copied. 6451182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6461182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6471182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell void (*ClippedPolygon)( GLcontext *ctx, const GLuint *elts, GLuint n ); 6481182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* Render a polygon with <n> vertices whose indexes are in the <elts> 6491182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * array. 6501182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6511182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6521182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 ); 6531182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* Render a line between the two vertices given by indexes v0 and v1. */ 6541182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6551182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell points_func Points; /* must now respect vb->elts */ 6561182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell line_func Line; 6571182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell triangle_func Triangle; 6581182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell quad_func Quad; 6591182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* These functions are called in order to render points, lines, 6601182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * triangles and quads. These are only called via the T&L module. 6611182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6621182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6631182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell render_func *PrimTabVerts; 6641182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell render_func *PrimTabElts; 6651182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* Render whole unclipped primitives (points, lines, linestrips, 6661182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * lineloops, etc). The tables are indexed by the GL enum of the 6671182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * primitive to be rendered. RenderTabVerts is used for non-indexed 6681182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * arrays of vertices. RenderTabElts is used for indexed arrays of 6691182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * vertices. 6701182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6711182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6721182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell void (*ResetLineStipple)( GLcontext *ctx ); 6731182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* Reset the hardware's line stipple counter. 6741182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6751182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6761182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell setup_func BuildVertices; 6771182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* This function is called whenever new vertices are required for 6781182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * rendering. The vertices in question are those n such that start 6791182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * <= n < end. The new_inputs parameter indicates those fields of 6801182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * the vertex which need to be updated, if only a partial repair of 6811182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * the vertex is required. 6821182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * 6831182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * This function is called only from _tnl_render_stage in tnl/t_render.c. 6841182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6851182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6861182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 6871182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell GLboolean (*Multipass)( GLcontext *ctx, GLuint passno ); 6881182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell /* Driver may request additional render passes by returning GL_TRUE 6891182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * when this function is called. This function will be called 6901182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * after the first pass, and passes will be made until the function 6911182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * returns GL_FALSE. If no function is registered, only one pass 6921182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * is made. 6931182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * 6941182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell * This function will be first invoked with passno == 1. 6951182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell */ 6961182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell } Render; 697709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell}; 6981182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell 699709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 70009da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul/** 70109da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul * Context state for T&L context. 70209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul */ 70309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paultypedef struct 70409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul{ 705709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell /* Driver interface. 706709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell */ 707709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell struct tnl_device_driver Driver; 708709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 709ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell /* Execute: 71023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 711ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_vtx vtx; 712ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell 713ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell /* Compile: 71423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 715ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_save save; 71623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 717cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Pipeline 71823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell */ 719ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline pipeline; 720cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer vb; 72123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 722cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* GLvectors for binding to vb: 723cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 724ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_vertex_arrays vtx_inputs; 725ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_vertex_arrays save_inputs; 726ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_vertex_arrays current; 727ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_vertex_arrays array_inputs; 728ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 729790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell /* Clipspace/ndc/window vertex managment: 730790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell */ 731790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell struct tnl_clipspace clipspace; 732790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 733321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell /* Probably need a better configuration mechanism: 734321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell */ 73530f51ae067379c2b3573c06b707d25a9704df7beBrian Paul GLboolean NeedNdcCoords; 73651b36396ae45f9ee9cec8d612787d038641dc6c8Keith Whitwell GLboolean LoopbackDListCassettes; 73747a28c0b4d4ca27592e3cbb8e4b17d1cd8f7997dKeith Whitwell GLboolean CalcDListNormalLengths; 7380cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell GLboolean IsolateMaterials; 73909da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean AllowVertexFog; 7408d407300c2b94f32c955b6dd75c2e18d6d58caa5Brian Paul GLboolean AllowPixelFog; 741c8100a02d28c8a424f69723778abebd950914bc6Keith Whitwell GLboolean AllowCodegen; 742321f67c4729adeebd7aa9ef9e22c95e709952851Keith Whitwell 74309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean _DoVertexFog; /* eval fog function at each vertex? */ 744790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell 74509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLuint render_inputs; 746ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 747ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLvertexformat exec_vtxfmt; 748306d3fcdbad523428501833405e47e9897896defKeith Whitwell GLvertexformat save_vtxfmt; 749ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 75023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell} TNLcontext; 75123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 75223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 75323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 75423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#define TNL_CONTEXT(ctx) ((TNLcontext *)(ctx->swtnl_context)) 75523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 75623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 757cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define TYPE_IDX(t) ((t) & 0xf) 758cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1 /* 0xa + 1 */ 75923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 760cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellextern void _tnl_MakeCurrent( GLcontext *ctx, 761cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLframebuffer *drawBuffer, 762cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLframebuffer *readBuffer ); 76323caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 76423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 76523caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 766cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 76723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#endif 768