VirtualBox

Ignore:
Timestamp:
Jan 26, 2009 10:58:55 AM (16 years ago)
Author:
vboxsync
Message:

crOpenGL: tabs to spaces

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_attrib.c

    r15532 r16223  
    2525void crStateAttribInit (CRAttribState *a)
    2626{
    27         int i;
    28         a->attribStackDepth = 0;
    29         a->accumBufferStackDepth = 0;
    30         a->colorBufferStackDepth = 0;
    31         a->currentStackDepth = 0;
    32         a->depthBufferStackDepth = 0;
    33         a->enableStackDepth = 0;
    34         for ( i = 0 ; i < CR_MAX_ATTRIB_STACK_DEPTH ; i++)
    35         {
    36                 a->enableStack[i].clip = NULL;
    37                 a->enableStack[i].light = NULL;
    38                 a->lightingStack[i].light = NULL;
    39                 a->transformStack[i].clip = NULL;
    40                 a->transformStack[i].clipPlane = NULL;
    41         }
    42         a->evalStackDepth = 0;
    43         a->fogStackDepth = 0;
    44         a->lightingStackDepth = 0;
    45         a->lineStackDepth = 0;
    46         a->listStackDepth = 0;
    47         a->pixelModeStackDepth = 0;
    48         a->pointStackDepth = 0;
    49         a->polygonStackDepth = 0;
    50         a->polygonStippleStackDepth = 0;
    51         a->scissorStackDepth = 0;
    52         a->stencilBufferStackDepth = 0;
    53         a->textureStackDepth = 0;
    54         a->transformStackDepth = 0;
    55         a->viewportStackDepth = 0;
     27    int i;
     28    a->attribStackDepth = 0;
     29    a->accumBufferStackDepth = 0;
     30    a->colorBufferStackDepth = 0;
     31    a->currentStackDepth = 0;
     32    a->depthBufferStackDepth = 0;
     33    a->enableStackDepth = 0;
     34    for ( i = 0 ; i < CR_MAX_ATTRIB_STACK_DEPTH ; i++)
     35    {
     36        a->enableStack[i].clip = NULL;
     37        a->enableStack[i].light = NULL;
     38        a->lightingStack[i].light = NULL;
     39        a->transformStack[i].clip = NULL;
     40        a->transformStack[i].clipPlane = NULL;
     41    }
     42    a->evalStackDepth = 0;
     43    a->fogStackDepth = 0;
     44    a->lightingStackDepth = 0;
     45    a->lineStackDepth = 0;
     46    a->listStackDepth = 0;
     47    a->pixelModeStackDepth = 0;
     48    a->pointStackDepth = 0;
     49    a->polygonStackDepth = 0;
     50    a->polygonStippleStackDepth = 0;
     51    a->scissorStackDepth = 0;
     52    a->stencilBufferStackDepth = 0;
     53    a->textureStackDepth = 0;
     54    a->transformStackDepth = 0;
     55    a->viewportStackDepth = 0;
    5656}
    5757
     
    6060copy_texunit(CRTextureUnit *dest, const CRTextureUnit *src)
    6161{
    62         dest->enabled1D = src->enabled1D;
    63         dest->enabled2D = src->enabled2D;
    64         dest->enabled3D = src->enabled3D;
    65         dest->enabledCubeMap = src->enabledCubeMap;
    66         dest->envMode = src->envMode;
    67         dest->envColor = src->envColor;
    68         dest->textureGen = src->textureGen;
    69         dest->objSCoeff = src->objSCoeff;
    70         dest->objTCoeff = src->objTCoeff;
    71         dest->objRCoeff = src->objRCoeff;
    72         dest->objQCoeff = src->objQCoeff;
    73         dest->eyeSCoeff = src->eyeSCoeff;
    74         dest->eyeTCoeff = src->eyeTCoeff;
    75         dest->eyeRCoeff = src->eyeRCoeff;
    76         dest->eyeQCoeff = src->eyeQCoeff;
    77         dest->gen = src->gen;
    78         dest->currentTexture1D = src->currentTexture1D;
    79         dest->currentTexture2D = src->currentTexture2D;
    80         dest->currentTexture3D = src->currentTexture3D;
    81         dest->currentTextureCubeMap = src->currentTextureCubeMap;
     62    dest->enabled1D = src->enabled1D;
     63    dest->enabled2D = src->enabled2D;
     64    dest->enabled3D = src->enabled3D;
     65    dest->enabledCubeMap = src->enabledCubeMap;
     66    dest->envMode = src->envMode;
     67    dest->envColor = src->envColor;
     68    dest->textureGen = src->textureGen;
     69    dest->objSCoeff = src->objSCoeff;
     70    dest->objTCoeff = src->objTCoeff;
     71    dest->objRCoeff = src->objRCoeff;
     72    dest->objQCoeff = src->objQCoeff;
     73    dest->eyeSCoeff = src->eyeSCoeff;
     74    dest->eyeTCoeff = src->eyeTCoeff;
     75    dest->eyeRCoeff = src->eyeRCoeff;
     76    dest->eyeQCoeff = src->eyeQCoeff;
     77    dest->gen = src->gen;
     78    dest->currentTexture1D = src->currentTexture1D;
     79    dest->currentTexture2D = src->currentTexture2D;
     80    dest->currentTexture3D = src->currentTexture3D;
     81    dest->currentTextureCubeMap = src->currentTextureCubeMap;
    8282}
    8383
     
    8585copy_texobj(CRTextureObj *dest, const CRTextureObj *src, GLboolean copyName)
    8686{
    87         if (copyName)
    88                 dest->name = src->name;
    89         dest->borderColor = src->borderColor;
    90         dest->wrapS = src->wrapS;
    91         dest->wrapT = src->wrapT;
    92         dest->minFilter = src->minFilter;
    93         dest->magFilter = src->magFilter;
     87    if (copyName)
     88        dest->name = src->name;
     89    dest->borderColor = src->borderColor;
     90    dest->wrapS = src->wrapS;
     91    dest->wrapT = src->wrapT;
     92    dest->minFilter = src->minFilter;
     93    dest->magFilter = src->magFilter;
    9494#ifdef CR_OPENGL_VERSION_1_2
    95         dest->priority = src->priority;
    96         dest->wrapR = src->wrapR;
    97         dest->minLod = src->minLod;
    98         dest->maxLod = src->maxLod;
    99         dest->baseLevel = src->baseLevel;
    100         dest->maxLevel = src->maxLevel;
     95    dest->priority = src->priority;
     96    dest->wrapR = src->wrapR;
     97    dest->minLod = src->minLod;
     98    dest->maxLod = src->maxLod;
     99    dest->baseLevel = src->baseLevel;
     100    dest->maxLevel = src->maxLevel;
    101101#endif
    102102#ifdef CR_EXT_texture_filter_anisotropic
    103         dest->maxAnisotropy = src->maxAnisotropy;
     103    dest->maxAnisotropy = src->maxAnisotropy;
    104104#endif
    105105}
     
    107107void STATE_APIENTRY crStatePushAttrib(GLbitfield mask)
    108108{
    109         CRContext *g = GetCurrentContext();
    110         CRAttribState *a = &(g->attrib);
    111         CRStateBits *sb = GetCurrentBits();
    112         CRAttribBits *ab = &(sb->attrib);
    113         unsigned int i;
    114 
    115         if (g->current.inBeginEnd)
    116         {
    117                 crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glPushAttrib called in Begin/End");
    118                 return;
    119         }
    120 
    121         if (a->attribStackDepth == CR_MAX_ATTRIB_STACK_DEPTH - 1)
    122         {
    123                 crStateError(__LINE__, __FILE__, GL_STACK_OVERFLOW, "glPushAttrib called with a full stack!" );
    124                 return;
    125         }
    126 
    127         FLUSH();
    128 
    129         a->pushMaskStack[a->attribStackDepth++] = mask;
    130 
    131         if (mask & GL_ACCUM_BUFFER_BIT)
    132         {
    133                 a->accumBufferStack[a->accumBufferStackDepth].accumClearValue = g->buffer.accumClearValue;
    134                 a->accumBufferStackDepth++;
    135         }
    136         if (mask & GL_COLOR_BUFFER_BIT)
    137         {
    138                 a->colorBufferStack[a->colorBufferStackDepth].alphaTest = g->buffer.alphaTest;
    139                 a->colorBufferStack[a->colorBufferStackDepth].alphaTestFunc = g->buffer.alphaTestFunc;
    140                 a->colorBufferStack[a->colorBufferStackDepth].alphaTestRef = g->buffer.alphaTestRef;
    141                 a->colorBufferStack[a->colorBufferStackDepth].blend = g->buffer.blend;
    142                 a->colorBufferStack[a->colorBufferStackDepth].blendSrcRGB = g->buffer.blendSrcRGB;
    143                 a->colorBufferStack[a->colorBufferStackDepth].blendDstRGB = g->buffer.blendDstRGB;
     109    CRContext *g = GetCurrentContext();
     110    CRAttribState *a = &(g->attrib);
     111    CRStateBits *sb = GetCurrentBits();
     112    CRAttribBits *ab = &(sb->attrib);
     113    unsigned int i;
     114
     115    if (g->current.inBeginEnd)
     116    {
     117        crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glPushAttrib called in Begin/End");
     118        return;
     119    }
     120
     121    if (a->attribStackDepth == CR_MAX_ATTRIB_STACK_DEPTH - 1)
     122    {
     123        crStateError(__LINE__, __FILE__, GL_STACK_OVERFLOW, "glPushAttrib called with a full stack!" );
     124        return;
     125    }
     126
     127    FLUSH();
     128
     129    a->pushMaskStack[a->attribStackDepth++] = mask;
     130
     131    if (mask & GL_ACCUM_BUFFER_BIT)
     132    {
     133        a->accumBufferStack[a->accumBufferStackDepth].accumClearValue = g->buffer.accumClearValue;
     134        a->accumBufferStackDepth++;
     135    }
     136    if (mask & GL_COLOR_BUFFER_BIT)
     137    {
     138        a->colorBufferStack[a->colorBufferStackDepth].alphaTest = g->buffer.alphaTest;
     139        a->colorBufferStack[a->colorBufferStackDepth].alphaTestFunc = g->buffer.alphaTestFunc;
     140        a->colorBufferStack[a->colorBufferStackDepth].alphaTestRef = g->buffer.alphaTestRef;
     141        a->colorBufferStack[a->colorBufferStackDepth].blend = g->buffer.blend;
     142        a->colorBufferStack[a->colorBufferStackDepth].blendSrcRGB = g->buffer.blendSrcRGB;
     143        a->colorBufferStack[a->colorBufferStackDepth].blendDstRGB = g->buffer.blendDstRGB;
    144144#if defined(CR_EXT_blend_func_separate)
    145                 a->colorBufferStack[a->colorBufferStackDepth].blendSrcA = g->buffer.blendSrcA;
    146                 a->colorBufferStack[a->colorBufferStackDepth].blendDstA = g->buffer.blendDstA;
     145        a->colorBufferStack[a->colorBufferStackDepth].blendSrcA = g->buffer.blendSrcA;
     146        a->colorBufferStack[a->colorBufferStackDepth].blendDstA = g->buffer.blendDstA;
    147147#endif
    148148#ifdef CR_EXT_blend_color
    149                 a->colorBufferStack[a->colorBufferStackDepth].blendColor = g->buffer.blendColor;
     149        a->colorBufferStack[a->colorBufferStackDepth].blendColor = g->buffer.blendColor;
    150150#endif
    151151#if defined(CR_EXT_blend_minmax) || defined(CR_EXT_blend_subtract) || defined(CR_EXT_blend_logic_op)
    152                 a->colorBufferStack[a->colorBufferStackDepth].blendEquation = g->buffer.blendEquation;
    153 #endif
    154                 a->colorBufferStack[a->colorBufferStackDepth].dither = g->buffer.dither;
    155                 a->colorBufferStack[a->colorBufferStackDepth].drawBuffer = g->buffer.drawBuffer;
    156                 a->colorBufferStack[a->colorBufferStackDepth].logicOp = g->buffer.logicOp;
    157                 a->colorBufferStack[a->colorBufferStackDepth].indexLogicOp = g->buffer.indexLogicOp;
    158                 a->colorBufferStack[a->colorBufferStackDepth].logicOpMode = g->buffer.logicOpMode;
    159                 a->colorBufferStack[a->colorBufferStackDepth].colorClearValue = g->buffer.colorClearValue;
    160                 a->colorBufferStack[a->colorBufferStackDepth].indexClearValue = g->buffer.indexClearValue;
    161                 a->colorBufferStack[a->colorBufferStackDepth].colorWriteMask = g->buffer.colorWriteMask;
    162                 a->colorBufferStack[a->colorBufferStackDepth].indexWriteMask = g->buffer.indexWriteMask;
    163                 a->colorBufferStackDepth++;
    164         }
    165         if (mask & GL_CURRENT_BIT)
    166         {
    167                 for (i = 0 ; i < CR_MAX_VERTEX_ATTRIBS ; i++)
    168                 {
    169                         COPY_4V(a->currentStack[a->currentStackDepth].attrib[i] , g->current.vertexAttrib[i]);
    170                         COPY_4V(a->currentStack[a->currentStackDepth].rasterAttrib[i] , g->current.rasterAttrib[i]);
    171                 }
    172                 a->currentStack[a->currentStackDepth].rasterValid = g->current.rasterValid;
    173                 a->currentStack[a->currentStackDepth].edgeFlag = g->current.edgeFlag;
    174                 a->currentStack[a->currentStackDepth].colorIndex = g->current.colorIndex;
    175                 a->currentStackDepth++;
    176         }
    177         if (mask & GL_DEPTH_BUFFER_BIT)
    178         {
    179                 a->depthBufferStack[a->depthBufferStackDepth].depthTest = g->buffer.depthTest;
    180                 a->depthBufferStack[a->depthBufferStackDepth].depthFunc = g->buffer.depthFunc;
    181                 a->depthBufferStack[a->depthBufferStackDepth].depthClearValue = g->buffer.depthClearValue;
    182                 a->depthBufferStack[a->depthBufferStackDepth].depthMask = g->buffer.depthMask;
    183                 a->depthBufferStackDepth++;
    184         }
    185         if (mask & GL_ENABLE_BIT)
    186         {
    187                 if (a->enableStack[a->enableStackDepth].clip == NULL)
    188                 {
    189                         a->enableStack[a->enableStackDepth].clip = (GLboolean *) crCalloc( g->limits.maxClipPlanes * sizeof( GLboolean ));
    190                 }
    191                 if (a->enableStack[a->enableStackDepth].light == NULL)
    192                 {
    193                         a->enableStack[a->enableStackDepth].light = (GLboolean *) crCalloc( g->limits.maxLights * sizeof( GLboolean ));
    194                 }
    195                 a->enableStack[a->enableStackDepth].alphaTest = g->buffer.alphaTest;
    196                 a->enableStack[a->enableStackDepth].autoNormal = g->eval.autoNormal;
    197                 a->enableStack[a->enableStackDepth].blend = g->buffer.blend;
    198                 for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
    199                 {
    200                         a->enableStack[a->enableStackDepth].clip[i] = g->transform.clip[i];
    201                 }
    202                 a->enableStack[a->enableStackDepth].colorMaterial = g->lighting.colorMaterial;
    203                 a->enableStack[a->enableStackDepth].cullFace = g->polygon.cullFace;
    204                 a->enableStack[a->enableStackDepth].depthTest = g->buffer.depthTest;
    205                 a->enableStack[a->enableStackDepth].dither = g->buffer.dither;
    206                 a->enableStack[a->enableStackDepth].fog = g->fog.enable;
    207                 for (i = 0 ; i < g->limits.maxLights ; i++)
    208                 {
    209                         a->enableStack[a->enableStackDepth].light[i] = g->lighting.light[i].enable;
    210                 }
    211                 a->enableStack[a->enableStackDepth].lighting = g->lighting.lighting;
    212                 a->enableStack[a->enableStackDepth].lineSmooth = g->line.lineSmooth;
    213                 a->enableStack[a->enableStackDepth].lineStipple = g->line.lineStipple;
    214                 a->enableStack[a->enableStackDepth].logicOp = g->buffer.logicOp;
    215                 a->enableStack[a->enableStackDepth].indexLogicOp = g->buffer.indexLogicOp;
    216                 for (i = 0 ; i < GLEVAL_TOT ; i++)
    217                 {
    218                         a->enableStack[a->enableStackDepth].map1[i] = g->eval.enable1D[i];
    219                         a->enableStack[a->enableStackDepth].map2[i] = g->eval.enable2D[i];
    220                 }
    221                 a->enableStack[a->enableStackDepth].normalize = g->transform.normalize;
    222                 a->enableStack[a->enableStackDepth].pointSmooth = g->point.pointSmooth;
     152        a->colorBufferStack[a->colorBufferStackDepth].blendEquation = g->buffer.blendEquation;
     153#endif
     154        a->colorBufferStack[a->colorBufferStackDepth].dither = g->buffer.dither;
     155        a->colorBufferStack[a->colorBufferStackDepth].drawBuffer = g->buffer.drawBuffer;
     156        a->colorBufferStack[a->colorBufferStackDepth].logicOp = g->buffer.logicOp;
     157        a->colorBufferStack[a->colorBufferStackDepth].indexLogicOp = g->buffer.indexLogicOp;
     158        a->colorBufferStack[a->colorBufferStackDepth].logicOpMode = g->buffer.logicOpMode;
     159        a->colorBufferStack[a->colorBufferStackDepth].colorClearValue = g->buffer.colorClearValue;
     160        a->colorBufferStack[a->colorBufferStackDepth].indexClearValue = g->buffer.indexClearValue;
     161        a->colorBufferStack[a->colorBufferStackDepth].colorWriteMask = g->buffer.colorWriteMask;
     162        a->colorBufferStack[a->colorBufferStackDepth].indexWriteMask = g->buffer.indexWriteMask;
     163        a->colorBufferStackDepth++;
     164    }
     165    if (mask & GL_CURRENT_BIT)
     166    {
     167        for (i = 0 ; i < CR_MAX_VERTEX_ATTRIBS ; i++)
     168        {
     169            COPY_4V(a->currentStack[a->currentStackDepth].attrib[i] , g->current.vertexAttrib[i]);
     170            COPY_4V(a->currentStack[a->currentStackDepth].rasterAttrib[i] , g->current.rasterAttrib[i]);
     171        }
     172        a->currentStack[a->currentStackDepth].rasterValid = g->current.rasterValid;
     173        a->currentStack[a->currentStackDepth].edgeFlag = g->current.edgeFlag;
     174        a->currentStack[a->currentStackDepth].colorIndex = g->current.colorIndex;
     175        a->currentStackDepth++;
     176    }
     177    if (mask & GL_DEPTH_BUFFER_BIT)
     178    {
     179        a->depthBufferStack[a->depthBufferStackDepth].depthTest = g->buffer.depthTest;
     180        a->depthBufferStack[a->depthBufferStackDepth].depthFunc = g->buffer.depthFunc;
     181        a->depthBufferStack[a->depthBufferStackDepth].depthClearValue = g->buffer.depthClearValue;
     182        a->depthBufferStack[a->depthBufferStackDepth].depthMask = g->buffer.depthMask;
     183        a->depthBufferStackDepth++;
     184    }
     185    if (mask & GL_ENABLE_BIT)
     186    {
     187        if (a->enableStack[a->enableStackDepth].clip == NULL)
     188        {
     189            a->enableStack[a->enableStackDepth].clip = (GLboolean *) crCalloc( g->limits.maxClipPlanes * sizeof( GLboolean ));
     190        }
     191        if (a->enableStack[a->enableStackDepth].light == NULL)
     192        {
     193            a->enableStack[a->enableStackDepth].light = (GLboolean *) crCalloc( g->limits.maxLights * sizeof( GLboolean ));
     194        }
     195        a->enableStack[a->enableStackDepth].alphaTest = g->buffer.alphaTest;
     196        a->enableStack[a->enableStackDepth].autoNormal = g->eval.autoNormal;
     197        a->enableStack[a->enableStackDepth].blend = g->buffer.blend;
     198        for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
     199        {
     200            a->enableStack[a->enableStackDepth].clip[i] = g->transform.clip[i];
     201        }
     202        a->enableStack[a->enableStackDepth].colorMaterial = g->lighting.colorMaterial;
     203        a->enableStack[a->enableStackDepth].cullFace = g->polygon.cullFace;
     204        a->enableStack[a->enableStackDepth].depthTest = g->buffer.depthTest;
     205        a->enableStack[a->enableStackDepth].dither = g->buffer.dither;
     206        a->enableStack[a->enableStackDepth].fog = g->fog.enable;
     207        for (i = 0 ; i < g->limits.maxLights ; i++)
     208        {
     209            a->enableStack[a->enableStackDepth].light[i] = g->lighting.light[i].enable;
     210        }
     211        a->enableStack[a->enableStackDepth].lighting = g->lighting.lighting;
     212        a->enableStack[a->enableStackDepth].lineSmooth = g->line.lineSmooth;
     213        a->enableStack[a->enableStackDepth].lineStipple = g->line.lineStipple;
     214        a->enableStack[a->enableStackDepth].logicOp = g->buffer.logicOp;
     215        a->enableStack[a->enableStackDepth].indexLogicOp = g->buffer.indexLogicOp;
     216        for (i = 0 ; i < GLEVAL_TOT ; i++)
     217        {
     218            a->enableStack[a->enableStackDepth].map1[i] = g->eval.enable1D[i];
     219            a->enableStack[a->enableStackDepth].map2[i] = g->eval.enable2D[i];
     220        }
     221        a->enableStack[a->enableStackDepth].normalize = g->transform.normalize;
     222        a->enableStack[a->enableStackDepth].pointSmooth = g->point.pointSmooth;
    223223#if CR_ARB_point_sprite
    224                 a->enableStack[a->enableStackDepth].pointSprite = g->point.pointSprite;
    225                 for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++)
    226                         a->enableStack[a->enableStackDepth].coordReplacement[i] = g->point.coordReplacement[i];
    227 #endif
    228                 a->enableStack[a->enableStackDepth].polygonOffsetLine = g->polygon.polygonOffsetLine;
    229                 a->enableStack[a->enableStackDepth].polygonOffsetFill = g->polygon.polygonOffsetFill;
    230                 a->enableStack[a->enableStackDepth].polygonOffsetPoint = g->polygon.polygonOffsetPoint;
    231                 a->enableStack[a->enableStackDepth].polygonSmooth = g->polygon.polygonSmooth;
    232                 a->enableStack[a->enableStackDepth].polygonStipple = g->polygon.polygonStipple;
     224        a->enableStack[a->enableStackDepth].pointSprite = g->point.pointSprite;
     225        for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++)
     226            a->enableStack[a->enableStackDepth].coordReplacement[i] = g->point.coordReplacement[i];
     227#endif
     228        a->enableStack[a->enableStackDepth].polygonOffsetLine = g->polygon.polygonOffsetLine;
     229        a->enableStack[a->enableStackDepth].polygonOffsetFill = g->polygon.polygonOffsetFill;
     230        a->enableStack[a->enableStackDepth].polygonOffsetPoint = g->polygon.polygonOffsetPoint;
     231        a->enableStack[a->enableStackDepth].polygonSmooth = g->polygon.polygonSmooth;
     232        a->enableStack[a->enableStackDepth].polygonStipple = g->polygon.polygonStipple;
    233233#ifdef CR_OPENGL_VERSION_1_2
    234                 a->enableStack[a->enableStackDepth].rescaleNormals = g->transform.rescaleNormals;
    235 #endif
    236                 a->enableStack[a->enableStackDepth].scissorTest = g->viewport.scissorTest;
    237                 a->enableStack[a->enableStackDepth].stencilTest = g->stencil.stencilTest;
    238                 for (i = 0 ; i < g->limits.maxTextureUnits; i++)
    239                 {
    240                         a->enableStack[a->enableStackDepth].texture1D[i] = g->texture.unit[i].enabled1D;
    241                         a->enableStack[a->enableStackDepth].texture2D[i] = g->texture.unit[i].enabled2D;
     234        a->enableStack[a->enableStackDepth].rescaleNormals = g->transform.rescaleNormals;
     235#endif
     236        a->enableStack[a->enableStackDepth].scissorTest = g->viewport.scissorTest;
     237        a->enableStack[a->enableStackDepth].stencilTest = g->stencil.stencilTest;
     238        for (i = 0 ; i < g->limits.maxTextureUnits; i++)
     239        {
     240            a->enableStack[a->enableStackDepth].texture1D[i] = g->texture.unit[i].enabled1D;
     241            a->enableStack[a->enableStackDepth].texture2D[i] = g->texture.unit[i].enabled2D;
    242242#ifdef CR_OPENGL_VERSION_1_2
    243                         a->enableStack[a->enableStackDepth].texture3D[i] = g->texture.unit[i].enabled3D;
     243            a->enableStack[a->enableStackDepth].texture3D[i] = g->texture.unit[i].enabled3D;
    244244#endif
    245245#ifdef CR_ARB_texture_cube_map
    246                         a->enableStack[a->enableStackDepth].textureCubeMap[i] = g->texture.unit[i].enabledCubeMap;
     246            a->enableStack[a->enableStackDepth].textureCubeMap[i] = g->texture.unit[i].enabledCubeMap;
    247247#endif
    248248#ifdef CR_NV_texture_rectangle
    249                         a->enableStack[a->enableStackDepth].textureRect[i] = g->texture.unit[i].enabledRect;
    250 #endif
    251                         a->enableStack[a->enableStackDepth].textureGenS[i] = g->texture.unit[i].textureGen.s;
    252                         a->enableStack[a->enableStackDepth].textureGenT[i] = g->texture.unit[i].textureGen.t;
    253                         a->enableStack[a->enableStackDepth].textureGenR[i] = g->texture.unit[i].textureGen.r;
    254                         a->enableStack[a->enableStackDepth].textureGenQ[i] = g->texture.unit[i].textureGen.q;
    255                 }
    256                 a->enableStackDepth++;
    257         }
    258         if (mask & GL_EVAL_BIT)
    259         {
    260                 for (i = 0 ; i < GLEVAL_TOT ; i++)
    261                 {
    262                         int size1 = g->eval.eval1D[i].order * gleval_sizes[i] *
    263                                         sizeof (GLfloat);
    264                         int size2 = g->eval.eval2D[i].uorder * g->eval.eval2D[i].vorder *
    265                                         gleval_sizes[i] * sizeof (GLfloat);
    266                         a->evalStack[a->evalStackDepth].enable1D[i] = g->eval.enable1D[i];
    267                         a->evalStack[a->evalStackDepth].enable2D[i] = g->eval.enable2D[i];
    268                         a->evalStack[a->evalStackDepth].eval1D[i].u1 = g->eval.eval1D[i].u1;
    269                         a->evalStack[a->evalStackDepth].eval1D[i].u2 = g->eval.eval1D[i].u2;
    270                         a->evalStack[a->evalStackDepth].eval1D[i].order = g->eval.eval1D[i].order;
    271                         a->evalStack[a->evalStackDepth].eval1D[i].coeff = (GLfloat*)crCalloc(size1);
    272                         crMemcpy(a->evalStack[a->evalStackDepth].eval1D[i].coeff, g->eval.eval1D[i].coeff, size1);
    273                         a->evalStack[a->evalStackDepth].eval2D[i].u1 = g->eval.eval2D[i].u1;
    274                         a->evalStack[a->evalStackDepth].eval2D[i].u2 = g->eval.eval2D[i].u2;
    275                         a->evalStack[a->evalStackDepth].eval2D[i].v1 = g->eval.eval2D[i].v1;
    276                         a->evalStack[a->evalStackDepth].eval2D[i].v2 = g->eval.eval2D[i].v2;
    277                         a->evalStack[a->evalStackDepth].eval2D[i].uorder = g->eval.eval2D[i].uorder;
    278                         a->evalStack[a->evalStackDepth].eval2D[i].vorder = g->eval.eval2D[i].vorder;
    279                         a->evalStack[a->evalStackDepth].eval2D[i].coeff = (GLfloat*)crCalloc(size2);
    280                         crMemcpy(a->evalStack[a->evalStackDepth].eval2D[i].coeff, g->eval.eval2D[i].coeff, size2);
    281                 }
    282                 a->evalStack[a->evalStackDepth].autoNormal = g->eval.autoNormal;
    283                 a->evalStack[a->evalStackDepth].un1D = g->eval.un1D;
    284                 a->evalStack[a->evalStackDepth].u11D = g->eval.u11D;
    285                 a->evalStack[a->evalStackDepth].u21D = g->eval.u21D;
    286                 a->evalStack[a->evalStackDepth].un2D = g->eval.un2D;
    287                 a->evalStack[a->evalStackDepth].u12D = g->eval.u12D;
    288                 a->evalStack[a->evalStackDepth].u22D = g->eval.u22D;
    289                 a->evalStack[a->evalStackDepth].vn2D = g->eval.vn2D;
    290                 a->evalStack[a->evalStackDepth].v12D = g->eval.v12D;
    291                 a->evalStack[a->evalStackDepth].v22D = g->eval.v22D;
    292                 a->evalStackDepth++;
    293         }
    294         if (mask & GL_FOG_BIT)
    295         {
    296                 a->fogStack[a->fogStackDepth].enable = g->fog.enable;
    297                 a->fogStack[a->fogStackDepth].color = g->fog.color;
    298                 a->fogStack[a->fogStackDepth].density = g->fog.density;
    299                 a->fogStack[a->fogStackDepth].start = g->fog.start;
    300                 a->fogStack[a->fogStackDepth].end = g->fog.end;
    301                 a->fogStack[a->fogStackDepth].index = g->fog.index;
    302                 a->fogStack[a->fogStackDepth].mode = g->fog.mode;
    303                 a->fogStackDepth++;
    304         }
    305         if (mask & GL_HINT_BIT)
    306         {
    307                 a->hintStack[a->hintStackDepth].perspectiveCorrection = g->hint.perspectiveCorrection;
    308                 a->hintStack[a->hintStackDepth].pointSmooth = g->hint.pointSmooth;
    309                 a->hintStack[a->hintStackDepth].lineSmooth = g->hint.lineSmooth;
    310                 a->hintStack[a->hintStackDepth].polygonSmooth = g->hint.polygonSmooth;
    311                 a->hintStack[a->hintStackDepth].fog = g->hint.fog;
     249            a->enableStack[a->enableStackDepth].textureRect[i] = g->texture.unit[i].enabledRect;
     250#endif
     251            a->enableStack[a->enableStackDepth].textureGenS[i] = g->texture.unit[i].textureGen.s;
     252            a->enableStack[a->enableStackDepth].textureGenT[i] = g->texture.unit[i].textureGen.t;
     253            a->enableStack[a->enableStackDepth].textureGenR[i] = g->texture.unit[i].textureGen.r;
     254            a->enableStack[a->enableStackDepth].textureGenQ[i] = g->texture.unit[i].textureGen.q;
     255        }
     256        a->enableStackDepth++;
     257    }
     258    if (mask & GL_EVAL_BIT)
     259    {
     260        for (i = 0 ; i < GLEVAL_TOT ; i++)
     261        {
     262            int size1 = g->eval.eval1D[i].order * gleval_sizes[i] *
     263                    sizeof (GLfloat);
     264            int size2 = g->eval.eval2D[i].uorder * g->eval.eval2D[i].vorder *
     265                    gleval_sizes[i] * sizeof (GLfloat);
     266            a->evalStack[a->evalStackDepth].enable1D[i] = g->eval.enable1D[i];
     267            a->evalStack[a->evalStackDepth].enable2D[i] = g->eval.enable2D[i];
     268            a->evalStack[a->evalStackDepth].eval1D[i].u1 = g->eval.eval1D[i].u1;
     269            a->evalStack[a->evalStackDepth].eval1D[i].u2 = g->eval.eval1D[i].u2;
     270            a->evalStack[a->evalStackDepth].eval1D[i].order = g->eval.eval1D[i].order;
     271            a->evalStack[a->evalStackDepth].eval1D[i].coeff = (GLfloat*)crCalloc(size1);
     272            crMemcpy(a->evalStack[a->evalStackDepth].eval1D[i].coeff, g->eval.eval1D[i].coeff, size1);
     273            a->evalStack[a->evalStackDepth].eval2D[i].u1 = g->eval.eval2D[i].u1;
     274            a->evalStack[a->evalStackDepth].eval2D[i].u2 = g->eval.eval2D[i].u2;
     275            a->evalStack[a->evalStackDepth].eval2D[i].v1 = g->eval.eval2D[i].v1;
     276            a->evalStack[a->evalStackDepth].eval2D[i].v2 = g->eval.eval2D[i].v2;
     277            a->evalStack[a->evalStackDepth].eval2D[i].uorder = g->eval.eval2D[i].uorder;
     278            a->evalStack[a->evalStackDepth].eval2D[i].vorder = g->eval.eval2D[i].vorder;
     279            a->evalStack[a->evalStackDepth].eval2D[i].coeff = (GLfloat*)crCalloc(size2);
     280            crMemcpy(a->evalStack[a->evalStackDepth].eval2D[i].coeff, g->eval.eval2D[i].coeff, size2);
     281        }
     282        a->evalStack[a->evalStackDepth].autoNormal = g->eval.autoNormal;
     283        a->evalStack[a->evalStackDepth].un1D = g->eval.un1D;
     284        a->evalStack[a->evalStackDepth].u11D = g->eval.u11D;
     285        a->evalStack[a->evalStackDepth].u21D = g->eval.u21D;
     286        a->evalStack[a->evalStackDepth].un2D = g->eval.un2D;
     287        a->evalStack[a->evalStackDepth].u12D = g->eval.u12D;
     288        a->evalStack[a->evalStackDepth].u22D = g->eval.u22D;
     289        a->evalStack[a->evalStackDepth].vn2D = g->eval.vn2D;
     290        a->evalStack[a->evalStackDepth].v12D = g->eval.v12D;
     291        a->evalStack[a->evalStackDepth].v22D = g->eval.v22D;
     292        a->evalStackDepth++;
     293    }
     294    if (mask & GL_FOG_BIT)
     295    {
     296        a->fogStack[a->fogStackDepth].enable = g->fog.enable;
     297        a->fogStack[a->fogStackDepth].color = g->fog.color;
     298        a->fogStack[a->fogStackDepth].density = g->fog.density;
     299        a->fogStack[a->fogStackDepth].start = g->fog.start;
     300        a->fogStack[a->fogStackDepth].end = g->fog.end;
     301        a->fogStack[a->fogStackDepth].index = g->fog.index;
     302        a->fogStack[a->fogStackDepth].mode = g->fog.mode;
     303        a->fogStackDepth++;
     304    }
     305    if (mask & GL_HINT_BIT)
     306    {
     307        a->hintStack[a->hintStackDepth].perspectiveCorrection = g->hint.perspectiveCorrection;
     308        a->hintStack[a->hintStackDepth].pointSmooth = g->hint.pointSmooth;
     309        a->hintStack[a->hintStackDepth].lineSmooth = g->hint.lineSmooth;
     310        a->hintStack[a->hintStackDepth].polygonSmooth = g->hint.polygonSmooth;
     311        a->hintStack[a->hintStackDepth].fog = g->hint.fog;
    312312#ifdef CR_EXT_clip_volume_hint
    313                 a->hintStack[a->hintStackDepth].clipVolumeClipping = g->hint.clipVolumeClipping;
     313        a->hintStack[a->hintStackDepth].clipVolumeClipping = g->hint.clipVolumeClipping;
    314314#endif
    315315#ifdef CR_ARB_texture_compression
    316                 a->hintStack[a->hintStackDepth].textureCompression = g->hint.textureCompression;
     316        a->hintStack[a->hintStackDepth].textureCompression = g->hint.textureCompression;
    317317#endif
    318318#ifdef CR_SGIS_generate_mipmap
    319                 a->hintStack[a->hintStackDepth].generateMipmap = g->hint.generateMipmap;
    320 #endif
    321                 a->hintStackDepth++;
    322         }
    323         if (mask & GL_LIGHTING_BIT)
    324         {
    325                 if (a->lightingStack[a->lightingStackDepth].light == NULL)
    326                 {
    327                         a->lightingStack[a->lightingStackDepth].light = (CRLight *) crCalloc( g->limits.maxLights * sizeof( CRLight ));
    328                 }
    329                 a->lightingStack[a->lightingStackDepth].lightModelAmbient = g->lighting.lightModelAmbient;
    330                 a->lightingStack[a->lightingStackDepth].lightModelLocalViewer = g->lighting.lightModelLocalViewer;
    331                 a->lightingStack[a->lightingStackDepth].lightModelTwoSide = g->lighting.lightModelTwoSide;
     319        a->hintStack[a->hintStackDepth].generateMipmap = g->hint.generateMipmap;
     320#endif
     321        a->hintStackDepth++;
     322    }
     323    if (mask & GL_LIGHTING_BIT)
     324    {
     325        if (a->lightingStack[a->lightingStackDepth].light == NULL)
     326        {
     327            a->lightingStack[a->lightingStackDepth].light = (CRLight *) crCalloc( g->limits.maxLights * sizeof( CRLight ));
     328        }
     329        a->lightingStack[a->lightingStackDepth].lightModelAmbient = g->lighting.lightModelAmbient;
     330        a->lightingStack[a->lightingStackDepth].lightModelLocalViewer = g->lighting.lightModelLocalViewer;
     331        a->lightingStack[a->lightingStackDepth].lightModelTwoSide = g->lighting.lightModelTwoSide;
    332332#if defined(CR_EXT_separate_specular_color) || defined(CR_OPENGL_VERSION_1_2)
    333                 a->lightingStack[a->lightingStackDepth].lightModelColorControlEXT = g->lighting.lightModelColorControlEXT;
    334 #endif
    335                 a->lightingStack[a->lightingStackDepth].lighting = g->lighting.lighting;
    336                 a->lightingStack[a->lightingStackDepth].colorMaterial = g->lighting.colorMaterial;
    337                 a->lightingStack[a->lightingStackDepth].colorMaterialMode = g->lighting.colorMaterialMode;
    338                 a->lightingStack[a->lightingStackDepth].colorMaterialFace = g->lighting.colorMaterialFace;
    339                 for (i = 0 ; i < g->limits.maxLights; i++)
    340                 {
    341                         a->lightingStack[a->lightingStackDepth].light[i].enable = g->lighting.light[i].enable;
    342                         a->lightingStack[a->lightingStackDepth].light[i].ambient = g->lighting.light[i].ambient;
    343                         a->lightingStack[a->lightingStackDepth].light[i].diffuse = g->lighting.light[i].diffuse;
    344                         a->lightingStack[a->lightingStackDepth].light[i].specular = g->lighting.light[i].specular;
    345                         a->lightingStack[a->lightingStackDepth].light[i].spotDirection = g->lighting.light[i].spotDirection;
    346                         a->lightingStack[a->lightingStackDepth].light[i].position = g->lighting.light[i].position;
    347                         a->lightingStack[a->lightingStackDepth].light[i].spotExponent = g->lighting.light[i].spotExponent;
    348                         a->lightingStack[a->lightingStackDepth].light[i].spotCutoff = g->lighting.light[i].spotCutoff;
    349                         a->lightingStack[a->lightingStackDepth].light[i].constantAttenuation = g->lighting.light[i].constantAttenuation;
    350                         a->lightingStack[a->lightingStackDepth].light[i].linearAttenuation = g->lighting.light[i].linearAttenuation;
    351                         a->lightingStack[a->lightingStackDepth].light[i].quadraticAttenuation = g->lighting.light[i].quadraticAttenuation;
    352                 }
    353                 for (i = 0 ; i < 2 ; i++)
    354                 {
    355                         a->lightingStack[a->lightingStackDepth].ambient[i] = g->lighting.ambient[i];
    356                         a->lightingStack[a->lightingStackDepth].diffuse[i] = g->lighting.diffuse[i];
    357                         a->lightingStack[a->lightingStackDepth].specular[i] = g->lighting.specular[i];
    358                         a->lightingStack[a->lightingStackDepth].emission[i] = g->lighting.emission[i];
    359                         a->lightingStack[a->lightingStackDepth].shininess[i] = g->lighting.shininess[i];
    360                         a->lightingStack[a->lightingStackDepth].indexes[i][0] = g->lighting.indexes[i][0];
    361                         a->lightingStack[a->lightingStackDepth].indexes[i][1] = g->lighting.indexes[i][1];
    362                         a->lightingStack[a->lightingStackDepth].indexes[i][2] = g->lighting.indexes[i][2];
    363                 }
    364                 a->lightingStack[a->lightingStackDepth].shadeModel = g->lighting.shadeModel;
    365                 a->lightingStackDepth++;
    366         }
    367         if (mask & GL_LINE_BIT)
    368         {
    369                 a->lineStack[a->lineStackDepth].lineSmooth = g->line.lineSmooth;
    370                 a->lineStack[a->lineStackDepth].lineStipple = g->line.lineStipple;
    371                 a->lineStack[a->lineStackDepth].pattern = g->line.pattern;
    372                 a->lineStack[a->lineStackDepth].repeat = g->line.repeat;
    373                 a->lineStack[a->lineStackDepth].width = g->line.width;
    374                 a->lineStackDepth++;
    375         }
    376         if (mask & GL_LIST_BIT)
    377         {
    378                 a->listStack[a->listStackDepth].base = g->lists.base;
    379                 a->listStackDepth++;
    380         }
    381         if (mask & GL_PIXEL_MODE_BIT)
    382         {
    383                 a->pixelModeStack[a->pixelModeStackDepth].bias = g->pixel.bias;
    384                 a->pixelModeStack[a->pixelModeStackDepth].scale = g->pixel.scale;
    385                 a->pixelModeStack[a->pixelModeStackDepth].indexOffset = g->pixel.indexOffset;
    386                 a->pixelModeStack[a->pixelModeStackDepth].indexShift = g->pixel.indexShift;
    387                 a->pixelModeStack[a->pixelModeStackDepth].mapColor = g->pixel.mapColor;
    388                 a->pixelModeStack[a->pixelModeStackDepth].mapStencil = g->pixel.mapStencil;
    389                 a->pixelModeStack[a->pixelModeStackDepth].xZoom = g->pixel.xZoom;
    390                 a->pixelModeStack[a->pixelModeStackDepth].yZoom = g->pixel.yZoom;
    391                 a->pixelModeStack[a->pixelModeStackDepth].readBuffer = g->buffer.readBuffer;
    392                 a->pixelModeStackDepth++;
    393         }
    394         if (mask & GL_POINT_BIT)
    395         {
    396                 a->pointStack[a->pointStackDepth].pointSmooth = g->point.pointSmooth;
     333        a->lightingStack[a->lightingStackDepth].lightModelColorControlEXT = g->lighting.lightModelColorControlEXT;
     334#endif
     335        a->lightingStack[a->lightingStackDepth].lighting = g->lighting.lighting;
     336        a->lightingStack[a->lightingStackDepth].colorMaterial = g->lighting.colorMaterial;
     337        a->lightingStack[a->lightingStackDepth].colorMaterialMode = g->lighting.colorMaterialMode;
     338        a->lightingStack[a->lightingStackDepth].colorMaterialFace = g->lighting.colorMaterialFace;
     339        for (i = 0 ; i < g->limits.maxLights; i++)
     340        {
     341            a->lightingStack[a->lightingStackDepth].light[i].enable = g->lighting.light[i].enable;
     342            a->lightingStack[a->lightingStackDepth].light[i].ambient = g->lighting.light[i].ambient;
     343            a->lightingStack[a->lightingStackDepth].light[i].diffuse = g->lighting.light[i].diffuse;
     344            a->lightingStack[a->lightingStackDepth].light[i].specular = g->lighting.light[i].specular;
     345            a->lightingStack[a->lightingStackDepth].light[i].spotDirection = g->lighting.light[i].spotDirection;
     346            a->lightingStack[a->lightingStackDepth].light[i].position = g->lighting.light[i].position;
     347            a->lightingStack[a->lightingStackDepth].light[i].spotExponent = g->lighting.light[i].spotExponent;
     348            a->lightingStack[a->lightingStackDepth].light[i].spotCutoff = g->lighting.light[i].spotCutoff;
     349            a->lightingStack[a->lightingStackDepth].light[i].constantAttenuation = g->lighting.light[i].constantAttenuation;
     350            a->lightingStack[a->lightingStackDepth].light[i].linearAttenuation = g->lighting.light[i].linearAttenuation;
     351            a->lightingStack[a->lightingStackDepth].light[i].quadraticAttenuation = g->lighting.light[i].quadraticAttenuation;
     352        }
     353        for (i = 0 ; i < 2 ; i++)
     354        {
     355            a->lightingStack[a->lightingStackDepth].ambient[i] = g->lighting.ambient[i];
     356            a->lightingStack[a->lightingStackDepth].diffuse[i] = g->lighting.diffuse[i];
     357            a->lightingStack[a->lightingStackDepth].specular[i] = g->lighting.specular[i];
     358            a->lightingStack[a->lightingStackDepth].emission[i] = g->lighting.emission[i];
     359            a->lightingStack[a->lightingStackDepth].shininess[i] = g->lighting.shininess[i];
     360            a->lightingStack[a->lightingStackDepth].indexes[i][0] = g->lighting.indexes[i][0];
     361            a->lightingStack[a->lightingStackDepth].indexes[i][1] = g->lighting.indexes[i][1];
     362            a->lightingStack[a->lightingStackDepth].indexes[i][2] = g->lighting.indexes[i][2];
     363        }
     364        a->lightingStack[a->lightingStackDepth].shadeModel = g->lighting.shadeModel;
     365        a->lightingStackDepth++;
     366    }
     367    if (mask & GL_LINE_BIT)
     368    {
     369        a->lineStack[a->lineStackDepth].lineSmooth = g->line.lineSmooth;
     370        a->lineStack[a->lineStackDepth].lineStipple = g->line.lineStipple;
     371        a->lineStack[a->lineStackDepth].pattern = g->line.pattern;
     372        a->lineStack[a->lineStackDepth].repeat = g->line.repeat;
     373        a->lineStack[a->lineStackDepth].width = g->line.width;
     374        a->lineStackDepth++;
     375    }
     376    if (mask & GL_LIST_BIT)
     377    {
     378        a->listStack[a->listStackDepth].base = g->lists.base;
     379        a->listStackDepth++;
     380    }
     381    if (mask & GL_PIXEL_MODE_BIT)
     382    {
     383        a->pixelModeStack[a->pixelModeStackDepth].bias = g->pixel.bias;
     384        a->pixelModeStack[a->pixelModeStackDepth].scale = g->pixel.scale;
     385        a->pixelModeStack[a->pixelModeStackDepth].indexOffset = g->pixel.indexOffset;
     386        a->pixelModeStack[a->pixelModeStackDepth].indexShift = g->pixel.indexShift;
     387        a->pixelModeStack[a->pixelModeStackDepth].mapColor = g->pixel.mapColor;
     388        a->pixelModeStack[a->pixelModeStackDepth].mapStencil = g->pixel.mapStencil;
     389        a->pixelModeStack[a->pixelModeStackDepth].xZoom = g->pixel.xZoom;
     390        a->pixelModeStack[a->pixelModeStackDepth].yZoom = g->pixel.yZoom;
     391        a->pixelModeStack[a->pixelModeStackDepth].readBuffer = g->buffer.readBuffer;
     392        a->pixelModeStackDepth++;
     393    }
     394    if (mask & GL_POINT_BIT)
     395    {
     396        a->pointStack[a->pointStackDepth].pointSmooth = g->point.pointSmooth;
    397397#if CR_ARB_point_sprite
    398                 a->pointStack[a->pointStackDepth].pointSprite = g->point.pointSprite;
    399                 for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++)
    400                         a->pointStack[a->enableStackDepth].coordReplacement[i] = g->point.coordReplacement[i];
    401 #endif
    402                 a->pointStack[a->pointStackDepth].pointSize = g->point.pointSize;
    403                 a->pointStackDepth++;
    404         }
    405         if (mask & GL_POLYGON_BIT)
    406         {
    407                 a->polygonStack[a->polygonStackDepth].cullFace = g->polygon.cullFace;
    408                 a->polygonStack[a->polygonStackDepth].cullFaceMode = g->polygon.cullFaceMode;
    409                 a->polygonStack[a->polygonStackDepth].frontFace = g->polygon.frontFace;
    410                 a->polygonStack[a->polygonStackDepth].frontMode = g->polygon.frontMode;
    411                 a->polygonStack[a->polygonStackDepth].backMode = g->polygon.backMode;
    412                 a->polygonStack[a->polygonStackDepth].polygonSmooth = g->polygon.polygonSmooth;
    413                 a->polygonStack[a->polygonStackDepth].polygonStipple = g->polygon.polygonStipple;
    414                 a->polygonStack[a->polygonStackDepth].polygonOffsetFill = g->polygon.polygonOffsetFill;
    415                 a->polygonStack[a->polygonStackDepth].polygonOffsetLine = g->polygon.polygonOffsetLine;
    416                 a->polygonStack[a->polygonStackDepth].polygonOffsetPoint = g->polygon.polygonOffsetPoint;
    417                 a->polygonStack[a->polygonStackDepth].offsetFactor = g->polygon.offsetFactor;
    418                 a->polygonStack[a->polygonStackDepth].offsetUnits = g->polygon.offsetUnits;
    419                 a->polygonStackDepth++;
    420         }
    421         if (mask & GL_POLYGON_STIPPLE_BIT)
    422         {
    423                 crMemcpy( a->polygonStippleStack[a->polygonStippleStackDepth].pattern, g->polygon.stipple, 32*sizeof(GLint) );
    424                 a->polygonStippleStackDepth++;
    425         }
    426         if (mask & GL_SCISSOR_BIT)
    427         {
    428                 a->scissorStack[a->scissorStackDepth].scissorTest = g->viewport.scissorTest;
    429                 a->scissorStack[a->scissorStackDepth].scissorX = g->viewport.scissorX;
    430                 a->scissorStack[a->scissorStackDepth].scissorY = g->viewport.scissorY;
    431                 a->scissorStack[a->scissorStackDepth].scissorW = g->viewport.scissorW;
    432                 a->scissorStack[a->scissorStackDepth].scissorH = g->viewport.scissorH;
    433                 a->scissorStackDepth++;
    434         }
    435         if (mask & GL_STENCIL_BUFFER_BIT)
    436         {
    437                 a->stencilBufferStack[a->stencilBufferStackDepth].stencilTest = g->stencil.stencilTest;
    438                 a->stencilBufferStack[a->stencilBufferStackDepth].func = g->stencil.func;
    439                 a->stencilBufferStack[a->stencilBufferStackDepth].mask = g->stencil.mask;
    440                 a->stencilBufferStack[a->stencilBufferStackDepth].ref = g->stencil.ref;
    441                 a->stencilBufferStack[a->stencilBufferStackDepth].fail = g->stencil.fail;
    442                 a->stencilBufferStack[a->stencilBufferStackDepth].passDepthFail = g->stencil.passDepthFail;
    443                 a->stencilBufferStack[a->stencilBufferStackDepth].passDepthPass = g->stencil.passDepthPass;
    444                 a->stencilBufferStack[a->stencilBufferStackDepth].clearValue = g->stencil.clearValue;
    445                 a->stencilBufferStack[a->stencilBufferStackDepth].writeMask = g->stencil.writeMask;
    446                 a->stencilBufferStackDepth++;
    447         }
    448         if (mask & GL_TEXTURE_BIT)
    449         {
    450                 CRTextureStack *tState = a->textureStack + a->textureStackDepth;
    451                 tState->curTextureUnit = g->texture.curTextureUnit;
    452                 for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
    453                 {
    454                         /* per-unit state */
    455                         copy_texunit(&tState->unit[i], &g->texture.unit[i]);
    456                         /* texture object state */
    457                         copy_texobj(&tState->unit[i].Saved1D, g->texture.unit[i].currentTexture1D, GL_TRUE);
    458                         copy_texobj(&tState->unit[i].Saved2D, g->texture.unit[i].currentTexture2D, GL_TRUE);
     398        a->pointStack[a->pointStackDepth].pointSprite = g->point.pointSprite;
     399        for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++)
     400            a->pointStack[a->enableStackDepth].coordReplacement[i] = g->point.coordReplacement[i];
     401#endif
     402        a->pointStack[a->pointStackDepth].pointSize = g->point.pointSize;
     403        a->pointStackDepth++;
     404    }
     405    if (mask & GL_POLYGON_BIT)
     406    {
     407        a->polygonStack[a->polygonStackDepth].cullFace = g->polygon.cullFace;
     408        a->polygonStack[a->polygonStackDepth].cullFaceMode = g->polygon.cullFaceMode;
     409        a->polygonStack[a->polygonStackDepth].frontFace = g->polygon.frontFace;
     410        a->polygonStack[a->polygonStackDepth].frontMode = g->polygon.frontMode;
     411        a->polygonStack[a->polygonStackDepth].backMode = g->polygon.backMode;
     412        a->polygonStack[a->polygonStackDepth].polygonSmooth = g->polygon.polygonSmooth;
     413        a->polygonStack[a->polygonStackDepth].polygonStipple = g->polygon.polygonStipple;
     414        a->polygonStack[a->polygonStackDepth].polygonOffsetFill = g->polygon.polygonOffsetFill;
     415        a->polygonStack[a->polygonStackDepth].polygonOffsetLine = g->polygon.polygonOffsetLine;
     416        a->polygonStack[a->polygonStackDepth].polygonOffsetPoint = g->polygon.polygonOffsetPoint;
     417        a->polygonStack[a->polygonStackDepth].offsetFactor = g->polygon.offsetFactor;
     418        a->polygonStack[a->polygonStackDepth].offsetUnits = g->polygon.offsetUnits;
     419        a->polygonStackDepth++;
     420    }
     421    if (mask & GL_POLYGON_STIPPLE_BIT)
     422    {
     423        crMemcpy( a->polygonStippleStack[a->polygonStippleStackDepth].pattern, g->polygon.stipple, 32*sizeof(GLint) );
     424        a->polygonStippleStackDepth++;
     425    }
     426    if (mask & GL_SCISSOR_BIT)
     427    {
     428        a->scissorStack[a->scissorStackDepth].scissorTest = g->viewport.scissorTest;
     429        a->scissorStack[a->scissorStackDepth].scissorX = g->viewport.scissorX;
     430        a->scissorStack[a->scissorStackDepth].scissorY = g->viewport.scissorY;
     431        a->scissorStack[a->scissorStackDepth].scissorW = g->viewport.scissorW;
     432        a->scissorStack[a->scissorStackDepth].scissorH = g->viewport.scissorH;
     433        a->scissorStackDepth++;
     434    }
     435    if (mask & GL_STENCIL_BUFFER_BIT)
     436    {
     437        a->stencilBufferStack[a->stencilBufferStackDepth].stencilTest = g->stencil.stencilTest;
     438        a->stencilBufferStack[a->stencilBufferStackDepth].func = g->stencil.func;
     439        a->stencilBufferStack[a->stencilBufferStackDepth].mask = g->stencil.mask;
     440        a->stencilBufferStack[a->stencilBufferStackDepth].ref = g->stencil.ref;
     441        a->stencilBufferStack[a->stencilBufferStackDepth].fail = g->stencil.fail;
     442        a->stencilBufferStack[a->stencilBufferStackDepth].passDepthFail = g->stencil.passDepthFail;
     443        a->stencilBufferStack[a->stencilBufferStackDepth].passDepthPass = g->stencil.passDepthPass;
     444        a->stencilBufferStack[a->stencilBufferStackDepth].clearValue = g->stencil.clearValue;
     445        a->stencilBufferStack[a->stencilBufferStackDepth].writeMask = g->stencil.writeMask;
     446        a->stencilBufferStackDepth++;
     447    }
     448    if (mask & GL_TEXTURE_BIT)
     449    {
     450        CRTextureStack *tState = a->textureStack + a->textureStackDepth;
     451        tState->curTextureUnit = g->texture.curTextureUnit;
     452        for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
     453        {
     454            /* per-unit state */
     455            copy_texunit(&tState->unit[i], &g->texture.unit[i]);
     456            /* texture object state */
     457            copy_texobj(&tState->unit[i].Saved1D, g->texture.unit[i].currentTexture1D, GL_TRUE);
     458            copy_texobj(&tState->unit[i].Saved2D, g->texture.unit[i].currentTexture2D, GL_TRUE);
    459459#ifdef CR_OPENGL_VERSION_1_2
    460                         copy_texobj(&tState->unit[i].Saved3D, g->texture.unit[i].currentTexture3D, GL_TRUE);
     460            copy_texobj(&tState->unit[i].Saved3D, g->texture.unit[i].currentTexture3D, GL_TRUE);
    461461#endif
    462462#ifdef CR_ARB_texture_cube_map
    463                         copy_texobj(&tState->unit[i].SavedCubeMap, g->texture.unit[i].currentTextureCubeMap, GL_TRUE);
     463            copy_texobj(&tState->unit[i].SavedCubeMap, g->texture.unit[i].currentTextureCubeMap, GL_TRUE);
    464464#endif
    465465#ifdef CR_NV_texture_rectangle
    466                         copy_texobj(&tState->unit[i].SavedRect, g->texture.unit[i].currentTextureRect, GL_TRUE);
    467 #endif
    468                 }
    469                 a->textureStackDepth++;
    470         }
    471         if (mask & GL_TRANSFORM_BIT)
    472         {
    473                 if (a->transformStack[a->transformStackDepth].clip == NULL)
    474                 {
    475                         a->transformStack[a->transformStackDepth].clip = (GLboolean *) crCalloc( g->limits.maxClipPlanes * sizeof( GLboolean ));
    476                 }
    477                 if (a->transformStack[a->transformStackDepth].clipPlane == NULL)
    478                 {
    479                         a->transformStack[a->transformStackDepth].clipPlane = (GLvectord *) crCalloc( g->limits.maxClipPlanes * sizeof( GLvectord ));
    480                 }
    481                 a->transformStack[a->transformStackDepth].matrixMode = g->transform.matrixMode;
    482                 for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
    483                 {
    484                         a->transformStack[a->transformStackDepth].clip[i] = g->transform.clip[i];
    485                         a->transformStack[a->transformStackDepth].clipPlane[i] = g->transform.clipPlane[i];
    486                 }
    487                 a->transformStack[a->transformStackDepth].normalize = g->transform.normalize;
     466            copy_texobj(&tState->unit[i].SavedRect, g->texture.unit[i].currentTextureRect, GL_TRUE);
     467#endif
     468        }
     469        a->textureStackDepth++;
     470    }
     471    if (mask & GL_TRANSFORM_BIT)
     472    {
     473        if (a->transformStack[a->transformStackDepth].clip == NULL)
     474        {
     475            a->transformStack[a->transformStackDepth].clip = (GLboolean *) crCalloc( g->limits.maxClipPlanes * sizeof( GLboolean ));
     476        }
     477        if (a->transformStack[a->transformStackDepth].clipPlane == NULL)
     478        {
     479            a->transformStack[a->transformStackDepth].clipPlane = (GLvectord *) crCalloc( g->limits.maxClipPlanes * sizeof( GLvectord ));
     480        }
     481        a->transformStack[a->transformStackDepth].matrixMode = g->transform.matrixMode;
     482        for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
     483        {
     484            a->transformStack[a->transformStackDepth].clip[i] = g->transform.clip[i];
     485            a->transformStack[a->transformStackDepth].clipPlane[i] = g->transform.clipPlane[i];
     486        }
     487        a->transformStack[a->transformStackDepth].normalize = g->transform.normalize;
    488488#ifdef CR_OPENGL_VERSION_1_2
    489                 a->transformStack[a->transformStackDepth].rescaleNormals = g->transform.rescaleNormals;
    490 #endif
    491                 a->transformStackDepth++;
    492         }
    493         if (mask & GL_VIEWPORT_BIT)
    494         {
    495                 a->viewportStack[a->viewportStackDepth].viewportX = g->viewport.viewportX;
    496                 a->viewportStack[a->viewportStackDepth].viewportY = g->viewport.viewportY;
    497                 a->viewportStack[a->viewportStackDepth].viewportW = g->viewport.viewportW;
    498                 a->viewportStack[a->viewportStackDepth].viewportH = g->viewport.viewportH;
    499                 a->viewportStack[a->viewportStackDepth].nearClip = g->viewport.nearClip;
    500                 a->viewportStack[a->viewportStackDepth].farClip = g->viewport.farClip;
    501                 a->viewportStackDepth++;
    502         }
    503 
    504         DIRTY(ab->dirty, g->neg_bitid);
     489        a->transformStack[a->transformStackDepth].rescaleNormals = g->transform.rescaleNormals;
     490#endif
     491        a->transformStackDepth++;
     492    }
     493    if (mask & GL_VIEWPORT_BIT)
     494    {
     495        a->viewportStack[a->viewportStackDepth].viewportX = g->viewport.viewportX;
     496        a->viewportStack[a->viewportStackDepth].viewportY = g->viewport.viewportY;
     497        a->viewportStack[a->viewportStackDepth].viewportW = g->viewport.viewportW;
     498        a->viewportStack[a->viewportStackDepth].viewportH = g->viewport.viewportH;
     499        a->viewportStack[a->viewportStackDepth].nearClip = g->viewport.nearClip;
     500        a->viewportStack[a->viewportStackDepth].farClip = g->viewport.farClip;
     501        a->viewportStackDepth++;
     502    }
     503
     504    DIRTY(ab->dirty, g->neg_bitid);
    505505}
    506506
    507507void STATE_APIENTRY crStatePopAttrib(void)
    508508{
    509         CRContext *g = GetCurrentContext();
    510         CRAttribState *a = &(g->attrib);
    511         CRStateBits *sb = GetCurrentBits();
    512         CRAttribBits *ab = &(sb->attrib);
    513         CRbitvalue mask;
    514         unsigned int i;
    515 
    516         if (g->current.inBeginEnd)
    517         {
    518                 crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glPopAttrib called in Begin/End");
    519                 return;
    520         }
    521 
    522         if (a->attribStackDepth == 0)
    523         {
    524                 crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty stack!" );
    525                 return;
    526         }
    527 
    528         FLUSH();
    529 
    530         mask = a->pushMaskStack[--a->attribStackDepth];
    531 
    532         if (mask & GL_ACCUM_BUFFER_BIT)
    533         {
    534                 if (a->accumBufferStackDepth == 0)
    535                 {
    536                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty accum buffer stack!" );
    537                         return;
    538                 }
    539                 a->accumBufferStackDepth--;
    540                 g->buffer.accumClearValue = a->accumBufferStack[a->accumBufferStackDepth].accumClearValue;
    541                 DIRTY(sb->buffer.dirty, g->neg_bitid);
    542                 DIRTY(sb->buffer.clearAccum, g->neg_bitid);
    543         }
    544         if (mask & GL_COLOR_BUFFER_BIT)
    545         {
    546                 if (a->colorBufferStackDepth == 0)
    547                 {
    548                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty color buffer stack!" );
    549                         return;
    550                 }
    551                 a->colorBufferStackDepth--;
    552                 g->buffer.alphaTest = a->colorBufferStack[a->colorBufferStackDepth].alphaTest;
    553                 g->buffer.alphaTestFunc = a->colorBufferStack[a->colorBufferStackDepth].alphaTestFunc;
    554                 g->buffer.alphaTestRef = a->colorBufferStack[a->colorBufferStackDepth].alphaTestRef;
    555                 g->buffer.blend = a->colorBufferStack[a->colorBufferStackDepth].blend;
    556                 g->buffer.blendSrcRGB = a->colorBufferStack[a->colorBufferStackDepth].blendSrcRGB;
    557                 g->buffer.blendDstRGB = a->colorBufferStack[a->colorBufferStackDepth].blendDstRGB;
     509    CRContext *g = GetCurrentContext();
     510    CRAttribState *a = &(g->attrib);
     511    CRStateBits *sb = GetCurrentBits();
     512    CRAttribBits *ab = &(sb->attrib);
     513    CRbitvalue mask;
     514    unsigned int i;
     515
     516    if (g->current.inBeginEnd)
     517    {
     518        crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glPopAttrib called in Begin/End");
     519        return;
     520    }
     521
     522    if (a->attribStackDepth == 0)
     523    {
     524        crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty stack!" );
     525        return;
     526    }
     527
     528    FLUSH();
     529
     530    mask = a->pushMaskStack[--a->attribStackDepth];
     531
     532    if (mask & GL_ACCUM_BUFFER_BIT)
     533    {
     534        if (a->accumBufferStackDepth == 0)
     535        {
     536            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty accum buffer stack!" );
     537            return;
     538        }
     539        a->accumBufferStackDepth--;
     540        g->buffer.accumClearValue = a->accumBufferStack[a->accumBufferStackDepth].accumClearValue;
     541        DIRTY(sb->buffer.dirty, g->neg_bitid);
     542        DIRTY(sb->buffer.clearAccum, g->neg_bitid);
     543    }
     544    if (mask & GL_COLOR_BUFFER_BIT)
     545    {
     546        if (a->colorBufferStackDepth == 0)
     547        {
     548            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty color buffer stack!" );
     549            return;
     550        }
     551        a->colorBufferStackDepth--;
     552        g->buffer.alphaTest = a->colorBufferStack[a->colorBufferStackDepth].alphaTest;
     553        g->buffer.alphaTestFunc = a->colorBufferStack[a->colorBufferStackDepth].alphaTestFunc;
     554        g->buffer.alphaTestRef = a->colorBufferStack[a->colorBufferStackDepth].alphaTestRef;
     555        g->buffer.blend = a->colorBufferStack[a->colorBufferStackDepth].blend;
     556        g->buffer.blendSrcRGB = a->colorBufferStack[a->colorBufferStackDepth].blendSrcRGB;
     557        g->buffer.blendDstRGB = a->colorBufferStack[a->colorBufferStackDepth].blendDstRGB;
    558558#if defined(CR_EXT_blend_func_separate)
    559                 g->buffer.blendSrcA = a->colorBufferStack[a->colorBufferStackDepth].blendSrcA;
    560                 g->buffer.blendDstA = a->colorBufferStack[a->colorBufferStackDepth].blendDstA;
     559        g->buffer.blendSrcA = a->colorBufferStack[a->colorBufferStackDepth].blendSrcA;
     560        g->buffer.blendDstA = a->colorBufferStack[a->colorBufferStackDepth].blendDstA;
    561561#endif
    562562#ifdef CR_EXT_blend_color
    563                 g->buffer.blendColor = a->colorBufferStack[a->colorBufferStackDepth].blendColor;
     563        g->buffer.blendColor = a->colorBufferStack[a->colorBufferStackDepth].blendColor;
    564564#endif
    565565#if defined(CR_EXT_blend_minmax) || defined(CR_EXT_blend_subtract) || defined(CR_EXT_blend_logic_op)
    566                 g->buffer.blendEquation = a->colorBufferStack[a->colorBufferStackDepth].blendEquation;
    567 #endif
    568                 g->buffer.dither = a->colorBufferStack[a->colorBufferStackDepth].dither;
    569                 g->buffer.drawBuffer = a->colorBufferStack[a->colorBufferStackDepth].drawBuffer;
    570                 g->buffer.logicOp = a->colorBufferStack[a->colorBufferStackDepth].logicOp;
    571                 g->buffer.indexLogicOp = a->colorBufferStack[a->colorBufferStackDepth].indexLogicOp;
    572                 g->buffer.logicOpMode = a->colorBufferStack[a->colorBufferStackDepth].logicOpMode;
    573                 g->buffer.colorClearValue = a->colorBufferStack[a->colorBufferStackDepth].colorClearValue;
    574                 g->buffer.indexClearValue = a->colorBufferStack[a->colorBufferStackDepth].indexClearValue;
    575                 g->buffer.colorWriteMask = a->colorBufferStack[a->colorBufferStackDepth].colorWriteMask;
    576                 g->buffer.indexWriteMask = a->colorBufferStack[a->colorBufferStackDepth].indexWriteMask;
    577                 DIRTY(sb->buffer.dirty, g->neg_bitid);
    578                 DIRTY(sb->buffer.enable, g->neg_bitid);
    579                 DIRTY(sb->buffer.alphaFunc, g->neg_bitid);
    580                 DIRTY(sb->buffer.blendFunc, g->neg_bitid);
     566        g->buffer.blendEquation = a->colorBufferStack[a->colorBufferStackDepth].blendEquation;
     567#endif
     568        g->buffer.dither = a->colorBufferStack[a->colorBufferStackDepth].dither;
     569        g->buffer.drawBuffer = a->colorBufferStack[a->colorBufferStackDepth].drawBuffer;
     570        g->buffer.logicOp = a->colorBufferStack[a->colorBufferStackDepth].logicOp;
     571        g->buffer.indexLogicOp = a->colorBufferStack[a->colorBufferStackDepth].indexLogicOp;
     572        g->buffer.logicOpMode = a->colorBufferStack[a->colorBufferStackDepth].logicOpMode;
     573        g->buffer.colorClearValue = a->colorBufferStack[a->colorBufferStackDepth].colorClearValue;
     574        g->buffer.indexClearValue = a->colorBufferStack[a->colorBufferStackDepth].indexClearValue;
     575        g->buffer.colorWriteMask = a->colorBufferStack[a->colorBufferStackDepth].colorWriteMask;
     576        g->buffer.indexWriteMask = a->colorBufferStack[a->colorBufferStackDepth].indexWriteMask;
     577        DIRTY(sb->buffer.dirty, g->neg_bitid);
     578        DIRTY(sb->buffer.enable, g->neg_bitid);
     579        DIRTY(sb->buffer.alphaFunc, g->neg_bitid);
     580        DIRTY(sb->buffer.blendFunc, g->neg_bitid);
    581581#ifdef CR_EXT_blend_color
    582                 DIRTY(sb->buffer.blendColor, g->neg_bitid);
     582        DIRTY(sb->buffer.blendColor, g->neg_bitid);
    583583#endif
    584584#if defined(CR_EXT_blend_minmax) || defined(CR_EXT_blend_subtract) || defined(CR_EXT_blend_logic_op)
    585                 DIRTY(sb->buffer.blendEquation, g->neg_bitid);
    586 #endif
    587                 DIRTY(sb->buffer.drawBuffer, g->neg_bitid);
    588                 DIRTY(sb->buffer.logicOp, g->neg_bitid);
    589                 DIRTY(sb->buffer.indexLogicOp, g->neg_bitid);
    590                 DIRTY(sb->buffer.clearColor, g->neg_bitid);
    591                 DIRTY(sb->buffer.clearIndex, g->neg_bitid);
    592                 DIRTY(sb->buffer.colorWriteMask, g->neg_bitid);
    593                 DIRTY(sb->buffer.indexMask, g->neg_bitid);
    594         }
    595         if (mask & GL_CURRENT_BIT)
    596         {
    597                 if (a->currentStackDepth == 0)
    598                 {
    599                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty current stack!" );
    600                         return;
    601                 }
    602                 a->currentStackDepth--;
    603                 for (i = 0 ; i < CR_MAX_VERTEX_ATTRIBS ; i++)
    604                 {
    605                         COPY_4V(g->current.vertexAttrib[i], a->currentStack[a->currentStackDepth].attrib[i]);
    606                         COPY_4V(g->current.rasterAttrib[i],  a->currentStack[a->currentStackDepth].rasterAttrib[i]);
    607                         DIRTY(sb->current.vertexAttrib[i], g->neg_bitid);
    608                 }
    609                 g->current.rasterValid = a->currentStack[a->currentStackDepth].rasterValid;
    610                 g->current.edgeFlag = a->currentStack[a->currentStackDepth].edgeFlag;
    611                 g->current.colorIndex = a->currentStack[a->currentStackDepth].colorIndex;
    612                 DIRTY(sb->current.dirty, g->neg_bitid);
    613                 DIRTY(sb->current.edgeFlag, g->neg_bitid);
    614                 DIRTY(sb->current.colorIndex, g->neg_bitid);
    615                 DIRTY(sb->current.rasterPos, g->neg_bitid);
    616         }
    617         if (mask & GL_DEPTH_BUFFER_BIT)
    618         {
    619                 if (a->depthBufferStackDepth == 0)
    620                 {
    621                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty depth buffer stack!" );
    622                         return;
    623                 }
    624                 a->depthBufferStackDepth--;
    625                 g->buffer.depthTest = a->depthBufferStack[a->depthBufferStackDepth].depthTest;
    626                 g->buffer.depthFunc = a->depthBufferStack[a->depthBufferStackDepth].depthFunc;
    627                 g->buffer.depthClearValue = a->depthBufferStack[a->depthBufferStackDepth].depthClearValue;
    628                 g->buffer.depthMask = a->depthBufferStack[a->depthBufferStackDepth].depthMask;
    629                 DIRTY(sb->buffer.dirty, g->neg_bitid);
    630                 DIRTY(sb->buffer.enable, g->neg_bitid);
    631                 DIRTY(sb->buffer.depthFunc, g->neg_bitid);
    632                 DIRTY(sb->buffer.clearDepth, g->neg_bitid);
    633                 DIRTY(sb->buffer.depthMask, g->neg_bitid);
    634         }
    635         if (mask & GL_ENABLE_BIT)
    636         {
    637                 if (a->enableStackDepth == 0)
    638                 {
    639                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty enable stack!" );
    640                         return;
    641                 }
    642                 a->enableStackDepth--;
    643                 g->buffer.alphaTest = a->enableStack[a->enableStackDepth].alphaTest;
    644                 g->eval.autoNormal = a->enableStack[a->enableStackDepth].autoNormal;
    645                 g->buffer.blend = a->enableStack[a->enableStackDepth].blend;
    646                 for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
    647                 {
    648                         g->transform.clip[i] = a->enableStack[a->enableStackDepth].clip[i];
    649                 }
    650                 g->lighting.colorMaterial = a->enableStack[a->enableStackDepth].colorMaterial;
    651                 g->polygon.cullFace = a->enableStack[a->enableStackDepth].cullFace;
    652                 g->buffer.depthTest = a->enableStack[a->enableStackDepth].depthTest;
    653                 g->buffer.dither = a->enableStack[a->enableStackDepth].dither;
    654                 g->fog.enable = a->enableStack[a->enableStackDepth].fog;
    655                 for (i = 0 ; i < g->limits.maxLights ; i++)
    656                 {
    657                         g->lighting.light[i].enable = a->enableStack[a->enableStackDepth].light[i];
    658                 }
    659                 g->lighting.lighting = a->enableStack[a->enableStackDepth].lighting;
    660                 g->line.lineSmooth = a->enableStack[a->enableStackDepth].lineSmooth;
    661                 g->line.lineStipple = a->enableStack[a->enableStackDepth].lineStipple;
    662                 g->buffer.logicOp = a->enableStack[a->enableStackDepth].logicOp;
    663                 g->buffer.indexLogicOp = a->enableStack[a->enableStackDepth].indexLogicOp;
    664                 for (i = 0 ; i < GLEVAL_TOT ; i++)
    665                 {
    666                         g->eval.enable1D[i] = a->enableStack[a->enableStackDepth].map1[i];
    667                         g->eval.enable2D[i] = a->enableStack[a->enableStackDepth].map2[i];
    668                 }
    669                 g->transform.normalize = a->enableStack[a->enableStackDepth].normalize;
    670                 g->point.pointSmooth = a->enableStack[a->enableStackDepth].pointSmooth;
     585        DIRTY(sb->buffer.blendEquation, g->neg_bitid);
     586#endif
     587        DIRTY(sb->buffer.drawBuffer, g->neg_bitid);
     588        DIRTY(sb->buffer.logicOp, g->neg_bitid);
     589        DIRTY(sb->buffer.indexLogicOp, g->neg_bitid);
     590        DIRTY(sb->buffer.clearColor, g->neg_bitid);
     591        DIRTY(sb->buffer.clearIndex, g->neg_bitid);
     592        DIRTY(sb->buffer.colorWriteMask, g->neg_bitid);
     593        DIRTY(sb->buffer.indexMask, g->neg_bitid);
     594    }
     595    if (mask & GL_CURRENT_BIT)
     596    {
     597        if (a->currentStackDepth == 0)
     598        {
     599            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty current stack!" );
     600            return;
     601        }
     602        a->currentStackDepth--;
     603        for (i = 0 ; i < CR_MAX_VERTEX_ATTRIBS ; i++)
     604        {
     605            COPY_4V(g->current.vertexAttrib[i], a->currentStack[a->currentStackDepth].attrib[i]);
     606            COPY_4V(g->current.rasterAttrib[i],  a->currentStack[a->currentStackDepth].rasterAttrib[i]);
     607            DIRTY(sb->current.vertexAttrib[i], g->neg_bitid);
     608        }
     609        g->current.rasterValid = a->currentStack[a->currentStackDepth].rasterValid;
     610        g->current.edgeFlag = a->currentStack[a->currentStackDepth].edgeFlag;
     611        g->current.colorIndex = a->currentStack[a->currentStackDepth].colorIndex;
     612        DIRTY(sb->current.dirty, g->neg_bitid);
     613        DIRTY(sb->current.edgeFlag, g->neg_bitid);
     614        DIRTY(sb->current.colorIndex, g->neg_bitid);
     615        DIRTY(sb->current.rasterPos, g->neg_bitid);
     616    }
     617    if (mask & GL_DEPTH_BUFFER_BIT)
     618    {
     619        if (a->depthBufferStackDepth == 0)
     620        {
     621            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty depth buffer stack!" );
     622            return;
     623        }
     624        a->depthBufferStackDepth--;
     625        g->buffer.depthTest = a->depthBufferStack[a->depthBufferStackDepth].depthTest;
     626        g->buffer.depthFunc = a->depthBufferStack[a->depthBufferStackDepth].depthFunc;
     627        g->buffer.depthClearValue = a->depthBufferStack[a->depthBufferStackDepth].depthClearValue;
     628        g->buffer.depthMask = a->depthBufferStack[a->depthBufferStackDepth].depthMask;
     629        DIRTY(sb->buffer.dirty, g->neg_bitid);
     630        DIRTY(sb->buffer.enable, g->neg_bitid);
     631        DIRTY(sb->buffer.depthFunc, g->neg_bitid);
     632        DIRTY(sb->buffer.clearDepth, g->neg_bitid);
     633        DIRTY(sb->buffer.depthMask, g->neg_bitid);
     634    }
     635    if (mask & GL_ENABLE_BIT)
     636    {
     637        if (a->enableStackDepth == 0)
     638        {
     639            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty enable stack!" );
     640            return;
     641        }
     642        a->enableStackDepth--;
     643        g->buffer.alphaTest = a->enableStack[a->enableStackDepth].alphaTest;
     644        g->eval.autoNormal = a->enableStack[a->enableStackDepth].autoNormal;
     645        g->buffer.blend = a->enableStack[a->enableStackDepth].blend;
     646        for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
     647        {
     648            g->transform.clip[i] = a->enableStack[a->enableStackDepth].clip[i];
     649        }
     650        g->lighting.colorMaterial = a->enableStack[a->enableStackDepth].colorMaterial;
     651        g->polygon.cullFace = a->enableStack[a->enableStackDepth].cullFace;
     652        g->buffer.depthTest = a->enableStack[a->enableStackDepth].depthTest;
     653        g->buffer.dither = a->enableStack[a->enableStackDepth].dither;
     654        g->fog.enable = a->enableStack[a->enableStackDepth].fog;
     655        for (i = 0 ; i < g->limits.maxLights ; i++)
     656        {
     657            g->lighting.light[i].enable = a->enableStack[a->enableStackDepth].light[i];
     658        }
     659        g->lighting.lighting = a->enableStack[a->enableStackDepth].lighting;
     660        g->line.lineSmooth = a->enableStack[a->enableStackDepth].lineSmooth;
     661        g->line.lineStipple = a->enableStack[a->enableStackDepth].lineStipple;
     662        g->buffer.logicOp = a->enableStack[a->enableStackDepth].logicOp;
     663        g->buffer.indexLogicOp = a->enableStack[a->enableStackDepth].indexLogicOp;
     664        for (i = 0 ; i < GLEVAL_TOT ; i++)
     665        {
     666            g->eval.enable1D[i] = a->enableStack[a->enableStackDepth].map1[i];
     667            g->eval.enable2D[i] = a->enableStack[a->enableStackDepth].map2[i];
     668        }
     669        g->transform.normalize = a->enableStack[a->enableStackDepth].normalize;
     670        g->point.pointSmooth = a->enableStack[a->enableStackDepth].pointSmooth;
    671671#ifdef CR_ARB_point_sprite
    672                 g->point.pointSprite = a->enableStack[a->enableStackDepth].pointSprite;
    673                 for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++)
    674                         g->point.coordReplacement[i] = a->enableStack[a->enableStackDepth].coordReplacement[i];
    675 #endif
    676                 g->polygon.polygonOffsetLine = a->enableStack[a->enableStackDepth].polygonOffsetLine;
    677                 g->polygon.polygonOffsetFill = a->enableStack[a->enableStackDepth].polygonOffsetFill;
    678                 g->polygon.polygonOffsetPoint = a->enableStack[a->enableStackDepth].polygonOffsetPoint;
    679                 g->polygon.polygonSmooth = a->enableStack[a->enableStackDepth].polygonSmooth;
    680                 g->polygon.polygonStipple = a->enableStack[a->enableStackDepth].polygonStipple;
     672        g->point.pointSprite = a->enableStack[a->enableStackDepth].pointSprite;
     673        for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++)
     674            g->point.coordReplacement[i] = a->enableStack[a->enableStackDepth].coordReplacement[i];
     675#endif
     676        g->polygon.polygonOffsetLine = a->enableStack[a->enableStackDepth].polygonOffsetLine;
     677        g->polygon.polygonOffsetFill = a->enableStack[a->enableStackDepth].polygonOffsetFill;
     678        g->polygon.polygonOffsetPoint = a->enableStack[a->enableStackDepth].polygonOffsetPoint;
     679        g->polygon.polygonSmooth = a->enableStack[a->enableStackDepth].polygonSmooth;
     680        g->polygon.polygonStipple = a->enableStack[a->enableStackDepth].polygonStipple;
    681681#ifdef CR_OPENGL_VERSION_1_2
    682                 g->transform.rescaleNormals = a->enableStack[a->enableStackDepth].rescaleNormals;
    683 #endif
    684                 g->viewport.scissorTest = a->enableStack[a->enableStackDepth].scissorTest;
    685                 g->stencil.stencilTest = a->enableStack[a->enableStackDepth].stencilTest;
    686                 for (i = 0 ; i < g->limits.maxTextureUnits; i++)
    687                 {
    688                         g->texture.unit[i].enabled1D = a->enableStack[a->enableStackDepth].texture1D[i];
    689                         g->texture.unit[i].enabled2D = a->enableStack[a->enableStackDepth].texture2D[i];
     682        g->transform.rescaleNormals = a->enableStack[a->enableStackDepth].rescaleNormals;
     683#endif
     684        g->viewport.scissorTest = a->enableStack[a->enableStackDepth].scissorTest;
     685        g->stencil.stencilTest = a->enableStack[a->enableStackDepth].stencilTest;
     686        for (i = 0 ; i < g->limits.maxTextureUnits; i++)
     687        {
     688            g->texture.unit[i].enabled1D = a->enableStack[a->enableStackDepth].texture1D[i];
     689            g->texture.unit[i].enabled2D = a->enableStack[a->enableStackDepth].texture2D[i];
    690690#ifdef CR_OPENGL_VERSION_1_2
    691                         g->texture.unit[i].enabled3D = a->enableStack[a->enableStackDepth].texture3D[i];
     691            g->texture.unit[i].enabled3D = a->enableStack[a->enableStackDepth].texture3D[i];
    692692#endif
    693693#ifdef CR_ARB_texture_cube_map
    694                         g->texture.unit[i].enabledCubeMap = a->enableStack[a->enableStackDepth].textureCubeMap[i];
     694            g->texture.unit[i].enabledCubeMap = a->enableStack[a->enableStackDepth].textureCubeMap[i];
    695695#endif
    696696#ifdef CR_NV_texture_rectangle
    697                         g->texture.unit[i].enabledRect = a->enableStack[a->enableStackDepth].textureRect[i];
    698 #endif
    699                         g->texture.unit[i].textureGen.s = a->enableStack[a->enableStackDepth].textureGenS[i];
    700                         g->texture.unit[i].textureGen.t = a->enableStack[a->enableStackDepth].textureGenT[i];
    701                         g->texture.unit[i].textureGen.r = a->enableStack[a->enableStackDepth].textureGenR[i];
    702                         g->texture.unit[i].textureGen.q = a->enableStack[a->enableStackDepth].textureGenQ[i];
    703                 }
    704                 DIRTY(sb->buffer.dirty, g->neg_bitid);
    705                 DIRTY(sb->eval.dirty, g->neg_bitid);
    706                 DIRTY(sb->transform.dirty, g->neg_bitid);
    707                 DIRTY(sb->lighting.dirty, g->neg_bitid);
    708                 DIRTY(sb->fog.dirty, g->neg_bitid);
    709                 DIRTY(sb->line.dirty, g->neg_bitid);
    710                 DIRTY(sb->polygon.dirty, g->neg_bitid);
    711                 DIRTY(sb->viewport.dirty, g->neg_bitid);
    712                 DIRTY(sb->stencil.dirty, g->neg_bitid);
    713                 DIRTY(sb->texture.dirty, g->neg_bitid);
    714 
    715                 DIRTY(sb->buffer.enable, g->neg_bitid);
    716                 DIRTY(sb->eval.enable, g->neg_bitid);
    717                 DIRTY(sb->transform.enable, g->neg_bitid);
    718                 DIRTY(sb->lighting.enable, g->neg_bitid);
    719                 DIRTY(sb->fog.enable, g->neg_bitid);
    720                 DIRTY(sb->line.enable, g->neg_bitid);
    721                 DIRTY(sb->polygon.enable, g->neg_bitid);
    722                 DIRTY(sb->viewport.enable, g->neg_bitid);
    723                 DIRTY(sb->stencil.enable, g->neg_bitid);
    724                 for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
    725                 {
    726                         DIRTY(sb->texture.enable[i], g->neg_bitid);
    727                 }
    728         }
    729         if (mask & GL_EVAL_BIT)
    730         {
    731                 if (a->evalStackDepth == 0)
    732                 {
    733                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty eval stack!" );
    734                         return;
    735                 }
    736                 a->evalStackDepth--;
    737                 for (i = 0 ; i < GLEVAL_TOT ; i++)
    738                 {
    739                         int size1 = a->evalStack[a->evalStackDepth].eval1D[i].order * gleval_sizes[i] * sizeof(GLfloat);
    740                         int size2 = a->evalStack[a->evalStackDepth].eval2D[i].uorder * a->evalStack[a->evalStackDepth].eval2D[i].vorder * gleval_sizes[i] * sizeof (GLfloat);
    741                         g->eval.enable1D[i] = a->evalStack[a->evalStackDepth].enable1D[i];
    742                         g->eval.enable2D[i] = a->evalStack[a->evalStackDepth].enable2D[i];
    743                         g->eval.eval1D[i].u1 = a->evalStack[a->evalStackDepth].eval1D[i].u1;
    744                         g->eval.eval1D[i].u2 = a->evalStack[a->evalStackDepth].eval1D[i].u2;
    745                         g->eval.eval1D[i].order = a->evalStack[a->evalStackDepth].eval1D[i].order;
    746                         crMemcpy((char*)g->eval.eval1D[i].coeff, a->evalStack[a->evalStackDepth].eval1D[i].coeff, size1);
    747                         crFree(a->evalStack[a->evalStackDepth].eval1D[i].coeff);
    748                         a->evalStack[a->evalStackDepth].eval1D[i].coeff = NULL;
    749                         g->eval.eval2D[i].u1 = a->evalStack[a->evalStackDepth].eval2D[i].u1;
    750                         g->eval.eval2D[i].u2 = a->evalStack[a->evalStackDepth].eval2D[i].u2;
    751                         g->eval.eval2D[i].v1 = a->evalStack[a->evalStackDepth].eval2D[i].v1;
    752                         g->eval.eval2D[i].v2 = a->evalStack[a->evalStackDepth].eval2D[i].v2;
    753                         g->eval.eval2D[i].uorder = a->evalStack[a->evalStackDepth].eval2D[i].uorder;
    754                         g->eval.eval2D[i].vorder = a->evalStack[a->evalStackDepth].eval2D[i].vorder;
    755                         crMemcpy((char*)g->eval.eval2D[i].coeff, a->evalStack[a->evalStackDepth].eval2D[i].coeff, size2);
    756                         crFree(a->evalStack[a->evalStackDepth].eval2D[i].coeff);
    757                         a->evalStack[a->evalStackDepth].eval2D[i].coeff = NULL;
    758                 }
    759                 g->eval.autoNormal = a->evalStack[a->evalStackDepth].autoNormal;
    760                 g->eval.un1D = a->evalStack[a->evalStackDepth].un1D;
    761                 g->eval.u11D = a->evalStack[a->evalStackDepth].u11D;
    762                 g->eval.u21D = a->evalStack[a->evalStackDepth].u21D;
    763                 g->eval.un2D = a->evalStack[a->evalStackDepth].un2D;
    764                 g->eval.u12D = a->evalStack[a->evalStackDepth].u12D;
    765                 g->eval.u22D = a->evalStack[a->evalStackDepth].u22D;
    766                 g->eval.vn2D = a->evalStack[a->evalStackDepth].vn2D;
    767                 g->eval.v12D = a->evalStack[a->evalStackDepth].v12D;
    768                 g->eval.v22D = a->evalStack[a->evalStackDepth].v22D;
    769                 for (i = 0; i < GLEVAL_TOT; i++) {
    770                         DIRTY(sb->eval.eval1D[i], g->neg_bitid);
    771                         DIRTY(sb->eval.eval2D[i], g->neg_bitid);
    772                 }
    773                 DIRTY(sb->eval.dirty, g->neg_bitid);
    774                 DIRTY(sb->eval.grid1D, g->neg_bitid);
    775                 DIRTY(sb->eval.grid2D, g->neg_bitid);
    776                 DIRTY(sb->eval.enable, g->neg_bitid);
    777         }
    778         if (mask & GL_FOG_BIT)
    779         {
    780                 if (a->fogStackDepth == 0)
    781                 {
    782                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty fog stack!" );
    783                         return;
    784                 }
    785                 a->fogStackDepth--;
    786                 g->fog.enable = a->fogStack[a->fogStackDepth].enable;
    787                 g->fog.color = a->fogStack[a->fogStackDepth].color;
    788                 g->fog.density = a->fogStack[a->fogStackDepth].density;
    789                 g->fog.start = a->fogStack[a->fogStackDepth].start;
    790                 g->fog.end = a->fogStack[a->fogStackDepth].end;
    791                 g->fog.index = a->fogStack[a->fogStackDepth].index;
    792                 g->fog.mode = a->fogStack[a->fogStackDepth].mode;
    793                 DIRTY(sb->fog.dirty, g->neg_bitid);
    794                 DIRTY(sb->fog.color, g->neg_bitid);
    795                 DIRTY(sb->fog.index, g->neg_bitid);
    796                 DIRTY(sb->fog.density, g->neg_bitid);
    797                 DIRTY(sb->fog.start, g->neg_bitid);
    798                 DIRTY(sb->fog.end, g->neg_bitid);
    799                 DIRTY(sb->fog.mode, g->neg_bitid);
    800                 DIRTY(sb->fog.enable, g->neg_bitid);
    801         }
    802         if (mask & GL_HINT_BIT)
    803         {
    804                 if (a->hintStackDepth == 0)
    805                 {
    806                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty hint stack!" );
    807                         return;
    808                 }
    809                 a->hintStackDepth--;
    810                 g->hint.perspectiveCorrection = a->hintStack[a->hintStackDepth].perspectiveCorrection;
    811                 g->hint.pointSmooth = a->hintStack[a->hintStackDepth].pointSmooth;
    812                 g->hint.lineSmooth = a->hintStack[a->hintStackDepth].lineSmooth;
    813                 g->hint.polygonSmooth = a->hintStack[a->hintStackDepth].polygonSmooth;
    814                 g->hint.fog = a->hintStack[a->hintStackDepth].fog;
    815                 DIRTY(sb->hint.dirty, g->neg_bitid);
    816                 DIRTY(sb->hint.perspectiveCorrection, g->neg_bitid);
    817                 DIRTY(sb->hint.pointSmooth, g->neg_bitid);
    818                 DIRTY(sb->hint.lineSmooth, g->neg_bitid);
    819                 DIRTY(sb->hint.polygonSmooth, g->neg_bitid);
     697            g->texture.unit[i].enabledRect = a->enableStack[a->enableStackDepth].textureRect[i];
     698#endif
     699            g->texture.unit[i].textureGen.s = a->enableStack[a->enableStackDepth].textureGenS[i];
     700            g->texture.unit[i].textureGen.t = a->enableStack[a->enableStackDepth].textureGenT[i];
     701            g->texture.unit[i].textureGen.r = a->enableStack[a->enableStackDepth].textureGenR[i];
     702            g->texture.unit[i].textureGen.q = a->enableStack[a->enableStackDepth].textureGenQ[i];
     703        }
     704        DIRTY(sb->buffer.dirty, g->neg_bitid);
     705        DIRTY(sb->eval.dirty, g->neg_bitid);
     706        DIRTY(sb->transform.dirty, g->neg_bitid);
     707        DIRTY(sb->lighting.dirty, g->neg_bitid);
     708        DIRTY(sb->fog.dirty, g->neg_bitid);
     709        DIRTY(sb->line.dirty, g->neg_bitid);
     710        DIRTY(sb->polygon.dirty, g->neg_bitid);
     711        DIRTY(sb->viewport.dirty, g->neg_bitid);
     712        DIRTY(sb->stencil.dirty, g->neg_bitid);
     713        DIRTY(sb->texture.dirty, g->neg_bitid);
     714
     715        DIRTY(sb->buffer.enable, g->neg_bitid);
     716        DIRTY(sb->eval.enable, g->neg_bitid);
     717        DIRTY(sb->transform.enable, g->neg_bitid);
     718        DIRTY(sb->lighting.enable, g->neg_bitid);
     719        DIRTY(sb->fog.enable, g->neg_bitid);
     720        DIRTY(sb->line.enable, g->neg_bitid);
     721        DIRTY(sb->polygon.enable, g->neg_bitid);
     722        DIRTY(sb->viewport.enable, g->neg_bitid);
     723        DIRTY(sb->stencil.enable, g->neg_bitid);
     724        for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
     725        {
     726            DIRTY(sb->texture.enable[i], g->neg_bitid);
     727        }
     728    }
     729    if (mask & GL_EVAL_BIT)
     730    {
     731        if (a->evalStackDepth == 0)
     732        {
     733            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty eval stack!" );
     734            return;
     735        }
     736        a->evalStackDepth--;
     737        for (i = 0 ; i < GLEVAL_TOT ; i++)
     738        {
     739            int size1 = a->evalStack[a->evalStackDepth].eval1D[i].order * gleval_sizes[i] * sizeof(GLfloat);
     740            int size2 = a->evalStack[a->evalStackDepth].eval2D[i].uorder * a->evalStack[a->evalStackDepth].eval2D[i].vorder * gleval_sizes[i] * sizeof (GLfloat);
     741            g->eval.enable1D[i] = a->evalStack[a->evalStackDepth].enable1D[i];
     742            g->eval.enable2D[i] = a->evalStack[a->evalStackDepth].enable2D[i];
     743            g->eval.eval1D[i].u1 = a->evalStack[a->evalStackDepth].eval1D[i].u1;
     744            g->eval.eval1D[i].u2 = a->evalStack[a->evalStackDepth].eval1D[i].u2;
     745            g->eval.eval1D[i].order = a->evalStack[a->evalStackDepth].eval1D[i].order;
     746            crMemcpy((char*)g->eval.eval1D[i].coeff, a->evalStack[a->evalStackDepth].eval1D[i].coeff, size1);
     747            crFree(a->evalStack[a->evalStackDepth].eval1D[i].coeff);
     748            a->evalStack[a->evalStackDepth].eval1D[i].coeff = NULL;
     749            g->eval.eval2D[i].u1 = a->evalStack[a->evalStackDepth].eval2D[i].u1;
     750            g->eval.eval2D[i].u2 = a->evalStack[a->evalStackDepth].eval2D[i].u2;
     751            g->eval.eval2D[i].v1 = a->evalStack[a->evalStackDepth].eval2D[i].v1;
     752            g->eval.eval2D[i].v2 = a->evalStack[a->evalStackDepth].eval2D[i].v2;
     753            g->eval.eval2D[i].uorder = a->evalStack[a->evalStackDepth].eval2D[i].uorder;
     754            g->eval.eval2D[i].vorder = a->evalStack[a->evalStackDepth].eval2D[i].vorder;
     755            crMemcpy((char*)g->eval.eval2D[i].coeff, a->evalStack[a->evalStackDepth].eval2D[i].coeff, size2);
     756            crFree(a->evalStack[a->evalStackDepth].eval2D[i].coeff);
     757            a->evalStack[a->evalStackDepth].eval2D[i].coeff = NULL;
     758        }
     759        g->eval.autoNormal = a->evalStack[a->evalStackDepth].autoNormal;
     760        g->eval.un1D = a->evalStack[a->evalStackDepth].un1D;
     761        g->eval.u11D = a->evalStack[a->evalStackDepth].u11D;
     762        g->eval.u21D = a->evalStack[a->evalStackDepth].u21D;
     763        g->eval.un2D = a->evalStack[a->evalStackDepth].un2D;
     764        g->eval.u12D = a->evalStack[a->evalStackDepth].u12D;
     765        g->eval.u22D = a->evalStack[a->evalStackDepth].u22D;
     766        g->eval.vn2D = a->evalStack[a->evalStackDepth].vn2D;
     767        g->eval.v12D = a->evalStack[a->evalStackDepth].v12D;
     768        g->eval.v22D = a->evalStack[a->evalStackDepth].v22D;
     769        for (i = 0; i < GLEVAL_TOT; i++) {
     770            DIRTY(sb->eval.eval1D[i], g->neg_bitid);
     771            DIRTY(sb->eval.eval2D[i], g->neg_bitid);
     772        }
     773        DIRTY(sb->eval.dirty, g->neg_bitid);
     774        DIRTY(sb->eval.grid1D, g->neg_bitid);
     775        DIRTY(sb->eval.grid2D, g->neg_bitid);
     776        DIRTY(sb->eval.enable, g->neg_bitid);
     777    }
     778    if (mask & GL_FOG_BIT)
     779    {
     780        if (a->fogStackDepth == 0)
     781        {
     782            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty fog stack!" );
     783            return;
     784        }
     785        a->fogStackDepth--;
     786        g->fog.enable = a->fogStack[a->fogStackDepth].enable;
     787        g->fog.color = a->fogStack[a->fogStackDepth].color;
     788        g->fog.density = a->fogStack[a->fogStackDepth].density;
     789        g->fog.start = a->fogStack[a->fogStackDepth].start;
     790        g->fog.end = a->fogStack[a->fogStackDepth].end;
     791        g->fog.index = a->fogStack[a->fogStackDepth].index;
     792        g->fog.mode = a->fogStack[a->fogStackDepth].mode;
     793        DIRTY(sb->fog.dirty, g->neg_bitid);
     794        DIRTY(sb->fog.color, g->neg_bitid);
     795        DIRTY(sb->fog.index, g->neg_bitid);
     796        DIRTY(sb->fog.density, g->neg_bitid);
     797        DIRTY(sb->fog.start, g->neg_bitid);
     798        DIRTY(sb->fog.end, g->neg_bitid);
     799        DIRTY(sb->fog.mode, g->neg_bitid);
     800        DIRTY(sb->fog.enable, g->neg_bitid);
     801    }
     802    if (mask & GL_HINT_BIT)
     803    {
     804        if (a->hintStackDepth == 0)
     805        {
     806            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty hint stack!" );
     807            return;
     808        }
     809        a->hintStackDepth--;
     810        g->hint.perspectiveCorrection = a->hintStack[a->hintStackDepth].perspectiveCorrection;
     811        g->hint.pointSmooth = a->hintStack[a->hintStackDepth].pointSmooth;
     812        g->hint.lineSmooth = a->hintStack[a->hintStackDepth].lineSmooth;
     813        g->hint.polygonSmooth = a->hintStack[a->hintStackDepth].polygonSmooth;
     814        g->hint.fog = a->hintStack[a->hintStackDepth].fog;
     815        DIRTY(sb->hint.dirty, g->neg_bitid);
     816        DIRTY(sb->hint.perspectiveCorrection, g->neg_bitid);
     817        DIRTY(sb->hint.pointSmooth, g->neg_bitid);
     818        DIRTY(sb->hint.lineSmooth, g->neg_bitid);
     819        DIRTY(sb->hint.polygonSmooth, g->neg_bitid);
    820820#ifdef CR_EXT_clip_volume_hint
    821                 g->hint.clipVolumeClipping = a->hintStack[a->hintStackDepth].clipVolumeClipping;
    822                 DIRTY(sb->hint.clipVolumeClipping, g->neg_bitid);
     821        g->hint.clipVolumeClipping = a->hintStack[a->hintStackDepth].clipVolumeClipping;
     822        DIRTY(sb->hint.clipVolumeClipping, g->neg_bitid);
    823823#endif
    824824#ifdef CR_ARB_texture_compression
    825                 g->hint.textureCompression = a->hintStack[a->hintStackDepth].textureCompression;
    826                 DIRTY(sb->hint.textureCompression, g->neg_bitid);
     825        g->hint.textureCompression = a->hintStack[a->hintStackDepth].textureCompression;
     826        DIRTY(sb->hint.textureCompression, g->neg_bitid);
    827827#endif
    828828#ifdef CR_SGIS_generate_mipmap
    829                 g->hint.generateMipmap = a->hintStack[a->hintStackDepth].generateMipmap;
    830                 DIRTY(sb->hint.generateMipmap, g->neg_bitid);
    831 #endif
    832         }
    833         if (mask & GL_LIGHTING_BIT)
    834         {
    835                 if (a->lightingStackDepth == 0)
    836                 {
    837                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty lighting stack!" );
    838                         return;
    839                 }
    840                 a->lightingStackDepth--;
    841                 g->lighting.lightModelAmbient = a->lightingStack[a->lightingStackDepth].lightModelAmbient;
    842                 g->lighting.lightModelLocalViewer = a->lightingStack[a->lightingStackDepth].lightModelLocalViewer;
    843                 g->lighting.lightModelTwoSide = a->lightingStack[a->lightingStackDepth].lightModelTwoSide;
     829        g->hint.generateMipmap = a->hintStack[a->hintStackDepth].generateMipmap;
     830        DIRTY(sb->hint.generateMipmap, g->neg_bitid);
     831#endif
     832    }
     833    if (mask & GL_LIGHTING_BIT)
     834    {
     835        if (a->lightingStackDepth == 0)
     836        {
     837            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty lighting stack!" );
     838            return;
     839        }
     840        a->lightingStackDepth--;
     841        g->lighting.lightModelAmbient = a->lightingStack[a->lightingStackDepth].lightModelAmbient;
     842        g->lighting.lightModelLocalViewer = a->lightingStack[a->lightingStackDepth].lightModelLocalViewer;
     843        g->lighting.lightModelTwoSide = a->lightingStack[a->lightingStackDepth].lightModelTwoSide;
    844844#if defined(CR_EXT_separate_specular_color) || defined(CR_OPENGL_VERSION_1_2)
    845                 g->lighting.lightModelColorControlEXT = a->lightingStack[a->lightingStackDepth].lightModelColorControlEXT;
    846 #endif
    847                 g->lighting.lighting = a->lightingStack[a->lightingStackDepth].lighting;
    848                 g->lighting.colorMaterial = a->lightingStack[a->lightingStackDepth].colorMaterial;
    849                 g->lighting.colorMaterialMode = a->lightingStack[a->lightingStackDepth].colorMaterialMode;
    850                 g->lighting.colorMaterialFace = a->lightingStack[a->lightingStackDepth].colorMaterialFace;
    851                 for (i = 0 ; i < g->limits.maxLights; i++)
    852                 {
    853                         g->lighting.light[i].enable = a->lightingStack[a->lightingStackDepth].light[i].enable;
    854                         g->lighting.light[i].ambient = a->lightingStack[a->lightingStackDepth].light[i].ambient;
    855                         g->lighting.light[i].diffuse = a->lightingStack[a->lightingStackDepth].light[i].diffuse;
    856                         g->lighting.light[i].specular = a->lightingStack[a->lightingStackDepth].light[i].specular;
    857                         g->lighting.light[i].spotDirection = a->lightingStack[a->lightingStackDepth].light[i].spotDirection;
    858                         g->lighting.light[i].position = a->lightingStack[a->lightingStackDepth].light[i].position;
    859                         g->lighting.light[i].spotExponent = a->lightingStack[a->lightingStackDepth].light[i].spotExponent;
    860                         g->lighting.light[i].spotCutoff = a->lightingStack[a->lightingStackDepth].light[i].spotCutoff;
    861                         g->lighting.light[i].constantAttenuation = a->lightingStack[a->lightingStackDepth].light[i].constantAttenuation;
    862                         g->lighting.light[i].linearAttenuation = a->lightingStack[a->lightingStackDepth].light[i].linearAttenuation;
    863                         g->lighting.light[i].quadraticAttenuation = a->lightingStack[a->lightingStackDepth].light[i].quadraticAttenuation;
    864                 }
    865                 for (i = 0 ; i < 2 ; i++)
    866                 {
    867                         g->lighting.ambient[i] = a->lightingStack[a->lightingStackDepth].ambient[i];
    868                         g->lighting.diffuse[i] = a->lightingStack[a->lightingStackDepth].diffuse[i];
    869                         g->lighting.specular[i] = a->lightingStack[a->lightingStackDepth].specular[i];
    870                         g->lighting.emission[i] = a->lightingStack[a->lightingStackDepth].emission[i];
    871                         g->lighting.shininess[i] = a->lightingStack[a->lightingStackDepth].shininess[i];
    872                         g->lighting.indexes[i][0] = a->lightingStack[a->lightingStackDepth].indexes[i][0];
    873                         g->lighting.indexes[i][1] = a->lightingStack[a->lightingStackDepth].indexes[i][1];
    874                         g->lighting.indexes[i][2] = a->lightingStack[a->lightingStackDepth].indexes[i][2];
    875                 }
    876                 g->lighting.shadeModel = a->lightingStack[a->lightingStackDepth].shadeModel;
    877                 DIRTY(sb->lighting.dirty, g->neg_bitid);
    878                 DIRTY(sb->lighting.shadeModel, g->neg_bitid);
    879                 DIRTY(sb->lighting.lightModel, g->neg_bitid);
    880                 DIRTY(sb->lighting.material, g->neg_bitid);
    881                 DIRTY(sb->lighting.enable, g->neg_bitid);
    882                 for (i = 0 ; i < g->limits.maxLights; i++)
    883                 {
    884                         DIRTY(sb->lighting.light[i].dirty, g->neg_bitid);
    885                         DIRTY(sb->lighting.light[i].enable, g->neg_bitid);
    886                         DIRTY(sb->lighting.light[i].ambient, g->neg_bitid);
    887                         DIRTY(sb->lighting.light[i].diffuse, g->neg_bitid);
    888                         DIRTY(sb->lighting.light[i].specular, g->neg_bitid);
    889                         DIRTY(sb->lighting.light[i].position, g->neg_bitid);
    890                         DIRTY(sb->lighting.light[i].attenuation, g->neg_bitid);
    891                         DIRTY(sb->lighting.light[i].spot, g->neg_bitid);
    892                 }
    893         }
    894         if (mask & GL_LINE_BIT)
    895         {
    896                 if (a->lineStackDepth == 0)
    897                 {
    898                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty line stack!" );
    899                         return;
    900                 }
    901                 a->lineStackDepth--;
    902                 g->line.lineSmooth = a->lineStack[a->lineStackDepth].lineSmooth;
    903                 g->line.lineStipple = a->lineStack[a->lineStackDepth].lineStipple;
    904                 g->line.pattern = a->lineStack[a->lineStackDepth].pattern;
    905                 g->line.repeat = a->lineStack[a->lineStackDepth].repeat;
    906                 g->line.width = a->lineStack[a->lineStackDepth].width;
    907                 DIRTY(sb->line.dirty, g->neg_bitid);
    908                 DIRTY(sb->line.enable, g->neg_bitid);
    909                 DIRTY(sb->line.width, g->neg_bitid);
    910                 DIRTY(sb->line.stipple, g->neg_bitid);
    911         }
    912         if (mask & GL_LIST_BIT)
    913         {
    914                 if (a->listStackDepth == 0)
    915                 {
    916                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty list stack!" );
    917                         return;
    918                 }
    919                 a->listStackDepth--;
    920                 g->lists.base = a->listStack[a->listStackDepth].base;
    921                 DIRTY(sb->lists.dirty, g->neg_bitid);
    922         }
    923         if (mask & GL_PIXEL_MODE_BIT)
    924         {
    925                 if (a->pixelModeStackDepth == 0)
    926                 {
    927                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty pixel mode stack!" );
    928                         return;
    929                 }
    930                 a->pixelModeStackDepth--;
    931                 g->pixel.bias = a->pixelModeStack[a->pixelModeStackDepth].bias;
    932                 g->pixel.scale = a->pixelModeStack[a->pixelModeStackDepth].scale;
    933                 g->pixel.indexOffset = a->pixelModeStack[a->pixelModeStackDepth].indexOffset;
    934                 g->pixel.indexShift = a->pixelModeStack[a->pixelModeStackDepth].indexShift;
    935                 g->pixel.mapColor = a->pixelModeStack[a->pixelModeStackDepth].mapColor;
    936                 g->pixel.mapStencil = a->pixelModeStack[a->pixelModeStackDepth].mapStencil;
    937                 g->pixel.xZoom = a->pixelModeStack[a->pixelModeStackDepth].xZoom;
    938                 g->pixel.yZoom = a->pixelModeStack[a->pixelModeStackDepth].yZoom;
    939                 g->buffer.readBuffer = a->pixelModeStack[a->pixelModeStackDepth].readBuffer;
    940                 DIRTY(sb->pixel.dirty, g->neg_bitid);
    941                 DIRTY(sb->pixel.transfer, g->neg_bitid);
    942                 DIRTY(sb->pixel.zoom, g->neg_bitid);
    943                 DIRTY(sb->buffer.dirty, g->neg_bitid);
    944                 DIRTY(sb->buffer.readBuffer, g->neg_bitid);
    945         }
    946         if (mask & GL_POINT_BIT)
    947         {
    948                 if (a->pointStackDepth == 0)
    949                 {
    950                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty point stack!" );
    951                         return;
    952                 }
    953                 a->pointStackDepth--;
    954                 g->point.pointSmooth = a->pointStack[a->pointStackDepth].pointSmooth;
    955                 g->point.pointSize = a->pointStack[a->pointStackDepth].pointSize;
     845        g->lighting.lightModelColorControlEXT = a->lightingStack[a->lightingStackDepth].lightModelColorControlEXT;
     846#endif
     847        g->lighting.lighting = a->lightingStack[a->lightingStackDepth].lighting;
     848        g->lighting.colorMaterial = a->lightingStack[a->lightingStackDepth].colorMaterial;
     849        g->lighting.colorMaterialMode = a->lightingStack[a->lightingStackDepth].colorMaterialMode;
     850        g->lighting.colorMaterialFace = a->lightingStack[a->lightingStackDepth].colorMaterialFace;
     851        for (i = 0 ; i < g->limits.maxLights; i++)
     852        {
     853            g->lighting.light[i].enable = a->lightingStack[a->lightingStackDepth].light[i].enable;
     854            g->lighting.light[i].ambient = a->lightingStack[a->lightingStackDepth].light[i].ambient;
     855            g->lighting.light[i].diffuse = a->lightingStack[a->lightingStackDepth].light[i].diffuse;
     856            g->lighting.light[i].specular = a->lightingStack[a->lightingStackDepth].light[i].specular;
     857            g->lighting.light[i].spotDirection = a->lightingStack[a->lightingStackDepth].light[i].spotDirection;
     858            g->lighting.light[i].position = a->lightingStack[a->lightingStackDepth].light[i].position;
     859            g->lighting.light[i].spotExponent = a->lightingStack[a->lightingStackDepth].light[i].spotExponent;
     860            g->lighting.light[i].spotCutoff = a->lightingStack[a->lightingStackDepth].light[i].spotCutoff;
     861            g->lighting.light[i].constantAttenuation = a->lightingStack[a->lightingStackDepth].light[i].constantAttenuation;
     862            g->lighting.light[i].linearAttenuation = a->lightingStack[a->lightingStackDepth].light[i].linearAttenuation;
     863            g->lighting.light[i].quadraticAttenuation = a->lightingStack[a->lightingStackDepth].light[i].quadraticAttenuation;
     864        }
     865        for (i = 0 ; i < 2 ; i++)
     866        {
     867            g->lighting.ambient[i] = a->lightingStack[a->lightingStackDepth].ambient[i];
     868            g->lighting.diffuse[i] = a->lightingStack[a->lightingStackDepth].diffuse[i];
     869            g->lighting.specular[i] = a->lightingStack[a->lightingStackDepth].specular[i];
     870            g->lighting.emission[i] = a->lightingStack[a->lightingStackDepth].emission[i];
     871            g->lighting.shininess[i] = a->lightingStack[a->lightingStackDepth].shininess[i];
     872            g->lighting.indexes[i][0] = a->lightingStack[a->lightingStackDepth].indexes[i][0];
     873            g->lighting.indexes[i][1] = a->lightingStack[a->lightingStackDepth].indexes[i][1];
     874            g->lighting.indexes[i][2] = a->lightingStack[a->lightingStackDepth].indexes[i][2];
     875        }
     876        g->lighting.shadeModel = a->lightingStack[a->lightingStackDepth].shadeModel;
     877        DIRTY(sb->lighting.dirty, g->neg_bitid);
     878        DIRTY(sb->lighting.shadeModel, g->neg_bitid);
     879        DIRTY(sb->lighting.lightModel, g->neg_bitid);
     880        DIRTY(sb->lighting.material, g->neg_bitid);
     881        DIRTY(sb->lighting.enable, g->neg_bitid);
     882        for (i = 0 ; i < g->limits.maxLights; i++)
     883        {
     884            DIRTY(sb->lighting.light[i].dirty, g->neg_bitid);
     885            DIRTY(sb->lighting.light[i].enable, g->neg_bitid);
     886            DIRTY(sb->lighting.light[i].ambient, g->neg_bitid);
     887            DIRTY(sb->lighting.light[i].diffuse, g->neg_bitid);
     888            DIRTY(sb->lighting.light[i].specular, g->neg_bitid);
     889            DIRTY(sb->lighting.light[i].position, g->neg_bitid);
     890            DIRTY(sb->lighting.light[i].attenuation, g->neg_bitid);
     891            DIRTY(sb->lighting.light[i].spot, g->neg_bitid);
     892        }
     893    }
     894    if (mask & GL_LINE_BIT)
     895    {
     896        if (a->lineStackDepth == 0)
     897        {
     898            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty line stack!" );
     899            return;
     900        }
     901        a->lineStackDepth--;
     902        g->line.lineSmooth = a->lineStack[a->lineStackDepth].lineSmooth;
     903        g->line.lineStipple = a->lineStack[a->lineStackDepth].lineStipple;
     904        g->line.pattern = a->lineStack[a->lineStackDepth].pattern;
     905        g->line.repeat = a->lineStack[a->lineStackDepth].repeat;
     906        g->line.width = a->lineStack[a->lineStackDepth].width;
     907        DIRTY(sb->line.dirty, g->neg_bitid);
     908        DIRTY(sb->line.enable, g->neg_bitid);
     909        DIRTY(sb->line.width, g->neg_bitid);
     910        DIRTY(sb->line.stipple, g->neg_bitid);
     911    }
     912    if (mask & GL_LIST_BIT)
     913    {
     914        if (a->listStackDepth == 0)
     915        {
     916            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty list stack!" );
     917            return;
     918        }
     919        a->listStackDepth--;
     920        g->lists.base = a->listStack[a->listStackDepth].base;
     921        DIRTY(sb->lists.dirty, g->neg_bitid);
     922    }
     923    if (mask & GL_PIXEL_MODE_BIT)
     924    {
     925        if (a->pixelModeStackDepth == 0)
     926        {
     927            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty pixel mode stack!" );
     928            return;
     929        }
     930        a->pixelModeStackDepth--;
     931        g->pixel.bias = a->pixelModeStack[a->pixelModeStackDepth].bias;
     932        g->pixel.scale = a->pixelModeStack[a->pixelModeStackDepth].scale;
     933        g->pixel.indexOffset = a->pixelModeStack[a->pixelModeStackDepth].indexOffset;
     934        g->pixel.indexShift = a->pixelModeStack[a->pixelModeStackDepth].indexShift;
     935        g->pixel.mapColor = a->pixelModeStack[a->pixelModeStackDepth].mapColor;
     936        g->pixel.mapStencil = a->pixelModeStack[a->pixelModeStackDepth].mapStencil;
     937        g->pixel.xZoom = a->pixelModeStack[a->pixelModeStackDepth].xZoom;
     938        g->pixel.yZoom = a->pixelModeStack[a->pixelModeStackDepth].yZoom;
     939        g->buffer.readBuffer = a->pixelModeStack[a->pixelModeStackDepth].readBuffer;
     940        DIRTY(sb->pixel.dirty, g->neg_bitid);
     941        DIRTY(sb->pixel.transfer, g->neg_bitid);
     942        DIRTY(sb->pixel.zoom, g->neg_bitid);
     943        DIRTY(sb->buffer.dirty, g->neg_bitid);
     944        DIRTY(sb->buffer.readBuffer, g->neg_bitid);
     945    }
     946    if (mask & GL_POINT_BIT)
     947    {
     948        if (a->pointStackDepth == 0)
     949        {
     950            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty point stack!" );
     951            return;
     952        }
     953        a->pointStackDepth--;
     954        g->point.pointSmooth = a->pointStack[a->pointStackDepth].pointSmooth;
     955        g->point.pointSize = a->pointStack[a->pointStackDepth].pointSize;
    956956#if GL_ARB_point_sprite
    957                 g->point.pointSprite = a->pointStack[a->pointStackDepth].pointSprite;
    958                 DIRTY(sb->point.enableSprite, g->neg_bitid);
    959                 for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++) {
    960                         g->point.coordReplacement[i] = a->enableStack[a->enableStackDepth].coordReplacement[i];
    961                         DIRTY(sb->point.coordReplacement[i], g->neg_bitid);
    962                 }
    963 #endif
    964                 DIRTY(sb->point.dirty, g->neg_bitid);
    965                 DIRTY(sb->point.size, g->neg_bitid);
    966                 DIRTY(sb->point.enableSmooth, g->neg_bitid);
    967         }
    968         if (mask & GL_POLYGON_BIT)
    969         {
    970                 if (a->polygonStackDepth == 0)
    971                 {
    972                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty polygon stack!" );
    973                         return;
    974                 }
    975                 a->polygonStackDepth--;
    976                 g->polygon.cullFace = a->polygonStack[a->polygonStackDepth].cullFace;
    977                 g->polygon.cullFaceMode = a->polygonStack[a->polygonStackDepth].cullFaceMode;
    978                 g->polygon.frontFace = a->polygonStack[a->polygonStackDepth].frontFace;
    979                 g->polygon.frontMode = a->polygonStack[a->polygonStackDepth].frontMode;
    980                 g->polygon.backMode = a->polygonStack[a->polygonStackDepth].backMode;
    981                 g->polygon.polygonSmooth = a->polygonStack[a->polygonStackDepth].polygonSmooth;
    982                 g->polygon.polygonStipple = a->polygonStack[a->polygonStackDepth].polygonStipple;
    983                 g->polygon.polygonOffsetFill = a->polygonStack[a->polygonStackDepth].polygonOffsetFill;
    984                 g->polygon.polygonOffsetLine = a->polygonStack[a->polygonStackDepth].polygonOffsetLine;
    985                 g->polygon.polygonOffsetPoint = a->polygonStack[a->polygonStackDepth].polygonOffsetPoint;
    986                 g->polygon.offsetFactor = a->polygonStack[a->polygonStackDepth].offsetFactor;
    987                 g->polygon.offsetUnits = a->polygonStack[a->polygonStackDepth].offsetUnits;
    988                 DIRTY(sb->polygon.dirty, g->neg_bitid);
    989                 DIRTY(sb->polygon.enable, g->neg_bitid);
    990                 DIRTY(sb->polygon.offset, g->neg_bitid);
    991                 DIRTY(sb->polygon.mode, g->neg_bitid);
    992                 DIRTY(sb->polygon.stipple, g->neg_bitid);
    993         }
    994         if (mask & GL_POLYGON_STIPPLE_BIT)
    995         {
    996                 if (a->polygonStippleStackDepth == 0)
    997                 {
    998                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty polygon stipple stack!" );
    999                         return;
    1000                 }
    1001                 a->polygonStippleStackDepth--;
    1002                 crMemcpy( g->polygon.stipple, a->polygonStippleStack[a->polygonStippleStackDepth].pattern, 32*sizeof(GLint) );
    1003                 DIRTY(sb->polygon.dirty, g->neg_bitid);
    1004                 DIRTY(sb->polygon.stipple, g->neg_bitid);
    1005         }
    1006         if (mask & GL_SCISSOR_BIT)
    1007         {
    1008                 if (a->scissorStackDepth == 0)
    1009                 {
    1010                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty scissor stack!" );
    1011                         return;
    1012                 }
    1013                 a->scissorStackDepth--;
    1014                 g->viewport.scissorTest = a->scissorStack[a->scissorStackDepth].scissorTest;
    1015                 g->viewport.scissorX = a->scissorStack[a->scissorStackDepth].scissorX;
    1016                 g->viewport.scissorY = a->scissorStack[a->scissorStackDepth].scissorY;
    1017                 g->viewport.scissorW = a->scissorStack[a->scissorStackDepth].scissorW;
    1018                 g->viewport.scissorH = a->scissorStack[a->scissorStackDepth].scissorH;
    1019                 DIRTY(sb->viewport.dirty, g->neg_bitid);
    1020                 DIRTY(sb->viewport.enable, g->neg_bitid);
    1021                 DIRTY(sb->viewport.s_dims, g->neg_bitid);
    1022         }
    1023         if (mask & GL_STENCIL_BUFFER_BIT)
    1024         {
    1025                 if (a->stencilBufferStackDepth == 0)
    1026                 {
    1027                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty stencil stack!" );
    1028                         return;
    1029                 }
    1030                 a->stencilBufferStackDepth--;
    1031                 g->stencil.stencilTest = a->stencilBufferStack[a->stencilBufferStackDepth].stencilTest;
    1032                 g->stencil.func = a->stencilBufferStack[a->stencilBufferStackDepth].func;
    1033                 g->stencil.mask = a->stencilBufferStack[a->stencilBufferStackDepth].mask;
    1034                 g->stencil.ref = a->stencilBufferStack[a->stencilBufferStackDepth].ref;
    1035                 g->stencil.fail = a->stencilBufferStack[a->stencilBufferStackDepth].fail;
    1036                 g->stencil.passDepthFail = a->stencilBufferStack[a->stencilBufferStackDepth].passDepthFail;
    1037                 g->stencil.passDepthPass = a->stencilBufferStack[a->stencilBufferStackDepth].passDepthPass;
    1038                 g->stencil.clearValue = a->stencilBufferStack[a->stencilBufferStackDepth].clearValue;
    1039                 g->stencil.writeMask = a->stencilBufferStack[a->stencilBufferStackDepth].writeMask;
    1040                 DIRTY(sb->stencil.dirty, g->neg_bitid);
    1041                 DIRTY(sb->stencil.enable, g->neg_bitid);
    1042                 DIRTY(sb->stencil.func, g->neg_bitid);
    1043                 DIRTY(sb->stencil.op, g->neg_bitid);
    1044                 DIRTY(sb->stencil.clearValue, g->neg_bitid);
    1045                 DIRTY(sb->stencil.writeMask, g->neg_bitid);
    1046         }
    1047         if (mask & GL_TEXTURE_BIT)
    1048         {
    1049                 CRTextureStack *tState;
    1050                 if (a->textureStackDepth == 0)
    1051                 {
    1052                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty texture stack!" );
    1053                         return;
    1054                 }
    1055                 a->textureStackDepth--;
    1056                 tState = a->textureStack + a->textureStackDepth;
    1057 
    1058                 g->texture.curTextureUnit = tState->curTextureUnit;
    1059                 for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
    1060                 {
    1061                         copy_texunit(&g->texture.unit[i], &tState->unit[i]);
    1062                         /* first, restore the bindings! */
    1063                         g->texture.unit[i].currentTexture1D = crStateTextureGet(GL_TEXTURE_1D, tState->unit[i].Saved1D.name);
    1064                         copy_texobj(g->texture.unit[i].currentTexture1D, &tState->unit[i].Saved1D, GL_FALSE);
    1065                         g->texture.unit[i].currentTexture2D = crStateTextureGet(GL_TEXTURE_2D, tState->unit[i].Saved2D.name);
    1066                         copy_texobj(g->texture.unit[i].currentTexture2D, &tState->unit[i].Saved2D, GL_FALSE);
     957        g->point.pointSprite = a->pointStack[a->pointStackDepth].pointSprite;
     958        DIRTY(sb->point.enableSprite, g->neg_bitid);
     959        for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++) {
     960            g->point.coordReplacement[i] = a->enableStack[a->enableStackDepth].coordReplacement[i];
     961            DIRTY(sb->point.coordReplacement[i], g->neg_bitid);
     962        }
     963#endif
     964        DIRTY(sb->point.dirty, g->neg_bitid);
     965        DIRTY(sb->point.size, g->neg_bitid);
     966        DIRTY(sb->point.enableSmooth, g->neg_bitid);
     967    }
     968    if (mask & GL_POLYGON_BIT)
     969    {
     970        if (a->polygonStackDepth == 0)
     971        {
     972            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty polygon stack!" );
     973            return;
     974        }
     975        a->polygonStackDepth--;
     976        g->polygon.cullFace = a->polygonStack[a->polygonStackDepth].cullFace;
     977        g->polygon.cullFaceMode = a->polygonStack[a->polygonStackDepth].cullFaceMode;
     978        g->polygon.frontFace = a->polygonStack[a->polygonStackDepth].frontFace;
     979        g->polygon.frontMode = a->polygonStack[a->polygonStackDepth].frontMode;
     980        g->polygon.backMode = a->polygonStack[a->polygonStackDepth].backMode;
     981        g->polygon.polygonSmooth = a->polygonStack[a->polygonStackDepth].polygonSmooth;
     982        g->polygon.polygonStipple = a->polygonStack[a->polygonStackDepth].polygonStipple;
     983        g->polygon.polygonOffsetFill = a->polygonStack[a->polygonStackDepth].polygonOffsetFill;
     984        g->polygon.polygonOffsetLine = a->polygonStack[a->polygonStackDepth].polygonOffsetLine;
     985        g->polygon.polygonOffsetPoint = a->polygonStack[a->polygonStackDepth].polygonOffsetPoint;
     986        g->polygon.offsetFactor = a->polygonStack[a->polygonStackDepth].offsetFactor;
     987        g->polygon.offsetUnits = a->polygonStack[a->polygonStackDepth].offsetUnits;
     988        DIRTY(sb->polygon.dirty, g->neg_bitid);
     989        DIRTY(sb->polygon.enable, g->neg_bitid);
     990        DIRTY(sb->polygon.offset, g->neg_bitid);
     991        DIRTY(sb->polygon.mode, g->neg_bitid);
     992        DIRTY(sb->polygon.stipple, g->neg_bitid);
     993    }
     994    if (mask & GL_POLYGON_STIPPLE_BIT)
     995    {
     996        if (a->polygonStippleStackDepth == 0)
     997        {
     998            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty polygon stipple stack!" );
     999            return;
     1000        }
     1001        a->polygonStippleStackDepth--;
     1002        crMemcpy( g->polygon.stipple, a->polygonStippleStack[a->polygonStippleStackDepth].pattern, 32*sizeof(GLint) );
     1003        DIRTY(sb->polygon.dirty, g->neg_bitid);
     1004        DIRTY(sb->polygon.stipple, g->neg_bitid);
     1005    }
     1006    if (mask & GL_SCISSOR_BIT)
     1007    {
     1008        if (a->scissorStackDepth == 0)
     1009        {
     1010            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty scissor stack!" );
     1011            return;
     1012        }
     1013        a->scissorStackDepth--;
     1014        g->viewport.scissorTest = a->scissorStack[a->scissorStackDepth].scissorTest;
     1015        g->viewport.scissorX = a->scissorStack[a->scissorStackDepth].scissorX;
     1016        g->viewport.scissorY = a->scissorStack[a->scissorStackDepth].scissorY;
     1017        g->viewport.scissorW = a->scissorStack[a->scissorStackDepth].scissorW;
     1018        g->viewport.scissorH = a->scissorStack[a->scissorStackDepth].scissorH;
     1019        DIRTY(sb->viewport.dirty, g->neg_bitid);
     1020        DIRTY(sb->viewport.enable, g->neg_bitid);
     1021        DIRTY(sb->viewport.s_dims, g->neg_bitid);
     1022    }
     1023    if (mask & GL_STENCIL_BUFFER_BIT)
     1024    {
     1025        if (a->stencilBufferStackDepth == 0)
     1026        {
     1027            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty stencil stack!" );
     1028            return;
     1029        }
     1030        a->stencilBufferStackDepth--;
     1031        g->stencil.stencilTest = a->stencilBufferStack[a->stencilBufferStackDepth].stencilTest;
     1032        g->stencil.func = a->stencilBufferStack[a->stencilBufferStackDepth].func;
     1033        g->stencil.mask = a->stencilBufferStack[a->stencilBufferStackDepth].mask;
     1034        g->stencil.ref = a->stencilBufferStack[a->stencilBufferStackDepth].ref;
     1035        g->stencil.fail = a->stencilBufferStack[a->stencilBufferStackDepth].fail;
     1036        g->stencil.passDepthFail = a->stencilBufferStack[a->stencilBufferStackDepth].passDepthFail;
     1037        g->stencil.passDepthPass = a->stencilBufferStack[a->stencilBufferStackDepth].passDepthPass;
     1038        g->stencil.clearValue = a->stencilBufferStack[a->stencilBufferStackDepth].clearValue;
     1039        g->stencil.writeMask = a->stencilBufferStack[a->stencilBufferStackDepth].writeMask;
     1040        DIRTY(sb->stencil.dirty, g->neg_bitid);
     1041        DIRTY(sb->stencil.enable, g->neg_bitid);
     1042        DIRTY(sb->stencil.func, g->neg_bitid);
     1043        DIRTY(sb->stencil.op, g->neg_bitid);
     1044        DIRTY(sb->stencil.clearValue, g->neg_bitid);
     1045        DIRTY(sb->stencil.writeMask, g->neg_bitid);
     1046    }
     1047    if (mask & GL_TEXTURE_BIT)
     1048    {
     1049        CRTextureStack *tState;
     1050        if (a->textureStackDepth == 0)
     1051        {
     1052            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty texture stack!" );
     1053            return;
     1054        }
     1055        a->textureStackDepth--;
     1056        tState = a->textureStack + a->textureStackDepth;
     1057
     1058        g->texture.curTextureUnit = tState->curTextureUnit;
     1059        for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
     1060        {
     1061            copy_texunit(&g->texture.unit[i], &tState->unit[i]);
     1062            /* first, restore the bindings! */
     1063            g->texture.unit[i].currentTexture1D = crStateTextureGet(GL_TEXTURE_1D, tState->unit[i].Saved1D.name);
     1064            copy_texobj(g->texture.unit[i].currentTexture1D, &tState->unit[i].Saved1D, GL_FALSE);
     1065            g->texture.unit[i].currentTexture2D = crStateTextureGet(GL_TEXTURE_2D, tState->unit[i].Saved2D.name);
     1066            copy_texobj(g->texture.unit[i].currentTexture2D, &tState->unit[i].Saved2D, GL_FALSE);
    10671067#ifdef CR_OPENGL_VERSION_1_2
    1068                         g->texture.unit[i].currentTexture3D = crStateTextureGet(GL_TEXTURE_3D, tState->unit[i].Saved3D.name);
    1069                         copy_texobj(g->texture.unit[i].currentTexture3D, &tState->unit[i].Saved3D, GL_FALSE);
     1068            g->texture.unit[i].currentTexture3D = crStateTextureGet(GL_TEXTURE_3D, tState->unit[i].Saved3D.name);
     1069            copy_texobj(g->texture.unit[i].currentTexture3D, &tState->unit[i].Saved3D, GL_FALSE);
    10701070#endif
    10711071#ifdef CR_ARB_texture_cube_map
    1072                         g->texture.unit[i].currentTextureCubeMap = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedCubeMap.name);
    1073                         copy_texobj(g->texture.unit[i].currentTextureCubeMap, &tState->unit[i].SavedCubeMap, GL_FALSE);
     1072            g->texture.unit[i].currentTextureCubeMap = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedCubeMap.name);
     1073            copy_texobj(g->texture.unit[i].currentTextureCubeMap, &tState->unit[i].SavedCubeMap, GL_FALSE);
    10741074#endif
    10751075#ifdef CR_NV_texture_rectangle
    1076                         g->texture.unit[i].currentTextureRect = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedRect.name);
    1077                         copy_texobj(g->texture.unit[i].currentTextureRect, &tState->unit[i].SavedRect, GL_FALSE);
    1078 #endif
    1079                 }
    1080                 DIRTY(sb->texture.dirty, g->neg_bitid);
    1081                 for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
    1082                 {
    1083                         DIRTY(sb->texture.enable[i], g->neg_bitid);
    1084                         DIRTY(sb->texture.current[i], g->neg_bitid);
    1085                         DIRTY(sb->texture.objGen[i], g->neg_bitid);
    1086                         DIRTY(sb->texture.eyeGen[i], g->neg_bitid);
    1087                         DIRTY(sb->texture.envBit[i], g->neg_bitid);
    1088                         DIRTY(sb->texture.genMode[i], g->neg_bitid);
    1089                 }
    1090 
    1091                 for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
    1092                 {
    1093                         DIRTY(g->texture.unit[i].currentTexture1D->dirty, g->neg_bitid);
    1094                         DIRTY(g->texture.unit[i].currentTexture2D->dirty, g->neg_bitid);
    1095                         DIRTY(g->texture.unit[i].currentTexture3D->dirty, g->neg_bitid);
     1076            g->texture.unit[i].currentTextureRect = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedRect.name);
     1077            copy_texobj(g->texture.unit[i].currentTextureRect, &tState->unit[i].SavedRect, GL_FALSE);
     1078#endif
     1079        }
     1080        DIRTY(sb->texture.dirty, g->neg_bitid);
     1081        for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
     1082        {
     1083            DIRTY(sb->texture.enable[i], g->neg_bitid);
     1084            DIRTY(sb->texture.current[i], g->neg_bitid);
     1085            DIRTY(sb->texture.objGen[i], g->neg_bitid);
     1086            DIRTY(sb->texture.eyeGen[i], g->neg_bitid);
     1087            DIRTY(sb->texture.envBit[i], g->neg_bitid);
     1088            DIRTY(sb->texture.genMode[i], g->neg_bitid);
     1089        }
     1090
     1091        for (i = 0 ; i < g->limits.maxTextureUnits ; i++)
     1092        {
     1093            DIRTY(g->texture.unit[i].currentTexture1D->dirty, g->neg_bitid);
     1094            DIRTY(g->texture.unit[i].currentTexture2D->dirty, g->neg_bitid);
     1095            DIRTY(g->texture.unit[i].currentTexture3D->dirty, g->neg_bitid);
    10961096#ifdef CR_ARB_texture_cube_map
    1097                         DIRTY(g->texture.unit[i].currentTextureCubeMap->dirty, g->neg_bitid);
     1097            DIRTY(g->texture.unit[i].currentTextureCubeMap->dirty, g->neg_bitid);
    10981098#endif
    10991099#ifdef CR_NV_texture_rectangle
    1100                         DIRTY(g->texture.unit[i].currentTextureRect->dirty, g->neg_bitid);
    1101 #endif
    1102                         DIRTY(g->texture.unit[i].currentTexture1D->paramsBit[i], g->neg_bitid);
    1103                         DIRTY(g->texture.unit[i].currentTexture2D->paramsBit[i], g->neg_bitid);
    1104                         DIRTY(g->texture.unit[i].currentTexture3D->paramsBit[i], g->neg_bitid);
     1100            DIRTY(g->texture.unit[i].currentTextureRect->dirty, g->neg_bitid);
     1101#endif
     1102            DIRTY(g->texture.unit[i].currentTexture1D->paramsBit[i], g->neg_bitid);
     1103            DIRTY(g->texture.unit[i].currentTexture2D->paramsBit[i], g->neg_bitid);
     1104            DIRTY(g->texture.unit[i].currentTexture3D->paramsBit[i], g->neg_bitid);
    11051105#ifdef CR_ARB_texture_cube_map
    1106                         DIRTY(g->texture.unit[i].currentTextureCubeMap->paramsBit[i], g->neg_bitid);
     1106            DIRTY(g->texture.unit[i].currentTextureCubeMap->paramsBit[i], g->neg_bitid);
    11071107#endif
    11081108#ifdef CR_NV_texture_rectangle
    1109                         DIRTY(g->texture.unit[i].currentTextureRect->paramsBit[i], g->neg_bitid);
    1110 #endif
    1111                 }
    1112         }
    1113         if (mask & GL_TRANSFORM_BIT)
    1114         {
    1115                 if (a->transformStackDepth == 0)
    1116                 {
    1117                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty transform stack!" );
    1118                         return;
    1119                 }
    1120                 a->transformStackDepth--;
    1121                 g->transform.matrixMode = a->transformStack[a->transformStackDepth].matrixMode;
    1122                 crStateMatrixMode(g->transform.matrixMode);
    1123                 for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
    1124                 {
    1125                         g->transform.clip[i] = a->transformStack[a->transformStackDepth].clip[i];
    1126                         g->transform.clipPlane[i] = a->transformStack[a->transformStackDepth].clipPlane[i];
    1127                 }
    1128                 g->transform.normalize = a->transformStack[a->transformStackDepth].normalize;
     1109            DIRTY(g->texture.unit[i].currentTextureRect->paramsBit[i], g->neg_bitid);
     1110#endif
     1111        }
     1112    }
     1113    if (mask & GL_TRANSFORM_BIT)
     1114    {
     1115        if (a->transformStackDepth == 0)
     1116        {
     1117            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty transform stack!" );
     1118            return;
     1119        }
     1120        a->transformStackDepth--;
     1121        g->transform.matrixMode = a->transformStack[a->transformStackDepth].matrixMode;
     1122        crStateMatrixMode(g->transform.matrixMode);
     1123        for (i = 0 ; i < g->limits.maxClipPlanes ; i++)
     1124        {
     1125            g->transform.clip[i] = a->transformStack[a->transformStackDepth].clip[i];
     1126            g->transform.clipPlane[i] = a->transformStack[a->transformStackDepth].clipPlane[i];
     1127        }
     1128        g->transform.normalize = a->transformStack[a->transformStackDepth].normalize;
    11291129#ifdef CR_OPENGL_VERSION_1_2
    1130                 g->transform.rescaleNormals = a->transformStack[a->transformStackDepth].rescaleNormals;
    1131 #endif
    1132                 DIRTY(sb->transform.dirty, g->neg_bitid);
    1133                 DIRTY(sb->transform.matrixMode, g->neg_bitid);
    1134                 DIRTY(sb->transform.clipPlane, g->neg_bitid);
    1135                 DIRTY(sb->transform.enable, g->neg_bitid);
    1136         }
    1137         if (mask & GL_VIEWPORT_BIT)
    1138         {
    1139                 if (a->viewportStackDepth == 0)
    1140                 {
    1141                         crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty viewport stack!" );
    1142                         return;
    1143                 }
    1144                 a->viewportStackDepth--;
    1145                 g->viewport.viewportX = a->viewportStack[a->viewportStackDepth].viewportX;
    1146                 g->viewport.viewportY = a->viewportStack[a->viewportStackDepth].viewportY;
    1147                 g->viewport.viewportW = a->viewportStack[a->viewportStackDepth].viewportW;
    1148                 g->viewport.viewportH = a->viewportStack[a->viewportStackDepth].viewportH;
    1149                 g->viewport.nearClip = a->viewportStack[a->viewportStackDepth].nearClip;
    1150                 g->viewport.farClip = a->viewportStack[a->viewportStackDepth].farClip;
    1151                 DIRTY(sb->viewport.dirty, g->neg_bitid);
    1152                 DIRTY(sb->viewport.v_dims, g->neg_bitid);
    1153                 DIRTY(sb->viewport.depth, g->neg_bitid);
    1154         }
    1155         DIRTY(ab->dirty, g->neg_bitid);
     1130        g->transform.rescaleNormals = a->transformStack[a->transformStackDepth].rescaleNormals;
     1131#endif
     1132        DIRTY(sb->transform.dirty, g->neg_bitid);
     1133        DIRTY(sb->transform.matrixMode, g->neg_bitid);
     1134        DIRTY(sb->transform.clipPlane, g->neg_bitid);
     1135        DIRTY(sb->transform.enable, g->neg_bitid);
     1136    }
     1137    if (mask & GL_VIEWPORT_BIT)
     1138    {
     1139        if (a->viewportStackDepth == 0)
     1140        {
     1141            crStateError(__LINE__, __FILE__, GL_STACK_UNDERFLOW, "glPopAttrib called with an empty viewport stack!" );
     1142            return;
     1143        }
     1144        a->viewportStackDepth--;
     1145        g->viewport.viewportX = a->viewportStack[a->viewportStackDepth].viewportX;
     1146        g->viewport.viewportY = a->viewportStack[a->viewportStackDepth].viewportY;
     1147        g->viewport.viewportW = a->viewportStack[a->viewportStackDepth].viewportW;
     1148        g->viewport.viewportH = a->viewportStack[a->viewportStackDepth].viewportH;
     1149        g->viewport.nearClip = a->viewportStack[a->viewportStackDepth].nearClip;
     1150        g->viewport.farClip = a->viewportStack[a->viewportStackDepth].farClip;
     1151        DIRTY(sb->viewport.dirty, g->neg_bitid);
     1152        DIRTY(sb->viewport.v_dims, g->neg_bitid);
     1153        DIRTY(sb->viewport.depth, g->neg_bitid);
     1154    }
     1155    DIRTY(ab->dirty, g->neg_bitid);
    11561156}
    11571157
     
    11591159                          CRContext *fromCtx, CRContext *toCtx )
    11601160{
    1161         CRAttribState *to = &(toCtx->attrib);
    1162         CRAttribState *from = &(fromCtx->attrib);
    1163         if (to->attribStackDepth != 0 || from->attribStackDepth != 0)
    1164         {
    1165                 crWarning( "Trying to switch contexts when the attribute stacks "
    1166                                                         "weren't empty.  Currently, this is not supported." );
    1167         }
    1168         (void) bb;
    1169         (void) bitID;
     1161    CRAttribState *to = &(toCtx->attrib);
     1162    CRAttribState *from = &(fromCtx->attrib);
     1163    if (to->attribStackDepth != 0 || from->attribStackDepth != 0)
     1164    {
     1165        crWarning( "Trying to switch contexts when the attribute stacks "
     1166                            "weren't empty.  Currently, this is not supported." );
     1167    }
     1168    (void) bb;
     1169    (void) bitID;
    11701170}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette