updated email addresses
[mesa.git] / src / mesa / array_cache / ac_context.c
1 /* $Id: ac_context.c,v 1.9 2002/10/29 20:28:58 brianp Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 4.1
6 *
7 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * Authors:
27 * Keith Whitwell <keith@tungstengraphics.com>
28 */
29
30 #include "glheader.h"
31 #include "macros.h"
32 #include "imports.h"
33 #include "mmath.h"
34 #include "mtypes.h"
35
36 #include "array_cache/ac_context.h"
37
38
39 /*
40 * Initialize the array fallbacks. That is, by default the fallback arrays
41 * point into the current vertex attribute values in ctx->Current.Attrib[]
42 */
43 static void _ac_fallbacks_init( GLcontext *ctx )
44 {
45 ACcontext *ac = AC_CONTEXT(ctx);
46 struct gl_client_array *cl;
47 GLuint i;
48
49 cl = &ac->Fallback.Normal;
50 cl->Size = 3;
51 cl->Type = GL_FLOAT;
52 cl->Stride = 0;
53 cl->StrideB = 0;
54 cl->Ptr = (void *) ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
55 cl->Enabled = 1;
56 cl->Flags = CA_CLIENT_DATA; /* hack */
57
58 cl = &ac->Fallback.Color;
59 cl->Size = 4;
60 cl->Type = GL_FLOAT;
61 cl->Stride = 0;
62 cl->StrideB = 0;
63 cl->Ptr = (void *) ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
64 cl->Enabled = 1;
65 cl->Flags = CA_CLIENT_DATA; /* hack */
66
67 cl = &ac->Fallback.SecondaryColor;
68 cl->Size = 3;
69 cl->Type = GL_FLOAT;
70 cl->Stride = 0;
71 cl->StrideB = 0;
72 cl->Ptr = (void *) ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
73 cl->Enabled = 1;
74 cl->Flags = CA_CLIENT_DATA; /* hack */
75
76 cl = &ac->Fallback.FogCoord;
77 cl->Size = 1;
78 cl->Type = GL_FLOAT;
79 cl->Stride = 0;
80 cl->StrideB = 0;
81 cl->Ptr = (void *) &ctx->Current.Attrib[VERT_ATTRIB_FOG];
82 cl->Enabled = 1;
83 cl->Flags = CA_CLIENT_DATA; /* hack */
84
85 cl = &ac->Fallback.Index;
86 cl->Size = 1;
87 cl->Type = GL_UNSIGNED_INT;
88 cl->Stride = 0;
89 cl->StrideB = 0;
90 cl->Ptr = (void *) &ctx->Current.Index;
91 cl->Enabled = 1;
92 cl->Flags = CA_CLIENT_DATA; /* hack */
93
94 for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
95 cl = &ac->Fallback.TexCoord[i];
96 cl->Size = 4;
97 cl->Type = GL_FLOAT;
98 cl->Stride = 0;
99 cl->StrideB = 0;
100 cl->Ptr = (void *) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i];
101 cl->Enabled = 1;
102 cl->Flags = CA_CLIENT_DATA; /* hack */
103 }
104
105 cl = &ac->Fallback.EdgeFlag;
106 cl->Size = 1;
107 cl->Type = GL_UNSIGNED_BYTE;
108 cl->Stride = 0;
109 cl->StrideB = 0;
110 cl->Ptr = (void *) &ctx->Current.EdgeFlag;
111 cl->Enabled = 1;
112 cl->Flags = CA_CLIENT_DATA; /* hack */
113
114 for (i = 0; i < VERT_ATTRIB_MAX; i++) {
115 cl = &ac->Fallback.Attrib[i];
116 cl->Size = 4;
117 cl->Type = GL_FLOAT;
118 cl->Stride = 0;
119 cl->StrideB = 0;
120 cl->Ptr = (void *) ctx->Current.Attrib[i];
121 cl->Enabled = 1;
122 cl->Flags = CA_CLIENT_DATA; /* hack */
123 }
124 }
125
126
127 /*
128 * Initialize the array cache pointers, types, strides, etc.
129 */
130 static void _ac_cache_init( GLcontext *ctx )
131 {
132 ACcontext *ac = AC_CONTEXT(ctx);
133 struct gl_client_array *cl;
134 GLuint size = ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES;
135 GLuint i;
136
137 cl = &ac->Cache.Vertex;
138 cl->Size = 4;
139 cl->Type = GL_FLOAT;
140 cl->Stride = 0;
141 cl->StrideB = 4 * sizeof(GLfloat);
142 cl->Ptr = MALLOC( cl->StrideB * size );
143 cl->Enabled = 1;
144 cl->Flags = 0;
145
146 cl = &ac->Cache.Normal;
147 cl->Size = 3;
148 cl->Type = GL_FLOAT;
149 cl->Stride = 0;
150 cl->StrideB = 3 * sizeof(GLfloat);
151 cl->Ptr = MALLOC( cl->StrideB * size );
152 cl->Enabled = 1;
153 cl->Flags = 0;
154
155 cl = &ac->Cache.Color;
156 cl->Size = 4;
157 cl->Type = GL_FLOAT;
158 cl->Stride = 0;
159 cl->StrideB = 4 * sizeof(GLfloat);
160 cl->Ptr = MALLOC( cl->StrideB * size );
161 cl->Enabled = 1;
162 cl->Flags = 0;
163
164 cl = &ac->Cache.SecondaryColor;
165 cl->Size = 3;
166 cl->Type = GL_FLOAT;
167 cl->Stride = 0;
168 cl->StrideB = 4 * sizeof(GLfloat);
169 cl->Ptr = MALLOC( cl->StrideB * size );
170 cl->Enabled = 1;
171 cl->Flags = 0;
172
173 cl = &ac->Cache.FogCoord;
174 cl->Size = 1;
175 cl->Type = GL_FLOAT;
176 cl->Stride = 0;
177 cl->StrideB = sizeof(GLfloat);
178 cl->Ptr = MALLOC( cl->StrideB * size );
179 cl->Enabled = 1;
180 cl->Flags = 0;
181
182 cl = &ac->Cache.Index;
183 cl->Size = 1;
184 cl->Type = GL_UNSIGNED_INT;
185 cl->Stride = 0;
186 cl->StrideB = sizeof(GLuint);
187 cl->Ptr = MALLOC( cl->StrideB * size );
188 cl->Enabled = 1;
189 cl->Flags = 0;
190
191 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
192 cl = &ac->Cache.TexCoord[i];
193 cl->Size = 4;
194 cl->Type = GL_FLOAT;
195 cl->Stride = 0;
196 cl->StrideB = 4 * sizeof(GLfloat);
197 cl->Ptr = MALLOC( cl->StrideB * size );
198 cl->Enabled = 1;
199 cl->Flags = 0;
200 }
201
202 cl = &ac->Cache.EdgeFlag;
203 cl->Size = 1;
204 cl->Type = GL_UNSIGNED_BYTE;
205 cl->Stride = 0;
206 cl->StrideB = sizeof(GLubyte);
207 cl->Ptr = MALLOC( cl->StrideB * size );
208 cl->Enabled = 1;
209 cl->Flags = 0;
210
211 for (i = 0 ; i < VERT_ATTRIB_MAX; i++) {
212 cl = &ac->Cache.Attrib[i];
213 cl->Size = 4;
214 cl->Type = GL_FLOAT;
215 cl->Stride = 0;
216 cl->StrideB = 4 * sizeof(GLfloat);
217 cl->Ptr = MALLOC( cl->StrideB * size );
218 cl->Enabled = 1;
219 cl->Flags = 0;
220 }
221 }
222
223
224 /* This storage used to hold translated client data if type or stride
225 * need to be fixed.
226 */
227 static void _ac_elts_init( GLcontext *ctx )
228 {
229 ACcontext *ac = AC_CONTEXT(ctx);
230 GLuint size = 1000;
231
232 ac->Elts = (GLuint *)MALLOC( sizeof(GLuint) * size );
233 ac->elt_size = size;
234 }
235
236 static void _ac_raw_init( GLcontext *ctx )
237 {
238 ACcontext *ac = AC_CONTEXT(ctx);
239 GLuint i;
240
241 ac->Raw.Color = ac->Fallback.Color;
242 ac->Raw.EdgeFlag = ac->Fallback.EdgeFlag;
243 ac->Raw.FogCoord = ac->Fallback.FogCoord;
244 ac->Raw.Index = ac->Fallback.Index;
245 ac->Raw.Normal = ac->Fallback.Normal;
246 ac->Raw.SecondaryColor = ac->Fallback.SecondaryColor;
247 ac->Raw.Vertex = ctx->Array.Vertex;
248
249 ac->IsCached.Color = GL_FALSE;
250 ac->IsCached.EdgeFlag = GL_FALSE;
251 ac->IsCached.FogCoord = GL_FALSE;
252 ac->IsCached.Index = GL_FALSE;
253 ac->IsCached.Normal = GL_FALSE;
254 ac->IsCached.SecondaryColor = GL_FALSE;
255 ac->IsCached.Vertex = GL_FALSE;
256
257 for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
258 ac->Raw.TexCoord[i] = ac->Fallback.TexCoord[i];
259 ac->IsCached.TexCoord[i] = GL_FALSE;
260 }
261
262 for (i = 0 ; i < VERT_ATTRIB_MAX ; i++) {
263 ac->Raw.Attrib[i] = ac->Fallback.Attrib[i];
264 ac->IsCached.Attrib[i] = GL_FALSE;
265 }
266 }
267
268 GLboolean _ac_CreateContext( GLcontext *ctx )
269 {
270 ctx->acache_context = CALLOC(sizeof(ACcontext));
271 if (ctx->acache_context) {
272 _ac_cache_init( ctx );
273 _ac_fallbacks_init( ctx );
274 _ac_raw_init( ctx );
275 _ac_elts_init( ctx );
276 return GL_TRUE;
277 }
278 return GL_FALSE;
279 }
280
281 void _ac_DestroyContext( GLcontext *ctx )
282 {
283 ACcontext *ac = AC_CONTEXT(ctx);
284 GLint i;
285
286 if (ac->Cache.Vertex.Ptr) FREE( ac->Cache.Vertex.Ptr );
287 if (ac->Cache.Normal.Ptr) FREE( ac->Cache.Normal.Ptr );
288 if (ac->Cache.Color.Ptr) FREE( ac->Cache.Color.Ptr );
289 if (ac->Cache.SecondaryColor.Ptr) FREE( ac->Cache.SecondaryColor.Ptr );
290 if (ac->Cache.EdgeFlag.Ptr) FREE( ac->Cache.EdgeFlag.Ptr );
291 if (ac->Cache.Index.Ptr) FREE( ac->Cache.Index.Ptr );
292 if (ac->Cache.FogCoord.Ptr) FREE( ac->Cache.FogCoord.Ptr );
293
294 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
295 if (ac->Cache.TexCoord[i].Ptr)
296 FREE( ac->Cache.TexCoord[i].Ptr );
297 }
298
299 for (i = 0; i < VERT_ATTRIB_MAX; i++) {
300 if (ac->Cache.Attrib[i].Ptr)
301 FREE( ac->Cache.Attrib[i].Ptr );
302 }
303
304 if (ac->Elts) FREE( ac->Elts );
305
306 /* Free the context structure itself */
307 FREE(ac);
308 ctx->acache_context = NULL;
309 }
310
311 void _ac_InvalidateState( GLcontext *ctx, GLuint new_state )
312 {
313 AC_CONTEXT(ctx)->NewState |= new_state;
314 AC_CONTEXT(ctx)->NewArrayState |= ctx->Array.NewState;
315 }