vtxfmt.c revision 3b7ac45162412a79c3cd4d4dbc16bd54db597608
1/* 2 * Mesa 3-D graphics library 3 * Version: 6.3 4 * 5 * Copyright (C) 1999-2004 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 * Gareth Hughes 27 */ 28 29#include "glheader.h" 30#include "api_arrayelt.h" 31#include "context.h" 32#include "imports.h" 33#include "mtypes.h" 34#include "vtxfmt.h" 35#include "eval.h" 36#include "dlist.h" 37 38 39#if FEATURE_beginend 40 41 42/* The neutral vertex format. This wraps all tnl module functions, 43 * verifying that the currently-installed module is valid and then 44 * installing the function pointers in a lazy fashion. It records the 45 * function pointers that have been swapped out, which allows a fast 46 * restoration of the neutral module in almost all cases -- a typical 47 * app might only require 4-6 functions to be modified from the neutral 48 * baseline, and only restoring these is certainly preferable to doing 49 * the entire module's 60 or so function pointers. 50 */ 51 52#define PRE_LOOPBACK( FUNC ) \ 53{ \ 54 GET_CURRENT_CONTEXT(ctx); \ 55 struct gl_tnl_module * const tnl = &(ctx->TnlModule); \ 56 const int tmp_offset = _gloffset_ ## FUNC ; \ 57 \ 58 ASSERT( tnl->Current ); \ 59 ASSERT( tnl->SwapCount < NUM_VERTEX_FORMAT_ENTRIES ); \ 60 ASSERT( tmp_offset >= 0 ); \ 61 \ 62 if (tnl->SwapCount == 0) \ 63 ctx->Driver.BeginVertices( ctx ); \ 64 \ 65 /* Save the swapped function's dispatch entry so it can be */ \ 66 /* restored later. */ \ 67 tnl->Swapped[tnl->SwapCount].location = & (((_glapi_proc *)ctx->Exec)[tmp_offset]); \ 68 tnl->Swapped[tnl->SwapCount].function = (_glapi_proc)TAG(FUNC); \ 69 tnl->SwapCount++; \ 70 \ 71 if ( 0 ) \ 72 _mesa_debug(ctx, " swapping gl" #FUNC"...\n" ); \ 73 \ 74 /* Install the tnl function pointer. */ \ 75 SET_ ## FUNC(ctx->Exec, tnl->Current->FUNC); \ 76} 77 78#define TAG(x) neutral_##x 79#include "vtxfmt_tmp.h" 80 81 82/** 83 * Use the per-vertex functions found in <vfmt> to initialze the given 84 * API dispatch table. 85 */ 86static void 87install_vtxfmt( struct _glapi_table *tab, const GLvertexformat *vfmt ) 88{ 89 _mesa_install_arrayelt_vtxfmt(tab, vfmt); 90 91 SET_Color3f(tab, vfmt->Color3f); 92 SET_Color3fv(tab, vfmt->Color3fv); 93 SET_Color4f(tab, vfmt->Color4f); 94 SET_Color4fv(tab, vfmt->Color4fv); 95 SET_EdgeFlag(tab, vfmt->EdgeFlag); 96 97 _mesa_install_eval_vtxfmt(tab, vfmt); 98 99 SET_FogCoordfEXT(tab, vfmt->FogCoordfEXT); 100 SET_FogCoordfvEXT(tab, vfmt->FogCoordfvEXT); 101 SET_Indexf(tab, vfmt->Indexf); 102 SET_Indexfv(tab, vfmt->Indexfv); 103 SET_Materialfv(tab, vfmt->Materialfv); 104 SET_MultiTexCoord1fARB(tab, vfmt->MultiTexCoord1fARB); 105 SET_MultiTexCoord1fvARB(tab, vfmt->MultiTexCoord1fvARB); 106 SET_MultiTexCoord2fARB(tab, vfmt->MultiTexCoord2fARB); 107 SET_MultiTexCoord2fvARB(tab, vfmt->MultiTexCoord2fvARB); 108 SET_MultiTexCoord3fARB(tab, vfmt->MultiTexCoord3fARB); 109 SET_MultiTexCoord3fvARB(tab, vfmt->MultiTexCoord3fvARB); 110 SET_MultiTexCoord4fARB(tab, vfmt->MultiTexCoord4fARB); 111 SET_MultiTexCoord4fvARB(tab, vfmt->MultiTexCoord4fvARB); 112 SET_Normal3f(tab, vfmt->Normal3f); 113 SET_Normal3fv(tab, vfmt->Normal3fv); 114 SET_SecondaryColor3fEXT(tab, vfmt->SecondaryColor3fEXT); 115 SET_SecondaryColor3fvEXT(tab, vfmt->SecondaryColor3fvEXT); 116 SET_TexCoord1f(tab, vfmt->TexCoord1f); 117 SET_TexCoord1fv(tab, vfmt->TexCoord1fv); 118 SET_TexCoord2f(tab, vfmt->TexCoord2f); 119 SET_TexCoord2fv(tab, vfmt->TexCoord2fv); 120 SET_TexCoord3f(tab, vfmt->TexCoord3f); 121 SET_TexCoord3fv(tab, vfmt->TexCoord3fv); 122 SET_TexCoord4f(tab, vfmt->TexCoord4f); 123 SET_TexCoord4fv(tab, vfmt->TexCoord4fv); 124 SET_Vertex2f(tab, vfmt->Vertex2f); 125 SET_Vertex2fv(tab, vfmt->Vertex2fv); 126 SET_Vertex3f(tab, vfmt->Vertex3f); 127 SET_Vertex3fv(tab, vfmt->Vertex3fv); 128 SET_Vertex4f(tab, vfmt->Vertex4f); 129 SET_Vertex4fv(tab, vfmt->Vertex4fv); 130 131 _mesa_install_dlist_vtxfmt(tab, vfmt); 132 133 SET_Begin(tab, vfmt->Begin); 134 SET_End(tab, vfmt->End); 135 SET_Rectf(tab, vfmt->Rectf); 136 SET_DrawArrays(tab, vfmt->DrawArrays); 137 SET_DrawElements(tab, vfmt->DrawElements); 138 SET_DrawRangeElements(tab, vfmt->DrawRangeElements); 139 SET_MultiDrawElementsEXT(tab, vfmt->MultiDrawElementsEXT); 140 SET_DrawElementsBaseVertex(tab, vfmt->DrawElementsBaseVertex); 141 SET_DrawRangeElementsBaseVertex(tab, vfmt->DrawRangeElementsBaseVertex); 142 SET_MultiDrawElementsBaseVertex(tab, vfmt->MultiDrawElementsBaseVertex); 143 SET_DrawArraysInstanced(tab, vfmt->DrawArraysInstanced); 144 SET_DrawElementsInstanced(tab, vfmt->DrawElementsInstanced); 145 146 /* GL_NV_vertex_program */ 147 SET_VertexAttrib1fNV(tab, vfmt->VertexAttrib1fNV); 148 SET_VertexAttrib1fvNV(tab, vfmt->VertexAttrib1fvNV); 149 SET_VertexAttrib2fNV(tab, vfmt->VertexAttrib2fNV); 150 SET_VertexAttrib2fvNV(tab, vfmt->VertexAttrib2fvNV); 151 SET_VertexAttrib3fNV(tab, vfmt->VertexAttrib3fNV); 152 SET_VertexAttrib3fvNV(tab, vfmt->VertexAttrib3fvNV); 153 SET_VertexAttrib4fNV(tab, vfmt->VertexAttrib4fNV); 154 SET_VertexAttrib4fvNV(tab, vfmt->VertexAttrib4fvNV); 155#if FEATURE_ARB_vertex_program 156 SET_VertexAttrib1fARB(tab, vfmt->VertexAttrib1fARB); 157 SET_VertexAttrib1fvARB(tab, vfmt->VertexAttrib1fvARB); 158 SET_VertexAttrib2fARB(tab, vfmt->VertexAttrib2fARB); 159 SET_VertexAttrib2fvARB(tab, vfmt->VertexAttrib2fvARB); 160 SET_VertexAttrib3fARB(tab, vfmt->VertexAttrib3fARB); 161 SET_VertexAttrib3fvARB(tab, vfmt->VertexAttrib3fvARB); 162 SET_VertexAttrib4fARB(tab, vfmt->VertexAttrib4fARB); 163 SET_VertexAttrib4fvARB(tab, vfmt->VertexAttrib4fvARB); 164#endif 165} 166 167 168void _mesa_init_exec_vtxfmt( GLcontext *ctx ) 169{ 170 install_vtxfmt( ctx->Exec, &neutral_vtxfmt ); 171 ctx->TnlModule.SwapCount = 0; 172} 173 174 175void _mesa_install_exec_vtxfmt( GLcontext *ctx, const GLvertexformat *vfmt ) 176{ 177 ctx->TnlModule.Current = vfmt; 178 _mesa_restore_exec_vtxfmt( ctx ); 179} 180 181 182void _mesa_install_save_vtxfmt( GLcontext *ctx, const GLvertexformat *vfmt ) 183{ 184 install_vtxfmt( ctx->Save, vfmt ); 185} 186 187 188void _mesa_restore_exec_vtxfmt( GLcontext *ctx ) 189{ 190 struct gl_tnl_module *tnl = &(ctx->TnlModule); 191 GLuint i; 192 193 /* Restore the neutral tnl module wrapper. 194 */ 195 for ( i = 0 ; i < tnl->SwapCount ; i++ ) { 196 *(tnl->Swapped[i].location) = tnl->Swapped[i].function; 197 } 198 199 tnl->SwapCount = 0; 200} 201 202 203#endif /* FEATURE_beginend */ 204