xref: /aosp_15_r20/external/mesa3d/src/glx/clientattrib.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: SGI-B-2.0
6*61046927SAndroid Build Coastguard Worker  */
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <assert.h>
9*61046927SAndroid Build Coastguard Worker #include "glxclient.h"
10*61046927SAndroid Build Coastguard Worker #include "indirect.h"
11*61046927SAndroid Build Coastguard Worker #include "indirect_vertex_array.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker /*****************************************************************************/
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #if !defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE)
16*61046927SAndroid Build Coastguard Worker static void
do_enable_disable(GLenum array,GLboolean val)17*61046927SAndroid Build Coastguard Worker do_enable_disable(GLenum array, GLboolean val)
18*61046927SAndroid Build Coastguard Worker {
19*61046927SAndroid Build Coastguard Worker    struct glx_context *gc = __glXGetCurrentContext();
20*61046927SAndroid Build Coastguard Worker    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
21*61046927SAndroid Build Coastguard Worker    unsigned index = 0;
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker    if (array == GL_TEXTURE_COORD_ARRAY) {
24*61046927SAndroid Build Coastguard Worker       index = __glXGetActiveTextureUnit(state);
25*61046927SAndroid Build Coastguard Worker    }
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker    if (!__glXSetArrayEnable(state, array, index, val)) {
28*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
29*61046927SAndroid Build Coastguard Worker    }
30*61046927SAndroid Build Coastguard Worker }
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker void
__indirect_glEnableClientState(GLenum array)33*61046927SAndroid Build Coastguard Worker __indirect_glEnableClientState(GLenum array)
34*61046927SAndroid Build Coastguard Worker {
35*61046927SAndroid Build Coastguard Worker    do_enable_disable(array, GL_TRUE);
36*61046927SAndroid Build Coastguard Worker }
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker void
__indirect_glDisableClientState(GLenum array)39*61046927SAndroid Build Coastguard Worker __indirect_glDisableClientState(GLenum array)
40*61046927SAndroid Build Coastguard Worker {
41*61046927SAndroid Build Coastguard Worker    do_enable_disable(array, GL_FALSE);
42*61046927SAndroid Build Coastguard Worker }
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker /************************************************************************/
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker void
__indirect_glPushClientAttrib(GLuint mask)47*61046927SAndroid Build Coastguard Worker __indirect_glPushClientAttrib(GLuint mask)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    struct glx_context *gc = __glXGetCurrentContext();
50*61046927SAndroid Build Coastguard Worker    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
51*61046927SAndroid Build Coastguard Worker    __GLXattribute **spp = gc->attributes.stackPointer, *sp;
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    if (spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]) {
54*61046927SAndroid Build Coastguard Worker       if (!(sp = *spp)) {
55*61046927SAndroid Build Coastguard Worker          sp = malloc(sizeof(__GLXattribute));
56*61046927SAndroid Build Coastguard Worker          if (sp == NULL) {
57*61046927SAndroid Build Coastguard Worker             __glXSetError(gc, GL_OUT_OF_MEMORY);
58*61046927SAndroid Build Coastguard Worker             return;
59*61046927SAndroid Build Coastguard Worker          }
60*61046927SAndroid Build Coastguard Worker          *spp = sp;
61*61046927SAndroid Build Coastguard Worker       }
62*61046927SAndroid Build Coastguard Worker       sp->mask = mask;
63*61046927SAndroid Build Coastguard Worker       gc->attributes.stackPointer = spp + 1;
64*61046927SAndroid Build Coastguard Worker       if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
65*61046927SAndroid Build Coastguard Worker          sp->storePack = state->storePack;
66*61046927SAndroid Build Coastguard Worker          sp->storeUnpack = state->storeUnpack;
67*61046927SAndroid Build Coastguard Worker       }
68*61046927SAndroid Build Coastguard Worker       if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
69*61046927SAndroid Build Coastguard Worker          __glXPushArrayState(state);
70*61046927SAndroid Build Coastguard Worker       }
71*61046927SAndroid Build Coastguard Worker    }
72*61046927SAndroid Build Coastguard Worker    else {
73*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_STACK_OVERFLOW);
74*61046927SAndroid Build Coastguard Worker       return;
75*61046927SAndroid Build Coastguard Worker    }
76*61046927SAndroid Build Coastguard Worker }
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker void
__indirect_glPopClientAttrib(void)79*61046927SAndroid Build Coastguard Worker __indirect_glPopClientAttrib(void)
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker    struct glx_context *gc = __glXGetCurrentContext();
82*61046927SAndroid Build Coastguard Worker    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
83*61046927SAndroid Build Coastguard Worker    __GLXattribute **spp = gc->attributes.stackPointer, *sp;
84*61046927SAndroid Build Coastguard Worker    GLuint mask;
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    if (spp > &gc->attributes.stack[0]) {
87*61046927SAndroid Build Coastguard Worker       --spp;
88*61046927SAndroid Build Coastguard Worker       sp = *spp;
89*61046927SAndroid Build Coastguard Worker       assert(sp != 0);
90*61046927SAndroid Build Coastguard Worker       mask = sp->mask;
91*61046927SAndroid Build Coastguard Worker       gc->attributes.stackPointer = spp;
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker       if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
94*61046927SAndroid Build Coastguard Worker          state->storePack = sp->storePack;
95*61046927SAndroid Build Coastguard Worker          state->storeUnpack = sp->storeUnpack;
96*61046927SAndroid Build Coastguard Worker       }
97*61046927SAndroid Build Coastguard Worker       if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
98*61046927SAndroid Build Coastguard Worker          __glXPopArrayState(state);
99*61046927SAndroid Build Coastguard Worker       }
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker       sp->mask = 0;
102*61046927SAndroid Build Coastguard Worker    }
103*61046927SAndroid Build Coastguard Worker    else {
104*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_STACK_UNDERFLOW);
105*61046927SAndroid Build Coastguard Worker       return;
106*61046927SAndroid Build Coastguard Worker    }
107*61046927SAndroid Build Coastguard Worker }
108*61046927SAndroid Build Coastguard Worker #endif
109