clientattrib.c revision dbe8b013936d977ec63d6607bfd2fc6772d29787
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the "Software"),
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to deal in the Software without restriction, including without limitation
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the rights to use, copy, modify, merge, publish, distribute, sublicense,
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and/or sell copies of the Software, and to permit persons to whom the
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Software is furnished to do so, subject to the following conditions:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * The above copyright notice including the dates of first publication and
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * either this permission notice or a reference to
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * http://oss.sgi.com/projects/FreeB/
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * shall be included in all copies or substantial portions of the Software.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * SOFTWARE.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Except as contained in this notice, the name of Silicon Graphics, Inc.
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * shall not be used in advertising or otherwise to promote the sale, use or
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * other dealings in this Software without prior written authorization from
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Silicon Graphics, Inc.
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "glxclient.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "indirect.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "indirect_vertex_array.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/*****************************************************************************/
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef GLX_USE_APPLEGL
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static void
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)do_enable_disable(GLenum array, GLboolean val)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   __GLXcontext *gc = __glXGetCurrentContext();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned index = 0;
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (array == GL_TEXTURE_COORD_ARRAY) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index = __glXGetActiveTextureUnit(state);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!__glXSetArrayEnable(state, array, index, val)) {
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      __glXSetError(gc, GL_INVALID_ENUM);
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)__indirect_glEnableClientState(GLenum array)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   do_enable_disable(array, GL_TRUE);
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)__indirect_glDisableClientState(GLenum array)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do_enable_disable(array, GL_FALSE);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************/
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__indirect_glPushClientAttrib(GLuint mask)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __GLXcontext *gc = __glXGetCurrentContext();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __GLXattribute **spp = gc->attributes.stackPointer, *sp;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(sp = *spp)) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         sp = (__GLXattribute *) Xmalloc(sizeof(__GLXattribute));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *spp = sp;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sp->mask = mask;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gc->attributes.stackPointer = spp + 1;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         sp->storePack = state->storePack;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         sp->storeUnpack = state->storeUnpack;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         __glXPushArrayState(state);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __glXSetError(gc, GL_STACK_OVERFLOW);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__indirect_glPopClientAttrib(void)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   __GLXcontext *gc = __glXGetCurrentContext();
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   __GLXattribute **spp = gc->attributes.stackPointer, *sp;
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   GLuint mask;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (spp > &gc->attributes.stack[0]) {
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      --spp;
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      sp = *spp;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(sp != 0);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mask = sp->mask;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gc->attributes.stackPointer = spp;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         state->storePack = sp->storePack;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         state->storeUnpack = sp->storeUnpack;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         __glXPopArrayState(state);
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      sp->mask = 0;
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   else {
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      __glXSetError(gc, GL_STACK_UNDERFLOW);
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return;
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   }
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__glFreeAttributeState(__GLXcontext * gc)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   __GLXattribute *sp, **spp;
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (spp = &gc->attributes.stack[0];
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]; spp++) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sp = *spp;
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (sp) {
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         XFree((char *) sp);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      else {
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         break;
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)