Merge branch 'gallium-0.1' into gallium-0.2
[mesa.git] / src / glx / x11 / clientattrib.c
1 /*
2 ** License Applicability. Except to the extent portions of this file are
3 ** made subject to an alternative license as permitted in the SGI Free
4 ** Software License B, Version 1.1 (the "License"), the contents of this
5 ** file are subject only to the provisions of the License. You may not use
6 ** this file except in compliance with the License. You may obtain a copy
7 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
9 **
10 ** http://oss.sgi.com/projects/FreeB
11 **
12 ** Note that, as provided in the License, the Software is distributed on an
13 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
17 **
18 ** Original Code. The Original Code is: OpenGL Sample Implementation,
19 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21 ** Copyright in any portions created by third parties is as indicated
22 ** elsewhere herein. All Rights Reserved.
23 **
24 ** Additional Notice Provisions: The application programming interfaces
25 ** established by SGI in conjunction with the Original Code are The
26 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29 ** Window System(R) (Version 1.3), released October 19, 1998. This software
30 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31 ** published by SGI, but has not been independently verified as being
32 ** compliant with the OpenGL(R) version 1.2.1 Specification.
33 **
34 */
35
36 #include <assert.h>
37 #include "glxclient.h"
38 #include "indirect.h"
39 #include "indirect_vertex_array.h"
40
41 /*****************************************************************************/
42
43 static void
44 do_enable_disable(GLenum array, GLboolean val )
45 {
46 __GLXcontext *gc = __glXGetCurrentContext();
47 __GLXattribute * state = (__GLXattribute *)(gc->client_state_private);
48 unsigned index = 0;
49
50 if ( array == GL_TEXTURE_COORD_ARRAY ) {
51 index = __glXGetActiveTextureUnit( state );
52 }
53
54 if ( ! __glXSetArrayEnable( state, array, index, val ) ) {
55 __glXSetError(gc, GL_INVALID_ENUM);
56 }
57 }
58
59 void __indirect_glEnableClientState(GLenum array)
60 {
61 do_enable_disable( array, GL_TRUE );
62 }
63
64 void __indirect_glDisableClientState(GLenum array)
65 {
66 do_enable_disable( array, GL_FALSE );
67 }
68
69 /************************************************************************/
70
71 void __indirect_glPushClientAttrib(GLuint mask)
72 {
73 __GLXcontext *gc = __glXGetCurrentContext();
74 __GLXattribute * state = (__GLXattribute *)(gc->client_state_private);
75 __GLXattribute **spp = gc->attributes.stackPointer, *sp;
76
77 if (spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]) {
78 if (!(sp = *spp)) {
79 sp = (__GLXattribute *)Xmalloc(sizeof(__GLXattribute));
80 *spp = sp;
81 }
82 sp->mask = mask;
83 gc->attributes.stackPointer = spp + 1;
84 if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
85 sp->storePack = state->storePack;
86 sp->storeUnpack = state->storeUnpack;
87 }
88 if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
89 __glXPushArrayState( state );
90 }
91 } else {
92 __glXSetError(gc, GL_STACK_OVERFLOW);
93 return;
94 }
95 }
96
97 void __indirect_glPopClientAttrib(void)
98 {
99 __GLXcontext *gc = __glXGetCurrentContext();
100 __GLXattribute * state = (__GLXattribute *)(gc->client_state_private);
101 __GLXattribute **spp = gc->attributes.stackPointer, *sp;
102 GLuint mask;
103
104 if (spp > &gc->attributes.stack[0]) {
105 --spp;
106 sp = *spp;
107 assert(sp != 0);
108 mask = sp->mask;
109 gc->attributes.stackPointer = spp;
110
111 if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
112 state->storePack = sp->storePack;
113 state->storeUnpack = sp->storeUnpack;
114 }
115 if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
116 __glXPopArrayState( state );
117 }
118
119 sp->mask = 0;
120 } else {
121 __glXSetError(gc, GL_STACK_UNDERFLOW);
122 return;
123 }
124 }
125
126 void __glFreeAttributeState(__GLXcontext *gc)
127 {
128 __GLXattribute *sp, **spp;
129
130 for (spp = &gc->attributes.stack[0];
131 spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
132 spp++) {
133 sp = *spp;
134 if (sp) {
135 XFree((char *)sp);
136 } else {
137 break;
138 }
139 }
140 }