api_arrayelt.c revision 05a4b37707d2c598ea68c05d07a3d65bcbf5a076
1/* $Id: api_arrayelt.c,v 1.11 2002/10/29 20:28:36 brianp Exp $ */ 2 3/* 4 * Mesa 3-D graphics library 5 * Version: 4.1 6 * 7 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be included 17 * in all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27/* Author: 28 * Keith Whitwell <keith@tungstengraphics.com> 29 */ 30 31#include "glheader.h" 32#include "api_arrayelt.h" 33#include "context.h" 34#include "glapi.h" 35#include "imports.h" 36#include "macros.h" 37#include "mtypes.h" 38 39 40typedef void (*texarray_func)( GLenum, const void * ); 41 42typedef struct { 43 GLint unit; 44 struct gl_client_array *array; 45 texarray_func func; 46} AEtexarray; 47 48typedef void (*array_func)( const void * ); 49 50typedef struct { 51 struct gl_client_array *array; 52 array_func func; 53} AEarray; 54 55typedef struct { 56 AEtexarray texarrays[MAX_TEXTURE_UNITS+1]; 57 AEarray arrays[32]; 58 GLuint NewState; 59} AEcontext; 60 61#define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context) 62#define TYPE_IDX(t) ((t) & 0xf) 63 64static void (*colorfuncs[2][8])( const void * ) = { 65 { (array_func)glColor3bv, 66 (array_func)glColor3ubv, 67 (array_func)glColor3sv, 68 (array_func)glColor3usv, 69 (array_func)glColor3iv, 70 (array_func)glColor3uiv, 71 (array_func)glColor3fv, 72 (array_func)glColor3dv }, 73 74 { (array_func)glColor4bv, 75 (array_func)glColor4ubv, 76 (array_func)glColor4sv, 77 (array_func)glColor4usv, 78 (array_func)glColor4iv, 79 (array_func)glColor4uiv, 80 (array_func)glColor4fv, 81 (array_func)glColor4dv } 82}; 83 84static void (*vertexfuncs[3][8])( const void * ) = { 85 { 0, 86 0, 87 (array_func)glVertex2sv, 88 0, 89 (array_func)glVertex2iv, 90 0, 91 (array_func)glVertex2fv, 92 (array_func)glVertex2dv }, 93 94 { 0, 95 0, 96 (array_func)glVertex3sv, 97 0, 98 (array_func)glVertex3iv, 99 0, 100 (array_func)glVertex3fv, 101 (array_func)glVertex3dv }, 102 103 { 0, 104 0, 105 (array_func)glVertex4sv, 106 0, 107 (array_func)glVertex4iv, 108 0, 109 (array_func)glVertex4fv, 110 (array_func)glVertex4dv } 111}; 112 113 114static void (*multitexfuncs[4][8])( GLenum, const void * ) = { 115 { 0, 116 0, 117 (texarray_func)glMultiTexCoord1svARB, 118 0, 119 (texarray_func)glMultiTexCoord1ivARB, 120 0, 121 (texarray_func)glMultiTexCoord1fvARB, 122 (texarray_func)glMultiTexCoord1dvARB }, 123 124 { 0, 125 0, 126 (texarray_func)glMultiTexCoord2svARB, 127 0, 128 (texarray_func)glMultiTexCoord2ivARB, 129 0, 130 (texarray_func)glMultiTexCoord2fvARB, 131 (texarray_func)glMultiTexCoord2dvARB }, 132 133 { 0, 134 0, 135 (texarray_func)glMultiTexCoord3svARB, 136 0, 137 (texarray_func)glMultiTexCoord3ivARB, 138 0, 139 (texarray_func)glMultiTexCoord3fvARB, 140 (texarray_func)glMultiTexCoord3dvARB }, 141 142 { 0, 143 0, 144 (texarray_func)glMultiTexCoord4svARB, 145 0, 146 (texarray_func)glMultiTexCoord4ivARB, 147 0, 148 (texarray_func)glMultiTexCoord4fvARB, 149 (texarray_func)glMultiTexCoord4dvARB } 150}; 151 152static void (*indexfuncs[8])( const void * ) = { 153 0, 154 (array_func)glIndexubv, 155 (array_func)glIndexsv, 156 0, 157 (array_func)glIndexiv, 158 0, 159 (array_func)glIndexfv, 160 (array_func)glIndexdv 161}; 162 163 164static void (*normalfuncs[8])( const void * ) = { 165 (array_func)glNormal3bv, 166 0, 167 (array_func)glNormal3sv, 168 0, 169 (array_func)glNormal3iv, 170 0, 171 (array_func)glNormal3fv, 172 (array_func)glNormal3dv, 173}; 174 175 176/* Wrapper functions in case glSecondaryColor*EXT doesn't exist */ 177static void SecondaryColor3bvEXT(const GLbyte *c) 178{ 179 _glapi_Dispatch->SecondaryColor3bvEXT(c); 180} 181 182static void SecondaryColor3ubvEXT(const GLubyte *c) 183{ 184 _glapi_Dispatch->SecondaryColor3ubvEXT(c); 185} 186 187static void SecondaryColor3svEXT(const GLshort *c) 188{ 189 _glapi_Dispatch->SecondaryColor3svEXT(c); 190} 191 192static void SecondaryColor3usvEXT(const GLushort *c) 193{ 194 _glapi_Dispatch->SecondaryColor3usvEXT(c); 195} 196 197static void SecondaryColor3ivEXT(const GLint *c) 198{ 199 _glapi_Dispatch->SecondaryColor3ivEXT(c); 200} 201 202static void SecondaryColor3uivEXT(const GLuint *c) 203{ 204 _glapi_Dispatch->SecondaryColor3uivEXT(c); 205} 206 207static void SecondaryColor3fvEXT(const GLfloat *c) 208{ 209 _glapi_Dispatch->SecondaryColor3fvEXT(c); 210} 211 212static void SecondaryColor3dvEXT(const GLdouble *c) 213{ 214 _glapi_Dispatch->SecondaryColor3dvEXT(c); 215} 216 217static void (*secondarycolorfuncs[8])( const void * ) = { 218 (array_func) SecondaryColor3bvEXT, 219 (array_func) SecondaryColor3ubvEXT, 220 (array_func) SecondaryColor3svEXT, 221 (array_func) SecondaryColor3usvEXT, 222 (array_func) SecondaryColor3ivEXT, 223 (array_func) SecondaryColor3uivEXT, 224 (array_func) SecondaryColor3fvEXT, 225 (array_func) SecondaryColor3dvEXT, 226}; 227 228 229/* Again, wrapper functions in case glSecondaryColor*EXT doesn't exist */ 230static void FogCoordfvEXT(const GLfloat *f) 231{ 232 _glapi_Dispatch->FogCoordfvEXT(f); 233} 234 235static void FogCoorddvEXT(const GLdouble *f) 236{ 237 _glapi_Dispatch->FogCoorddvEXT(f); 238} 239 240static void (*fogcoordfuncs[8])( const void * ) = { 241 0, 242 0, 243 0, 244 0, 245 0, 246 0, 247 (array_func) FogCoordfvEXT, 248 (array_func) FogCoorddvEXT 249}; 250 251 252 253GLboolean _ae_create_context( GLcontext *ctx ) 254{ 255 ctx->aelt_context = MALLOC( sizeof(AEcontext) ); 256 if (!ctx->aelt_context) 257 return GL_FALSE; 258 259 AE_CONTEXT(ctx)->NewState = ~0; 260 return GL_TRUE; 261} 262 263 264void _ae_destroy_context( GLcontext *ctx ) 265{ 266 if ( AE_CONTEXT( ctx ) ) { 267 FREE( ctx->aelt_context ); 268 ctx->aelt_context = 0; 269 } 270} 271 272 273static void _ae_update_state( GLcontext *ctx ) 274{ 275 AEcontext *actx = AE_CONTEXT(ctx); 276 AEtexarray *ta = actx->texarrays; 277 AEarray *aa = actx->arrays; 278 GLuint i; 279 280 for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) 281 if (ctx->Array.TexCoord[i].Enabled) { 282 ta->unit = i; 283 ta->array = &ctx->Array.TexCoord[i]; 284 ta->func = multitexfuncs[ta->array->Size-1][TYPE_IDX(ta->array->Type)]; 285 ta++; 286 } 287 288 ta->func = 0; 289 290 if (ctx->Array.Color.Enabled) { 291 aa->array = &ctx->Array.Color; 292 aa->func = colorfuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)]; 293 aa++; 294 } 295 296 if (ctx->Array.Normal.Enabled) { 297 aa->array = &ctx->Array.Normal; 298 aa->func = normalfuncs[TYPE_IDX(aa->array->Type)]; 299 aa++; 300 } 301 302 if (ctx->Array.Index.Enabled) { 303 aa->array = &ctx->Array.Index; 304 aa->func = indexfuncs[TYPE_IDX(aa->array->Type)]; 305 aa++; 306 } 307 308 if (ctx->Array.EdgeFlag.Enabled) { 309 aa->array = &ctx->Array.EdgeFlag; 310 aa->func = (array_func)glEdgeFlagv; 311 aa++; 312 } 313 314 if (ctx->Array.FogCoord.Enabled) { 315 aa->array = &ctx->Array.FogCoord; 316 aa->func = fogcoordfuncs[TYPE_IDX(aa->array->Type)]; 317 aa++; 318 } 319 320 if (ctx->Array.SecondaryColor.Enabled) { 321 aa->array = &ctx->Array.SecondaryColor; 322 aa->func = secondarycolorfuncs[TYPE_IDX(aa->array->Type)]; 323 aa++; 324 } 325 326 /* Must be last 327 */ 328 if (ctx->Array.Vertex.Enabled) { 329 aa->array = &ctx->Array.Vertex; 330 aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; 331 aa++; 332 } 333 334 aa->func = 0; 335 actx->NewState = 0; 336} 337 338 339void _ae_loopback_array_elt( GLint elt ) 340{ 341 GET_CURRENT_CONTEXT(ctx); 342 AEcontext *actx = AE_CONTEXT(ctx); 343 AEtexarray *ta; 344 AEarray *aa; 345 346 if (actx->NewState) 347 _ae_update_state( ctx ); 348 349 for (ta = actx->texarrays ; ta->func ; ta++) { 350 ta->func( ta->unit + GL_TEXTURE0_ARB, (char *)ta->array->Ptr + elt * ta->array->StrideB ); 351 } 352 353 /* Must be last 354 */ 355 for (aa = actx->arrays ; aa->func ; aa++) { 356 aa->func( (char *)aa->array->Ptr + elt * aa->array->StrideB ); 357 } 358} 359 360 361 362void _ae_invalidate_state( GLcontext *ctx, GLuint new_state ) 363{ 364 AE_CONTEXT(ctx)->NewState |= new_state; 365} 366