t_context.c revision 7117f1b4
1/* 2 * Mesa 3-D graphics library 3 * Version: 6.5.2 4 * 5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 * 24 * Authors: 25 * Keith Whitwell <keith@tungstengraphics.com> 26 */ 27 28 29#include "glheader.h" 30#include "imports.h" 31#include "context.h" 32#include "macros.h" 33#include "mtypes.h" 34#include "light.h" 35 36#include "tnl.h" 37#include "t_context.h" 38#include "t_pipeline.h" 39#include "t_vp_build.h" 40 41#include "vbo/vbo.h" 42 43GLboolean 44_tnl_CreateContext( GLcontext *ctx ) 45{ 46 TNLcontext *tnl; 47 48 /* Create the TNLcontext structure 49 */ 50 ctx->swtnl_context = tnl = (TNLcontext *) CALLOC( sizeof(TNLcontext) ); 51 52 if (!tnl) { 53 return GL_FALSE; 54 } 55 56 /* Initialize the VB. 57 */ 58 tnl->vb.Size = ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES; 59 60 61 /* Initialize tnl state. 62 */ 63 if (ctx->VertexProgram._MaintainTnlProgram) { 64 _tnl_ProgramCacheInit( ctx ); 65 _tnl_install_pipeline( ctx, _tnl_vp_pipeline ); 66 } else { 67 _tnl_install_pipeline( ctx, _tnl_default_pipeline ); 68 } 69 70 tnl->NeedNdcCoords = GL_TRUE; 71 tnl->AllowVertexFog = GL_TRUE; 72 tnl->AllowPixelFog = GL_TRUE; 73 74 /* Set a few default values in the driver struct. 75 */ 76 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; 77 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; 78 tnl->Driver.NotifyMaterialChange = _mesa_validate_all_lighting_tables; 79 80 tnl->nr_blocks = 0; 81 82 return GL_TRUE; 83} 84 85 86void 87_tnl_DestroyContext( GLcontext *ctx ) 88{ 89 TNLcontext *tnl = TNL_CONTEXT(ctx); 90 91 _tnl_destroy_pipeline( ctx ); 92 93 if (ctx->VertexProgram._MaintainTnlProgram) 94 _tnl_ProgramCacheDestroy( ctx ); 95 96 FREE(tnl); 97 ctx->swtnl_context = NULL; 98} 99 100 101void 102_tnl_InvalidateState( GLcontext *ctx, GLuint new_state ) 103{ 104 TNLcontext *tnl = TNL_CONTEXT(ctx); 105 const struct gl_vertex_program *vp = ctx->VertexProgram._Current; 106 const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 107 108 if (new_state & (_NEW_HINT)) { 109 ASSERT(tnl->AllowVertexFog || tnl->AllowPixelFog); 110 tnl->_DoVertexFog = (tnl->AllowVertexFog && (ctx->Hint.Fog != GL_NICEST)) 111 || !tnl->AllowPixelFog; 112 } 113 114 tnl->pipeline.new_state |= new_state; 115 116 /* Calculate tnl->render_inputs: 117 */ 118 if (ctx->Visual.rgbMode) { 119 GLuint i; 120 121 RENDERINPUTS_ZERO( tnl->render_inputs_bitset ); 122 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_POS ); 123 if (!fp || (fp->Base.InputsRead & FRAG_BIT_COL0)) { 124 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR0 ); 125 } 126 for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) { 127 if (ctx->Texture._EnabledCoordUnits & (1 << i)) { 128 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) ); 129 } 130 } 131 132 if (NEED_SECONDARY_COLOR(ctx)) 133 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR1 ); 134 } 135 else { 136 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_POS ); 137 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR_INDEX ); 138 } 139 140 if (ctx->Fog.Enabled || 141 ((ctx->FragmentProgram._Active || ctx->FragmentProgram._Current) && 142 (ctx->FragmentProgram._Current->FogOption != GL_NONE || 143 (ctx->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_FOGC)))) 144 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_FOG ); 145 146 if (ctx->Polygon.FrontMode != GL_FILL || 147 ctx->Polygon.BackMode != GL_FILL) 148 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_EDGEFLAG ); 149 150 if (ctx->RenderMode == GL_FEEDBACK) 151 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_TEX0 ); 152 153 if (ctx->Point._Attenuated || 154 (ctx->VertexProgram._Enabled && ctx->VertexProgram.PointSizeEnabled)) 155 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_POINTSIZE ); 156 157 /* check for varying vars which are written by the vertex program */ 158 if (vp) { 159 GLuint i; 160 for (i = 0; i < MAX_VARYING; i++) { 161 if (vp->Base.OutputsWritten & (1 << (VERT_RESULT_VAR0 + i))) { 162 RENDERINPUTS_SET(tnl->render_inputs_bitset, 163 _TNL_ATTRIB_GENERIC(i)); 164 } 165 } 166 } 167} 168 169 170void 171_tnl_wakeup( GLcontext *ctx ) 172{ 173 /* Assume we haven't been getting state updates either: 174 */ 175 _tnl_InvalidateState( ctx, ~0 ); 176 177#if 0 178 if (ctx->Light.ColorMaterialEnabled) { 179 _mesa_update_color_material( ctx, 180 ctx->Current.Attrib[VERT_ATTRIB_COLOR0] ); 181 } 182#endif 183} 184 185 186 187 188/** 189 * Drivers call this function to tell the TCL module whether or not 190 * it wants Normalized Device Coords (NDC) computed. I.e. whether 191 * we should "Divide-by-W". Software renders will want that. 192 */ 193void 194_tnl_need_projected_coords( GLcontext *ctx, GLboolean mode ) 195{ 196 TNLcontext *tnl = TNL_CONTEXT(ctx); 197 tnl->NeedNdcCoords = mode; 198} 199 200void 201_tnl_allow_vertex_fog( GLcontext *ctx, GLboolean value ) 202{ 203 TNLcontext *tnl = TNL_CONTEXT(ctx); 204 tnl->AllowVertexFog = value; 205 tnl->_DoVertexFog = (tnl->AllowVertexFog && (ctx->Hint.Fog != GL_NICEST)) 206 || !tnl->AllowPixelFog; 207 208} 209 210void 211_tnl_allow_pixel_fog( GLcontext *ctx, GLboolean value ) 212{ 213 TNLcontext *tnl = TNL_CONTEXT(ctx); 214 tnl->AllowPixelFog = value; 215 tnl->_DoVertexFog = (tnl->AllowVertexFog && (ctx->Hint.Fog != GL_NICEST)) 216 || !tnl->AllowPixelFog; 217} 218 219