1 /*
2 Copyright (C) 2001-2002 Charles Hollemeersch
3 Radeon Version (C) 2002 Jarno Paananen
4 
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 
14 See the GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 
20 PENTA: the whole file is freakin penta...
21 
22 Same as gl_bumpmap.c but Radeon 8500+ optimized
23 These routines require 6 texture units, vertex shader and pixel shader
24 
25 This could be further optimized for Radeon 9700 (specular exponent for
26 example), but would need better documentation and extension.
27 
28 All lights not require only 1 pass:
29 1 diffuse + specular with optional light filter
30 
31 */
32 
33 #include "quakedef.h"
34 
35 #include "glATI.h"
36 
37 PFNGLGENFRAGMENTSHADERSATIPROC		qglGenFragmentShadersATI = NULL;
38 PFNGLBINDFRAGMENTSHADERATIPROC		qglBindFragmentShaderATI = NULL;
39 PFNGLDELETEFRAGMENTSHADERATIPROC 	qglDeleteFragmentShaderATI = NULL;
40 PFNGLBEGINFRAGMENTSHADERATIPROC 	qglBeginFragmentShaderATI = NULL;
41 PFNGLENDFRAGMENTSHADERATIPROC 		qglEndFragmentShaderATI = NULL;
42 PFNGLPASSTEXCOORDATIPROC		qglPassTexCoordATI = NULL;
43 PFNGLSAMPLEMAPATIPROC			qglSampleMapATI = NULL;
44 PFNGLCOLORFRAGMENTOP1ATIPROC		qglColorFragmentOp1ATI = NULL;
45 PFNGLCOLORFRAGMENTOP2ATIPROC		qglColorFragmentOp2ATI = NULL;
46 PFNGLCOLORFRAGMENTOP3ATIPROC		qglColorFragmentOp3ATI = NULL;
47 PFNGLALPHAFRAGMENTOP1ATIPROC		qglAlphaFragmentOp1ATI = NULL;
48 PFNGLALPHAFRAGMENTOP2ATIPROC		qglAlphaFragmentOp2ATI = NULL;
49 PFNGLALPHAFRAGMENTOP3ATIPROC		qglAlphaFragmentOp3ATI = NULL;
50 PFNGLSETFRAGMENTSHADERCONSTANTATIPROC	qglSetFragmentShaderConstantATI = NULL;
51 PFNGLBEGINVERTEXSHADEREXTPROC		qglBeginVertexShaderEXT = NULL;
52 PFNGLENDVERTEXSHADEREXTPROC		qglEndVertexShaderEXT = NULL;
53 PFNGLBINDVERTEXSHADEREXTPROC		qglBindVertexShaderEXT = NULL;
54 PFNGLGENVERTEXSHADERSEXTPROC		qglGenVertexShadersEXT = NULL;
55 PFNGLDELETEVERTEXSHADEREXTPROC		qglDeleteVertexShaderEXT = NULL;
56 PFNGLSHADEROP1EXTPROC			qglShaderOp1EXT = NULL;
57 PFNGLSHADEROP2EXTPROC			qglShaderOp2EXT = NULL;
58 PFNGLSHADEROP3EXTPROC			qglShaderOp3EXT = NULL;
59 PFNGLSWIZZLEEXTPROC			qglSwizzleEXT = NULL;
60 PFNGLWRITEMASKEXTPROC			qglWriteMaskEXT = NULL;
61 PFNGLINSERTCOMPONENTEXTPROC		qglInsertComponentEXT = NULL;
62 PFNGLEXTRACTCOMPONENTEXTPROC		qglExtractComponentEXT = NULL;
63 PFNGLGENSYMBOLSEXTPROC			qglGenSymbolsEXT = NULL;
64 PFNGLSETINVARIANTEXTPROC		qglSetInvariantEXT = NULL;
65 PFNGLSETLOCALCONSTANTEXTPROC		qglSetLocalConstantEXT = NULL;
66 PFNGLVARIANTBVEXTPROC			qglVariantbvEXT = NULL;
67 PFNGLVARIANTSVEXTPROC			qglVariantsvEXT = NULL;
68 PFNGLVARIANTIVEXTPROC			qglVariantivEXT = NULL;
69 PFNGLVARIANTFVEXTPROC			qglVariantfvEXT = NULL;
70 PFNGLVARIANTDVEXTPROC			qglVariantdvEXT = NULL;
71 PFNGLVARIANTUBVEXTPROC			qglVariantubvEXT = NULL;
72 PFNGLVARIANTUSVEXTPROC			qglVariantusvEXT = NULL;
73 PFNGLVARIANTUIVEXTPROC			qglVariantuivEXT = NULL;
74 PFNGLVARIANTPOINTEREXTPROC		qglVariantPointerEXT = NULL;
75 PFNGLENABLEVARIANTCLIENTSTATEEXTPROC	qglEnableVariantClientStateEXT = NULL;
76 PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC	qglDisableVariantClientStateEXT = NULL;
77 PFNGLBINDLIGHTPARAMETEREXTPROC		qglBindLightParameterEXT = NULL;
78 PFNGLBINDMATERIALPARAMETEREXTPROC	qglBindMaterialParameterEXT = NULL;
79 PFNGLBINDTEXGENPARAMETEREXTPROC		qglBindTexGenParameterEXT = NULL;
80 PFNGLBINDTEXTUREUNITPARAMETEREXTPROC	qglBindTextureUnitParameterEXT = NULL;
81 PFNGLBINDPARAMETEREXTPROC		qglBindParameterEXT = NULL;
82 PFNGLISVARIANTENABLEDEXTPROC		qglIsVariantEnabledEXT = NULL;
83 PFNGLGETVARIANTBOOLEANVEXTPROC		qglGetVariantBooleanvEXT = NULL;
84 PFNGLGETVARIANTINTEGERVEXTPROC		qglGetVariantIntegervEXT = NULL;
85 PFNGLGETVARIANTFLOATVEXTPROC		qglGetVariantFloatvEXT = NULL;
86 PFNGLGETVARIANTPOINTERVEXTPROC		qglGetVariantPointervEXT = NULL;
87 PFNGLGETINVARIANTBOOLEANVEXTPROC	qglGetInvariantBooleanvEXT = NULL;
88 PFNGLGETINVARIANTINTEGERVEXTPROC	qglGetInvariantIntegervEXT = NULL;
89 PFNGLGETINVARIANTFLOATVEXTPROC		qglGetInvariantFloatvEXT = NULL;
90 PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC	qglGetLocalConstantBooleanvEXT = NULL;
91 PFNGLGETLOCALCONSTANTINTEGERVEXTPROC	qglGetLocalConstantIntegervEXT = NULL;
92 PFNGLGETLOCALCONSTANTFLOATVEXTPROC	qglGetLocalConstantFloatvEXT = NULL;
93 
94 PFNGLPNTRIANGLESIATIPROC qglPNTrianglesiATI = NULL;
95 PFNGLPNTRIANGLESFATIPROC qglPNTrianglesfATI = NULL;
96 
97 static unsigned int fragment_shaders;
98 static unsigned int vertex_shaders;
99 
100 //#define RADEONDEBUG
101 
102 #ifdef RADEONDEBUG
checkerror()103 void checkerror()
104 {
105     GLuint error = glGetError();
106     if ( error != GL_NO_ERROR )
107     {
108         _asm { int 3 };
109     }
110 }
111 #else
112 
113 #define checkerror() do { } while(0)
114 
115 #endif
116 
117 // <AWE> We look up the symbols here, this way we don't need to prototype all the "qgl" functions!
118 #if defined (__APPLE__) || defined (MACOSX)
119 
120 extern void *	GL_GetProcAddress (const char *theName, qboolean theSafeMode);
121 
GL_LookupRadeonSymbols(void)122 qboolean	GL_LookupRadeonSymbols (void)
123 {
124     qglGenFragmentShadersATI = GL_GetProcAddress ("glGenFragmentShadersATI", false);
125     qglBindFragmentShaderATI = GL_GetProcAddress ("glBindFragmentShaderATI", false);
126     qglDeleteFragmentShaderATI = GL_GetProcAddress ("glDeleteFragmentShaderATI", false);
127     qglBeginFragmentShaderATI = GL_GetProcAddress ("glBeginFragmentShaderATI", false);
128     qglEndFragmentShaderATI = GL_GetProcAddress ("glEndFragmentShaderATI", false);
129     qglPassTexCoordATI = GL_GetProcAddress ("glPassTexCoordATI", false);
130     qglSampleMapATI = GL_GetProcAddress ("glSampleMapATI", false);
131     qglColorFragmentOp1ATI = GL_GetProcAddress ("glColorFragmentOp1ATI", false);
132     qglColorFragmentOp2ATI = GL_GetProcAddress ("glColorFragmentOp2ATI", false);
133     qglColorFragmentOp3ATI = GL_GetProcAddress ("glColorFragmentOp3ATI", false);
134     qglAlphaFragmentOp1ATI = GL_GetProcAddress ("glAlphaFragmentOp1ATI", false);
135     qglAlphaFragmentOp2ATI = GL_GetProcAddress ("glAlphaFragmentOp2ATI", false);
136     qglAlphaFragmentOp3ATI = GL_GetProcAddress ("glAlphaFragmentOp3ATI", false);
137     qglSetFragmentShaderConstantATI = GL_GetProcAddress ("glSetFragmentShaderConstantATI", false);
138     qglBeginVertexShaderEXT = GL_GetProcAddress ("glBeginVertexShaderEXT", false);
139     qglEndVertexShaderEXT = GL_GetProcAddress ("glEndVertexShaderEXT", false);
140     qglBindVertexShaderEXT = GL_GetProcAddress ("glBindVertexShaderEXT", false);
141     qglGenVertexShadersEXT = GL_GetProcAddress ("glGenVertexShadersEXT", false);
142     qglDeleteVertexShaderEXT = GL_GetProcAddress ("glDeleteVertexShaderEXT", false);
143     qglShaderOp1EXT = GL_GetProcAddress ("glShaderOp1EXT", false);
144     qglShaderOp2EXT = GL_GetProcAddress ("glShaderOp2EXT", false);
145     qglShaderOp3EXT = GL_GetProcAddress ("glShaderOp3EXT", false);
146     qglSwizzleEXT = GL_GetProcAddress ("glSwizzleEXT", false);
147     qglWriteMaskEXT = GL_GetProcAddress ("glWriteMaskEXT", false);
148     qglInsertComponentEXT = GL_GetProcAddress ("glInsertComponentEXT", false);
149     qglExtractComponentEXT = GL_GetProcAddress ("glExtractComponentEXT", false);
150     qglGenSymbolsEXT = GL_GetProcAddress ("glGenSymbolsEXT", false);
151     qglSetInvariantEXT = GL_GetProcAddress ("glSetInvariantEXT", false);
152     qglSetLocalConstantEXT = GL_GetProcAddress ("glSetLocalConstantEXT", false);
153     qglVariantbvEXT = GL_GetProcAddress ("glVariantbvEXT", false);
154     qglVariantsvEXT = GL_GetProcAddress ("glVariantsvEXT", false);
155     qglVariantivEXT = GL_GetProcAddress ("glVariantivEXT", false);
156     qglVariantfvEXT = GL_GetProcAddress ("glVariantfvEXT", false);
157     qglVariantdvEXT = GL_GetProcAddress ("glVariantdvEXT", false);
158     qglVariantubvEXT = GL_GetProcAddress ("glVariantubvEXT", false);
159     qglVariantusvEXT = GL_GetProcAddress ("glVariantusvEXT", false);
160     qglVariantuivEXT = GL_GetProcAddress ("glVariantuivEXT", false);
161     qglVariantPointerEXT = GL_GetProcAddress ("glVariantPointerEXT", false);
162     qglEnableVariantClientStateEXT = GL_GetProcAddress ("glEnableVariantClientStateEXT", false);
163     qglDisableVariantClientStateEXT = GL_GetProcAddress ("glDisableVariantClientStateEXT", false);
164     qglBindLightParameterEXT = GL_GetProcAddress ("glBindLightParameterEXT", false);
165     qglBindMaterialParameterEXT = GL_GetProcAddress ("glBindMaterialParameterEXT", false);
166     qglBindTexGenParameterEXT = GL_GetProcAddress ("glBindTexGenParameterEXT", false);
167     qglBindTextureUnitParameterEXT = GL_GetProcAddress ("glBindTextureUnitParameterEXT", false);
168     qglBindParameterEXT = GL_GetProcAddress ("glBindParameterEXT", false);
169     qglIsVariantEnabledEXT = GL_GetProcAddress ("glIsVariantEnabledEXT", false);
170     qglGetVariantBooleanvEXT = GL_GetProcAddress ("glGetVariantBooleanvEXT", false);
171     qglGetVariantIntegervEXT = GL_GetProcAddress ("glGetVariantIntegervEXT", false);
172     qglGetVariantFloatvEXT = GL_GetProcAddress ("glGetVariantFloatvEXT", false);
173     qglGetVariantPointervEXT = GL_GetProcAddress ("glGetVariantPointervEXT", false);
174     qglGetInvariantBooleanvEXT = GL_GetProcAddress ("glGetInvariantBooleanvEXT", false);
175     qglGetInvariantIntegervEXT = GL_GetProcAddress ("glGetInvariantIntegervEXT", false);
176     qglGetInvariantFloatvEXT = GL_GetProcAddress ("glGetInvariantFloatvEXT", false);
177     qglGetLocalConstantBooleanvEXT = GL_GetProcAddress ("glGetLocalConstantBooleanvEXT", false);
178     qglGetLocalConstantIntegervEXT = GL_GetProcAddress ("glGetLocalConstantIntegervEXT", false);
179     qglGetLocalConstantFloatvEXT = GL_GetProcAddress ("glGetLocalConstantFloatvEXT", false);
180 
181     if (qglGenFragmentShadersATI != NULL &&
182         qglBindFragmentShaderATI != NULL &&
183         qglDeleteFragmentShaderATI != NULL &&
184         qglBeginFragmentShaderATI != NULL &&
185         qglEndFragmentShaderATI != NULL &&
186         qglPassTexCoordATI != NULL &&
187         qglSampleMapATI != NULL &&
188         qglColorFragmentOp1ATI != NULL &&
189         qglColorFragmentOp2ATI != NULL &&
190         qglColorFragmentOp3ATI != NULL &&
191         qglAlphaFragmentOp1ATI != NULL &&
192         qglAlphaFragmentOp2ATI != NULL &&
193         qglAlphaFragmentOp3ATI != NULL &&
194         qglSetFragmentShaderConstantATI != NULL &&
195         qglBeginVertexShaderEXT != NULL &&
196         qglEndVertexShaderEXT != NULL &&
197         qglBindVertexShaderEXT != NULL &&
198         qglGenVertexShadersEXT != NULL &&
199         qglDeleteVertexShaderEXT != NULL &&
200         qglShaderOp1EXT != NULL &&
201         qglShaderOp2EXT != NULL &&
202         qglShaderOp3EXT != NULL &&
203         qglSwizzleEXT != NULL &&
204         qglWriteMaskEXT != NULL &&
205         qglInsertComponentEXT != NULL &&
206         qglExtractComponentEXT != NULL &&
207         qglGenSymbolsEXT != NULL &&
208         qglSetInvariantEXT != NULL &&
209         qglSetLocalConstantEXT != NULL &&
210         qglVariantbvEXT != NULL &&
211         qglVariantsvEXT != NULL &&
212         qglVariantivEXT != NULL &&
213         qglVariantfvEXT != NULL &&
214         qglVariantdvEXT != NULL &&
215         qglVariantubvEXT != NULL &&
216         qglVariantusvEXT != NULL &&
217         qglVariantuivEXT != NULL &&
218         qglVariantPointerEXT != NULL &&
219         qglEnableVariantClientStateEXT != NULL &&
220         qglDisableVariantClientStateEXT != NULL &&
221         qglBindLightParameterEXT != NULL &&
222         qglBindMaterialParameterEXT != NULL &&
223         qglBindTexGenParameterEXT != NULL &&
224         qglBindTextureUnitParameterEXT != NULL &&
225         qglBindParameterEXT != NULL &&
226         qglIsVariantEnabledEXT != NULL &&
227         qglGetVariantBooleanvEXT != NULL &&
228         qglGetVariantIntegervEXT != NULL &&
229         qglGetVariantFloatvEXT != NULL &&
230         qglGetVariantPointervEXT != NULL &&
231         qglGetInvariantBooleanvEXT != NULL &&
232         qglGetInvariantIntegervEXT != NULL &&
233         qglGetInvariantFloatvEXT != NULL &&
234         qglGetLocalConstantBooleanvEXT != NULL &&
235         qglGetLocalConstantIntegervEXT != NULL &&
236         qglGetLocalConstantFloatvEXT != NULL)
237     {
238         return (true);
239     }
240 
241     return (false);
242 }
243 
244 #endif /* __APPLE__ || MACOSX */
245 
GL_CreateShadersRadeon()246 void GL_CreateShadersRadeon()
247 {
248     float scaler[4] = {0.5f, 0.5f, 0.5f, 0.5f};
249     int i;
250     GLuint mvp, modelview, zcomp;
251     GLuint texturematrix, texturematrix2;
252     GLuint vertex;
253     GLuint texcoord0;
254     GLuint texcoord1;
255     GLuint texcoord2;
256     GLuint color;
257     GLuint supportedTmu;
258     GLuint disttemp, disttemp2;
259     GLuint fogstart, fogend;
260 
261 #if !defined(__APPLE__) && !defined (MACOSX)
262     SAFE_GET_PROC( qglGenFragmentShadersATI, PFNGLGENFRAGMENTSHADERSATIPROC, "glGenFragmentShadersATI");
263     SAFE_GET_PROC( qglBindFragmentShaderATI, PFNGLBINDFRAGMENTSHADERATIPROC, "glBindFragmentShaderATI");
264     SAFE_GET_PROC( qglDeleteFragmentShaderATI, PFNGLDELETEFRAGMENTSHADERATIPROC, "glDeleteFragmentShaderATI");
265     SAFE_GET_PROC( qglBeginFragmentShaderATI, PFNGLBEGINFRAGMENTSHADERATIPROC, "glBeginFragmentShaderATI");
266     SAFE_GET_PROC( qglEndFragmentShaderATI, PFNGLENDFRAGMENTSHADERATIPROC, "glEndFragmentShaderATI");
267     SAFE_GET_PROC( qglPassTexCoordATI, PFNGLPASSTEXCOORDATIPROC, "glPassTexCoordATI");
268     SAFE_GET_PROC( qglSampleMapATI, PFNGLSAMPLEMAPATIPROC, "glSampleMapATI");
269     SAFE_GET_PROC( qglColorFragmentOp1ATI, PFNGLCOLORFRAGMENTOP1ATIPROC, "glColorFragmentOp1ATI");
270     SAFE_GET_PROC( qglColorFragmentOp2ATI, PFNGLCOLORFRAGMENTOP2ATIPROC, "glColorFragmentOp2ATI");
271     SAFE_GET_PROC( qglColorFragmentOp3ATI, PFNGLCOLORFRAGMENTOP3ATIPROC, "glColorFragmentOp3ATI");
272     SAFE_GET_PROC( qglAlphaFragmentOp1ATI, PFNGLALPHAFRAGMENTOP1ATIPROC, "glAlphaFragmentOp1ATI");
273     SAFE_GET_PROC( qglAlphaFragmentOp2ATI, PFNGLALPHAFRAGMENTOP2ATIPROC, "glAlphaFragmentOp2ATI");
274     SAFE_GET_PROC( qglAlphaFragmentOp3ATI, PFNGLALPHAFRAGMENTOP3ATIPROC, "glAlphaFragmentOp3ATI");
275     SAFE_GET_PROC( qglSetFragmentShaderConstantATI, PFNGLSETFRAGMENTSHADERCONSTANTATIPROC, "glSetFragmentShaderConstantATI");
276     SAFE_GET_PROC( qglBeginVertexShaderEXT, PFNGLBEGINVERTEXSHADEREXTPROC, "glBeginVertexShaderEXT");
277     SAFE_GET_PROC( qglEndVertexShaderEXT, PFNGLENDVERTEXSHADEREXTPROC, "glEndVertexShaderEXT");
278     SAFE_GET_PROC( qglBindVertexShaderEXT, PFNGLBINDVERTEXSHADEREXTPROC, "glBindVertexShaderEXT");
279     SAFE_GET_PROC( qglGenVertexShadersEXT, PFNGLGENVERTEXSHADERSEXTPROC, "glGenVertexShadersEXT");
280     SAFE_GET_PROC( qglDeleteVertexShaderEXT, PFNGLDELETEVERTEXSHADEREXTPROC, "glDeleteVertexShaderEXT");
281     SAFE_GET_PROC( qglShaderOp1EXT, PFNGLSHADEROP1EXTPROC, "glShaderOp1EXT");
282     SAFE_GET_PROC( qglShaderOp2EXT, PFNGLSHADEROP2EXTPROC, "glShaderOp2EXT");
283     SAFE_GET_PROC( qglShaderOp3EXT, PFNGLSHADEROP3EXTPROC, "glShaderOp3EXT");
284     SAFE_GET_PROC( qglSwizzleEXT, PFNGLSWIZZLEEXTPROC, "glSwizzleEXT");
285     SAFE_GET_PROC( qglWriteMaskEXT, PFNGLWRITEMASKEXTPROC, "glWriteMaskEXT");
286     SAFE_GET_PROC( qglInsertComponentEXT, PFNGLINSERTCOMPONENTEXTPROC, "glInsertComponentEXT");
287     SAFE_GET_PROC( qglExtractComponentEXT, PFNGLEXTRACTCOMPONENTEXTPROC, "glExtractComponentEXT");
288     SAFE_GET_PROC( qglGenSymbolsEXT, PFNGLGENSYMBOLSEXTPROC, "glGenSymbolsEXT");
289     SAFE_GET_PROC( qglSetInvariantEXT, PFNGLSETINVARIANTEXTPROC, "glSetInvariantEXT");
290     SAFE_GET_PROC( qglSetLocalConstantEXT, PFNGLSETLOCALCONSTANTEXTPROC, "glSetLocalConstantEXT");
291     SAFE_GET_PROC( qglVariantbvEXT, PFNGLVARIANTBVEXTPROC, "glVariantbvEXT");
292     SAFE_GET_PROC( qglVariantsvEXT, PFNGLVARIANTSVEXTPROC, "glVariantsvEXT");
293     SAFE_GET_PROC( qglVariantivEXT, PFNGLVARIANTIVEXTPROC, "glVariantivEXT");
294     SAFE_GET_PROC( qglVariantfvEXT, PFNGLVARIANTFVEXTPROC, "glVariantfvEXT");
295     SAFE_GET_PROC( qglVariantdvEXT, PFNGLVARIANTDVEXTPROC, "glVariantdvEXT");
296     SAFE_GET_PROC( qglVariantubvEXT, PFNGLVARIANTUBVEXTPROC, "glVariantubvEXT");
297     SAFE_GET_PROC( qglVariantusvEXT, PFNGLVARIANTUSVEXTPROC, "glVariantusvEXT");
298     SAFE_GET_PROC( qglVariantuivEXT, PFNGLVARIANTUIVEXTPROC, "glVariantuivEXT");
299     SAFE_GET_PROC( qglVariantPointerEXT, PFNGLVARIANTPOINTEREXTPROC, "glVariantPointerEXT");
300     SAFE_GET_PROC( qglEnableVariantClientStateEXT, PFNGLENABLEVARIANTCLIENTSTATEEXTPROC, "glEnableVariantClientStateEXT");
301     SAFE_GET_PROC( qglDisableVariantClientStateEXT, PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC, "glDisableVariantClientStateEXT");
302     SAFE_GET_PROC( qglBindLightParameterEXT, PFNGLBINDLIGHTPARAMETEREXTPROC, "glBindLightParameterEXT");
303     SAFE_GET_PROC( qglBindMaterialParameterEXT, PFNGLBINDMATERIALPARAMETEREXTPROC, "glBindMaterialParameterEXT");
304     SAFE_GET_PROC( qglBindTexGenParameterEXT, PFNGLBINDTEXGENPARAMETEREXTPROC, "glBindTexGenParameterEXT");
305     SAFE_GET_PROC( qglBindTextureUnitParameterEXT, PFNGLBINDTEXTUREUNITPARAMETEREXTPROC, "glBindTextureUnitParameterEXT");
306     SAFE_GET_PROC( qglBindParameterEXT, PFNGLBINDPARAMETEREXTPROC, "glBindParameterEXT");
307     SAFE_GET_PROC( qglIsVariantEnabledEXT, PFNGLISVARIANTENABLEDEXTPROC, "glIsVariantEnabledEXT");
308     SAFE_GET_PROC( qglGetVariantBooleanvEXT, PFNGLGETVARIANTBOOLEANVEXTPROC, "glGetVariantBooleanvEXT");
309     SAFE_GET_PROC( qglGetVariantIntegervEXT, PFNGLGETVARIANTINTEGERVEXTPROC, "glGetVariantIntegervEXT");
310     SAFE_GET_PROC( qglGetVariantFloatvEXT, PFNGLGETVARIANTFLOATVEXTPROC, "glGetVariantFloatvEXT");
311     SAFE_GET_PROC( qglGetVariantPointervEXT, PFNGLGETVARIANTPOINTERVEXTPROC, "glGetVariantPointervEXT");
312     SAFE_GET_PROC( qglGetInvariantBooleanvEXT, PFNGLGETINVARIANTBOOLEANVEXTPROC, "glGetInvariantBooleanvEXT");
313     SAFE_GET_PROC( qglGetInvariantIntegervEXT, PFNGLGETINVARIANTINTEGERVEXTPROC, "glGetInvariantIntegervEXT");
314     SAFE_GET_PROC( qglGetInvariantFloatvEXT, PFNGLGETINVARIANTFLOATVEXTPROC, "glGetInvariantFloatvEXT");
315     SAFE_GET_PROC( qglGetLocalConstantBooleanvEXT, PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC, "glGetLocalConstantBooleanvEXT");
316     SAFE_GET_PROC( qglGetLocalConstantIntegervEXT, PFNGLGETLOCALCONSTANTINTEGERVEXTPROC, "glGetLocalConstantIntegervEXT");
317     SAFE_GET_PROC( qglGetLocalConstantFloatvEXT, PFNGLGETLOCALCONSTANTFLOATVEXTPROC, "glGetLocalConstantFloatvEXT");
318 
319     SAFE_GET_PROC( qglPNTrianglesiATI, PFNGLPNTRIANGLESIATIPROC, "glPNTrianglesiATI");
320     SAFE_GET_PROC( qglPNTrianglesfATI, PFNGLPNTRIANGLESFATIPROC, "glPNTrianglesfATI");
321 #endif /* !__APPLE__ && !MACOSX */
322 
323     glEnable(GL_FRAGMENT_SHADER_ATI);
324 
325     fragment_shaders = qglGenFragmentShadersATI(2);
326 
327     // combined diffuse & specular shader w/ vertex color
328     qglBindFragmentShaderATI(fragment_shaders);
329     checkerror();
330     qglBeginFragmentShaderATI();
331     checkerror();
332 
333     qglSetFragmentShaderConstantATI(GL_CON_0_ATI, &scaler[0]);
334     checkerror();
335 
336     // texld r0, t0
337     qglSampleMapATI (GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI);
338     checkerror();
339     // texld r1, t1
340     qglSampleMapATI (GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI);
341     checkerror();
342     // texld r2, t2
343     qglSampleMapATI (GL_REG_2_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI);
344     checkerror();
345     // texld r3, t3
346     qglSampleMapATI (GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI);
347     checkerror();
348     // texld r4, t4
349     qglSampleMapATI (GL_REG_4_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI);
350     checkerror();
351 
352     // gloss * atten * light color * specular +
353     // dot * color * atten * light color * self shadow =
354     // (gloss * specular + dot * color * self shadow ) * atten * light color
355     // Alpha ops rule :-)
356 
357     // dp3_sat r2.rgb, r0_bx2.rgb, r2_bx2.rgb   // specular
358     qglColorFragmentOp2ATI(GL_DOT3_ATI,
359                            GL_REG_2_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
360                            GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
361                            GL_REG_2_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
362     checkerror();
363 
364     // +mov_x8_sat r2.a, r1_bx2.b               // self shadow term
365     qglAlphaFragmentOp1ATI(GL_MOV_ATI,
366                            GL_REG_2_ATI, GL_8X_BIT_ATI|GL_SATURATE_BIT_ATI,
367                            GL_REG_1_ATI, GL_BLUE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
368     checkerror();
369 
370     // dp3_sat r1.rgb, r0_bx2.rgb, r1_bx2.rgb   // diffuse
371     qglColorFragmentOp2ATI(GL_DOT3_ATI,
372                            GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
373                            GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
374                            GL_REG_1_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
375     checkerror();
376 
377     // +mad_x2_sat r1.a, r2.b, r2.b, -c0.b      // specular exponent
378     qglAlphaFragmentOp3ATI(GL_MAD_ATI,
379                            GL_REG_1_ATI, GL_2X_BIT_ATI|GL_SATURATE_BIT_ATI,
380                            GL_REG_2_ATI, GL_BLUE, GL_NONE,
381                            GL_REG_2_ATI, GL_BLUE, GL_NONE,
382                            GL_CON_0_ATI, GL_BLUE, GL_NEGATE_BIT_ATI);
383     checkerror();
384 
385     // mul r1.rgb, r1.rgb, r3.rgb               // diffuse color * diffuse bump
386     qglColorFragmentOp2ATI(GL_MUL_ATI,
387                            GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
388                            GL_REG_1_ATI, GL_NONE, GL_NONE,
389                            GL_REG_3_ATI, GL_NONE, GL_NONE);
390     checkerror();
391 
392     // +mul r1.a, r1.a, r1.a                    // raise exponent
393     qglAlphaFragmentOp2ATI(GL_MUL_ATI,
394                            GL_REG_1_ATI, GL_NONE,
395                            GL_REG_1_ATI, GL_NONE, GL_NONE,
396                            GL_REG_1_ATI, GL_NONE, GL_NONE);
397     checkerror();
398 
399     // mul r4.rgb, r4.rgb, v0.rgb               // atten * light color
400     qglColorFragmentOp2ATI(GL_MUL_ATI,
401                            GL_REG_4_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
402                            GL_REG_4_ATI, GL_NONE, GL_NONE,
403                            GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE);
404     checkerror();
405 
406     // +mul r1.a, r1.a, r1.a                    // raise exponent
407     qglAlphaFragmentOp2ATI(GL_MUL_ATI,
408                            GL_REG_1_ATI, GL_NONE,
409                            GL_REG_1_ATI, GL_NONE, GL_NONE,
410                            GL_REG_1_ATI, GL_NONE, GL_NONE);
411     checkerror();
412 
413     // mul r1.rgb, r1.rgb, r2.a                 // self shadow * diffuse
414     qglColorFragmentOp2ATI(GL_MUL_ATI,
415                            GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
416                            GL_REG_1_ATI, GL_NONE, GL_NONE,
417                            GL_REG_2_ATI, GL_ALPHA, GL_NONE);
418     checkerror();
419 
420     // +mul r0.a, r1.a, r0.a                    // specular * gloss map
421     qglAlphaFragmentOp2ATI(GL_MUL_ATI,
422                            GL_REG_0_ATI, GL_SATURATE_BIT_ATI,
423                            GL_REG_1_ATI, GL_NONE, GL_NONE,
424                            GL_REG_0_ATI, GL_NONE, GL_NONE);
425     checkerror();
426 
427     // add r0.rgb, r1.rgb, r0.a                 // diffuse + specular
428     qglColorFragmentOp2ATI(GL_ADD_ATI,
429                            GL_REG_0_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
430                            GL_REG_1_ATI, GL_NONE, GL_NONE,
431                            GL_REG_0_ATI, GL_ALPHA, GL_NONE);
432     checkerror();
433 
434     // mul_sat r0.rgb, r0.rgb, r4.rgb           // (diffuse + specular)*atten*color
435     qglColorFragmentOp2ATI(GL_MUL_ATI,
436                            GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI,
437                            GL_REG_0_ATI, GL_NONE, GL_NONE,
438                            GL_REG_4_ATI, GL_NONE, GL_NONE);
439     checkerror();
440 
441 
442     qglEndFragmentShaderATI();
443     checkerror();
444 
445     // Second shader with cube filter
446     qglBindFragmentShaderATI(fragment_shaders+1);
447     checkerror();
448     qglBeginFragmentShaderATI();
449     checkerror();
450 
451     qglSetFragmentShaderConstantATI(GL_CON_0_ATI, &scaler[0]);
452     checkerror();
453 
454     // texld r0, t0
455     qglSampleMapATI (GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI);
456     checkerror();
457     // texld r1, t1
458     qglSampleMapATI (GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI);
459     checkerror();
460     // texld r2, t2
461     qglSampleMapATI (GL_REG_2_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI);
462     checkerror();
463     // texld r3, t3
464     qglSampleMapATI (GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI);
465     checkerror();
466     // texld r4, t4
467     qglSampleMapATI (GL_REG_4_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI);
468     checkerror();
469     // texld r5, t5
470     qglSampleMapATI (GL_REG_5_ATI, GL_TEXTURE5_ARB, GL_SWIZZLE_STR_ATI);
471     checkerror();
472 
473     // gloss * atten * light color * specular +
474     // dot * color * atten * light color * self shadow =
475     // (gloss * specular + dot * color * self shadow ) * atten * light color * filter
476     // Alpha ops rule :-)
477 
478     // dp3_sat r2.rgb, r0_bx2.rgb, r2_bx2.rgb      // specular
479     qglColorFragmentOp2ATI(GL_DOT3_ATI,
480                            GL_REG_2_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
481                            GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
482                            GL_REG_2_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
483     checkerror();
484 
485     // +mov_x8_sat r2.a, r1_bx2.b                  // self shadow term
486     qglAlphaFragmentOp1ATI(GL_MOV_ATI,
487                            GL_REG_2_ATI, GL_8X_BIT_ATI|GL_SATURATE_BIT_ATI,
488                            GL_REG_1_ATI, GL_BLUE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
489     checkerror();
490 
491     // dp3_sat r1.rgb, r0_bx2.rgb, r1_bx2.rgb  // diffuse
492     qglColorFragmentOp2ATI(GL_DOT3_ATI,
493                            GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
494                            GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
495                            GL_REG_1_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
496     checkerror();
497 
498     // +mad_x2_sat r1.a, r2.b, r2.b, -c0.b     // specular exponent
499     qglAlphaFragmentOp3ATI(GL_MAD_ATI,
500                            GL_REG_1_ATI, GL_2X_BIT_ATI|GL_SATURATE_BIT_ATI,
501                            GL_REG_2_ATI, GL_BLUE, GL_NONE,
502                            GL_REG_2_ATI, GL_BLUE, GL_NONE,
503                            GL_CON_0_ATI, GL_BLUE, GL_NEGATE_BIT_ATI);
504     checkerror();
505 
506     // mul r1.rgb, r1.rgb, r3.rgb              // diffuse color * diffuse bump
507     qglColorFragmentOp2ATI(GL_MUL_ATI,
508                            GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
509                            GL_REG_1_ATI, GL_NONE, GL_NONE,
510                            GL_REG_3_ATI, GL_NONE, GL_NONE);
511     checkerror();
512 
513     // +mul r1.a, r1.a, r1.a                   // raise exponent
514     qglAlphaFragmentOp2ATI(GL_MUL_ATI,
515                            GL_REG_1_ATI, GL_NONE,
516                            GL_REG_1_ATI, GL_NONE, GL_NONE,
517                            GL_REG_1_ATI, GL_NONE, GL_NONE);
518     checkerror();
519 
520     // mul r4.rgb, r4.rgb, v0.rgb              // atten * light color
521     qglColorFragmentOp2ATI(GL_MUL_ATI,
522                            GL_REG_4_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
523                            GL_REG_4_ATI, GL_NONE, GL_NONE,
524                            GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE);
525     checkerror();
526 
527     // +mul r1.a, r1.a, r1.a                   // raise exponent
528     qglAlphaFragmentOp2ATI(GL_MUL_ATI,
529                            GL_REG_1_ATI, GL_NONE,
530                            GL_REG_1_ATI, GL_NONE, GL_NONE,
531                            GL_REG_1_ATI, GL_NONE, GL_NONE);
532     checkerror();
533 
534     // mul r1.rgb, r1.rgb, r2.a               // self shadow * diffuse
535     qglColorFragmentOp2ATI(GL_MUL_ATI,
536                            GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
537                            GL_REG_1_ATI, GL_NONE, GL_NONE,
538                            GL_REG_2_ATI, GL_ALPHA, GL_NONE);
539     checkerror();
540 
541     // +mul r0.a, r1.a, r0.a                 // specular * gloss map
542     qglAlphaFragmentOp2ATI(GL_MUL_ATI,
543                            GL_REG_0_ATI, GL_SATURATE_BIT_ATI,
544                            GL_REG_1_ATI, GL_NONE, GL_NONE,
545                            GL_REG_0_ATI, GL_NONE, GL_NONE);
546     checkerror();
547 
548     // add r0.rgb, r0.rgb, r0.a              // diffuse + specular
549     qglColorFragmentOp2ATI(GL_ADD_ATI,
550                            GL_REG_0_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
551                            GL_REG_1_ATI, GL_NONE, GL_NONE,
552                            GL_REG_0_ATI, GL_ALPHA, GL_NONE);
553     checkerror();
554 
555     // mul r0.rgb, r0.rgb, r4.rgb            // (diffuse + specular)*atten*color
556     qglColorFragmentOp2ATI(GL_MUL_ATI,
557                            GL_REG_0_ATI, GL_NONE, GL_NONE,
558                            GL_REG_0_ATI, GL_NONE, GL_NONE,
559                            GL_REG_4_ATI, GL_NONE, GL_NONE);
560     checkerror();
561 
562     // mul_sat r0.rgb, r0.rgb, r5.rgb    // (diffuse + specular)*atten*color*filter
563     qglColorFragmentOp2ATI(GL_MUL_ATI,
564                            GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI,
565                            GL_REG_0_ATI, GL_NONE, GL_NONE,
566                            GL_REG_5_ATI, GL_NONE, GL_NONE);
567     checkerror();
568 
569 
570     qglEndFragmentShaderATI();
571     checkerror();
572 
573     glDisable(GL_FRAGMENT_SHADER_ATI);
574 
575 
576     glEnable(GL_VERTEX_SHADER_EXT);
577 
578     vertex_shaders = qglGenVertexShadersEXT(2);
579     checkerror();
580     qglBindVertexShaderEXT(vertex_shaders);
581     checkerror();
582     qglBeginVertexShaderEXT();
583     checkerror();
584 
585     // Generates a necessary input for the diffuse bumpmapping registers
586     mvp           = qglBindParameterEXT( GL_MVP_MATRIX_EXT );
587     checkerror();
588     modelview     = qglBindParameterEXT( GL_MODELVIEW_MATRIX );
589     checkerror();
590     vertex        = qglBindParameterEXT( GL_CURRENT_VERTEX_EXT );
591     checkerror();
592     color         = qglBindParameterEXT( GL_CURRENT_COLOR );
593     checkerror();
594     texturematrix = qglBindTextureUnitParameterEXT( GL_TEXTURE4_ARB, GL_TEXTURE_MATRIX );
595     checkerror();
596     texcoord0     = qglBindTextureUnitParameterEXT( GL_TEXTURE0_ARB, GL_CURRENT_TEXTURE_COORDS );
597     checkerror();
598     texcoord1     = qglBindTextureUnitParameterEXT( GL_TEXTURE1_ARB, GL_CURRENT_TEXTURE_COORDS );
599     checkerror();
600     texcoord2     = qglBindTextureUnitParameterEXT( GL_TEXTURE2_ARB, GL_CURRENT_TEXTURE_COORDS );
601     checkerror();
602     disttemp      = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
603     checkerror();
604     disttemp2     = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
605     checkerror();
606     zcomp         = qglGenSymbolsEXT(GL_VECTOR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
607     checkerror();
608     fogstart      = qglBindParameterEXT( GL_FOG_START );
609     checkerror();
610     fogend        = qglBindParameterEXT( GL_FOG_END );
611     checkerror();
612 
613     // Transform vertex to view-space
614     qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_VERTEX_EXT, mvp, vertex );
615     checkerror();
616 
617     // Transform vertex by texture matrix and copy to output
618     qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_TEXTURE_COORD4_EXT, texturematrix, vertex );
619     checkerror();
620 
621     // copy tex coords of unit 0 to unit 3
622     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD0_EXT, texcoord0);
623     checkerror();
624     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD1_EXT, texcoord1);
625     checkerror();
626     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD2_EXT, texcoord2);
627     checkerror();
628     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD3_EXT, texcoord0);
629     checkerror();
630     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_COLOR0_EXT, color);
631     checkerror();
632 
633     // Transform vertex and take z for fog
634     qglExtractComponentEXT( zcomp, modelview, 2);
635     checkerror();
636     qglShaderOp2EXT( GL_OP_DOT4_EXT, disttemp, zcomp, vertex );
637     checkerror();
638 
639     // calculate fog values end - z and end - start
640     qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp, fogend, disttemp);
641     checkerror();
642     qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp2, fogend, fogstart);
643     checkerror();
644 
645     // divide end - z by end - start, that's it
646     qglShaderOp1EXT( GL_OP_RECIP_EXT, disttemp2, disttemp2);
647     checkerror();
648     qglShaderOp2EXT( GL_OP_MUL_EXT, GL_OUTPUT_FOG_EXT, disttemp, disttemp2);
649     checkerror();
650 
651     qglEndVertexShaderEXT();
652     checkerror();
653 
654     // Two transformed textures
655     qglBindVertexShaderEXT(vertex_shaders+1);
656     checkerror();
657     qglBeginVertexShaderEXT();
658     checkerror();
659 
660     // Generates a necessary input for the diffuse bumpmapping registers
661     mvp            = qglBindParameterEXT( GL_MVP_MATRIX_EXT );
662     checkerror();
663     modelview      = qglBindParameterEXT( GL_MODELVIEW_MATRIX );
664     checkerror();
665     vertex         = qglBindParameterEXT( GL_CURRENT_VERTEX_EXT );
666     checkerror();
667     color          = qglBindParameterEXT( GL_CURRENT_COLOR );
668     checkerror();
669     texturematrix  = qglBindTextureUnitParameterEXT( GL_TEXTURE4_ARB, GL_TEXTURE_MATRIX );
670     checkerror();
671     texturematrix2 = qglBindTextureUnitParameterEXT( GL_TEXTURE5_ARB, GL_TEXTURE_MATRIX );
672     checkerror();
673     texcoord0      = qglBindTextureUnitParameterEXT( GL_TEXTURE0_ARB, GL_CURRENT_TEXTURE_COORDS );
674     checkerror();
675     texcoord1      = qglBindTextureUnitParameterEXT( GL_TEXTURE1_ARB, GL_CURRENT_TEXTURE_COORDS );
676     checkerror();
677     texcoord2      = qglBindTextureUnitParameterEXT( GL_TEXTURE2_ARB, GL_CURRENT_TEXTURE_COORDS );
678     checkerror();
679     disttemp       = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
680     checkerror();
681     disttemp2      = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
682     checkerror();
683     zcomp          = qglGenSymbolsEXT(GL_VECTOR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
684     checkerror();
685     fogstart       = qglBindParameterEXT( GL_FOG_START );
686     checkerror();
687     fogend         = qglBindParameterEXT( GL_FOG_END );
688     checkerror();
689 
690     // Transform vertex to view-space
691     qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_VERTEX_EXT, mvp, vertex );
692     checkerror();
693 
694     // Transform vertex by texture matrix and copy to output
695     qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_TEXTURE_COORD4_EXT, texturematrix, vertex );
696     checkerror();
697 
698     // Transform vertex by texture matrix and copy to output
699     qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_TEXTURE_COORD5_EXT, texturematrix2, vertex );
700     checkerror();
701 
702     // copy tex coords of unit 0 to unit 3
703     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD0_EXT, texcoord0);
704     checkerror();
705     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD1_EXT, texcoord1);
706     checkerror();
707     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD2_EXT, texcoord2);
708     checkerror();
709     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD3_EXT, texcoord0);
710     checkerror();
711     qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_COLOR0_EXT, color);
712     checkerror();
713 
714     // Transform vertex and take z for fog
715     qglExtractComponentEXT( zcomp, modelview, 2);
716     checkerror();
717     qglShaderOp2EXT( GL_OP_DOT4_EXT, disttemp, zcomp, vertex );
718     checkerror();
719 
720     // calculate fog values end - z and end - start
721     qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp, fogend, disttemp);
722     checkerror();
723     qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp2, fogend, fogstart);
724     checkerror();
725 
726     // divide end - z by end - start, that's it
727     qglShaderOp1EXT( GL_OP_RECIP_EXT, disttemp2, disttemp2);
728     checkerror();
729     qglShaderOp2EXT( GL_OP_MUL_EXT, GL_OUTPUT_FOG_EXT, disttemp, disttemp2);
730     checkerror();
731 
732     qglEndVertexShaderEXT();
733     checkerror();
734 
735     glDisable(GL_VERTEX_SHADER_EXT);
736 }
737 
738 
GL_DisableDiffuseShaderRadeon()739 void GL_DisableDiffuseShaderRadeon()
740 {
741     //tex 0 = normal map
742     //tex 1 = normalization cube map (tangent space light vector)
743     //tex 2 = normalization cube map (tangent space half vector)
744     //tex 3 = color map
745     //tex 4 = (attenuation or light filter, depends on light settings)
746 
747     glDisable(GL_VERTEX_SHADER_EXT);
748     glDisable(GL_FRAGMENT_SHADER_ATI);
749 
750     GL_SelectTexture(GL_TEXTURE1_ARB);
751     glDisable(GL_TEXTURE_CUBE_MAP_ARB);
752 
753     GL_SelectTexture(GL_TEXTURE2_ARB);
754     glDisable(GL_TEXTURE_CUBE_MAP_ARB);
755 
756     GL_SelectTexture(GL_TEXTURE3_ARB);
757     glDisable(GL_TEXTURE_2D);
758 
759     GL_SelectTexture(GL_TEXTURE4_ARB);
760     if (currentshadowlight->filtercube)
761     {
762         glDisable(GL_TEXTURE_CUBE_MAP_ARB);
763         glPopMatrix();
764         GL_SelectTexture(GL_TEXTURE5_ARB);
765     }
766     glDisable(GL_TEXTURE_3D);
767     glPopMatrix();
768     glMatrixMode(GL_MODELVIEW);
769 
770     GL_SelectTexture(GL_TEXTURE0_ARB);
771 }
772 
GL_EnableDiffuseSpecularShaderRadeon(qboolean world,vec3_t lightOrig)773 void GL_EnableDiffuseSpecularShaderRadeon(qboolean world, vec3_t lightOrig)
774 {
775     float invrad = 1/currentshadowlight->radius;
776 
777     //tex 0 = normal map
778     //tex 1 = normalization cube map (tangent space light vector)
779     //tex 2 = normalization cube map (tangent space half vector)
780     //tex 3 = color map
781     //tex 4 = (attenuation or light filter, depends on light settings but the actual
782     //  register combiner setup does not change only the bound texture)
783 
784     GL_SelectTexture(GL_TEXTURE1_ARB);
785     glEnable(GL_TEXTURE_CUBE_MAP_ARB);
786     glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normcube_texture_object);
787 
788     GL_SelectTexture(GL_TEXTURE2_ARB);
789     glEnable(GL_TEXTURE_CUBE_MAP_ARB);
790     glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normcube_texture_object);
791 
792     GL_SelectTexture(GL_TEXTURE3_ARB);
793     glEnable(GL_TEXTURE_2D);
794 
795     glEnable(GL_FRAGMENT_SHADER_ATI);
796     glEnable(GL_VERTEX_SHADER_EXT);
797 
798     GL_SelectTexture(GL_TEXTURE4_ARB);
799     glMatrixMode(GL_TEXTURE);
800     glPushMatrix();
801     glLoadIdentity();
802     if (currentshadowlight->filtercube)
803     {
804         glGetError();
805         qglBindFragmentShaderATI( fragment_shaders + 1 );
806         checkerror();
807         qglBindVertexShaderEXT( vertex_shaders + 1);
808         checkerror();
809 
810         glEnable(GL_TEXTURE_CUBE_MAP_ARB);
811         glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, currentshadowlight->filtercube);
812         GL_SetupCubeMapMatrix(world);
813 
814         GL_SelectTexture(GL_TEXTURE5_ARB);
815         glMatrixMode(GL_TEXTURE);
816         glPushMatrix();
817         glLoadIdentity();
818     }
819     else
820     {
821         glGetError();
822         qglBindFragmentShaderATI( fragment_shaders );
823         checkerror();
824         qglBindVertexShaderEXT( vertex_shaders );
825         checkerror();
826     }
827 
828     glEnable(GL_TEXTURE_3D);
829     glBindTexture(GL_TEXTURE_3D, atten3d_texture_object);
830 
831     glTranslatef(0.5,0.5,0.5);
832     glScalef(0.5,0.5,0.5);
833     glScalef(invrad, invrad, invrad);
834     glTranslatef(-lightOrig[0], -lightOrig[1], -lightOrig[2]);
835 
836     GL_SelectTexture(GL_TEXTURE0_ARB);
837 
838 }
839 
840 
R_DrawWorldRadeonDiffuseSpecular(lightcmd_t * lightCmds)841 void R_DrawWorldRadeonDiffuseSpecular(lightcmd_t *lightCmds)
842 {
843     int command, num, i;
844     int lightPos = 0;
845     vec3_t lightOr;
846     msurface_t *surf;
847     float               *v;
848     float* lightP;
849     vec3_t lightDir;
850     vec3_t tsH,H;
851 
852     texture_t	*t;//XYZ
853 
854     //support flickering lights
855     VectorCopy(currentshadowlight->origin,lightOr);
856 
857     while (1)
858     {
859         command = lightCmds[lightPos++].asInt;
860         if (command == 0) break; //end of list
861 
862         surf = lightCmds[lightPos++].asVoid;
863 
864         if (surf->visframe != r_framecount) {
865             lightPos+=(4+surf->polys->numverts*(2+3));
866             continue;
867         }
868 
869         num = surf->polys->numverts;
870         lightPos+=4;//skip color
871 
872         //XYZ
873         t = R_TextureAnimation (surf->texinfo->texture);
874 
875         GL_SelectTexture(GL_TEXTURE0_ARB);
876         GL_Bind(t->gl_texturenum+1);
877         GL_SelectTexture(GL_TEXTURE3_ARB);
878         GL_Bind(t->gl_texturenum);
879 
880         glBegin(command);
881         //v = surf->polys->verts[0];
882         v = (float *)(&globalVertexTable[surf->polys->firstvertex]);
883         for (i=0; i<num; i++, v+= VERTEXSIZE)
884         {
885             //skip attent texture coord.
886             lightPos += 2;
887 
888             lightP = &lightCmds[lightPos].asFloat;
889             lightPos += 3;
890 
891             VectorCopy(lightP, lightDir);
892             VectorNormalize(lightDir);
893 
894             //calculate local H vector and put it into tangent space
895 
896             //r_origin = camera position
897             VectorSubtract(r_refdef.vieworg,v,H);
898             VectorNormalize(H);
899 
900             //put H in tangent space first since lightDir (precalc) is already in tang space
901             if (surf->flags & SURF_PLANEBACK)
902             {
903                 tsH[2] = -DotProduct(H,surf->plane->normal);
904             }
905             else
906             {
907                 tsH[2] = DotProduct(H,surf->plane->normal);
908             }
909 
910             tsH[1] = -DotProduct(H,surf->texinfo->vecs[1]);
911             tsH[0] = DotProduct(H,surf->texinfo->vecs[0]);
912 
913             VectorAdd(lightDir,tsH,tsH);
914 
915             // diffuse
916             qglMultiTexCoord2fARB(GL_TEXTURE0_ARB, v[3], v[4]);
917 
918             qglMultiTexCoord3fvARB(GL_TEXTURE1_ARB, lightP);
919 
920             // half vector for specular
921             qglMultiTexCoord3fvARB(GL_TEXTURE2_ARB,&tsH[0]);
922 
923             glVertex3fv(&v[0]);
924         }
925         glEnd();
926     }
927 
928     GL_SelectTexture(GL_TEXTURE0_ARB);
929 }
930 
931 
932 
R_DrawBrushRadeonDiffuseSpecular(entity_t * e)933 void R_DrawBrushRadeonDiffuseSpecular(entity_t *e)
934 {
935     model_t     *model = e->model;
936     msurface_t *surf;
937     glpoly_t    *poly;
938     int         i, j, count;
939     brushlightinstant_t *ins = e->brushlightinstant;
940     float       *v;
941     texture_t	*t;//XYZ
942 
943     count = 0;
944 
945     surf = &model->surfaces[model->firstmodelsurface];
946     for (i=0; i<model->nummodelsurfaces; i++, surf++)
947     {
948         if (!ins->polygonVis[i]) continue;
949 
950         poly = surf->polys;
951 
952         //XYZ
953         t = R_TextureAnimation (surf->texinfo->texture);
954 
955         GL_SelectTexture(GL_TEXTURE0_ARB);
956         GL_Bind(t->gl_texturenum+1);
957         GL_SelectTexture(GL_TEXTURE3_ARB);
958         GL_Bind(t->gl_texturenum);
959 
960         glBegin(GL_TRIANGLE_FAN);
961         //v = poly->verts[0];
962         v = (float *)(&globalVertexTable[poly->firstvertex]);
963         for (j=0 ; j<poly->numverts ; j++, v+= VERTEXSIZE)
964         {
965             qglMultiTexCoord2fARB(GL_TEXTURE0_ARB, v[3], v[4]);
966             qglMultiTexCoord3fvARB(GL_TEXTURE1_ARB,&ins->tslights[count+j][0]);
967             qglMultiTexCoord3fvARB(GL_TEXTURE2_ARB,&ins->tshalfangles[count+j][0]);
968             glVertex3fv(v);
969         }
970         glEnd();
971         count+=surf->numedges;
972     }
973 }
974 
975 
R_DrawAliasFrameRadeonDiffuseSpecular(aliashdr_t * paliashdr,aliasframeinstant_t * instant)976 void R_DrawAliasFrameRadeonDiffuseSpecular (aliashdr_t *paliashdr, aliasframeinstant_t *instant)
977 {
978     mtriangle_t *tris;
979     fstvert_t   *texcoords;
980     int anim;
981     int                 *indecies;
982     aliaslightinstant_t *linstant = instant->lightinstant;
983 
984     tris = (mtriangle_t *)((byte *)paliashdr + paliashdr->triangles);
985     texcoords = (fstvert_t *)((byte *)paliashdr + paliashdr->texcoords);
986 
987     //bind normal map
988     anim = (int)(cl.time*10) & 3;
989 
990     GL_SelectTexture(GL_TEXTURE0_ARB);
991     GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]+1);
992     GL_SelectTexture(GL_TEXTURE3_ARB);
993     GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]);
994 
995     indecies = (int *)((byte *)paliashdr + paliashdr->indecies);
996 
997     glVertexPointer(3, GL_FLOAT, 0, instant->vertices);
998     glEnableClientState(GL_VERTEX_ARRAY);
999     glNormalPointer(GL_FLOAT, 0, instant->normals);
1000     glEnableClientState(GL_NORMAL_ARRAY);
1001 
1002     qglClientActiveTextureARB(GL_TEXTURE0_ARB);
1003     glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
1004     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1005 
1006     qglClientActiveTextureARB(GL_TEXTURE1_ARB);
1007     glTexCoordPointer(3, GL_FLOAT, 0, linstant->tslights);
1008     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1009 
1010     qglClientActiveTextureARB(GL_TEXTURE2_ARB);
1011     glTexCoordPointer(3, GL_FLOAT, 0, linstant->tshalfangles);
1012     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1013 
1014     //glDrawElements(GL_TRIANGLES,paliashdr->numtris*3,GL_UNSIGNED_INT,indecies);
1015     glDrawElements(GL_TRIANGLES,linstant->numtris*3,GL_UNSIGNED_INT,&linstant->indecies[0]);
1016 
1017     glDisableClientState(GL_VERTEX_ARRAY);
1018     glDisableClientState(GL_NORMAL_ARRAY);
1019     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1020     qglClientActiveTextureARB(GL_TEXTURE0_ARB);
1021     GL_SelectTexture(GL_TEXTURE0_ARB);
1022     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1023 }
1024 
R_DrawWorldBumpedRadeon()1025 void R_DrawWorldBumpedRadeon()
1026 {
1027     if (!currentshadowlight->visible)
1028         return;
1029 
1030     glDepthMask (0);
1031     glShadeModel (GL_SMOOTH);
1032     GL_AddColor();
1033     glColor3fv(&currentshadowlight->color[0]);
1034 
1035     GL_EnableDiffuseSpecularShaderRadeon(true,currentshadowlight->origin);
1036     R_DrawWorldRadeonDiffuseSpecular(currentshadowlight->lightCmds);
1037     GL_DisableDiffuseShaderRadeon();
1038 
1039     glColor3f (1,1,1);
1040     glDisable (GL_BLEND);
1041     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1042     glDepthMask (1);
1043 }
1044 
R_DrawBrushBumpedRadeon(entity_t * e)1045 void R_DrawBrushBumpedRadeon(entity_t *e)
1046 {
1047     GL_AddColor();
1048     glColor3fv(&currentshadowlight->color[0]);
1049 
1050 
1051     GL_EnableDiffuseSpecularShaderRadeon(false,((brushlightinstant_t *)e->brushlightinstant)->lightpos);
1052     R_DrawBrushRadeonDiffuseSpecular(e);
1053     GL_DisableDiffuseShaderRadeon();
1054 }
1055 
R_DrawAliasBumpedRadeon(aliashdr_t * paliashdr,aliasframeinstant_t * instant)1056 void R_DrawAliasBumpedRadeon(aliashdr_t *paliashdr, aliasframeinstant_t *instant)
1057 {
1058     if ( gl_truform.value )
1059     {
1060         glEnable(GL_PN_TRIANGLES_ATI);
1061 	qglPNTrianglesiATI(GL_PN_TRIANGLES_POINT_MODE_ATI, GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI);
1062 	qglPNTrianglesiATI(GL_PN_TRIANGLES_NORMAL_MODE_ATI, GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI);
1063 	qglPNTrianglesiATI(GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI, gl_truform_tesselation.value);
1064     }
1065 
1066     GL_AddColor();
1067     glColor3fv(&currentshadowlight->color[0]);
1068 
1069     GL_EnableDiffuseSpecularShaderRadeon(false,instant->lightinstant->lightpos);
1070     R_DrawAliasFrameRadeonDiffuseSpecular(paliashdr,instant);
1071     GL_DisableDiffuseShaderRadeon();
1072 
1073     if ( gl_truform.value )
1074     {
1075         glDisable(GL_PN_TRIANGLES_ATI);
1076     }
1077 }
1078