Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/glx/clientattrib.c
4558 views
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 = malloc(sizeof(__GLXattribute));
79
if (sp == NULL) {
80
__glXSetError(gc, GL_OUT_OF_MEMORY);
81
return;
82
}
83
*spp = sp;
84
}
85
sp->mask = mask;
86
gc->attributes.stackPointer = spp + 1;
87
if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
88
sp->storePack = state->storePack;
89
sp->storeUnpack = state->storeUnpack;
90
}
91
if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
92
__glXPushArrayState(state);
93
}
94
}
95
else {
96
__glXSetError(gc, GL_STACK_OVERFLOW);
97
return;
98
}
99
}
100
101
void
102
__indirect_glPopClientAttrib(void)
103
{
104
struct glx_context *gc = __glXGetCurrentContext();
105
__GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
106
__GLXattribute **spp = gc->attributes.stackPointer, *sp;
107
GLuint mask;
108
109
if (spp > &gc->attributes.stack[0]) {
110
--spp;
111
sp = *spp;
112
assert(sp != 0);
113
mask = sp->mask;
114
gc->attributes.stackPointer = spp;
115
116
if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
117
state->storePack = sp->storePack;
118
state->storeUnpack = sp->storeUnpack;
119
}
120
if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
121
__glXPopArrayState(state);
122
}
123
124
sp->mask = 0;
125
}
126
else {
127
__glXSetError(gc, GL_STACK_UNDERFLOW);
128
return;
129
}
130
}
131
#endif
132
133
void
134
__glFreeAttributeState(struct glx_context * gc)
135
{
136
__GLXattribute *sp, **spp;
137
138
for (spp = &gc->attributes.stack[0];
139
spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]; spp++) {
140
sp = *spp;
141
if (sp) {
142
free((char *) sp);
143
}
144
else {
145
break;
146
}
147
}
148
}
149
150