home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / MesaDLL / api_arrayelt.cpp < prev    next >
C/C++ Source or Header  |  2002-10-29  |  9KB  |  366 lines

  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.  
  40. typedef void (*texarray_func)( GLenum, const void * );
  41.  
  42. typedef struct {
  43.    GLint unit;
  44.    struct gl_client_array *array;
  45.    texarray_func func;
  46. } AEtexarray;
  47.  
  48. typedef void (*array_func)( const void * );
  49.  
  50. typedef struct {
  51.    struct gl_client_array *array;
  52.    array_func func;
  53. } AEarray;
  54.  
  55. typedef 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.  
  64. static 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.  
  84. static 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.  
  114. static 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.  
  152. static 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.  
  164. static 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 */
  177. static void SecondaryColor3bvEXT(const GLbyte *c)
  178. {
  179.    _glapi_Dispatch->SecondaryColor3bvEXT(c);
  180. }
  181.  
  182. static void SecondaryColor3ubvEXT(const GLubyte *c)
  183. {
  184.    _glapi_Dispatch->SecondaryColor3ubvEXT(c);
  185. }
  186.  
  187. static void SecondaryColor3svEXT(const GLshort *c)
  188. {
  189.    _glapi_Dispatch->SecondaryColor3svEXT(c);
  190. }
  191.  
  192. static void SecondaryColor3usvEXT(const GLushort *c)
  193. {
  194.    _glapi_Dispatch->SecondaryColor3usvEXT(c);
  195. }
  196.  
  197. static void SecondaryColor3ivEXT(const GLint *c)
  198. {
  199.    _glapi_Dispatch->SecondaryColor3ivEXT(c);
  200. }
  201.  
  202. static void SecondaryColor3uivEXT(const GLuint *c)
  203. {
  204.    _glapi_Dispatch->SecondaryColor3uivEXT(c);
  205. }
  206.  
  207. static void SecondaryColor3fvEXT(const GLfloat *c)
  208. {
  209.    _glapi_Dispatch->SecondaryColor3fvEXT(c);
  210. }
  211.  
  212. static void SecondaryColor3dvEXT(const GLdouble *c)
  213. {
  214.    _glapi_Dispatch->SecondaryColor3dvEXT(c);
  215. }
  216.  
  217. static 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 */
  230. static void FogCoordfvEXT(const GLfloat *f)
  231. {
  232.    _glapi_Dispatch->FogCoordfvEXT(f);
  233. }
  234.  
  235. static void FogCoorddvEXT(const GLdouble *f)
  236. {
  237.    _glapi_Dispatch->FogCoorddvEXT(f);
  238. }
  239.  
  240. static 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.  
  253. GLboolean _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.  
  264. void _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.  
  273. static 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.  
  339. void _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.  
  362. void _ae_invalidate_state( GLcontext *ctx, GLuint new_state )
  363. {
  364.    AE_CONTEXT(ctx)->NewState |= new_state;
  365. }
  366.