Home | History | Annotate | Download | only in glx
      1 /*
      2  * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
      3  * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      9  * and/or sell copies of the Software, and to permit persons to whom the
     10  * Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice including the dates of first publication and
     13  * either this permission notice or a reference to
     14  * http://oss.sgi.com/projects/FreeB/
     15  * shall be included in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20  * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     21  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
     22  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     23  * SOFTWARE.
     24  *
     25  * Except as contained in this notice, the name of Silicon Graphics, Inc.
     26  * shall not be used in advertising or otherwise to promote the sale, use or
     27  * other dealings in this Software without prior written authorization from
     28  * Silicon Graphics, Inc.
     29  */
     30 
     31 #include <assert.h>
     32 #include "glxclient.h"
     33 #include "indirect.h"
     34 #include "indirect_vertex_array.h"
     35 
     36 /*****************************************************************************/
     37 
     38 #ifndef GLX_USE_APPLEGL
     39 static void
     40 do_enable_disable(GLenum array, GLboolean val)
     41 {
     42    struct glx_context *gc = __glXGetCurrentContext();
     43    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
     44    unsigned index = 0;
     45 
     46    if (array == GL_TEXTURE_COORD_ARRAY) {
     47       index = __glXGetActiveTextureUnit(state);
     48    }
     49 
     50    if (!__glXSetArrayEnable(state, array, index, val)) {
     51       __glXSetError(gc, GL_INVALID_ENUM);
     52    }
     53 }
     54 
     55 void
     56 __indirect_glEnableClientState(GLenum array)
     57 {
     58    do_enable_disable(array, GL_TRUE);
     59 }
     60 
     61 void
     62 __indirect_glDisableClientState(GLenum array)
     63 {
     64    do_enable_disable(array, GL_FALSE);
     65 }
     66 
     67 /************************************************************************/
     68 
     69 void
     70 __indirect_glPushClientAttrib(GLuint mask)
     71 {
     72    struct glx_context *gc = __glXGetCurrentContext();
     73    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
     74    __GLXattribute **spp = gc->attributes.stackPointer, *sp;
     75 
     76    if (spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]) {
     77       if (!(sp = *spp)) {
     78          sp = (__GLXattribute *) Xmalloc(sizeof(__GLXattribute));
     79          *spp = sp;
     80       }
     81       sp->mask = mask;
     82       gc->attributes.stackPointer = spp + 1;
     83       if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
     84          sp->storePack = state->storePack;
     85          sp->storeUnpack = state->storeUnpack;
     86       }
     87       if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
     88          __glXPushArrayState(state);
     89       }
     90    }
     91    else {
     92       __glXSetError(gc, GL_STACK_OVERFLOW);
     93       return;
     94    }
     95 }
     96 
     97 void
     98 __indirect_glPopClientAttrib(void)
     99 {
    100    struct glx_context *gc = __glXGetCurrentContext();
    101    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
    102    __GLXattribute **spp = gc->attributes.stackPointer, *sp;
    103    GLuint mask;
    104 
    105    if (spp > &gc->attributes.stack[0]) {
    106       --spp;
    107       sp = *spp;
    108       assert(sp != 0);
    109       mask = sp->mask;
    110       gc->attributes.stackPointer = spp;
    111 
    112       if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
    113          state->storePack = sp->storePack;
    114          state->storeUnpack = sp->storeUnpack;
    115       }
    116       if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
    117          __glXPopArrayState(state);
    118       }
    119 
    120       sp->mask = 0;
    121    }
    122    else {
    123       __glXSetError(gc, GL_STACK_UNDERFLOW);
    124       return;
    125    }
    126 }
    127 #endif
    128 
    129 void
    130 __glFreeAttributeState(struct glx_context * gc)
    131 {
    132    __GLXattribute *sp, **spp;
    133 
    134    for (spp = &gc->attributes.stack[0];
    135         spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]; spp++) {
    136       sp = *spp;
    137       if (sp) {
    138          XFree((char *) sp);
    139       }
    140       else {
    141          break;
    142       }
    143    }
    144 }
    145