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)