1 | /* $Id: state.c,v 1.1 2000-05-23 20:40:54 jeroen Exp $ */
|
---|
2 |
|
---|
3 | /*
|
---|
4 | * Mesa 3-D graphics library
|
---|
5 | * Version: 3.3
|
---|
6 | *
|
---|
7 | * Copyright (C) 1999-2000 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 |
|
---|
27 |
|
---|
28 | /*
|
---|
29 | * This file initializes the immediate-mode dispatch table (which may
|
---|
30 | * be state-dependant) and manages internal Mesa state update.
|
---|
31 | */
|
---|
32 |
|
---|
33 |
|
---|
34 | #ifdef PC_HEADER
|
---|
35 | #include "all.h"
|
---|
36 | #else
|
---|
37 | #include "glheader.h"
|
---|
38 | #include "accum.h"
|
---|
39 | #include "alpha.h"
|
---|
40 | #include "attrib.h"
|
---|
41 | #include "bitmap.h"
|
---|
42 | #include "blend.h"
|
---|
43 | #include "buffers.h"
|
---|
44 | #include "clip.h"
|
---|
45 | #include "colortab.h"
|
---|
46 | #include "context.h"
|
---|
47 | #include "copypix.h"
|
---|
48 | #include "cva.h"
|
---|
49 | #include "depth.h"
|
---|
50 | #include "dlist.h"
|
---|
51 | #include "drawpix.h"
|
---|
52 | #include "enable.h"
|
---|
53 | #include "eval.h"
|
---|
54 | #include "get.h"
|
---|
55 | #include "feedback.h"
|
---|
56 | #include "fog.h"
|
---|
57 | #include "hint.h"
|
---|
58 | #include "imaging.h"
|
---|
59 | #include "light.h"
|
---|
60 | #include "lines.h"
|
---|
61 | #include "logic.h"
|
---|
62 | #include "masking.h"
|
---|
63 | #include "matrix.h"
|
---|
64 | #include "mmath.h"
|
---|
65 | #include "pipeline.h"
|
---|
66 | #include "pixel.h"
|
---|
67 | #include "points.h"
|
---|
68 | #include "polygon.h"
|
---|
69 | #include "quads.h"
|
---|
70 | #include "rastpos.h"
|
---|
71 | #include "readpix.h"
|
---|
72 | #include "rect.h"
|
---|
73 | #include "scissor.h"
|
---|
74 | #include "shade.h"
|
---|
75 | #include "state.h"
|
---|
76 | #include "stencil.h"
|
---|
77 | #include "teximage.h"
|
---|
78 | #include "texobj.h"
|
---|
79 | #include "texstate.h"
|
---|
80 | #include "texture.h"
|
---|
81 | #include "triangle.h"
|
---|
82 | #include "types.h"
|
---|
83 | #include "varray.h"
|
---|
84 | #include "vbfill.h"
|
---|
85 | #include "vbrender.h"
|
---|
86 | #include "winpos.h"
|
---|
87 | #endif
|
---|
88 |
|
---|
89 |
|
---|
90 |
|
---|
91 | static int
|
---|
92 | generic_noop(void)
|
---|
93 | {
|
---|
94 | #ifdef DEBUG
|
---|
95 | gl_problem(NULL, "undefined function dispatch");
|
---|
96 | #endif
|
---|
97 | return 0;
|
---|
98 | }
|
---|
99 |
|
---|
100 |
|
---|
101 | void
|
---|
102 | _mesa_init_no_op_table(struct _glapi_table *table)
|
---|
103 | {
|
---|
104 | /* Check to be sure the dispatcher's table is at least as big as Mesa's. */
|
---|
105 | const GLuint size = sizeof(struct _glapi_table) / sizeof(void *);
|
---|
106 | ASSERT(_glapi_get_dispatch_table_size() >= size);
|
---|
107 |
|
---|
108 | {
|
---|
109 | const GLuint n = _glapi_get_dispatch_table_size();
|
---|
110 | GLuint i;
|
---|
111 | void **dispatch = (void **) table;
|
---|
112 | for (i = 0; i < n; i++) {
|
---|
113 | dispatch[i] = (void *) generic_noop;
|
---|
114 | }
|
---|
115 | }
|
---|
116 | }
|
---|
117 |
|
---|
118 |
|
---|
119 | /*
|
---|
120 | * Initialize the given dispatch table with pointers to Mesa's
|
---|
121 | * immediate-mode commands.
|
---|
122 | */
|
---|
123 | void
|
---|
124 | _mesa_init_exec_table(struct _glapi_table *exec)
|
---|
125 | {
|
---|
126 | /* first initialize all dispatch slots to no-op */
|
---|
127 | _mesa_init_no_op_table(exec);
|
---|
128 |
|
---|
129 | /* load the dispatch slots we understand */
|
---|
130 | exec->Accum = _mesa_Accum;
|
---|
131 | exec->AlphaFunc = _mesa_AlphaFunc;
|
---|
132 | exec->Begin = _mesa_Begin;
|
---|
133 | exec->Bitmap = _mesa_Bitmap;
|
---|
134 | exec->BlendFunc = _mesa_BlendFunc;
|
---|
135 | exec->CallList = _mesa_CallList;
|
---|
136 | exec->CallLists = _mesa_CallLists;
|
---|
137 | exec->Clear = _mesa_Clear;
|
---|
138 | exec->ClearAccum = _mesa_ClearAccum;
|
---|
139 | exec->ClearColor = _mesa_ClearColor;
|
---|
140 | exec->ClearDepth = _mesa_ClearDepth;
|
---|
141 | exec->ClearIndex = _mesa_ClearIndex;
|
---|
142 | exec->ClearStencil = _mesa_ClearStencil;
|
---|
143 | exec->ClipPlane = _mesa_ClipPlane;
|
---|
144 | exec->Color3b = _mesa_Color3b;
|
---|
145 | exec->Color3bv = _mesa_Color3bv;
|
---|
146 | exec->Color3d = _mesa_Color3d;
|
---|
147 | exec->Color3dv = _mesa_Color3dv;
|
---|
148 | exec->Color3f = _mesa_Color3f;
|
---|
149 | exec->Color3fv = _mesa_Color3fv;
|
---|
150 | exec->Color3i = _mesa_Color3i;
|
---|
151 | exec->Color3iv = _mesa_Color3iv;
|
---|
152 | exec->Color3s = _mesa_Color3s;
|
---|
153 | exec->Color3sv = _mesa_Color3sv;
|
---|
154 | exec->Color3ub = _mesa_Color3ub;
|
---|
155 | exec->Color3ubv = _mesa_Color3ubv;
|
---|
156 | exec->Color3ui = _mesa_Color3ui;
|
---|
157 | exec->Color3uiv = _mesa_Color3uiv;
|
---|
158 | exec->Color3us = _mesa_Color3us;
|
---|
159 | exec->Color3usv = _mesa_Color3usv;
|
---|
160 | exec->Color4b = _mesa_Color4b;
|
---|
161 | exec->Color4bv = _mesa_Color4bv;
|
---|
162 | exec->Color4d = _mesa_Color4d;
|
---|
163 | exec->Color4dv = _mesa_Color4dv;
|
---|
164 | exec->Color4f = _mesa_Color4f;
|
---|
165 | exec->Color4fv = _mesa_Color4fv;
|
---|
166 | exec->Color4i = _mesa_Color4i;
|
---|
167 | exec->Color4iv = _mesa_Color4iv;
|
---|
168 | exec->Color4s = _mesa_Color4s;
|
---|
169 | exec->Color4sv = _mesa_Color4sv;
|
---|
170 | exec->Color4ub = _mesa_Color4ub;
|
---|
171 | exec->Color4ubv = _mesa_Color4ubv;
|
---|
172 | exec->Color4ui = _mesa_Color4ui;
|
---|
173 | exec->Color4uiv = _mesa_Color4uiv;
|
---|
174 | exec->Color4us = _mesa_Color4us;
|
---|
175 | exec->Color4usv = _mesa_Color4usv;
|
---|
176 | exec->ColorMask = _mesa_ColorMask;
|
---|
177 | exec->ColorMaterial = _mesa_ColorMaterial;
|
---|
178 | exec->CopyPixels = _mesa_CopyPixels;
|
---|
179 | exec->CullFace = _mesa_CullFace;
|
---|
180 | exec->DeleteLists = _mesa_DeleteLists;
|
---|
181 | exec->DepthFunc = _mesa_DepthFunc;
|
---|
182 | exec->DepthMask = _mesa_DepthMask;
|
---|
183 | exec->DepthRange = _mesa_DepthRange;
|
---|
184 | exec->Disable = _mesa_Disable;
|
---|
185 | exec->DrawBuffer = _mesa_DrawBuffer;
|
---|
186 | exec->DrawPixels = _mesa_DrawPixels;
|
---|
187 | exec->EdgeFlag = _mesa_EdgeFlag;
|
---|
188 | exec->EdgeFlagv = _mesa_EdgeFlagv;
|
---|
189 | exec->Enable = _mesa_Enable;
|
---|
190 | exec->End = _mesa_End;
|
---|
191 | exec->EndList = _mesa_EndList;
|
---|
192 | exec->EvalCoord1d = _mesa_EvalCoord1d;
|
---|
193 | exec->EvalCoord1dv = _mesa_EvalCoord1dv;
|
---|
194 | exec->EvalCoord1f = _mesa_EvalCoord1f;
|
---|
195 | exec->EvalCoord1fv = _mesa_EvalCoord1fv;
|
---|
196 | exec->EvalCoord2d = _mesa_EvalCoord2d;
|
---|
197 | exec->EvalCoord2dv = _mesa_EvalCoord2dv;
|
---|
198 | exec->EvalCoord2f = _mesa_EvalCoord2f;
|
---|
199 | exec->EvalCoord2fv = _mesa_EvalCoord2fv;
|
---|
200 | exec->EvalMesh1 = _mesa_EvalMesh1;
|
---|
201 | exec->EvalMesh2 = _mesa_EvalMesh2;
|
---|
202 | exec->EvalPoint1 = _mesa_EvalPoint1;
|
---|
203 | exec->EvalPoint2 = _mesa_EvalPoint2;
|
---|
204 | exec->FeedbackBuffer = _mesa_FeedbackBuffer;
|
---|
205 | exec->Finish = _mesa_Finish;
|
---|
206 | exec->Flush = _mesa_Flush;
|
---|
207 | exec->Fogf = _mesa_Fogf;
|
---|
208 | exec->Fogfv = _mesa_Fogfv;
|
---|
209 | exec->Fogi = _mesa_Fogi;
|
---|
210 | exec->Fogiv = _mesa_Fogiv;
|
---|
211 | exec->FrontFace = _mesa_FrontFace;
|
---|
212 | exec->Frustum = _mesa_Frustum;
|
---|
213 | exec->GenLists = _mesa_GenLists;
|
---|
214 | exec->GetBooleanv = _mesa_GetBooleanv;
|
---|
215 | exec->GetClipPlane = _mesa_GetClipPlane;
|
---|
216 | exec->GetDoublev = _mesa_GetDoublev;
|
---|
217 | exec->GetError = _mesa_GetError;
|
---|
218 | exec->GetFloatv = _mesa_GetFloatv;
|
---|
219 | exec->GetIntegerv = _mesa_GetIntegerv;
|
---|
220 | exec->GetLightfv = _mesa_GetLightfv;
|
---|
221 | exec->GetLightiv = _mesa_GetLightiv;
|
---|
222 | exec->GetMapdv = _mesa_GetMapdv;
|
---|
223 | exec->GetMapfv = _mesa_GetMapfv;
|
---|
224 | exec->GetMapiv = _mesa_GetMapiv;
|
---|
225 | exec->GetMaterialfv = _mesa_GetMaterialfv;
|
---|
226 | exec->GetMaterialiv = _mesa_GetMaterialiv;
|
---|
227 | exec->GetPixelMapfv = _mesa_GetPixelMapfv;
|
---|
228 | exec->GetPixelMapuiv = _mesa_GetPixelMapuiv;
|
---|
229 | exec->GetPixelMapusv = _mesa_GetPixelMapusv;
|
---|
230 | exec->GetPolygonStipple = _mesa_GetPolygonStipple;
|
---|
231 | exec->GetString = _mesa_GetString;
|
---|
232 | exec->GetTexEnvfv = _mesa_GetTexEnvfv;
|
---|
233 | exec->GetTexEnviv = _mesa_GetTexEnviv;
|
---|
234 | exec->GetTexGendv = _mesa_GetTexGendv;
|
---|
235 | exec->GetTexGenfv = _mesa_GetTexGenfv;
|
---|
236 | exec->GetTexGeniv = _mesa_GetTexGeniv;
|
---|
237 | exec->GetTexImage = _mesa_GetTexImage;
|
---|
238 | exec->GetTexLevelParameterfv = _mesa_GetTexLevelParameterfv;
|
---|
239 | exec->GetTexLevelParameteriv = _mesa_GetTexLevelParameteriv;
|
---|
240 | exec->GetTexParameterfv = _mesa_GetTexParameterfv;
|
---|
241 | exec->GetTexParameteriv = _mesa_GetTexParameteriv;
|
---|
242 | exec->Hint = _mesa_Hint;
|
---|
243 | exec->IndexMask = _mesa_IndexMask;
|
---|
244 | exec->Indexd = _mesa_Indexd;
|
---|
245 | exec->Indexdv = _mesa_Indexdv;
|
---|
246 | exec->Indexf = _mesa_Indexf;
|
---|
247 | exec->Indexfv = _mesa_Indexfv;
|
---|
248 | exec->Indexi = _mesa_Indexi;
|
---|
249 | exec->Indexiv = _mesa_Indexiv;
|
---|
250 | exec->Indexs = _mesa_Indexs;
|
---|
251 | exec->Indexsv = _mesa_Indexsv;
|
---|
252 | exec->InitNames = _mesa_InitNames;
|
---|
253 | exec->IsEnabled = _mesa_IsEnabled;
|
---|
254 | exec->IsList = _mesa_IsList;
|
---|
255 | exec->LightModelf = _mesa_LightModelf;
|
---|
256 | exec->LightModelfv = _mesa_LightModelfv;
|
---|
257 | exec->LightModeli = _mesa_LightModeli;
|
---|
258 | exec->LightModeliv = _mesa_LightModeliv;
|
---|
259 | exec->Lightf = _mesa_Lightf;
|
---|
260 | exec->Lightfv = _mesa_Lightfv;
|
---|
261 | exec->Lighti = _mesa_Lighti;
|
---|
262 | exec->Lightiv = _mesa_Lightiv;
|
---|
263 | exec->LineStipple = _mesa_LineStipple;
|
---|
264 | exec->LineWidth = _mesa_LineWidth;
|
---|
265 | exec->ListBase = _mesa_ListBase;
|
---|
266 | exec->LoadIdentity = _mesa_LoadIdentity;
|
---|
267 | exec->LoadMatrixd = _mesa_LoadMatrixd;
|
---|
268 | exec->LoadMatrixf = _mesa_LoadMatrixf;
|
---|
269 | exec->LoadName = _mesa_LoadName;
|
---|
270 | exec->LogicOp = _mesa_LogicOp;
|
---|
271 | exec->Map1d = _mesa_Map1d;
|
---|
272 | exec->Map1f = _mesa_Map1f;
|
---|
273 | exec->Map2d = _mesa_Map2d;
|
---|
274 | exec->Map2f = _mesa_Map2f;
|
---|
275 | exec->MapGrid1d = _mesa_MapGrid1d;
|
---|
276 | exec->MapGrid1f = _mesa_MapGrid1f;
|
---|
277 | exec->MapGrid2d = _mesa_MapGrid2d;
|
---|
278 | exec->MapGrid2f = _mesa_MapGrid2f;
|
---|
279 | exec->Materialf = _mesa_Materialf;
|
---|
280 | exec->Materialfv = _mesa_Materialfv;
|
---|
281 | exec->Materiali = _mesa_Materiali;
|
---|
282 | exec->Materialiv = _mesa_Materialiv;
|
---|
283 | exec->MatrixMode = _mesa_MatrixMode;
|
---|
284 | exec->MultMatrixd = _mesa_MultMatrixd;
|
---|
285 | exec->MultMatrixf = _mesa_MultMatrixf;
|
---|
286 | exec->NewList = _mesa_NewList;
|
---|
287 | exec->Normal3b = _mesa_Normal3b;
|
---|
288 | exec->Normal3bv = _mesa_Normal3bv;
|
---|
289 | exec->Normal3d = _mesa_Normal3d;
|
---|
290 | exec->Normal3dv = _mesa_Normal3dv;
|
---|
291 | exec->Normal3f = _mesa_Normal3f;
|
---|
292 | exec->Normal3fv = _mesa_Normal3fv;
|
---|
293 | exec->Normal3i = _mesa_Normal3i;
|
---|
294 | exec->Normal3iv = _mesa_Normal3iv;
|
---|
295 | exec->Normal3s = _mesa_Normal3s;
|
---|
296 | exec->Normal3sv = _mesa_Normal3sv;
|
---|
297 | exec->Ortho = _mesa_Ortho;
|
---|
298 | exec->PassThrough = _mesa_PassThrough;
|
---|
299 | exec->PixelMapfv = _mesa_PixelMapfv;
|
---|
300 | exec->PixelMapuiv = _mesa_PixelMapuiv;
|
---|
301 | exec->PixelMapusv = _mesa_PixelMapusv;
|
---|
302 | exec->PixelStoref = _mesa_PixelStoref;
|
---|
303 | exec->PixelStorei = _mesa_PixelStorei;
|
---|
304 | exec->PixelTransferf = _mesa_PixelTransferf;
|
---|
305 | exec->PixelTransferi = _mesa_PixelTransferi;
|
---|
306 | exec->PixelZoom = _mesa_PixelZoom;
|
---|
307 | exec->PointSize = _mesa_PointSize;
|
---|
308 | exec->PolygonMode = _mesa_PolygonMode;
|
---|
309 | exec->PolygonOffset = _mesa_PolygonOffset;
|
---|
310 | exec->PolygonStipple = _mesa_PolygonStipple;
|
---|
311 | exec->PopAttrib = _mesa_PopAttrib;
|
---|
312 | exec->PopMatrix = _mesa_PopMatrix;
|
---|
313 | exec->PopName = _mesa_PopName;
|
---|
314 | exec->PushAttrib = _mesa_PushAttrib;
|
---|
315 | exec->PushMatrix = _mesa_PushMatrix;
|
---|
316 | exec->PushName = _mesa_PushName;
|
---|
317 | exec->RasterPos2d = _mesa_RasterPos2d;
|
---|
318 | exec->RasterPos2dv = _mesa_RasterPos2dv;
|
---|
319 | exec->RasterPos2f = _mesa_RasterPos2f;
|
---|
320 | exec->RasterPos2fv = _mesa_RasterPos2fv;
|
---|
321 | exec->RasterPos2i = _mesa_RasterPos2i;
|
---|
322 | exec->RasterPos2iv = _mesa_RasterPos2iv;
|
---|
323 | exec->RasterPos2s = _mesa_RasterPos2s;
|
---|
324 | exec->RasterPos2sv = _mesa_RasterPos2sv;
|
---|
325 | exec->RasterPos3d = _mesa_RasterPos3d;
|
---|
326 | exec->RasterPos3dv = _mesa_RasterPos3dv;
|
---|
327 | exec->RasterPos3f = _mesa_RasterPos3f;
|
---|
328 | exec->RasterPos3fv = _mesa_RasterPos3fv;
|
---|
329 | exec->RasterPos3i = _mesa_RasterPos3i;
|
---|
330 | exec->RasterPos3iv = _mesa_RasterPos3iv;
|
---|
331 | exec->RasterPos3s = _mesa_RasterPos3s;
|
---|
332 | exec->RasterPos3sv = _mesa_RasterPos3sv;
|
---|
333 | exec->RasterPos4d = _mesa_RasterPos4d;
|
---|
334 | exec->RasterPos4dv = _mesa_RasterPos4dv;
|
---|
335 | exec->RasterPos4f = _mesa_RasterPos4f;
|
---|
336 | exec->RasterPos4fv = _mesa_RasterPos4fv;
|
---|
337 | exec->RasterPos4i = _mesa_RasterPos4i;
|
---|
338 | exec->RasterPos4iv = _mesa_RasterPos4iv;
|
---|
339 | exec->RasterPos4s = _mesa_RasterPos4s;
|
---|
340 | exec->RasterPos4sv = _mesa_RasterPos4sv;
|
---|
341 | exec->ReadBuffer = _mesa_ReadBuffer;
|
---|
342 | exec->ReadPixels = _mesa_ReadPixels;
|
---|
343 | exec->Rectd = _mesa_Rectd;
|
---|
344 | exec->Rectdv = _mesa_Rectdv;
|
---|
345 | exec->Rectf = _mesa_Rectf;
|
---|
346 | exec->Rectfv = _mesa_Rectfv;
|
---|
347 | exec->Recti = _mesa_Recti;
|
---|
348 | exec->Rectiv = _mesa_Rectiv;
|
---|
349 | exec->Rects = _mesa_Rects;
|
---|
350 | exec->Rectsv = _mesa_Rectsv;
|
---|
351 | exec->RenderMode = _mesa_RenderMode;
|
---|
352 | exec->Rotated = _mesa_Rotated;
|
---|
353 | exec->Rotatef = _mesa_Rotatef;
|
---|
354 | exec->Scaled = _mesa_Scaled;
|
---|
355 | exec->Scalef = _mesa_Scalef;
|
---|
356 | exec->Scissor = _mesa_Scissor;
|
---|
357 | exec->SelectBuffer = _mesa_SelectBuffer;
|
---|
358 | exec->ShadeModel = _mesa_ShadeModel;
|
---|
359 | exec->StencilFunc = _mesa_StencilFunc;
|
---|
360 | exec->StencilMask = _mesa_StencilMask;
|
---|
361 | exec->StencilOp = _mesa_StencilOp;
|
---|
362 | exec->TexCoord1d = _mesa_TexCoord1d;
|
---|
363 | exec->TexCoord1dv = _mesa_TexCoord1dv;
|
---|
364 | exec->TexCoord1f = _mesa_TexCoord1f;
|
---|
365 | exec->TexCoord1fv = _mesa_TexCoord1fv;
|
---|
366 | exec->TexCoord1i = _mesa_TexCoord1i;
|
---|
367 | exec->TexCoord1iv = _mesa_TexCoord1iv;
|
---|
368 | exec->TexCoord1s = _mesa_TexCoord1s;
|
---|
369 | exec->TexCoord1sv = _mesa_TexCoord1sv;
|
---|
370 | exec->TexCoord2d = _mesa_TexCoord2d;
|
---|
371 | exec->TexCoord2dv = _mesa_TexCoord2dv;
|
---|
372 | exec->TexCoord2f = _mesa_TexCoord2f;
|
---|
373 | exec->TexCoord2fv = _mesa_TexCoord2fv;
|
---|
374 | exec->TexCoord2i = _mesa_TexCoord2i;
|
---|
375 | exec->TexCoord2iv = _mesa_TexCoord2iv;
|
---|
376 | exec->TexCoord2s = _mesa_TexCoord2s;
|
---|
377 | exec->TexCoord2sv = _mesa_TexCoord2sv;
|
---|
378 | exec->TexCoord3d = _mesa_TexCoord3d;
|
---|
379 | exec->TexCoord3dv = _mesa_TexCoord3dv;
|
---|
380 | exec->TexCoord3f = _mesa_TexCoord3f;
|
---|
381 | exec->TexCoord3fv = _mesa_TexCoord3fv;
|
---|
382 | exec->TexCoord3i = _mesa_TexCoord3i;
|
---|
383 | exec->TexCoord3iv = _mesa_TexCoord3iv;
|
---|
384 | exec->TexCoord3s = _mesa_TexCoord3s;
|
---|
385 | exec->TexCoord3sv = _mesa_TexCoord3sv;
|
---|
386 | exec->TexCoord4d = _mesa_TexCoord4d;
|
---|
387 | exec->TexCoord4dv = _mesa_TexCoord4dv;
|
---|
388 | exec->TexCoord4f = _mesa_TexCoord4f;
|
---|
389 | exec->TexCoord4fv = _mesa_TexCoord4fv;
|
---|
390 | exec->TexCoord4i = _mesa_TexCoord4i;
|
---|
391 | exec->TexCoord4iv = _mesa_TexCoord4iv;
|
---|
392 | exec->TexCoord4s = _mesa_TexCoord4s;
|
---|
393 | exec->TexCoord4sv = _mesa_TexCoord4sv;
|
---|
394 | exec->TexEnvf = _mesa_TexEnvf;
|
---|
395 | exec->TexEnvfv = _mesa_TexEnvfv;
|
---|
396 | exec->TexEnvi = _mesa_TexEnvi;
|
---|
397 | exec->TexEnviv = _mesa_TexEnviv;
|
---|
398 | exec->TexGend = _mesa_TexGend;
|
---|
399 | exec->TexGendv = _mesa_TexGendv;
|
---|
400 | exec->TexGenf = _mesa_TexGenf;
|
---|
401 | exec->TexGenfv = _mesa_TexGenfv;
|
---|
402 | exec->TexGeni = _mesa_TexGeni;
|
---|
403 | exec->TexGeniv = _mesa_TexGeniv;
|
---|
404 | exec->TexImage1D = _mesa_TexImage1D;
|
---|
405 | exec->TexImage2D = _mesa_TexImage2D;
|
---|
406 | exec->TexParameterf = _mesa_TexParameterf;
|
---|
407 | exec->TexParameterfv = _mesa_TexParameterfv;
|
---|
408 | exec->TexParameteri = _mesa_TexParameteri;
|
---|
409 | exec->TexParameteriv = _mesa_TexParameteriv;
|
---|
410 | exec->Translated = _mesa_Translated;
|
---|
411 | exec->Translatef = _mesa_Translatef;
|
---|
412 | exec->Vertex2d = _mesa_Vertex2d;
|
---|
413 | exec->Vertex2dv = _mesa_Vertex2dv;
|
---|
414 | exec->Vertex2f = _mesa_Vertex2f;
|
---|
415 | exec->Vertex2fv = _mesa_Vertex2fv;
|
---|
416 | exec->Vertex2i = _mesa_Vertex2i;
|
---|
417 | exec->Vertex2iv = _mesa_Vertex2iv;
|
---|
418 | exec->Vertex2s = _mesa_Vertex2s;
|
---|
419 | exec->Vertex2sv = _mesa_Vertex2sv;
|
---|
420 | exec->Vertex3d = _mesa_Vertex3d;
|
---|
421 | exec->Vertex3dv = _mesa_Vertex3dv;
|
---|
422 | exec->Vertex3f = _mesa_Vertex3f;
|
---|
423 | exec->Vertex3fv = _mesa_Vertex3fv;
|
---|
424 | exec->Vertex3i = _mesa_Vertex3i;
|
---|
425 | exec->Vertex3iv = _mesa_Vertex3iv;
|
---|
426 | exec->Vertex3s = _mesa_Vertex3s;
|
---|
427 | exec->Vertex3sv = _mesa_Vertex3sv;
|
---|
428 | exec->Vertex4d = _mesa_Vertex4d;
|
---|
429 | exec->Vertex4dv = _mesa_Vertex4dv;
|
---|
430 | exec->Vertex4f = _mesa_Vertex4f;
|
---|
431 | exec->Vertex4fv = _mesa_Vertex4fv;
|
---|
432 | exec->Vertex4i = _mesa_Vertex4i;
|
---|
433 | exec->Vertex4iv = _mesa_Vertex4iv;
|
---|
434 | exec->Vertex4s = _mesa_Vertex4s;
|
---|
435 | exec->Vertex4sv = _mesa_Vertex4sv;
|
---|
436 | exec->Viewport = _mesa_Viewport;
|
---|
437 |
|
---|
438 | /* 1.1 */
|
---|
439 | exec->AreTexturesResident = _mesa_AreTexturesResident;
|
---|
440 | exec->ArrayElement = _mesa_ArrayElement;
|
---|
441 | exec->BindTexture = _mesa_BindTexture;
|
---|
442 | exec->ColorPointer = _mesa_ColorPointer;
|
---|
443 | exec->CopyTexImage1D = _mesa_CopyTexImage1D;
|
---|
444 | exec->CopyTexImage2D = _mesa_CopyTexImage2D;
|
---|
445 | exec->CopyTexSubImage1D = _mesa_CopyTexSubImage1D;
|
---|
446 | exec->CopyTexSubImage2D = _mesa_CopyTexSubImage2D;
|
---|
447 | exec->DeleteTextures = _mesa_DeleteTextures;
|
---|
448 | exec->DisableClientState = _mesa_DisableClientState;
|
---|
449 | exec->DrawArrays = _mesa_DrawArrays;
|
---|
450 | exec->DrawElements = _mesa_DrawElements;
|
---|
451 | exec->EdgeFlagPointer = _mesa_EdgeFlagPointer;
|
---|
452 | exec->EnableClientState = _mesa_EnableClientState;
|
---|
453 | exec->GenTextures = _mesa_GenTextures;
|
---|
454 | exec->GetPointerv = _mesa_GetPointerv;
|
---|
455 | exec->IndexPointer = _mesa_IndexPointer;
|
---|
456 | exec->Indexub = _mesa_Indexub;
|
---|
457 | exec->Indexubv = _mesa_Indexubv;
|
---|
458 | exec->InterleavedArrays = _mesa_InterleavedArrays;
|
---|
459 | exec->IsTexture = _mesa_IsTexture;
|
---|
460 | exec->NormalPointer = _mesa_NormalPointer;
|
---|
461 | exec->PopClientAttrib = _mesa_PopClientAttrib;
|
---|
462 | exec->PrioritizeTextures = _mesa_PrioritizeTextures;
|
---|
463 | exec->PushClientAttrib = _mesa_PushClientAttrib;
|
---|
464 | exec->TexCoordPointer = _mesa_TexCoordPointer;
|
---|
465 | exec->TexSubImage1D = _mesa_TexSubImage1D;
|
---|
466 | exec->TexSubImage2D = _mesa_TexSubImage2D;
|
---|
467 | exec->VertexPointer = _mesa_VertexPointer;
|
---|
468 |
|
---|
469 | /* 1.2 */
|
---|
470 | exec->CopyTexSubImage3D = _mesa_CopyTexSubImage3D;
|
---|
471 | exec->DrawRangeElements = _mesa_DrawRangeElements;
|
---|
472 | exec->TexImage3D = _mesa_TexImage3D;
|
---|
473 | exec->TexSubImage3D = _mesa_TexSubImage3D;
|
---|
474 |
|
---|
475 |
|
---|
476 | /* OpenGL 1.2 GL_ARB_imaging */
|
---|
477 | exec->BlendColor = _mesa_BlendColor;
|
---|
478 | exec->BlendEquation = _mesa_BlendEquation;
|
---|
479 | exec->ColorSubTable = _mesa_ColorSubTable;
|
---|
480 | exec->ColorTable = _mesa_ColorTable;
|
---|
481 | exec->ColorTableParameterfv = _mesa_ColorTableParameterfv;
|
---|
482 | exec->ColorTableParameteriv = _mesa_ColorTableParameteriv;
|
---|
483 | exec->ConvolutionFilter1D = _mesa_ConvolutionFilter1D;
|
---|
484 | exec->ConvolutionFilter2D = _mesa_ConvolutionFilter2D;
|
---|
485 | exec->ConvolutionParameterf = _mesa_ConvolutionParameterf;
|
---|
486 | exec->ConvolutionParameterfv = _mesa_ConvolutionParameterfv;
|
---|
487 | exec->ConvolutionParameteri = _mesa_ConvolutionParameteri;
|
---|
488 | exec->ConvolutionParameteriv = _mesa_ConvolutionParameteriv;
|
---|
489 | exec->CopyColorSubTable = _mesa_CopyColorSubTable;
|
---|
490 | exec->CopyColorTable = _mesa_CopyColorTable;
|
---|
491 | exec->CopyConvolutionFilter1D = _mesa_CopyConvolutionFilter1D;
|
---|
492 | exec->CopyConvolutionFilter2D = _mesa_CopyConvolutionFilter2D;
|
---|
493 | exec->GetColorTable = _mesa_GetColorTable;
|
---|
494 | exec->GetColorTableParameterfv = _mesa_GetColorTableParameterfv;
|
---|
495 | exec->GetColorTableParameteriv = _mesa_GetColorTableParameteriv;
|
---|
496 | exec->GetConvolutionFilter = _mesa_GetConvolutionFilter;
|
---|
497 | exec->GetConvolutionParameterfv = _mesa_GetConvolutionParameterfv;
|
---|
498 | exec->GetConvolutionParameteriv = _mesa_GetConvolutionParameteriv;
|
---|
499 | exec->GetHistogram = _mesa_GetHistogram;
|
---|
500 | exec->GetHistogramParameterfv = _mesa_GetHistogramParameterfv;
|
---|
501 | exec->GetHistogramParameteriv = _mesa_GetHistogramParameteriv;
|
---|
502 | exec->GetMinmax = _mesa_GetMinmax;
|
---|
503 | exec->GetMinmaxParameterfv = _mesa_GetMinmaxParameterfv;
|
---|
504 | exec->GetMinmaxParameteriv = _mesa_GetMinmaxParameteriv;
|
---|
505 | exec->GetSeparableFilter = _mesa_GetSeparableFilter;
|
---|
506 | exec->Histogram = _mesa_Histogram;
|
---|
507 | exec->Minmax = _mesa_Minmax;
|
---|
508 | exec->ResetHistogram = _mesa_ResetHistogram;
|
---|
509 | exec->ResetMinmax = _mesa_ResetMinmax;
|
---|
510 | exec->SeparableFilter2D = _mesa_SeparableFilter2D;
|
---|
511 |
|
---|
512 | /* GL_EXT_texture3d */
|
---|
513 | #if 0
|
---|
514 | exec->CopyTexSubImage3DEXT = _mesa_CopyTexSubImage3D;
|
---|
515 | exec->TexImage3DEXT = _mesa_TexImage3DEXT;
|
---|
516 | exec->TexSubImage3DEXT = _mesa_TexSubImage3D;
|
---|
517 | #endif
|
---|
518 |
|
---|
519 | /* GL_EXT_paletted_texture */
|
---|
520 | #if 0
|
---|
521 | exec->ColorTableEXT = _mesa_ColorTableEXT;
|
---|
522 | exec->ColorSubTableEXT = _mesa_ColorSubTableEXT;
|
---|
523 | #endif
|
---|
524 | exec->GetColorTableEXT = _mesa_GetColorTable;
|
---|
525 | exec->GetColorTableParameterfvEXT = _mesa_GetColorTableParameterfv;
|
---|
526 | exec->GetColorTableParameterivEXT = _mesa_GetColorTableParameteriv;
|
---|
527 |
|
---|
528 | /* GL_EXT_compiled_vertex_array */
|
---|
529 | exec->LockArraysEXT = _mesa_LockArraysEXT;
|
---|
530 | exec->UnlockArraysEXT = _mesa_UnlockArraysEXT;
|
---|
531 |
|
---|
532 | /* GL_EXT_point_parameters */
|
---|
533 | exec->PointParameterfEXT = _mesa_PointParameterfEXT;
|
---|
534 | exec->PointParameterfvEXT = _mesa_PointParameterfvEXT;
|
---|
535 |
|
---|
536 | /* GL_PGI_misc_hints */
|
---|
537 | exec->HintPGI = _mesa_HintPGI;
|
---|
538 |
|
---|
539 | /* GL_EXT_polygon_offset */
|
---|
540 | exec->PolygonOffsetEXT = _mesa_PolygonOffsetEXT;
|
---|
541 |
|
---|
542 | /* GL_EXT_blend_minmax */
|
---|
543 | #if 0
|
---|
544 | exec->BlendEquationEXT = _mesa_BlendEquationEXT;
|
---|
545 | #endif
|
---|
546 |
|
---|
547 | /* GL_EXT_blend_color */
|
---|
548 | #if 0
|
---|
549 | exec->BlendColorEXT = _mesa_BlendColorEXT;
|
---|
550 | #endif
|
---|
551 |
|
---|
552 | /* GL_ARB_multitexture */
|
---|
553 | exec->ActiveTextureARB = _mesa_ActiveTextureARB;
|
---|
554 | exec->ClientActiveTextureARB = _mesa_ClientActiveTextureARB;
|
---|
555 | exec->MultiTexCoord1dARB = _mesa_MultiTexCoord1dARB;
|
---|
556 | exec->MultiTexCoord1dvARB = _mesa_MultiTexCoord1dvARB;
|
---|
557 | exec->MultiTexCoord1fARB = _mesa_MultiTexCoord1fARB;
|
---|
558 | exec->MultiTexCoord1fvARB = _mesa_MultiTexCoord1fvARB;
|
---|
559 | exec->MultiTexCoord1iARB = _mesa_MultiTexCoord1iARB;
|
---|
560 | exec->MultiTexCoord1ivARB = _mesa_MultiTexCoord1ivARB;
|
---|
561 | exec->MultiTexCoord1sARB = _mesa_MultiTexCoord1sARB;
|
---|
562 | exec->MultiTexCoord1svARB = _mesa_MultiTexCoord1svARB;
|
---|
563 | exec->MultiTexCoord2dARB = _mesa_MultiTexCoord2dARB;
|
---|
564 | exec->MultiTexCoord2dvARB = _mesa_MultiTexCoord2dvARB;
|
---|
565 | exec->MultiTexCoord2fARB = _mesa_MultiTexCoord2fARB;
|
---|
566 | exec->MultiTexCoord2fvARB = _mesa_MultiTexCoord2fvARB;
|
---|
567 | exec->MultiTexCoord2iARB = _mesa_MultiTexCoord2iARB;
|
---|
568 | exec->MultiTexCoord2ivARB = _mesa_MultiTexCoord2ivARB;
|
---|
569 | exec->MultiTexCoord2sARB = _mesa_MultiTexCoord2sARB;
|
---|
570 | exec->MultiTexCoord2svARB = _mesa_MultiTexCoord2svARB;
|
---|
571 | exec->MultiTexCoord3dARB = _mesa_MultiTexCoord3dARB;
|
---|
572 | exec->MultiTexCoord3dvARB = _mesa_MultiTexCoord3dvARB;
|
---|
573 | exec->MultiTexCoord3fARB = _mesa_MultiTexCoord3fARB;
|
---|
574 | exec->MultiTexCoord3fvARB = _mesa_MultiTexCoord3fvARB;
|
---|
575 | exec->MultiTexCoord3iARB = _mesa_MultiTexCoord3iARB;
|
---|
576 | exec->MultiTexCoord3ivARB = _mesa_MultiTexCoord3ivARB;
|
---|
577 | exec->MultiTexCoord3sARB = _mesa_MultiTexCoord3sARB;
|
---|
578 | exec->MultiTexCoord3svARB = _mesa_MultiTexCoord3svARB;
|
---|
579 | exec->MultiTexCoord4dARB = _mesa_MultiTexCoord4dARB;
|
---|
580 | exec->MultiTexCoord4dvARB = _mesa_MultiTexCoord4dvARB;
|
---|
581 | exec->MultiTexCoord4fARB = _mesa_MultiTexCoord4fARB;
|
---|
582 | exec->MultiTexCoord4fvARB = _mesa_MultiTexCoord4fvARB;
|
---|
583 | exec->MultiTexCoord4iARB = _mesa_MultiTexCoord4iARB;
|
---|
584 | exec->MultiTexCoord4ivARB = _mesa_MultiTexCoord4ivARB;
|
---|
585 | exec->MultiTexCoord4sARB = _mesa_MultiTexCoord4sARB;
|
---|
586 | exec->MultiTexCoord4svARB = _mesa_MultiTexCoord4svARB;
|
---|
587 |
|
---|
588 | /* GL_INGR_blend_func_separate */
|
---|
589 | exec->BlendFuncSeparateEXT = _mesa_BlendFuncSeparateEXT;
|
---|
590 |
|
---|
591 | /* GL_MESA_window_pos */
|
---|
592 | exec->WindowPos2dMESA = _mesa_WindowPos2dMESA;
|
---|
593 | exec->WindowPos2dvMESA = _mesa_WindowPos2dvMESA;
|
---|
594 | exec->WindowPos2fMESA = _mesa_WindowPos2fMESA;
|
---|
595 | exec->WindowPos2fvMESA = _mesa_WindowPos2fvMESA;
|
---|
596 | exec->WindowPos2iMESA = _mesa_WindowPos2iMESA;
|
---|
597 | exec->WindowPos2ivMESA = _mesa_WindowPos2ivMESA;
|
---|
598 | exec->WindowPos2sMESA = _mesa_WindowPos2sMESA;
|
---|
599 | exec->WindowPos2svMESA = _mesa_WindowPos2svMESA;
|
---|
600 | exec->WindowPos3dMESA = _mesa_WindowPos3dMESA;
|
---|
601 | exec->WindowPos3dvMESA = _mesa_WindowPos3dvMESA;
|
---|
602 | exec->WindowPos3fMESA = _mesa_WindowPos3fMESA;
|
---|
603 | exec->WindowPos3fvMESA = _mesa_WindowPos3fvMESA;
|
---|
604 | exec->WindowPos3iMESA = _mesa_WindowPos3iMESA;
|
---|
605 | exec->WindowPos3ivMESA = _mesa_WindowPos3ivMESA;
|
---|
606 | exec->WindowPos3sMESA = _mesa_WindowPos3sMESA;
|
---|
607 | exec->WindowPos3svMESA = _mesa_WindowPos3svMESA;
|
---|
608 | exec->WindowPos4dMESA = _mesa_WindowPos4dMESA;
|
---|
609 | exec->WindowPos4dvMESA = _mesa_WindowPos4dvMESA;
|
---|
610 | exec->WindowPos4fMESA = _mesa_WindowPos4fMESA;
|
---|
611 | exec->WindowPos4fvMESA = _mesa_WindowPos4fvMESA;
|
---|
612 | exec->WindowPos4iMESA = _mesa_WindowPos4iMESA;
|
---|
613 | exec->WindowPos4ivMESA = _mesa_WindowPos4ivMESA;
|
---|
614 | exec->WindowPos4sMESA = _mesa_WindowPos4sMESA;
|
---|
615 | exec->WindowPos4svMESA = _mesa_WindowPos4svMESA;
|
---|
616 |
|
---|
617 | /* GL_MESA_resize_buffers */
|
---|
618 | exec->ResizeBuffersMESA = _mesa_ResizeBuffersMESA;
|
---|
619 |
|
---|
620 | /* GL_ARB_transpose_matrix */
|
---|
621 | exec->LoadTransposeMatrixdARB = _mesa_LoadTransposeMatrixdARB;
|
---|
622 | exec->LoadTransposeMatrixfARB = _mesa_LoadTransposeMatrixfARB;
|
---|
623 | exec->MultTransposeMatrixdARB = _mesa_MultTransposeMatrixdARB;
|
---|
624 | exec->MultTransposeMatrixfARB = _mesa_MultTransposeMatrixfARB;
|
---|
625 | }
|
---|
626 |
|
---|
627 |
|
---|
628 | /**********************************************************************/
|
---|
629 | /***** State update logic *****/
|
---|
630 | /**********************************************************************/
|
---|
631 |
|
---|
632 |
|
---|
633 | /*
|
---|
634 | * Since the device driver may or may not support pixel logic ops we
|
---|
635 | * have to make some extensive tests to determine whether or not
|
---|
636 | * software-implemented logic operations have to be used.
|
---|
637 | */
|
---|
638 | static void update_pixel_logic( GLcontext *ctx )
|
---|
639 | {
|
---|
640 | if (ctx->Visual->RGBAflag) {
|
---|
641 | /* RGBA mode blending w/ Logic Op */
|
---|
642 | if (ctx->Color.ColorLogicOpEnabled) {
|
---|
643 | if (ctx->Driver.LogicOp
|
---|
644 | && (*ctx->Driver.LogicOp)( ctx, ctx->Color.LogicOp )) {
|
---|
645 | /* Device driver can do logic, don't have to do it in software */
|
---|
646 | ctx->Color.SWLogicOpEnabled = GL_FALSE;
|
---|
647 | }
|
---|
648 | else {
|
---|
649 | /* Device driver can't do logic op so we do it in software */
|
---|
650 | ctx->Color.SWLogicOpEnabled = GL_TRUE;
|
---|
651 | }
|
---|
652 | }
|
---|
653 | else {
|
---|
654 | /* no logic op */
|
---|
655 | if (ctx->Driver.LogicOp) {
|
---|
656 | (void) (*ctx->Driver.LogicOp)( ctx, GL_COPY );
|
---|
657 | }
|
---|
658 | ctx->Color.SWLogicOpEnabled = GL_FALSE;
|
---|
659 | }
|
---|
660 | }
|
---|
661 | else {
|
---|
662 | /* CI mode Logic Op */
|
---|
663 | if (ctx->Color.IndexLogicOpEnabled) {
|
---|
664 | if (ctx->Driver.LogicOp
|
---|
665 | && (*ctx->Driver.LogicOp)( ctx, ctx->Color.LogicOp )) {
|
---|
666 | /* Device driver can do logic, don't have to do it in software */
|
---|
667 | ctx->Color.SWLogicOpEnabled = GL_FALSE;
|
---|
668 | }
|
---|
669 | else {
|
---|
670 | /* Device driver can't do logic op so we do it in software */
|
---|
671 | ctx->Color.SWLogicOpEnabled = GL_TRUE;
|
---|
672 | }
|
---|
673 | }
|
---|
674 | else {
|
---|
675 | /* no logic op */
|
---|
676 | if (ctx->Driver.LogicOp) {
|
---|
677 | (void) (*ctx->Driver.LogicOp)( ctx, GL_COPY );
|
---|
678 | }
|
---|
679 | ctx->Color.SWLogicOpEnabled = GL_FALSE;
|
---|
680 | }
|
---|
681 | }
|
---|
682 | }
|
---|
683 |
|
---|
684 |
|
---|
685 |
|
---|
686 | /*
|
---|
687 | * Check if software implemented RGBA or Color Index masking is needed.
|
---|
688 | */
|
---|
689 | static void update_pixel_masking( GLcontext *ctx )
|
---|
690 | {
|
---|
691 | if (ctx->Visual->RGBAflag) {
|
---|
692 | GLuint *colorMask = (GLuint *) ctx->Color.ColorMask;
|
---|
693 | if (*colorMask == 0xffffffff) {
|
---|
694 | /* disable masking */
|
---|
695 | if (ctx->Driver.ColorMask) {
|
---|
696 | (void) (*ctx->Driver.ColorMask)( ctx, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
|
---|
697 | }
|
---|
698 | ctx->Color.SWmasking = GL_FALSE;
|
---|
699 | }
|
---|
700 | else {
|
---|
701 | /* Ask driver to do color masking, if it can't then
|
---|
702 | * do it in software
|
---|
703 | */
|
---|
704 | GLboolean red = ctx->Color.ColorMask[RCOMP] ? GL_TRUE : GL_FALSE;
|
---|
705 | GLboolean green = ctx->Color.ColorMask[GCOMP] ? GL_TRUE : GL_FALSE;
|
---|
706 | GLboolean blue = ctx->Color.ColorMask[BCOMP] ? GL_TRUE : GL_FALSE;
|
---|
707 | GLboolean alpha = ctx->Color.ColorMask[ACOMP] ? GL_TRUE : GL_FALSE;
|
---|
708 | if (ctx->Driver.ColorMask
|
---|
709 | && (*ctx->Driver.ColorMask)( ctx, red, green, blue, alpha )) {
|
---|
710 | ctx->Color.SWmasking = GL_FALSE;
|
---|
711 | }
|
---|
712 | else {
|
---|
713 | ctx->Color.SWmasking = GL_TRUE;
|
---|
714 | }
|
---|
715 | }
|
---|
716 | }
|
---|
717 | else {
|
---|
718 | if (ctx->Color.IndexMask==0xffffffff) {
|
---|
719 | /* disable masking */
|
---|
720 | if (ctx->Driver.IndexMask) {
|
---|
721 | (void) (*ctx->Driver.IndexMask)( ctx, 0xffffffff );
|
---|
722 | }
|
---|
723 | ctx->Color.SWmasking = GL_FALSE;
|
---|
724 | }
|
---|
725 | else {
|
---|
726 | /* Ask driver to do index masking, if it can't then
|
---|
727 | * do it in software
|
---|
728 | */
|
---|
729 | if (ctx->Driver.IndexMask
|
---|
730 | && (*ctx->Driver.IndexMask)( ctx, ctx->Color.IndexMask )) {
|
---|
731 | ctx->Color.SWmasking = GL_FALSE;
|
---|
732 | }
|
---|
733 | else {
|
---|
734 | ctx->Color.SWmasking = GL_TRUE;
|
---|
735 | }
|
---|
736 | }
|
---|
737 | }
|
---|
738 | }
|
---|
739 |
|
---|
740 |
|
---|
741 | static void update_fog_mode( GLcontext *ctx )
|
---|
742 | {
|
---|
743 | int old_mode = ctx->FogMode;
|
---|
744 |
|
---|
745 | if (ctx->Fog.Enabled) {
|
---|
746 | if (ctx->Texture.Enabled)
|
---|
747 | ctx->FogMode = FOG_FRAGMENT;
|
---|
748 | else if (ctx->Hint.Fog == GL_NICEST)
|
---|
749 | ctx->FogMode = FOG_FRAGMENT;
|
---|
750 | else
|
---|
751 | ctx->FogMode = FOG_VERTEX;
|
---|
752 |
|
---|
753 | if (ctx->Driver.GetParameteri)
|
---|
754 | if ((ctx->Driver.GetParameteri)( ctx, DD_HAVE_HARDWARE_FOG ))
|
---|
755 | ctx->FogMode = FOG_FRAGMENT;
|
---|
756 | }
|
---|
757 | else {
|
---|
758 | ctx->FogMode = FOG_NONE;
|
---|
759 | }
|
---|
760 |
|
---|
761 | if (old_mode != ctx->FogMode)
|
---|
762 | ctx->NewState |= NEW_FOG;
|
---|
763 | }
|
---|
764 |
|
---|
765 |
|
---|
766 | /*
|
---|
767 | * Recompute the value of ctx->RasterMask, etc. according to
|
---|
768 | * the current context.
|
---|
769 | */
|
---|
770 | static void update_rasterflags( GLcontext *ctx )
|
---|
771 | {
|
---|
772 | ctx->RasterMask = 0;
|
---|
773 |
|
---|
774 | if (ctx->Color.AlphaEnabled) ctx->RasterMask |= ALPHATEST_BIT;
|
---|
775 | if (ctx->Color.BlendEnabled) ctx->RasterMask |= BLEND_BIT;
|
---|
776 | if (ctx->Depth.Test) ctx->RasterMask |= DEPTH_BIT;
|
---|
777 | if (ctx->FogMode==FOG_FRAGMENT) ctx->RasterMask |= FOG_BIT;
|
---|
778 | if (ctx->Color.SWLogicOpEnabled) ctx->RasterMask |= LOGIC_OP_BIT;
|
---|
779 | if (ctx->Scissor.Enabled) ctx->RasterMask |= SCISSOR_BIT;
|
---|
780 | if (ctx->Stencil.Enabled) ctx->RasterMask |= STENCIL_BIT;
|
---|
781 | if (ctx->Color.SWmasking) ctx->RasterMask |= MASKING_BIT;
|
---|
782 |
|
---|
783 | if (ctx->Visual->SoftwareAlpha && ctx->Color.ColorMask[ACOMP]
|
---|
784 | && ctx->Color.DrawBuffer != GL_NONE)
|
---|
785 | ctx->RasterMask |= ALPHABUF_BIT;
|
---|
786 |
|
---|
787 | if ( ctx->Viewport.X<0
|
---|
788 | || ctx->Viewport.X + ctx->Viewport.Width > ctx->DrawBuffer->Width
|
---|
789 | || ctx->Viewport.Y<0
|
---|
790 | || ctx->Viewport.Y + ctx->Viewport.Height > ctx->DrawBuffer->Height) {
|
---|
791 | ctx->RasterMask |= WINCLIP_BIT;
|
---|
792 | }
|
---|
793 |
|
---|
794 | if (ctx->Depth.OcclusionTest) {
|
---|
795 | if (ctx->Color.ColorMask[0] == 0 &&
|
---|
796 | ctx->Color.ColorMask[1] == 0 &&
|
---|
797 | ctx->Color.ColorMask[2] == 0 &&
|
---|
798 | ctx->Color.ColorMask[3] == 0 &&
|
---|
799 | ctx->Depth.Mask == GL_FALSE &&
|
---|
800 | !ctx->Stencil.Enabled) {
|
---|
801 | ctx->RasterMask |= OCCLUSION_BIT;
|
---|
802 | }
|
---|
803 | }
|
---|
804 |
|
---|
805 | /* If we're not drawing to exactly one color buffer set the
|
---|
806 | * MULTI_DRAW_BIT flag. Also set it if we're drawing to no
|
---|
807 | * buffers or the RGBA or CI mask disables all writes.
|
---|
808 | */
|
---|
809 | ctx->TriangleCaps &= ~DD_MULTIDRAW;
|
---|
810 |
|
---|
811 | if (ctx->Color.MultiDrawBuffer) {
|
---|
812 | ctx->RasterMask |= MULTI_DRAW_BIT;
|
---|
813 | ctx->TriangleCaps |= DD_MULTIDRAW;
|
---|
814 | }
|
---|
815 | else if (ctx->Color.DrawBuffer==GL_NONE) {
|
---|
816 | ctx->RasterMask |= MULTI_DRAW_BIT;
|
---|
817 | ctx->TriangleCaps |= DD_MULTIDRAW;
|
---|
818 | }
|
---|
819 | else if (ctx->Visual->RGBAflag && ctx->Color.ColorMask==0) {
|
---|
820 | /* all RGBA channels disabled */
|
---|
821 | ctx->RasterMask |= MULTI_DRAW_BIT;
|
---|
822 | ctx->TriangleCaps |= DD_MULTIDRAW;
|
---|
823 | ctx->Color.DrawDestMask = 0;
|
---|
824 | }
|
---|
825 | else if (!ctx->Visual->RGBAflag && ctx->Color.IndexMask==0) {
|
---|
826 | /* all color index bits disabled */
|
---|
827 | ctx->RasterMask |= MULTI_DRAW_BIT;
|
---|
828 | ctx->TriangleCaps |= DD_MULTIDRAW;
|
---|
829 | ctx->Color.DrawDestMask = 0;
|
---|
830 | }
|
---|
831 | }
|
---|
832 |
|
---|
833 |
|
---|
834 | void gl_print_state( const char *msg, GLuint state )
|
---|
835 | {
|
---|
836 | fprintf(stderr,
|
---|
837 | "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
---|
838 | msg,
|
---|
839 | state,
|
---|
840 | (state & NEW_LIGHTING) ? "lighting, " : "",
|
---|
841 | (state & NEW_RASTER_OPS) ? "raster-ops, " : "",
|
---|
842 | (state & NEW_TEXTURING) ? "texturing, " : "",
|
---|
843 | (state & NEW_POLYGON) ? "polygon, " : "",
|
---|
844 | (state & NEW_DRVSTATE0) ? "driver-0, " : "",
|
---|
845 | (state & NEW_DRVSTATE1) ? "driver-1, " : "",
|
---|
846 | (state & NEW_DRVSTATE2) ? "driver-2, " : "",
|
---|
847 | (state & NEW_DRVSTATE3) ? "driver-3, " : "",
|
---|
848 | (state & NEW_MODELVIEW) ? "modelview, " : "",
|
---|
849 | (state & NEW_PROJECTION) ? "projection, " : "",
|
---|
850 | (state & NEW_TEXTURE_MATRIX) ? "texture-matrix, " : "",
|
---|
851 | (state & NEW_USER_CLIP) ? "user-clip, " : "",
|
---|
852 | (state & NEW_TEXTURE_ENV) ? "texture-env, " : "",
|
---|
853 | (state & NEW_CLIENT_STATE) ? "client-state, " : "",
|
---|
854 | (state & NEW_FOG) ? "fog, " : "",
|
---|
855 | (state & NEW_NORMAL_TRANSFORM) ? "normal-transform, " : "",
|
---|
856 | (state & NEW_VIEWPORT) ? "viewport, " : "",
|
---|
857 | (state & NEW_TEXTURE_ENABLE) ? "texture-enable, " : "");
|
---|
858 | }
|
---|
859 |
|
---|
860 |
|
---|
861 | void gl_print_enable_flags( const char *msg, GLuint flags )
|
---|
862 | {
|
---|
863 | fprintf(stderr,
|
---|
864 | "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s\n",
|
---|
865 | msg,
|
---|
866 | flags,
|
---|
867 | (flags & ENABLE_TEX0) ? "tex-0, " : "",
|
---|
868 | (flags & ENABLE_TEX1) ? "tex-1, " : "",
|
---|
869 | (flags & ENABLE_LIGHT) ? "light, " : "",
|
---|
870 | (flags & ENABLE_FOG) ? "fog, " : "",
|
---|
871 | (flags & ENABLE_USERCLIP) ? "userclip, " : "",
|
---|
872 | (flags & ENABLE_TEXGEN0) ? "tex-gen-0, " : "",
|
---|
873 | (flags & ENABLE_TEXGEN1) ? "tex-gen-1, " : "",
|
---|
874 | (flags & ENABLE_TEXMAT0) ? "tex-mat-0, " : "",
|
---|
875 | (flags & ENABLE_TEXMAT1) ? "tex-mat-1, " : "",
|
---|
876 | (flags & ENABLE_NORMALIZE) ? "normalize, " : "",
|
---|
877 | (flags & ENABLE_RESCALE) ? "rescale, " : "");
|
---|
878 | }
|
---|
879 |
|
---|
880 |
|
---|
881 | /*
|
---|
882 | * If ctx->NewState is non-zero then this function MUST be called before
|
---|
883 | * rendering any primitive. Basically, function pointers and miscellaneous
|
---|
884 | * flags are updated to reflect the current state of the state machine.
|
---|
885 | */
|
---|
886 | void gl_update_state( GLcontext *ctx )
|
---|
887 | {
|
---|
888 | GLuint i;
|
---|
889 |
|
---|
890 | if (MESA_VERBOSE & VERBOSE_STATE)
|
---|
891 | gl_print_state("", ctx->NewState);
|
---|
892 |
|
---|
893 | if (ctx->NewState & NEW_CLIENT_STATE)
|
---|
894 | gl_update_client_state( ctx );
|
---|
895 |
|
---|
896 | if ((ctx->NewState & NEW_TEXTURE_ENABLE) &&
|
---|
897 | (ctx->Enabled & ENABLE_TEX_ANY) != ctx->Texture.Enabled)
|
---|
898 | ctx->NewState |= NEW_TEXTURING | NEW_RASTER_OPS;
|
---|
899 |
|
---|
900 | if (ctx->NewState & NEW_TEXTURE_ENV) {
|
---|
901 | if (ctx->Texture.Unit[0].EnvMode == ctx->Texture.Unit[0].LastEnvMode &&
|
---|
902 | ctx->Texture.Unit[1].EnvMode == ctx->Texture.Unit[1].LastEnvMode)
|
---|
903 | ctx->NewState &= ~NEW_TEXTURE_ENV;
|
---|
904 | ctx->Texture.Unit[0].LastEnvMode = ctx->Texture.Unit[0].EnvMode;
|
---|
905 | ctx->Texture.Unit[1].LastEnvMode = ctx->Texture.Unit[1].EnvMode;
|
---|
906 | }
|
---|
907 |
|
---|
908 | if (ctx->NewState & NEW_TEXTURE_MATRIX) {
|
---|
909 | ctx->Enabled &= ~(ENABLE_TEXMAT0|ENABLE_TEXMAT1);
|
---|
910 |
|
---|
911 | for (i=0; i < MAX_TEXTURE_UNITS; i++) {
|
---|
912 | if (ctx->TextureMatrix[i].flags & MAT_DIRTY_ALL_OVER)
|
---|
913 | {
|
---|
914 | gl_matrix_analyze( &ctx->TextureMatrix[i] );
|
---|
915 | ctx->TextureMatrix[i].flags &= ~MAT_DIRTY_DEPENDENTS;
|
---|
916 |
|
---|
917 | if (ctx->Texture.Unit[i].Enabled &&
|
---|
918 | ctx->TextureMatrix[i].type != MATRIX_IDENTITY)
|
---|
919 | ctx->Enabled |= ENABLE_TEXMAT0 << i;
|
---|
920 | }
|
---|
921 | }
|
---|
922 | }
|
---|
923 |
|
---|
924 | if (ctx->NewState & (NEW_TEXTURING | NEW_TEXTURE_ENABLE)) {
|
---|
925 | ctx->Texture.NeedNormals = GL_FALSE;
|
---|
926 | gl_update_dirty_texobjs(ctx);
|
---|
927 | ctx->Enabled &= ~(ENABLE_TEXGEN0|ENABLE_TEXGEN1);
|
---|
928 | ctx->Texture.ReallyEnabled = 0;
|
---|
929 |
|
---|
930 | for (i=0; i < MAX_TEXTURE_UNITS; i++) {
|
---|
931 | if (ctx->Texture.Unit[i].Enabled) {
|
---|
932 | gl_update_texture_unit( ctx, &ctx->Texture.Unit[i] );
|
---|
933 |
|
---|
934 | ctx->Texture.ReallyEnabled |=
|
---|
935 | ctx->Texture.Unit[i].ReallyEnabled<<(i*4);
|
---|
936 |
|
---|
937 | if (ctx->Texture.Unit[i].GenFlags != 0) {
|
---|
938 | ctx->Enabled |= ENABLE_TEXGEN0 << i;
|
---|
939 |
|
---|
940 | if (ctx->Texture.Unit[i].GenFlags & TEXGEN_NEED_NORMALS)
|
---|
941 | {
|
---|
942 | ctx->Texture.NeedNormals = GL_TRUE;
|
---|
943 | ctx->Texture.NeedEyeCoords = GL_TRUE;
|
---|
944 | }
|
---|
945 |
|
---|
946 | if (ctx->Texture.Unit[i].GenFlags & TEXGEN_NEED_EYE_COORD)
|
---|
947 | {
|
---|
948 | ctx->Texture.NeedEyeCoords = GL_TRUE;
|
---|
949 | }
|
---|
950 | }
|
---|
951 | }
|
---|
952 | }
|
---|
953 |
|
---|
954 | ctx->Texture.Enabled = ctx->Enabled & ENABLE_TEX_ANY;
|
---|
955 | ctx->NeedNormals = (ctx->Light.Enabled || ctx->Texture.NeedNormals);
|
---|
956 | }
|
---|
957 |
|
---|
958 | if (ctx->NewState & (NEW_RASTER_OPS | NEW_LIGHTING | NEW_FOG)) {
|
---|
959 |
|
---|
960 |
|
---|
961 | if (ctx->NewState & NEW_RASTER_OPS) {
|
---|
962 | update_pixel_logic(ctx);
|
---|
963 | update_pixel_masking(ctx);
|
---|
964 | update_fog_mode(ctx);
|
---|
965 | update_rasterflags(ctx);
|
---|
966 | if (ctx->Driver.Dither) {
|
---|
967 | (*ctx->Driver.Dither)( ctx, ctx->Color.DitherFlag );
|
---|
968 | }
|
---|
969 |
|
---|
970 | /* Check if incoming colors can be modified during rasterization */
|
---|
971 | if (ctx->Fog.Enabled ||
|
---|
972 | ctx->Texture.Enabled ||
|
---|
973 | ctx->Color.BlendEnabled ||
|
---|
974 | ctx->Color.SWmasking ||
|
---|
975 | ctx->Color.SWLogicOpEnabled) {
|
---|
976 | ctx->MutablePixels = GL_TRUE;
|
---|
977 | }
|
---|
978 | else {
|
---|
979 | ctx->MutablePixels = GL_FALSE;
|
---|
980 | }
|
---|
981 |
|
---|
982 | /* update scissor region */
|
---|
983 |
|
---|
984 | ctx->DrawBuffer->Xmin = 0;
|
---|
985 | ctx->DrawBuffer->Ymin = 0;
|
---|
986 | ctx->DrawBuffer->Xmax = ctx->DrawBuffer->Width-1;
|
---|
987 | ctx->DrawBuffer->Ymax = ctx->DrawBuffer->Height-1;
|
---|
988 | if (ctx->Scissor.Enabled) {
|
---|
989 | if (ctx->Scissor.X > ctx->DrawBuffer->Xmin) {
|
---|
990 | ctx->DrawBuffer->Xmin = ctx->Scissor.X;
|
---|
991 | }
|
---|
992 | if (ctx->Scissor.Y > ctx->DrawBuffer->Ymin) {
|
---|
993 | ctx->DrawBuffer->Ymin = ctx->Scissor.Y;
|
---|
994 | }
|
---|
995 | if (ctx->Scissor.X + ctx->Scissor.Width - 1 < ctx->DrawBuffer->Xmax) {
|
---|
996 | ctx->DrawBuffer->Xmax = ctx->Scissor.X + ctx->Scissor.Width - 1;
|
---|
997 | }
|
---|
998 | if (ctx->Scissor.Y + ctx->Scissor.Height - 1 < ctx->DrawBuffer->Ymax) {
|
---|
999 | ctx->DrawBuffer->Ymax = ctx->Scissor.Y + ctx->Scissor.Height - 1;
|
---|
1000 | }
|
---|
1001 | }
|
---|
1002 | }
|
---|
1003 |
|
---|
1004 | if (ctx->NewState & NEW_LIGHTING) {
|
---|
1005 | ctx->TriangleCaps &= ~(DD_TRI_LIGHT_TWOSIDE|DD_LIGHTING_CULL);
|
---|
1006 | if (ctx->Light.Enabled) {
|
---|
1007 | if (ctx->Light.Model.TwoSide)
|
---|
1008 | ctx->TriangleCaps |= (DD_TRI_LIGHT_TWOSIDE|DD_LIGHTING_CULL);
|
---|
1009 | gl_update_lighting(ctx);
|
---|
1010 | }
|
---|
1011 | }
|
---|
1012 | }
|
---|
1013 |
|
---|
1014 | if (ctx->NewState & (NEW_POLYGON | NEW_LIGHTING)) {
|
---|
1015 |
|
---|
1016 | ctx->TriangleCaps &= ~DD_TRI_CULL_FRONT_BACK;
|
---|
1017 |
|
---|
1018 | if (ctx->NewState & NEW_POLYGON) {
|
---|
1019 | /* Setup CullBits bitmask */
|
---|
1020 | if (ctx->Polygon.CullFlag) {
|
---|
1021 | ctx->backface_sign = 1;
|
---|
1022 | switch(ctx->Polygon.CullFaceMode) {
|
---|
1023 | case GL_BACK:
|
---|
1024 | if(ctx->Polygon.FrontFace==GL_CCW)
|
---|
1025 | ctx->backface_sign = -1;
|
---|
1026 | ctx->Polygon.CullBits = 1;
|
---|
1027 | break;
|
---|
1028 | case GL_FRONT:
|
---|
1029 | if(ctx->Polygon.FrontFace!=GL_CCW)
|
---|
1030 | ctx->backface_sign = -1;
|
---|
1031 | ctx->Polygon.CullBits = 2;
|
---|
1032 | break;
|
---|
1033 | default:
|
---|
1034 | case GL_FRONT_AND_BACK:
|
---|
1035 | ctx->backface_sign = 0;
|
---|
1036 | ctx->Polygon.CullBits = 0;
|
---|
1037 | ctx->TriangleCaps |= DD_TRI_CULL_FRONT_BACK;
|
---|
1038 | break;
|
---|
1039 | }
|
---|
1040 | }
|
---|
1041 | else {
|
---|
1042 | ctx->Polygon.CullBits = 3;
|
---|
1043 | ctx->backface_sign = 0;
|
---|
1044 | }
|
---|
1045 |
|
---|
1046 | /* Any Polygon offsets enabled? */
|
---|
1047 | ctx->TriangleCaps &= ~DD_TRI_OFFSET;
|
---|
1048 |
|
---|
1049 | if (ctx->Polygon.OffsetPoint ||
|
---|
1050 | ctx->Polygon.OffsetLine ||
|
---|
1051 | ctx->Polygon.OffsetFill)
|
---|
1052 | ctx->TriangleCaps |= DD_TRI_OFFSET;
|
---|
1053 |
|
---|
1054 | /* reset Z offsets now */
|
---|
1055 | ctx->PointZoffset = 0.0;
|
---|
1056 | ctx->LineZoffset = 0.0;
|
---|
1057 | ctx->PolygonZoffset = 0.0;
|
---|
1058 | }
|
---|
1059 | }
|
---|
1060 |
|
---|
1061 | if (ctx->NewState & ~(NEW_CLIENT_STATE|
|
---|
1062 | NEW_DRIVER_STATE|NEW_USER_CLIP|
|
---|
1063 | NEW_POLYGON))
|
---|
1064 | gl_update_clipmask(ctx);
|
---|
1065 |
|
---|
1066 | if (ctx->NewState & (NEW_LIGHTING|
|
---|
1067 | NEW_RASTER_OPS|
|
---|
1068 | NEW_TEXTURING|
|
---|
1069 | NEW_TEXTURE_ENABLE|
|
---|
1070 | NEW_TEXTURE_ENV|
|
---|
1071 | NEW_POLYGON|
|
---|
1072 | NEW_DRVSTATE0|
|
---|
1073 | NEW_DRVSTATE1|
|
---|
1074 | NEW_DRVSTATE2|
|
---|
1075 | NEW_DRVSTATE3|
|
---|
1076 | NEW_USER_CLIP))
|
---|
1077 | {
|
---|
1078 | ctx->IndirectTriangles = ctx->TriangleCaps & ~ctx->Driver.TriangleCaps;
|
---|
1079 | ctx->IndirectTriangles |= DD_SW_RASTERIZE;
|
---|
1080 |
|
---|
1081 | if (MESA_VERBOSE&VERBOSE_CULL)
|
---|
1082 | gl_print_tri_caps("initial indirect tris", ctx->IndirectTriangles);
|
---|
1083 |
|
---|
1084 | ctx->Driver.PointsFunc = NULL;
|
---|
1085 | ctx->Driver.LineFunc = NULL;
|
---|
1086 | ctx->Driver.TriangleFunc = NULL;
|
---|
1087 | ctx->Driver.QuadFunc = NULL;
|
---|
1088 | ctx->Driver.RectFunc = NULL;
|
---|
1089 | ctx->Driver.RenderVBClippedTab = NULL;
|
---|
1090 | ctx->Driver.RenderVBCulledTab = NULL;
|
---|
1091 | ctx->Driver.RenderVBRawTab = NULL;
|
---|
1092 |
|
---|
1093 | /*
|
---|
1094 | * Here the driver sets up all the ctx->Driver function pointers to
|
---|
1095 | * it's specific, private functions.
|
---|
1096 | */
|
---|
1097 | ctx->Driver.UpdateState(ctx);
|
---|
1098 |
|
---|
1099 | if (MESA_VERBOSE&VERBOSE_CULL)
|
---|
1100 | gl_print_tri_caps("indirect tris", ctx->IndirectTriangles);
|
---|
1101 |
|
---|
1102 | /*
|
---|
1103 | * In case the driver didn't hook in an optimized point, line or
|
---|
1104 | * triangle function we'll now select "core/fallback" point, line
|
---|
1105 | * and triangle functions.
|
---|
1106 | */
|
---|
1107 | if (ctx->IndirectTriangles & DD_SW_RASTERIZE) {
|
---|
1108 | gl_set_point_function(ctx);
|
---|
1109 | gl_set_line_function(ctx);
|
---|
1110 | gl_set_triangle_function(ctx);
|
---|
1111 | gl_set_quad_function(ctx);
|
---|
1112 |
|
---|
1113 | if ((ctx->IndirectTriangles &
|
---|
1114 | (DD_TRI_SW_RASTERIZE|DD_QUAD_SW_RASTERIZE|DD_TRI_CULL)) ==
|
---|
1115 | (DD_TRI_SW_RASTERIZE|DD_QUAD_SW_RASTERIZE|DD_TRI_CULL))
|
---|
1116 | ctx->IndirectTriangles &= ~DD_TRI_CULL;
|
---|
1117 | }
|
---|
1118 |
|
---|
1119 | if (MESA_VERBOSE&VERBOSE_CULL)
|
---|
1120 | gl_print_tri_caps("indirect tris 2", ctx->IndirectTriangles);
|
---|
1121 |
|
---|
1122 | gl_set_render_vb_function(ctx);
|
---|
1123 | }
|
---|
1124 |
|
---|
1125 | /* Should only be calc'd when !need_eye_coords and not culling.
|
---|
1126 | */
|
---|
1127 | if (ctx->NewState & (NEW_MODELVIEW|NEW_PROJECTION)) {
|
---|
1128 | if (ctx->NewState & NEW_MODELVIEW) {
|
---|
1129 | gl_matrix_analyze( &ctx->ModelView );
|
---|
1130 | ctx->ProjectionMatrix.flags &= ~MAT_DIRTY_DEPENDENTS;
|
---|
1131 | }
|
---|
1132 |
|
---|
1133 | if (ctx->NewState & NEW_PROJECTION) {
|
---|
1134 | gl_matrix_analyze( &ctx->ProjectionMatrix );
|
---|
1135 | ctx->ProjectionMatrix.flags &= ~MAT_DIRTY_DEPENDENTS;
|
---|
1136 |
|
---|
1137 | if (ctx->Transform.AnyClip) {
|
---|
1138 | gl_update_userclip( ctx );
|
---|
1139 | }
|
---|
1140 | }
|
---|
1141 |
|
---|
1142 | gl_calculate_model_project_matrix( ctx );
|
---|
1143 | ctx->ModelProjectWinMatrixUptodate = 0;
|
---|
1144 | }
|
---|
1145 |
|
---|
1146 | /* Figure out whether we can light in object space or not. If we
|
---|
1147 | * can, find the current positions of the lights in object space
|
---|
1148 | */
|
---|
1149 | if ((ctx->Enabled & (ENABLE_POINT_ATTEN | ENABLE_LIGHT | ENABLE_FOG |
|
---|
1150 | ENABLE_TEXGEN0 | ENABLE_TEXGEN1)) &&
|
---|
1151 | (ctx->NewState & (NEW_LIGHTING |
|
---|
1152 | NEW_FOG |
|
---|
1153 | NEW_MODELVIEW |
|
---|
1154 | NEW_PROJECTION |
|
---|
1155 | NEW_TEXTURING |
|
---|
1156 | NEW_RASTER_OPS |
|
---|
1157 | NEW_USER_CLIP)))
|
---|
1158 | {
|
---|
1159 | GLboolean oldcoord, oldnorm;
|
---|
1160 |
|
---|
1161 | oldcoord = ctx->NeedEyeCoords;
|
---|
1162 | oldnorm = ctx->NeedEyeNormals;
|
---|
1163 |
|
---|
1164 | ctx->NeedNormals = (ctx->Light.Enabled || ctx->Texture.NeedNormals);
|
---|
1165 | ctx->NeedEyeCoords = ((ctx->Fog.Enabled && ctx->Hint.Fog != GL_NICEST) ||
|
---|
1166 | ctx->Point.Attenuated);
|
---|
1167 | ctx->NeedEyeNormals = GL_FALSE;
|
---|
1168 |
|
---|
1169 | if (ctx->Light.Enabled) {
|
---|
1170 | if (ctx->Light.Flags & LIGHT_POSITIONAL) {
|
---|
1171 | /* Need length for attenuation */
|
---|
1172 | if (!TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_LENGTH_PRESERVING))
|
---|
1173 | ctx->NeedEyeCoords = GL_TRUE;
|
---|
1174 | } else if (ctx->Light.NeedVertices) {
|
---|
1175 | /* Need angle for spot calculations */
|
---|
1176 | if (!TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_ANGLE_PRESERVING))
|
---|
1177 | ctx->NeedEyeCoords = GL_TRUE;
|
---|
1178 | }
|
---|
1179 | ctx->NeedEyeNormals = ctx->NeedEyeCoords;
|
---|
1180 | }
|
---|
1181 | if (ctx->Texture.Enabled || ctx->RenderMode==GL_FEEDBACK) {
|
---|
1182 | if (ctx->Texture.NeedEyeCoords) ctx->NeedEyeCoords = GL_TRUE;
|
---|
1183 | if (ctx->Texture.NeedNormals)
|
---|
1184 | ctx->NeedNormals = ctx->NeedEyeNormals = GL_TRUE;
|
---|
1185 | }
|
---|
1186 |
|
---|
1187 | ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
|
---|
1188 |
|
---|
1189 | if (ctx->NeedEyeCoords)
|
---|
1190 | ctx->vb_proj_matrix = &ctx->ProjectionMatrix;
|
---|
1191 |
|
---|
1192 | if (ctx->Light.Enabled) {
|
---|
1193 | gl_update_lighting_function(ctx);
|
---|
1194 |
|
---|
1195 | if ( (ctx->NewState & NEW_LIGHTING) ||
|
---|
1196 | ((ctx->NewState & (NEW_MODELVIEW| NEW_PROJECTION)) &&
|
---|
1197 | !ctx->NeedEyeCoords) ||
|
---|
1198 | oldcoord != ctx->NeedEyeCoords ||
|
---|
1199 | oldnorm != ctx->NeedEyeNormals) {
|
---|
1200 | gl_compute_light_positions(ctx);
|
---|
1201 | }
|
---|
1202 |
|
---|
1203 | ctx->rescale_factor = 1.0F;
|
---|
1204 |
|
---|
1205 | if (ctx->ModelView.flags & (MAT_FLAG_UNIFORM_SCALE |
|
---|
1206 | MAT_FLAG_GENERAL_SCALE |
|
---|
1207 | MAT_FLAG_GENERAL_3D |
|
---|
1208 | MAT_FLAG_GENERAL) )
|
---|
1209 |
|
---|
1210 | {
|
---|
1211 | GLfloat *m = ctx->ModelView.inv;
|
---|
1212 | GLfloat f = m[2]*m[2] + m[6]*m[6] + m[10]*m[10];
|
---|
1213 | if (f > 1e-12 && (f-1)*(f-1) > 1e-12)
|
---|
1214 | ctx->rescale_factor = 1.0/GL_SQRT(f);
|
---|
1215 | }
|
---|
1216 | }
|
---|
1217 |
|
---|
1218 | gl_update_normal_transform( ctx );
|
---|
1219 | }
|
---|
1220 |
|
---|
1221 | gl_update_pipelines(ctx);
|
---|
1222 | ctx->NewState = 0;
|
---|
1223 | }
|
---|