t_context.c revision 3464ebd5
1/* 2 * Mesa 3-D graphics library 3 * Version: 7.2 4 * 5 * Copyright (C) 1999-2008 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 "main/glheader.h" 30#include "main/imports.h" 31#include "main/context.h" 32#include "main/macros.h" 33#include "main/mtypes.h" 34#include "main/light.h" 35#include "math/m_translate.h" 36#include "math/m_xform.h" 37#include "main/state.h" 38 39#include "tnl.h" 40#include "t_context.h" 41#include "t_pipeline.h" 42 43#include "vbo/vbo.h" 44 45GLboolean 46_tnl_CreateContext( struct gl_context *ctx ) 47{ 48 TNLcontext *tnl; 49 50 /* Create the TNLcontext structure 51 */ 52 ctx->swtnl_context = tnl = (TNLcontext *) CALLOC( sizeof(TNLcontext) ); 53 54 if (!tnl) { 55 return GL_FALSE; 56 } 57 58 /* Initialize the VB. 59 */ 60 tnl->vb.Size = ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES; 61 62 63 /* Initialize tnl state. 64 */ 65 if (ctx->VertexProgram._MaintainTnlProgram) { 66 _tnl_install_pipeline( ctx, _tnl_vp_pipeline ); 67 } else { 68 _tnl_install_pipeline( ctx, _tnl_default_pipeline ); 69 } 70 71 tnl->NeedNdcCoords = GL_TRUE; 72 tnl->AllowVertexFog = GL_TRUE; 73 tnl->AllowPixelFog = GL_TRUE; 74 75 /* Set a few default values in the driver struct. 76 */ 77 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; 78 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; 79 tnl->Driver.NotifyMaterialChange = _mesa_validate_all_lighting_tables; 80 81 tnl->nr_blocks = 0; 82 83 /* plug in the VBO drawing function */ 84 vbo_set_draw_func(ctx, _tnl_vbo_draw_prims); 85 86 _math_init_transformation(); 87 _math_init_translate(); 88 89 return GL_TRUE; 90} 91 92 93void 94_tnl_DestroyContext( struct gl_context *ctx ) 95{ 96 TNLcontext *tnl = TNL_CONTEXT(ctx); 97 98 _tnl_destroy_pipeline( ctx ); 99 100 FREE(tnl); 101 ctx->swtnl_context = NULL; 102} 103 104 105void 106_tnl_InvalidateState( struct gl_context *ctx, GLuint new_state ) 107{ 108 TNLcontext *tnl = TNL_CONTEXT(ctx); 109 const struct gl_vertex_program *vp = ctx->VertexProgram._Current; 110 const struct gl_fragment_program *fp = ctx->FragmentProgram._Current; 111 GLuint i; 112 113 if (new_state & (_NEW_HINT | _NEW_PROGRAM)) { 114 ASSERT(tnl->AllowVertexFog || tnl->AllowPixelFog); 115 tnl->_DoVertexFog = ((tnl->AllowVertexFog && (ctx->Hint.Fog != GL_NICEST)) 116 || !tnl->AllowPixelFog) && !fp; 117 } 118 119 tnl->pipeline.new_state |= new_state; 120 121 /* Calculate tnl->render_inputs. This bitmask indicates which vertex 122 * attributes need to be emitted to the rasterizer. 123 */ 124 RENDERINPUTS_ZERO( tnl->render_inputs_bitset ); 125 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_POS ); 126 127 if (!fp || (fp->Base.InputsRead & FRAG_BIT_COL0)) { 128 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR0 ); 129 } 130 131 if (_mesa_need_secondary_color(ctx)) 132 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR1 ); 133 134 for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) { 135 if (ctx->Texture._EnabledCoordUnits & (1 << i) || 136 (fp && fp->Base.InputsRead & FRAG_BIT_TEX(i))) { 137 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) ); 138 } 139 } 140 141 if (ctx->Fog.Enabled 142 || (fp != NULL && (fp->Base.InputsRead & FRAG_BIT_FOGC) != 0)) { 143 /* Either fixed-function fog or a fragment program needs fog coord. 144 */ 145 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_FOG ); 146 } 147 148 if (ctx->Polygon.FrontMode != GL_FILL || 149 ctx->Polygon.BackMode != GL_FILL) 150 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_EDGEFLAG ); 151 152 if (ctx->RenderMode == GL_FEEDBACK) 153 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_TEX0 ); 154 155 if (ctx->Point._Attenuated || 156 (ctx->VertexProgram._Enabled && ctx->VertexProgram.PointSizeEnabled)) 157 RENDERINPUTS_SET( tnl->render_inputs_bitset, _TNL_ATTRIB_POINTSIZE ); 158 159 /* check for varying vars which are written by the vertex program */ 160 if (vp) { 161 GLuint i; 162 for (i = 0; i < MAX_VARYING; i++) { 163 if (vp->Base.OutputsWritten & BITFIELD64_BIT(VERT_RESULT_VAR0 + i)) { 164 RENDERINPUTS_SET(tnl->render_inputs_bitset, 165 _TNL_ATTRIB_GENERIC(i)); 166 } 167 } 168 } 169} 170 171 172void 173_tnl_wakeup( struct gl_context *ctx ) 174{ 175 /* Assume we haven't been getting state updates either: 176 */ 177 _tnl_InvalidateState( ctx, ~0 ); 178 179#if 0 180 if (ctx->Light.ColorMaterialEnabled) { 181 _mesa_update_color_material( ctx, 182 ctx->Current.Attrib[VERT_ATTRIB_COLOR0] ); 183 } 184#endif 185} 186 187 188 189 190/** 191 * Drivers call this function to tell the TCL module whether or not 192 * it wants Normalized Device Coords (NDC) computed. I.e. whether 193 * we should "Divide-by-W". Software renders will want that. 194 */ 195void 196_tnl_need_projected_coords( struct gl_context *ctx, GLboolean mode ) 197{ 198 TNLcontext *tnl = TNL_CONTEXT(ctx); 199 tnl->NeedNdcCoords = mode; 200} 201 202void 203_tnl_allow_vertex_fog( struct gl_context *ctx, GLboolean value ) 204{ 205 TNLcontext *tnl = TNL_CONTEXT(ctx); 206 tnl->AllowVertexFog = value; 207 tnl->_DoVertexFog = ((tnl->AllowVertexFog && (ctx->Hint.Fog != GL_NICEST)) 208 || !tnl->AllowPixelFog) && !ctx->FragmentProgram._Current; 209 210} 211 212void 213_tnl_allow_pixel_fog( struct gl_context *ctx, GLboolean value ) 214{ 215 TNLcontext *tnl = TNL_CONTEXT(ctx); 216 tnl->AllowPixelFog = value; 217 tnl->_DoVertexFog = ((tnl->AllowVertexFog && (ctx->Hint.Fog != GL_NICEST)) 218 || !tnl->AllowPixelFog) && !ctx->FragmentProgram._Current; 219} 220 221