2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002 Dave2001
4 * Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
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
36 static int fct[4], source0[4], operand0[4], source1[4], operand1[4], source2[4], operand2[4];
37 static int fcta[4],sourcea0[4],operanda0[4],sourcea1[4],operanda1[4],sourcea2[4],operanda2[4];
38 static int alpha_ref, alpha_func;
41 float texture_env_color[4];
44 static float chroma_color[4];
46 static int chroma_enabled;
47 static int chroma_other_color;
48 static int chroma_other_alpha;
49 static int dither_enabled;
53 float fogStart,fogEnd;
62 float lambda_color[2][4];
67 static GLuint fragment_shader_object;
68 static GLuint fragment_depth_shader_object;
69 static GLuint vertex_shader_object;
70 static GLuint program_object_default;
71 static GLuint program_object_depth;
72 static GLuint program_object;
73 static int constant_color_location;
74 static int ccolor0_location;
75 static int ccolor1_location;
76 static int first_color = 1;
77 static int first_alpha = 1;
78 static int first_texture0 = 1;
79 static int first_texture1 = 1;
80 static int tex0_combiner_ext = 0;
81 static int tex1_combiner_ext = 0;
82 static int c_combiner_ext = 0;
83 static int a_combiner_ext = 0;
85 #define GLSL_VERSION "100"
87 #define SHADER_HEADER \
88 "#version " GLSL_VERSION " \n" \
89 "#define gl_Color vFrontColor \n" \
90 "#define gl_FrontColor vFrontColor \n" \
91 "#define gl_TexCoord vTexCoord \n"
93 #define SHADER_VARYING \
94 "varying highp vec4 gl_FrontColor; \n" \
95 "varying highp vec4 gl_TexCoord[4]; \n"
97 static const char* fragment_shader_header =
99 "precision lowp float; \n"
100 "uniform sampler2D texture0; \n"
101 "uniform sampler2D texture1; \n"
102 "uniform sampler2D ditherTex; \n"
103 "uniform vec4 constant_color; \n"
104 "uniform vec4 ccolor0; \n"
105 "uniform vec4 ccolor1; \n"
106 "uniform vec4 chroma_color; \n"
107 "uniform float lambda; \n"
108 "uniform vec3 fogColor; \n"
109 "uniform float alphaRef; \n"
112 "void test_chroma(vec4 ctexture1); \n"
119 // using gl_FragCoord is terribly slow on ATI and varying variables don't work for some unknown
120 // reason, so we use the unused components of the texture2 coordinates
121 static const char* fragment_shader_dither =
123 /*" float dithx = (gl_TexCoord[2].b + 1.0)*0.5*1000.0; \n"
124 " float dithy = (gl_TexCoord[2].a + 1.0)*0.5*1000.0; \n"
125 " if(texture2D(ditherTex, vec2((dithx-32.0*floor(dithx/32.0))/32.0, \n"
126 " (dithy-32.0*floor(dithy/32.0))/32.0)).a > 0.5) discard; \n"*/
129 static const char* fragment_shader_default =
130 " gl_FragColor = texture2D(texture0, vec2(gl_TexCoord[0])); \n"
133 static const char* fragment_shader_readtex0color =
134 " vec4 readtex0 = texture2D(texture0, vec2(gl_TexCoord[0])); \n"
137 static const char* fragment_shader_readtex0bw =
138 " vec4 readtex0 = texture2D(texture0, vec2(gl_TexCoord[0])); \n"
139 " readtex0 = vec4(vec3(readtex0.b), \n"
140 " readtex0.r + readtex0.g * 8.0 / 256.0); \n"
142 static const char* fragment_shader_readtex0bw_2 =
143 " vec4 readtex0 = vec4(dot(texture2D(texture0, vec2(gl_TexCoord[0])), vec4(1.0/3, 1.0/3, 1.0/3, 0))); \n"
146 static const char* fragment_shader_readtex1color =
147 " vec4 readtex1 = texture2D(texture1, vec2(gl_TexCoord[1])); \n"
150 static const char* fragment_shader_readtex1bw =
151 " vec4 readtex1 = texture2D(texture1, vec2(gl_TexCoord[1])); \n"
152 " readtex1 = vec4(vec3(readtex1.b), \n"
153 " readtex1.r + readtex1.g * 8.0 / 256.0); \n"
155 static const char* fragment_shader_readtex1bw_2 =
156 " vec4 readtex1 = vec4(dot(texture2D(texture1, vec2(gl_TexCoord[1])), vec4(1.0/3, 1.0/3, 1.0/3, 0))); \n"
159 static const char* fragment_shader_fog =
161 " fog = gl_TexCoord[0].b; \n"
162 " gl_FragColor.rgb = mix(fogColor, gl_FragColor.rgb, fog); \n"
165 static const char* fragment_shader_end =
166 "if(gl_FragColor.a <= alphaRef) {discard;} \n"
171 static const char* fragment_shader_alt_end =
176 static const char* vertex_shader =
178 "#define Z_MAX 65536.0 \n"
179 "attribute highp vec4 aVertex; \n"
180 "attribute mediump vec4 aColor; \n" //*SEB* highp -> lowp
181 "attribute highp vec4 aMultiTexCoord0; \n"
182 "attribute highp vec4 aMultiTexCoord1; \n"
183 "attribute float aFog; \n"
184 "uniform vec3 vertexOffset; \n" //Moved some calculations from grDrawXXX to shader
185 "uniform vec4 textureSizes; \n"
186 "uniform vec3 fogModeEndScale; \n" //0 = Mode, 1 = gl_Fog.end, 2 = gl_Fog.scale
191 " float q = aVertex.w; \n"
192 " float invertY = vertexOffset.z; \n" //Usually 1.0 but -1.0 when rendering to a texture (see inverted_culling grRenderBuffer)
193 " gl_Position.x = (aVertex.x - vertexOffset.x) / vertexOffset.x; \n"
194 " gl_Position.y = invertY *-(aVertex.y - vertexOffset.y) / vertexOffset.y; \n"
195 " gl_Position.z = aVertex.z / Z_MAX; \n"
196 " gl_Position.w = 1.0; \n"
197 " gl_Position /= q; \n"
198 " gl_FrontColor = aColor.bgra; \n"
200 " gl_TexCoord[0] = vec4(aMultiTexCoord0.xy / q / textureSizes.xy,0,1); \n"
201 " gl_TexCoord[1] = vec4(aMultiTexCoord1.xy / q / textureSizes.zw,0,1); \n"
203 " float fogV = (1.0 / mix(q,aFog,fogModeEndScale[0])) / 255.0; \n"
204 " //if(fogMode == 2) { \n"
205 " // fogV = 1.0 / aFog / 255 \n"
208 " float f = (fogModeEndScale[1] - fogV) * fogModeEndScale[2]; \n"
209 " f = clamp(f, 0.0, 1.0); \n"
210 " gl_TexCoord[0].b = f; \n"
211 " gl_TexCoord[2].b = aVertex.x; \n"
212 " gl_TexCoord[2].a = aVertex.y; \n"
216 static char fragment_shader_color_combiner[1024];
217 static char fragment_shader_alpha_combiner[1024];
218 static char fragment_shader_texture1[1024];
219 static char fragment_shader_texture0[1024];
220 static char fragment_shader_chroma[1024];
221 static char shader_log[2048];
223 void check_compile(GLuint shader)
226 glGetShaderiv(shader,GL_COMPILE_STATUS,&success);
230 glGetShaderInfoLog(shader,1024,NULL,log);
235 void check_link(GLuint program)
238 glGetProgramiv(program,GL_LINK_STATUS,&success);
242 glGetProgramInfoLog(program,1024,NULL,log);
249 int texture[4] = {0, 0, 0, 0};
251 glActiveTexture(GL_TEXTURE0);
252 glEnable(GL_TEXTURE_2D);
254 // creating a fake texture
255 glBindTexture(GL_TEXTURE_2D, default_texture);
256 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
257 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
258 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
260 glActiveTexture(GL_TEXTURE1);
261 glBindTexture(GL_TEXTURE_2D, default_texture);
262 glEnable(GL_TEXTURE_2D);
264 int texture0_location;
265 int texture1_location;
266 char *fragment_shader;
271 fragment_depth_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
274 // ZIGGY convert a 565 texture into depth component
275 sprintf(s, "gl_FragDepth = dot(texture2D(texture0, vec2(gl_TexCoord[0])), vec4(31*64*32, 63*32, 31, 0))*%g + %g; \n", zscale/2/65535.0, 1-zscale/2);
276 fragment_shader = (char*)malloc(strlen(fragment_shader_header)+
278 strlen(fragment_shader_end)+1);
279 strcpy(fragment_shader, fragment_shader_header);
280 strcat(fragment_shader, s);
281 strcat(fragment_shader, fragment_shader_end);
282 glShaderSource(fragment_depth_shader_object, 1, (const GLchar**)&fragment_shader, NULL);
283 free(fragment_shader);
285 glCompileShader(fragment_depth_shader_object);
286 check_compile(fragment_depth_shader_object);
290 fragment_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
292 fragment_shader = (char*)malloc(strlen(fragment_shader_header)+
293 strlen(fragment_shader_default)+
294 strlen(fragment_shader_alt_end)+1);
295 strcpy(fragment_shader, fragment_shader_header);
296 strcat(fragment_shader, fragment_shader_default);
297 strcat(fragment_shader, fragment_shader_alt_end); /*SEB*/
298 glShaderSource(fragment_shader_object, 1, (const GLchar**)&fragment_shader, NULL);
299 free(fragment_shader);
301 glCompileShader(fragment_shader_object);
302 check_compile(fragment_shader_object);
304 vertex_shader_object = glCreateShader(GL_VERTEX_SHADER);
305 glShaderSource(vertex_shader_object, 1, &vertex_shader, NULL);
306 glCompileShader(vertex_shader_object);
307 check_compile(vertex_shader_object);
310 program_object = glCreateProgram();
311 program_object_depth = program_object;
312 glAttachShader(program_object, fragment_depth_shader_object);
313 glAttachShader(program_object, vertex_shader_object);
315 glBindAttribLocation(program_object,POSITION_ATTR,"aPosition");
316 glBindAttribLocation(program_object,COLOUR_ATTR,"aColor");
317 glBindAttribLocation(program_object,TEXCOORD_0_ATTR,"aMultiTexCoord0");
318 glBindAttribLocation(program_object,TEXCOORD_1_ATTR,"aMultiTexCoord1");
319 glBindAttribLocation(program_object,FOG_ATTR,"aFog");
321 glLinkProgram(program_object);
322 check_link(program_object);
323 glUseProgram(program_object);
325 texture0_location = glGetUniformLocation(program_object, "texture0");
326 texture1_location = glGetUniformLocation(program_object, "texture1");
327 glUniform1i(texture0_location, 0);
328 glUniform1i(texture1_location, 1);
331 program_object = glCreateProgram();
332 program_object_default = program_object;
333 glAttachShader(program_object, fragment_shader_object);
334 glAttachShader(program_object, vertex_shader_object);
336 glBindAttribLocation(program_object,POSITION_ATTR,"aPosition");
337 glBindAttribLocation(program_object,COLOUR_ATTR,"aColor");
338 glBindAttribLocation(program_object,TEXCOORD_0_ATTR,"aMultiTexCoord0");
339 glBindAttribLocation(program_object,TEXCOORD_1_ATTR,"aMultiTexCoord1");
340 glBindAttribLocation(program_object,FOG_ATTR,"aFog");
342 glLinkProgram(program_object);
343 check_link(program_object);
344 glUseProgram(program_object);
346 texture0_location = glGetUniformLocation(program_object, "texture0");
347 texture1_location = glGetUniformLocation(program_object, "texture1");
348 glUniform1i(texture0_location, 0);
349 glUniform1i(texture1_location, 1);
351 strcpy(fragment_shader_color_combiner, "");
352 strcpy(fragment_shader_alpha_combiner, "");
353 strcpy(fragment_shader_texture1, "vec4 ctexture1 = texture2D(texture0, vec2(gl_TexCoord[0])); \n");
354 strcpy(fragment_shader_texture0, "");
368 void compile_chroma_shader()
370 strcpy(fragment_shader_chroma, "\nvoid test_chroma(vec4 ctexture1)\n{\n");
372 switch(chroma_other_alpha)
374 case GR_COMBINE_OTHER_ITERATED:
375 strcat(fragment_shader_chroma, "float alpha = gl_Color.a; \n");
377 case GR_COMBINE_OTHER_TEXTURE:
378 strcat(fragment_shader_chroma, "float alpha = ctexture1.a; \n");
380 case GR_COMBINE_OTHER_CONSTANT:
381 strcat(fragment_shader_chroma, "float alpha = constant_color.a; \n");
384 display_warning("unknown compile_choma_shader_alpha : %x", chroma_other_alpha);
387 switch(chroma_other_color)
389 case GR_COMBINE_OTHER_ITERATED:
390 strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(gl_Color),alpha); \n");
392 case GR_COMBINE_OTHER_TEXTURE:
393 strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(ctexture1),alpha); \n");
395 case GR_COMBINE_OTHER_CONSTANT:
396 strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(constant_color),alpha); \n");
399 display_warning("unknown compile_choma_shader_alpha : %x", chroma_other_color);
402 strcat(fragment_shader_chroma, "if (color.rgb == chroma_color.rgb) discard; \n");
403 strcat(fragment_shader_chroma, "}");
406 typedef struct _shader_program_key
410 int texture0_combiner;
411 int texture1_combiner;
412 int texture0_combinera;
413 int texture1_combinera;
419 int alpha_test; //*SEB*
420 GLuint fragment_shader_object;
421 GLuint program_object;
422 int texture0_location;
423 int texture1_location;
424 int vertexOffset_location;
425 int textureSizes_location;
426 int fogModeEndScale_location;
427 int fogColor_location;
428 int alphaRef_location;
429 int ditherTex_location;
430 int chroma_color_location;
431 } shader_program_key;
433 static shader_program_key* shader_programs = NULL;
434 static int number_of_programs = 0;
435 static int color_combiner_key;
436 static int alpha_combiner_key;
437 static int texture0_combiner_key;
438 static int texture1_combiner_key;
439 static int texture0_combinera_key;
440 static int texture1_combinera_key;
442 void update_uniforms(shader_program_key prog)
444 glUniform1i(prog.texture0_location, 0);
445 glUniform1i(prog.texture1_location, 1);
447 glUniform3f(prog.vertexOffset_location,widtho,heighto,inverted_culling ? -1.0f : 1.0f);
448 glUniform4f(prog.textureSizes_location,tex0_width,tex0_height,tex1_width,tex1_height);
450 glUniform3f(prog.fogModeEndScale_location,
451 fog_enabled != 2 ? 0.0f : 1.0f,
453 1.0f / (fogEnd - fogStart)
456 if(prog.fogColor_location != -1)
458 glUniform3f(prog.fogColor_location,fogColor[0],fogColor[1],fogColor[2]);
461 glUniform1f(prog.alphaRef_location,alpha_test ? alpha_ref/255.0f : -1.0f);
463 constant_color_location = glGetUniformLocation(program_object, "constant_color");
464 glUniform4f(constant_color_location, texture_env_color[0], texture_env_color[1],
465 texture_env_color[2], texture_env_color[3]);
467 ccolor0_location = glGetUniformLocation(program_object, "ccolor0");
468 glUniform4f(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);
470 ccolor1_location = glGetUniformLocation(program_object, "ccolor1");
471 glUniform4f(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);
473 glUniform4f(prog.chroma_color_location, chroma_color[0], chroma_color[1],
474 chroma_color[2], chroma_color[3]);
478 glUniform1i(prog.ditherTex_location, 2);
484 void disable_textureSizes()
486 int textureSizes_location = glGetUniformLocation(program_object_default,"textureSizes");
487 glUniform4f(textureSizes_location,1,1,1,1);
490 void compile_shader()
492 int texture0_location;
493 int texture1_location;
494 int ditherTex_location;
495 int vertexOffset_location;
496 int textureSizes_location;
497 char *fragment_shader;
499 int chroma_color_location;
506 for(i=0; i<number_of_programs; i++)
508 shader_program_key prog = shader_programs[i];
509 if(prog.color_combiner == color_combiner_key &&
510 prog.alpha_combiner == alpha_combiner_key &&
511 prog.texture0_combiner == texture0_combiner_key &&
512 prog.texture1_combiner == texture1_combiner_key &&
513 prog.texture0_combinera == texture0_combinera_key &&
514 prog.texture1_combinera == texture1_combinera_key &&
515 prog.fog_enabled == fog_enabled &&
516 prog.alpha_test == alpha_test && //*SEB*
517 prog.chroma_enabled == chroma_enabled &&
518 prog.dither_enabled == dither_enabled &&
519 prog.blackandwhite0 == blackandwhite0 &&
520 prog.blackandwhite1 == blackandwhite1)
522 program_object = shader_programs[i].program_object;
523 glUseProgram(program_object);
524 update_uniforms(prog);
529 if(shader_programs != NULL) {
530 if ((number_of_programs+1)>1024)
531 shader_programs = (shader_program_key*)realloc(shader_programs, (number_of_programs+1)*sizeof(shader_program_key));
534 shader_programs = (shader_program_key*)malloc(sizeof(shader_program_key)*1024);
535 //printf("number of shaders %d\n", number_of_programs);
537 shader_programs[number_of_programs].color_combiner = color_combiner_key;
538 shader_programs[number_of_programs].alpha_combiner = alpha_combiner_key;
539 shader_programs[number_of_programs].texture0_combiner = texture0_combiner_key;
540 shader_programs[number_of_programs].texture1_combiner = texture1_combiner_key;
541 shader_programs[number_of_programs].texture0_combinera = texture0_combinera_key;
542 shader_programs[number_of_programs].texture1_combinera = texture1_combinera_key;
543 shader_programs[number_of_programs].fog_enabled = fog_enabled;
544 shader_programs[number_of_programs].chroma_enabled = chroma_enabled;
545 shader_programs[number_of_programs].dither_enabled = dither_enabled;
546 shader_programs[number_of_programs].blackandwhite0 = blackandwhite0;
547 shader_programs[number_of_programs].blackandwhite1 = blackandwhite1;
548 shader_programs[number_of_programs].alpha_test = alpha_test; //*SEB*
552 strcat(fragment_shader_texture1, "test_chroma(ctexture1); \n");
553 compile_chroma_shader();
556 fragment_shader = (char*)malloc(4096);
558 strcpy(fragment_shader, fragment_shader_header);
559 if(dither_enabled) strcat(fragment_shader, fragment_shader_dither);
560 switch (blackandwhite0) {
561 case 1: strcat(fragment_shader, fragment_shader_readtex0bw); break;
562 case 2: strcat(fragment_shader, fragment_shader_readtex0bw_2); break;
563 default: strcat(fragment_shader, fragment_shader_readtex0color);
565 switch (blackandwhite1) {
566 case 1: strcat(fragment_shader, fragment_shader_readtex1bw); break;
567 case 2: strcat(fragment_shader, fragment_shader_readtex1bw_2); break;
568 default: strcat(fragment_shader, fragment_shader_readtex1color);
570 strcat(fragment_shader, fragment_shader_texture0);
571 strcat(fragment_shader, fragment_shader_texture1);
572 strcat(fragment_shader, fragment_shader_color_combiner);
573 strcat(fragment_shader, fragment_shader_alpha_combiner);
574 if(fog_enabled) strcat(fragment_shader, fragment_shader_fog);
576 strcat(fragment_shader, fragment_shader_end);
578 strcat(fragment_shader, fragment_shader_alt_end); //*SEB*
579 if(chroma_enabled) strcat(fragment_shader, fragment_shader_chroma);
581 shader_programs[number_of_programs].fragment_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
582 glShaderSource(shader_programs[number_of_programs].fragment_shader_object, 1, (const GLchar**)&fragment_shader, NULL);
584 glCompileShader(shader_programs[number_of_programs].fragment_shader_object);
585 check_compile(shader_programs[number_of_programs].fragment_shader_object);
587 program_object = glCreateProgram();
588 shader_programs[number_of_programs].program_object = program_object;
590 glBindAttribLocation(program_object,POSITION_ATTR,"aPosition");
591 glBindAttribLocation(program_object,COLOUR_ATTR,"aColor");
592 glBindAttribLocation(program_object,TEXCOORD_0_ATTR,"aMultiTexCoord0");
593 glBindAttribLocation(program_object,TEXCOORD_1_ATTR,"aMultiTexCoord1");
594 glBindAttribLocation(program_object,FOG_ATTR,"aFog");
596 glAttachShader(program_object, shader_programs[number_of_programs].fragment_shader_object);
597 glAttachShader(program_object, vertex_shader_object);
599 glLinkProgram(program_object);
600 check_link(program_object);
601 glUseProgram(program_object);
604 shader_programs[number_of_programs].texture0_location = glGetUniformLocation(program_object, "texture0");
605 shader_programs[number_of_programs].texture1_location = glGetUniformLocation(program_object, "texture1");
606 shader_programs[number_of_programs].vertexOffset_location = glGetUniformLocation(program_object, "vertexOffset");
607 shader_programs[number_of_programs].textureSizes_location = glGetUniformLocation(program_object, "textureSizes");
608 shader_programs[number_of_programs].fogModeEndScale_location = glGetUniformLocation(program_object, "fogModeEndScale");
609 shader_programs[number_of_programs].fogColor_location = glGetUniformLocation(program_object, "fogColor");
610 shader_programs[number_of_programs].alphaRef_location = glGetUniformLocation(program_object, "alphaRef");
612 update_uniforms(shader_programs[number_of_programs]);
614 number_of_programs++;
617 void free_combiners()
619 free(shader_programs);
620 shader_programs = NULL;
621 number_of_programs = 0;
624 void set_copy_shader()
626 int texture0_location;
627 int alphaRef_location;
629 glUseProgram(program_object_default);
630 texture0_location = glGetUniformLocation(program_object_default, "texture0");
631 glUniform1i(texture0_location, 0);
633 alphaRef_location = glGetUniformLocation(program_object_default, "alphaRef");
634 if(alphaRef_location != -1)
635 glUniform1f(alphaRef_location,alpha_test ? alpha_ref/255.0f : -1.0f);
638 void set_depth_shader()
640 int texture0_location;
641 int alphaRef_location;
643 glUseProgram(program_object_depth);
644 texture0_location = glGetUniformLocation(program_object_depth, "texture0");
645 glUniform1i(texture0_location, 0);
647 alphaRef_location = glGetUniformLocation(program_object_depth, "alphaRef");
648 if(alphaRef_location != -1)
649 glUniform1f(alphaRef_location,alpha_test ? alpha_ref/255.0f : -1.0f);
654 int lambda_location = glGetUniformLocation(program_object, "lambda");
655 glUniform1f(lambda_location, lambda);
658 FX_ENTRY void FX_CALL
659 grConstantColorValue( GrColor_t value )
661 LOG("grConstantColorValue(%d)\r\n", value);
662 switch(lfb_color_fmt)
664 case GR_COLORFORMAT_ARGB:
665 texture_env_color[3] = ((value >> 24) & 0xFF) / 255.0f;
666 texture_env_color[0] = ((value >> 16) & 0xFF) / 255.0f;
667 texture_env_color[1] = ((value >> 8) & 0xFF) / 255.0f;
668 texture_env_color[2] = (value & 0xFF) / 255.0f;
670 case GR_COLORFORMAT_RGBA:
671 texture_env_color[0] = ((value >> 24) & 0xFF) / 255.0f;
672 texture_env_color[1] = ((value >> 16) & 0xFF) / 255.0f;
673 texture_env_color[2] = ((value >> 8) & 0xFF) / 255.0f;
674 texture_env_color[3] = (value & 0xFF) / 255.0f;
677 display_warning("grConstantColorValue: unknown color format : %x", lfb_color_fmt);
682 constant_color_location = glGetUniformLocation(program_object, "constant_color");
683 glUniform4f(constant_color_location, texture_env_color[0], texture_env_color[1],
684 texture_env_color[2], texture_env_color[3]);
687 void writeGLSLColorOther(int other)
691 case GR_COMBINE_OTHER_ITERATED:
692 strcat(fragment_shader_color_combiner, "vec4 color_other = gl_Color; \n");
694 case GR_COMBINE_OTHER_TEXTURE:
695 strcat(fragment_shader_color_combiner, "vec4 color_other = ctexture1; \n");
697 case GR_COMBINE_OTHER_CONSTANT:
698 strcat(fragment_shader_color_combiner, "vec4 color_other = constant_color; \n");
701 display_warning("unknown writeGLSLColorOther : %x", other);
705 void writeGLSLColorLocal(int local)
709 case GR_COMBINE_LOCAL_ITERATED:
710 strcat(fragment_shader_color_combiner, "vec4 color_local = gl_Color; \n");
712 case GR_COMBINE_LOCAL_CONSTANT:
713 strcat(fragment_shader_color_combiner, "vec4 color_local = constant_color; \n");
716 display_warning("unknown writeGLSLColorLocal : %x", local);
720 void writeGLSLColorFactor(int factor, int local, int need_local, int other, int need_other)
724 case GR_COMBINE_FACTOR_ZERO:
725 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(0.0); \n");
727 case GR_COMBINE_FACTOR_LOCAL:
728 if(need_local) writeGLSLColorLocal(local);
729 strcat(fragment_shader_color_combiner, "vec4 color_factor = color_local; \n");
731 case GR_COMBINE_FACTOR_OTHER_ALPHA:
732 if(need_other) writeGLSLColorOther(other);
733 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(color_other.a); \n");
735 case GR_COMBINE_FACTOR_LOCAL_ALPHA:
736 if(need_local) writeGLSLColorLocal(local);
737 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(color_local.a); \n");
739 case GR_COMBINE_FACTOR_TEXTURE_ALPHA:
740 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(ctexture1.a); \n");
742 case GR_COMBINE_FACTOR_TEXTURE_RGB:
743 strcat(fragment_shader_color_combiner, "vec4 color_factor = ctexture1; \n");
745 case GR_COMBINE_FACTOR_ONE:
746 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0); \n");
748 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
749 if(need_local) writeGLSLColorLocal(local);
750 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - color_local; \n");
752 case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
753 if(need_other) writeGLSLColorOther(other);
754 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(color_other.a); \n");
756 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
757 if(need_local) writeGLSLColorLocal(local);
758 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(color_local.a); \n");
760 case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:
761 strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(ctexture1.a); \n");
764 display_warning("unknown writeGLSLColorFactor : %x", factor);
768 FX_ENTRY void FX_CALL
770 GrCombineFunction_t function, GrCombineFactor_t factor,
771 GrCombineLocal_t local, GrCombineOther_t other,
774 LOG("grColorCombine(%d,%d,%d,%d,%d)\r\n", function, factor, local, other, invert);
775 static int last_function = 0;
776 static int last_factor = 0;
777 static int last_local = 0;
778 static int last_other = 0;
780 if(last_function == function && last_factor == factor &&
781 last_local == local && last_other == other && first_color == 0 && !c_combiner_ext) return;
785 last_function = function;
786 last_factor = factor;
790 if (invert) display_warning("grColorCombine : inverted result");
792 color_combiner_key = function | (factor << 4) | (local << 8) | (other << 10);
793 chroma_other_color = other;
795 strcpy(fragment_shader_color_combiner, "");
798 case GR_COMBINE_FUNCTION_ZERO:
799 strcat(fragment_shader_color_combiner, "gl_FragColor = vec4(0.0); \n");
801 case GR_COMBINE_FUNCTION_LOCAL:
802 writeGLSLColorLocal(local);
803 strcat(fragment_shader_color_combiner, "gl_FragColor = color_local; \n");
805 case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
806 writeGLSLColorLocal(local);
807 strcat(fragment_shader_color_combiner, "gl_FragColor = vec4(color_local.a); \n");
809 case GR_COMBINE_FUNCTION_SCALE_OTHER:
810 writeGLSLColorOther(other);
811 writeGLSLColorFactor(factor,local,1,other,0);
812 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other; \n");
814 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
815 writeGLSLColorLocal(local);
816 writeGLSLColorOther(other);
817 writeGLSLColorFactor(factor,local,0,other,0);
818 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other + color_local; \n");
820 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
821 writeGLSLColorLocal(local);
822 writeGLSLColorOther(other);
823 writeGLSLColorFactor(factor,local,0,other,0);
824 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other + vec4(color_local.a); \n");
826 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
827 writeGLSLColorLocal(local);
828 writeGLSLColorOther(other);
829 writeGLSLColorFactor(factor,local,0,other,0);
830 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local); \n");
832 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
833 writeGLSLColorLocal(local);
834 writeGLSLColorOther(other);
835 writeGLSLColorFactor(factor,local,0,other,0);
836 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local) + color_local; \n");
838 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
839 writeGLSLColorLocal(local);
840 writeGLSLColorOther(other);
841 writeGLSLColorFactor(factor,local,0,other,0);
842 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local) + vec4(color_local.a); \n");
844 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
845 writeGLSLColorLocal(local);
846 writeGLSLColorFactor(factor,local,0,other,1);
847 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (-color_local) + color_local; \n");
849 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
850 writeGLSLColorLocal(local);
851 writeGLSLColorFactor(factor,local,0,other,1);
852 strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (-color_local) + vec4(color_local.a); \n");
855 strcpy(fragment_shader_color_combiner, fragment_shader_default);
856 display_warning("grColorCombine : unknown function : %x", function);
863 int setOtherAlphaSource(int other)
867 case GR_COMBINE_OTHER_ITERATED:
868 return GL_PRIMARY_COLOR_ARB;
870 case GR_COMBINE_OTHER_TEXTURE:
871 return GL_PREVIOUS_ARB;
873 case GR_COMBINE_OTHER_CONSTANT:
874 return GL_CONSTANT_ARB;
877 display_warning("unknwown other alpha source : %x", other);
882 int setLocalAlphaSource(int local)
886 case GR_COMBINE_LOCAL_ITERATED:
887 return GL_PRIMARY_COLOR_ARB;
889 case GR_COMBINE_LOCAL_CONSTANT:
890 return GL_CONSTANT_ARB;
893 display_warning("unknwown local alpha source : %x", local);
899 void writeGLSLAlphaOther(int other)
903 case GR_COMBINE_OTHER_ITERATED:
904 strcat(fragment_shader_alpha_combiner, "float alpha_other = gl_Color.a; \n");
906 case GR_COMBINE_OTHER_TEXTURE:
907 strcat(fragment_shader_alpha_combiner, "float alpha_other = ctexture1.a; \n");
909 case GR_COMBINE_OTHER_CONSTANT:
910 strcat(fragment_shader_alpha_combiner, "float alpha_other = constant_color.a; \n");
913 display_warning("unknown writeGLSLAlphaOther : %x", other);
917 void writeGLSLAlphaLocal(int local)
921 case GR_COMBINE_LOCAL_ITERATED:
922 strcat(fragment_shader_alpha_combiner, "float alpha_local = gl_Color.a; \n");
924 case GR_COMBINE_LOCAL_CONSTANT:
925 strcat(fragment_shader_alpha_combiner, "float alpha_local = constant_color.a; \n");
928 display_warning("unknown writeGLSLAlphaLocal : %x", local);
932 void writeGLSLAlphaFactor(int factor, int local, int need_local, int other, int need_other)
936 case GR_COMBINE_FACTOR_ZERO:
937 strcat(fragment_shader_alpha_combiner, "float alpha_factor = 0.0; \n");
939 case GR_COMBINE_FACTOR_LOCAL:
940 if(need_local) writeGLSLAlphaLocal(local);
941 strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_local; \n");
943 case GR_COMBINE_FACTOR_OTHER_ALPHA:
944 if(need_other) writeGLSLAlphaOther(other);
945 strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_other; \n");
947 case GR_COMBINE_FACTOR_LOCAL_ALPHA:
948 if(need_local) writeGLSLAlphaLocal(local);
949 strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_local; \n");
951 case GR_COMBINE_FACTOR_TEXTURE_ALPHA:
952 strcat(fragment_shader_alpha_combiner, "float alpha_factor = ctexture1.a; \n");
954 case GR_COMBINE_FACTOR_ONE:
955 strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0; \n");
957 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
958 if(need_local) writeGLSLAlphaLocal(local);
959 strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_local; \n");
961 case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
962 if(need_other) writeGLSLAlphaOther(other);
963 strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_other; \n");
965 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
966 if(need_local) writeGLSLAlphaLocal(local);
967 strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_local; \n");
969 case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:
970 strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - ctexture1.a; \n");
973 display_warning("unknown writeGLSLAlphaFactor : %x", factor);
977 FX_ENTRY void FX_CALL
979 GrCombineFunction_t function, GrCombineFactor_t factor,
980 GrCombineLocal_t local, GrCombineOther_t other,
984 LOG("grAlphaCombine(%d,%d,%d,%d,%d)\r\n", function, factor, local, other, invert);
985 static int last_function = 0;
986 static int last_factor = 0;
987 static int last_local = 0;
988 static int last_other = 0;
990 if(last_function == function && last_factor == factor &&
991 last_local == local && last_other == other && first_alpha == 0 && !a_combiner_ext) return;
995 last_function = function;
996 last_factor = factor;
1000 if (invert) display_warning("grAlphaCombine : inverted result");
1002 alpha_combiner_key = function | (factor << 4) | (local << 8) | (other << 10);
1003 chroma_other_alpha = other;
1005 strcpy(fragment_shader_alpha_combiner, "");
1009 case GR_COMBINE_FUNCTION_ZERO:
1010 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = 0.0; \n");
1012 case GR_COMBINE_FUNCTION_LOCAL:
1013 writeGLSLAlphaLocal(local);
1014 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_local; \n");
1016 case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
1017 writeGLSLAlphaLocal(local);
1018 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_local; \n");
1020 case GR_COMBINE_FUNCTION_SCALE_OTHER:
1021 writeGLSLAlphaOther(other);
1022 writeGLSLAlphaFactor(factor,local,1,other,0);
1023 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other; \n");
1025 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
1026 writeGLSLAlphaLocal(local);
1027 writeGLSLAlphaOther(other);
1028 writeGLSLAlphaFactor(factor,local,0,other,0);
1029 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other + alpha_local; \n");
1031 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
1032 writeGLSLAlphaLocal(local);
1033 writeGLSLAlphaOther(other);
1034 writeGLSLAlphaFactor(factor,local,0,other,0);
1035 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other + alpha_local; \n");
1037 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
1038 writeGLSLAlphaLocal(local);
1039 writeGLSLAlphaOther(other);
1040 writeGLSLAlphaFactor(factor,local,0,other,0);
1041 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local); \n");
1043 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
1044 writeGLSLAlphaLocal(local);
1045 writeGLSLAlphaOther(other);
1046 writeGLSLAlphaFactor(factor,local,0,other,0);
1047 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local) + alpha_local; \n");
1049 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1050 writeGLSLAlphaLocal(local);
1051 writeGLSLAlphaOther(other);
1052 writeGLSLAlphaFactor(factor,local,0,other,0);
1053 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local) + alpha_local; \n");
1055 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
1056 writeGLSLAlphaLocal(local);
1057 writeGLSLAlphaFactor(factor,local,0,other,1);
1058 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (-alpha_local) + alpha_local; \n");
1060 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1061 writeGLSLAlphaLocal(local);
1062 writeGLSLAlphaFactor(factor,local,0,other,1);
1063 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (-alpha_local) + alpha_local; \n");
1066 display_warning("grAlphaCombine : unknown function : %x", function);
1070 need_to_compile = 1;
1073 void writeGLSLTextureColorFactor(int num_tex, int factor)
1077 case GR_COMBINE_FACTOR_ZERO:
1079 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(0.0); \n");
1081 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(0.0); \n");
1083 case GR_COMBINE_FACTOR_LOCAL:
1085 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = readtex0; \n");
1087 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = readtex1; \n");
1089 case GR_COMBINE_FACTOR_OTHER_ALPHA:
1091 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(0.0); \n");
1093 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(ctexture0.a); \n");
1095 case GR_COMBINE_FACTOR_LOCAL_ALPHA:
1097 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(readtex0.a); \n");
1099 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(readtex1.a); \n");
1101 case GR_COMBINE_FACTOR_DETAIL_FACTOR:
1103 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(lambda); \n");
1105 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(lambda); \n");
1107 case GR_COMBINE_FACTOR_ONE:
1109 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0); \n");
1111 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0); \n");
1113 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
1115 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - readtex0; \n");
1117 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - readtex1; \n");
1119 case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
1121 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(0.0); \n");
1123 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(ctexture0.a); \n");
1125 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
1127 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(readtex0.a); \n");
1129 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(readtex1.a); \n");
1131 case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:
1133 strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(lambda); \n");
1135 strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(lambda); \n");
1138 display_warning("unknown writeGLSLTextureColorFactor : %x", factor);
1142 void writeGLSLTextureAlphaFactor(int num_tex, int factor)
1146 case GR_COMBINE_FACTOR_ZERO:
1148 strcat(fragment_shader_texture0, "float texture0_alpha_factor = 0.0; \n");
1150 strcat(fragment_shader_texture1, "float texture1_alpha_factor = 0.0; \n");
1152 case GR_COMBINE_FACTOR_LOCAL:
1154 strcat(fragment_shader_texture0, "float texture0_alpha_factor = readtex0.a; \n");
1156 strcat(fragment_shader_texture1, "float texture1_alpha_factor = readtex1.a; \n");
1158 case GR_COMBINE_FACTOR_OTHER_ALPHA:
1160 strcat(fragment_shader_texture0, "float texture0_alpha_factor = 0.0; \n");
1162 strcat(fragment_shader_texture1, "float texture1_alpha_factor = ctexture0.a; \n");
1164 case GR_COMBINE_FACTOR_LOCAL_ALPHA:
1166 strcat(fragment_shader_texture0, "float texture0_alpha_factor = readtex0.a; \n");
1168 strcat(fragment_shader_texture1, "float texture1_alpha_factor = readtex1.a; \n");
1170 case GR_COMBINE_FACTOR_DETAIL_FACTOR:
1172 strcat(fragment_shader_texture0, "float texture0_alpha_factor = lambda; \n");
1174 strcat(fragment_shader_texture1, "float texture1_alpha_factor = lambda; \n");
1176 case GR_COMBINE_FACTOR_ONE:
1178 strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0; \n");
1180 strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0; \n");
1182 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
1184 strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - readtex0.a; \n");
1186 strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - readtex1.a; \n");
1188 case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
1190 strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - 0.0; \n");
1192 strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - ctexture0.a; \n");
1194 case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
1196 strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - readtex0.a; \n");
1198 strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - readtex1.a; \n");
1200 case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:
1202 strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - lambda; \n");
1204 strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - lambda; \n");
1207 display_warning("unknown writeGLSLTextureAlphaFactor : %x", factor);
1211 FX_ENTRY void FX_CALL
1214 GrCombineFunction_t rgb_function,
1215 GrCombineFactor_t rgb_factor,
1216 GrCombineFunction_t alpha_function,
1217 GrCombineFactor_t alpha_factor,
1222 LOG("grTexCombine(%d,%d,%d,%d,%d,%d,%d)\r\n", tmu, rgb_function, rgb_factor, alpha_function, alpha_factor, rgb_invert, alpha_invert);
1225 if (tmu == GR_TMU0) num_tex = 1;
1230 static int last_function = 0;
1231 static int last_factor = 0;
1232 static int last_afunction = 0;
1233 static int last_afactor = 0;
1234 static int last_rgb_invert = 0;
1236 if(last_function == rgb_function && last_factor == rgb_factor &&
1237 last_afunction == alpha_function && last_afactor == alpha_factor &&
1238 last_rgb_invert == rgb_invert && first_texture0 == 0 && !tex0_combiner_ext) return;
1240 tex0_combiner_ext = 0;
1242 last_function = rgb_function;
1243 last_factor = rgb_factor;
1244 last_afunction = alpha_function;
1245 last_afactor = alpha_factor;
1246 last_rgb_invert= rgb_invert;
1247 texture0_combiner_key = rgb_function | (rgb_factor << 4) |
1248 (alpha_function << 8) | (alpha_factor << 12) |
1250 texture0_combinera_key = 0;
1251 strcpy(fragment_shader_texture0, "");
1255 static int last_function = 0;
1256 static int last_factor = 0;
1257 static int last_afunction = 0;
1258 static int last_afactor = 0;
1259 static int last_rgb_invert = 0;
1261 if(last_function == rgb_function && last_factor == rgb_factor &&
1262 last_afunction == alpha_function && last_afactor == alpha_factor &&
1263 last_rgb_invert == rgb_invert && first_texture1 == 0 && !tex1_combiner_ext) return;
1265 tex1_combiner_ext = 0;
1267 last_function = rgb_function;
1268 last_factor = rgb_factor;
1269 last_afunction = alpha_function;
1270 last_afactor = alpha_factor;
1271 last_rgb_invert = rgb_invert;
1273 texture1_combiner_key = rgb_function | (rgb_factor << 4) |
1274 (alpha_function << 8) | (alpha_factor << 12) |
1276 texture1_combinera_key = 0;
1277 strcpy(fragment_shader_texture1, "");
1280 switch(rgb_function)
1282 case GR_COMBINE_FUNCTION_ZERO:
1284 strcat(fragment_shader_texture0, "vec4 ctexture0 = vec4(0.0); \n");
1286 strcat(fragment_shader_texture1, "vec4 ctexture1 = vec4(0.0); \n");
1288 case GR_COMBINE_FUNCTION_LOCAL:
1290 strcat(fragment_shader_texture0, "vec4 ctexture0 = readtex0; \n");
1292 strcat(fragment_shader_texture1, "vec4 ctexture1 = readtex1; \n");
1294 case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
1296 strcat(fragment_shader_texture0, "vec4 ctexture0 = vec4(readtex0.a); \n");
1298 strcat(fragment_shader_texture1, "vec4 ctexture1 = vec4(readtex1.a); \n");
1300 case GR_COMBINE_FUNCTION_SCALE_OTHER:
1301 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1303 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0); \n");
1305 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0; \n");
1307 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
1308 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1310 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0) + readtex0; \n");
1312 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0 + readtex1; \n");
1314 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
1315 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1317 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0) + vec4(readtex0.a); \n");
1319 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0 + vec4(readtex1.a); \n");
1321 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
1322 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1324 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0); \n");
1326 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1); \n");
1328 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
1329 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1331 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0) + readtex0; \n");
1333 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1) + readtex1; \n");
1335 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1336 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1338 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0) + vec4(readtex0.a); \n");
1340 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1) + vec4(readtex1.a); \n");
1342 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
1343 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1345 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (-readtex0) + readtex0; \n");
1347 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (-readtex1) + readtex1; \n");
1349 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1350 writeGLSLTextureColorFactor(num_tex, rgb_factor);
1352 strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (-readtex0) + vec4(readtex0.a); \n");
1354 strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (-readtex1) + vec4(readtex1.a); \n");
1358 strcat(fragment_shader_texture0, "vec4 ctexture0 = readtex0; \n");
1360 strcat(fragment_shader_texture1, "vec4 ctexture1 = readtex1; \n");
1361 display_warning("grTextCombine : unknown rgb function : %x", rgb_function);
1367 strcat(fragment_shader_texture0, "ctexture0 = vec4(1.0) - ctexture0; \n");
1369 strcat(fragment_shader_texture1, "ctexture1 = vec4(1.0) - ctexture1; \n");
1372 switch(alpha_function)
1374 case GR_COMBINE_FACTOR_ZERO:
1376 strcat(fragment_shader_texture0, "ctexture0.a = 0.0; \n");
1378 strcat(fragment_shader_texture1, "ctexture1.a = 0.0; \n");
1380 case GR_COMBINE_FUNCTION_LOCAL:
1382 strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");
1384 strcat(fragment_shader_texture1, "ctexture1.a = readtex1.a; \n");
1386 case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
1388 strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");
1390 strcat(fragment_shader_texture1, "ctexture1.a = readtex1.a; \n");
1392 case GR_COMBINE_FUNCTION_SCALE_OTHER:
1393 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1395 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0; \n");
1397 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a; \n");
1399 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
1400 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1402 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0 + readtex0.a; \n");
1404 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a + readtex1.a; \n");
1406 case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
1407 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1409 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0 + readtex0.a; \n");
1411 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a + readtex1.a; \n");
1413 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
1414 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1416 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a); \n");
1418 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a); \n");
1420 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
1421 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1423 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a) + readtex0.a; \n");
1425 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a) + readtex1.a; \n");
1427 case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1428 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1430 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a) + readtex0.a; \n");
1432 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a) + readtex1.a; \n");
1434 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
1435 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1437 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (-readtex0.a) + readtex0.a; \n");
1439 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (-readtex1.a) + readtex1.a; \n");
1441 case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1442 writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1444 strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (-readtex0.a) + readtex0.a; \n");
1446 strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (-readtex1.a) + readtex1.a; \n");
1450 strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");
1452 strcat(fragment_shader_texture1, "ctexture1.a = ctexture0.a; \n");
1453 display_warning("grTextCombine : unknown alpha function : %x", alpha_function);
1459 strcat(fragment_shader_texture0, "ctexture0.a = 1.0 - ctexture0.a; \n");
1461 strcat(fragment_shader_texture1, "ctexture1.a = 1.0 - ctexture1.a; \n");
1463 need_to_compile = 1;
1466 FX_ENTRY void FX_CALL
1467 grAlphaBlendFunction(
1468 GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df,
1469 GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df
1472 int sfactorRGB = 0, dfactorRGB = 0, sfactorAlpha = 0, dfactorAlpha = 0;
1473 LOG("grAlphaBlendFunction(%d,%d,%d,%d)\r\n", rgb_sf, rgb_df, alpha_sf, alpha_df);
1478 sfactorRGB = GL_ZERO;
1480 case GR_BLEND_SRC_ALPHA:
1481 sfactorRGB = GL_SRC_ALPHA;
1484 sfactorRGB = GL_ONE;
1486 case GR_BLEND_ONE_MINUS_SRC_ALPHA:
1487 sfactorRGB = GL_ONE_MINUS_SRC_ALPHA;
1490 display_warning("grAlphaBlendFunction : rgb_sf = %x", rgb_sf);
1496 dfactorRGB = GL_ZERO;
1498 case GR_BLEND_SRC_ALPHA:
1499 dfactorRGB = GL_SRC_ALPHA;
1502 dfactorRGB = GL_ONE;
1504 case GR_BLEND_ONE_MINUS_SRC_ALPHA:
1505 dfactorRGB = GL_ONE_MINUS_SRC_ALPHA;
1508 display_warning("grAlphaBlendFunction : rgb_df = %x", rgb_df);
1514 sfactorAlpha = GL_ZERO;
1517 sfactorAlpha = GL_ONE;
1520 display_warning("grAlphaBlendFunction : alpha_sf = %x", alpha_sf);
1526 dfactorAlpha = GL_ZERO;
1529 dfactorAlpha = GL_ONE;
1532 display_warning("grAlphaBlendFunction : alpha_df = %x", alpha_df);
1535 glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
1537 if (blend_func_separate_support)
1538 glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
1540 glBlendFunc(sfactorRGB, dfactorRGB);
1544 FX_ENTRY void FX_CALL
1545 grAlphaTestReferenceValue( GrAlpha_t value )
1547 LOG("grAlphaTestReferenceValue(%d)\r\n", value);
1549 grAlphaTestFunction(alpha_func);
1552 FX_ENTRY void FX_CALL
1553 grAlphaTestFunction( GrCmpFnc_t function )
1555 LOG("grAlphaTestFunction(%d)\r\n", function);
1556 alpha_func = function;
1559 case GR_CMP_GREATER:
1560 //glAlphaFunc(GL_GREATER, alpha_ref/255.0f);
1563 //glAlphaFunc(GL_GEQUAL, alpha_ref/255.0f);
1566 //glAlphaFunc(GL_ALWAYS, alpha_ref/255.0f);
1567 //glDisable(GL_ALPHA_TEST);
1572 display_warning("grAlphaTestFunction : unknown function : %x", function);
1574 //glEnable(GL_ALPHA_TEST);
1580 FX_ENTRY void FX_CALL
1581 grFogMode( GrFogMode_t mode )
1583 LOG("grFogMode(%d)\r\n", mode);
1586 case GR_FOG_DISABLE:
1587 //glDisable(GL_FOG);
1590 case GR_FOG_WITH_TABLE_ON_Q:
1592 //glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
1595 case GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT:
1597 //glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
1601 display_warning("grFogMode : unknown mode : %x", mode);
1603 need_to_compile = 1;
1606 FX_ENTRY float FX_CALL
1607 guFogTableIndexToW( int i )
1609 LOG("guFogTableIndexToW(%d)\r\n", i);
1610 return (float)(pow(2.0, 3.0+(double)(i>>2)) / (8-(i&3)));
1613 FX_ENTRY void FX_CALL
1614 guFogGenerateLinear(GrFog_t *fogtable,
1615 float nearZ, float farZ )
1617 LOG("guFogGenerateLinear(%f,%f)\r\n", nearZ, farZ);
1619 glFogi(GL_FOG_MODE, GL_LINEAR);
1620 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
1621 glFogf(GL_FOG_START, nearZ / 255.0f);
1622 glFogf(GL_FOG_END, farZ / 255.0f);
1624 fogStart = nearZ / 255.0f;
1625 fogEnd = farZ / 255.0f;
1628 FX_ENTRY void FX_CALL
1629 grFogTable( const GrFog_t ft[] )
1631 LOG("grFogTable()\r\n");
1634 FX_ENTRY void FX_CALL
1635 grFogColorValue( GrColor_t fogcolor )
1637 LOG("grFogColorValue(%x)\r\n", fogcolor);
1639 switch(lfb_color_fmt)
1641 case GR_COLORFORMAT_ARGB:
1642 fogColor[3] = ((fogcolor >> 24) & 0xFF) / 255.0f;
1643 fogColor[0] = ((fogcolor >> 16) & 0xFF) / 255.0f;
1644 fogColor[1] = ((fogcolor >> 8) & 0xFF) / 255.0f;
1645 fogColor[2] = (fogcolor & 0xFF) / 255.0f;
1647 case GR_COLORFORMAT_RGBA:
1648 fogColor[0] = ((fogcolor >> 24) & 0xFF) / 255.0f;
1649 fogColor[1] = ((fogcolor >> 16) & 0xFF) / 255.0f;
1650 fogColor[2] = ((fogcolor >> 8) & 0xFF) / 255.0f;
1651 fogColor[3] = (fogcolor & 0xFF) / 255.0f;
1654 display_warning("grFogColorValue: unknown color format : %x", lfb_color_fmt);
1657 //glFogfv(GL_FOG_COLOR, color);
1662 FX_ENTRY void FX_CALL
1663 grChromakeyMode( GrChromakeyMode_t mode )
1665 LOG("grChromakeyMode(%d)\r\n", mode);
1668 case GR_CHROMAKEY_DISABLE:
1671 case GR_CHROMAKEY_ENABLE:
1675 display_warning("grChromakeyMode : unknown mode : %x", mode);
1677 need_to_compile = 1;
1680 FX_ENTRY void FX_CALL
1681 grChromakeyValue( GrColor_t value )
1683 LOG("grChromakeyValue(%x)\r\n", value);
1684 int chroma_color_location;
1686 switch(lfb_color_fmt)
1688 case GR_COLORFORMAT_ARGB:
1689 chroma_color[3] = 1.0;//((value >> 24) & 0xFF) / 255.0f;
1690 chroma_color[0] = ((value >> 16) & 0xFF) / 255.0f;
1691 chroma_color[1] = ((value >> 8) & 0xFF) / 255.0f;
1692 chroma_color[2] = (value & 0xFF) / 255.0f;
1694 case GR_COLORFORMAT_RGBA:
1695 chroma_color[0] = ((value >> 24) & 0xFF) / 255.0f;
1696 chroma_color[1] = ((value >> 16) & 0xFF) / 255.0f;
1697 chroma_color[2] = ((value >> 8) & 0xFF) / 255.0f;
1698 chroma_color[3] = 1.0;//(value & 0xFF) / 255.0f;
1701 display_warning("grChromakeyValue: unknown color format : %x", lfb_color_fmt);
1704 chroma_color_location = glGetUniformLocation(program_object, "chroma_color");
1705 glUniform4f(chroma_color_location, chroma_color[0], chroma_color[1],
1706 chroma_color[2], chroma_color[3]);
1709 static void setPattern()
1715 unsigned int val = (rand() << 17) | ((rand() & 1) << 16) | (rand() << 1) | (rand() & 1);
1716 stip[i*4+0] = (val >> 24) & 0xFF;
1717 stip[i*4+1] = (val >> 16) & 0xFF;
1718 stip[i*4+2] = (val >> 8) & 0xFF;
1719 stip[i*4+3] = val & 0xFF;
1721 GLubyte texture[32*32*4];
1727 texture[(i*32+j*8+0)*4+3] = ((stip[i*4+j] >> 7) & 1) ? 255 : 0;
1728 texture[(i*32+j*8+1)*4+3] = ((stip[i*4+j] >> 6) & 1) ? 255 : 0;
1729 texture[(i*32+j*8+2)*4+3] = ((stip[i*4+j] >> 5) & 1) ? 255 : 0;
1730 texture[(i*32+j*8+3)*4+3] = ((stip[i*4+j] >> 4) & 1) ? 255 : 0;
1731 texture[(i*32+j*8+4)*4+3] = ((stip[i*4+j] >> 3) & 1) ? 255 : 0;
1732 texture[(i*32+j*8+5)*4+3] = ((stip[i*4+j] >> 2) & 1) ? 255 : 0;
1733 texture[(i*32+j*8+6)*4+3] = ((stip[i*4+j] >> 1) & 1) ? 255 : 0;
1734 texture[(i*32+j*8+7)*4+3] = ((stip[i*4+j] >> 0) & 1) ? 255 : 0;
1737 glActiveTexture(GL_TEXTURE2);
1738 glEnable(GL_TEXTURE_2D);
1739 glBindTexture(GL_TEXTURE_2D, 33*1024*1024);
1740 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
1741 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1742 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1743 glDisable(GL_TEXTURE_2D);
1746 FX_ENTRY void FX_CALL
1748 GrStipplePattern_t stipple)
1750 LOG("grStipplePattern(%x)\r\n", stipple);
1755 FX_ENTRY void FX_CALL
1756 grStippleMode( GrStippleMode_t mode )
1758 LOG("grStippleMode(%d)\r\n", mode);
1761 case GR_STIPPLE_DISABLE:
1763 glActiveTexture(GL_TEXTURE2);
1764 glDisable(GL_TEXTURE_2D);
1766 case GR_STIPPLE_PATTERN:
1769 glActiveTexture(GL_TEXTURE2);
1770 glEnable(GL_TEXTURE_2D);
1772 case GR_STIPPLE_ROTATE:
1775 glActiveTexture(GL_TEXTURE2);
1776 glEnable(GL_TEXTURE_2D);
1779 display_warning("grStippleMode:%x", mode);
1781 need_to_compile = 1;
1784 FX_ENTRY void FX_CALL
1785 grColorCombineExt(GrCCUColor_t a, GrCombineMode_t a_mode,
1786 GrCCUColor_t b, GrCombineMode_t b_mode,
1787 GrCCUColor_t c, FxBool c_invert,
1788 GrCCUColor_t d, FxBool d_invert,
1789 FxU32 shift, FxBool invert)
1791 LOG("grColorCombineExt(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)\r\n", a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
1792 if (invert) display_warning("grColorCombineExt : inverted result");
1793 if (shift) display_warning("grColorCombineExt : shift = %d", shift);
1795 color_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
1796 ((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
1797 ((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
1798 ((d & 0x1F) << 20) | ((d_invert & 1) << 25);
1800 strcpy(fragment_shader_color_combiner, "");
1805 strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(0.0); \n");
1807 case GR_CMBX_TEXTURE_ALPHA:
1808 strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(ctexture1.a); \n");
1810 case GR_CMBX_CONSTANT_ALPHA:
1811 strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(constant_color.a); \n");
1813 case GR_CMBX_CONSTANT_COLOR:
1814 strcat(fragment_shader_color_combiner, "vec4 cs_a = constant_color; \n");
1816 case GR_CMBX_ITALPHA:
1817 strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(gl_Color.a); \n");
1820 strcat(fragment_shader_color_combiner, "vec4 cs_a = gl_Color; \n");
1822 case GR_CMBX_TEXTURE_RGB:
1823 strcat(fragment_shader_color_combiner, "vec4 cs_a = ctexture1; \n");
1826 display_warning("grColorCombineExt : a = %x", a);
1827 strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(0.0); \n");
1832 case GR_FUNC_MODE_ZERO:
1833 strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(0.0); \n");
1835 case GR_FUNC_MODE_X:
1836 strcat(fragment_shader_color_combiner, "vec4 c_a = cs_a; \n");
1838 case GR_FUNC_MODE_ONE_MINUS_X:
1839 strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(1.0) - cs_a; \n");
1841 case GR_FUNC_MODE_NEGATIVE_X:
1842 strcat(fragment_shader_color_combiner, "vec4 c_a = -cs_a; \n");
1845 display_warning("grColorCombineExt : a_mode = %x", a_mode);
1846 strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(0.0); \n");
1852 strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(0.0); \n");
1854 case GR_CMBX_TEXTURE_ALPHA:
1855 strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(ctexture1.a); \n");
1857 case GR_CMBX_CONSTANT_ALPHA:
1858 strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(constant_color.a); \n");
1860 case GR_CMBX_CONSTANT_COLOR:
1861 strcat(fragment_shader_color_combiner, "vec4 cs_b = constant_color; \n");
1863 case GR_CMBX_ITALPHA:
1864 strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(gl_Color.a); \n");
1867 strcat(fragment_shader_color_combiner, "vec4 cs_b = gl_Color; \n");
1869 case GR_CMBX_TEXTURE_RGB:
1870 strcat(fragment_shader_color_combiner, "vec4 cs_b = ctexture1; \n");
1873 display_warning("grColorCombineExt : b = %x", b);
1874 strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(0.0); \n");
1879 case GR_FUNC_MODE_ZERO:
1880 strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(0.0); \n");
1882 case GR_FUNC_MODE_X:
1883 strcat(fragment_shader_color_combiner, "vec4 c_b = cs_b; \n");
1885 case GR_FUNC_MODE_ONE_MINUS_X:
1886 strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(1.0) - cs_b; \n");
1888 case GR_FUNC_MODE_NEGATIVE_X:
1889 strcat(fragment_shader_color_combiner, "vec4 c_b = -cs_b; \n");
1892 display_warning("grColorCombineExt : b_mode = %x", b_mode);
1893 strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(0.0); \n");
1899 strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(0.0); \n");
1901 case GR_CMBX_TEXTURE_ALPHA:
1902 strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(ctexture1.a); \n");
1904 case GR_CMBX_ALOCAL:
1905 strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(c_b.a); \n");
1907 case GR_CMBX_AOTHER:
1908 strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(c_a.a); \n");
1911 strcat(fragment_shader_color_combiner, "vec4 c_c = cs_b; \n");
1913 case GR_CMBX_CONSTANT_ALPHA:
1914 strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(constant_color.a); \n");
1916 case GR_CMBX_CONSTANT_COLOR:
1917 strcat(fragment_shader_color_combiner, "vec4 c_c = constant_color; \n");
1919 case GR_CMBX_ITALPHA:
1920 strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(gl_Color.a); \n");
1923 strcat(fragment_shader_color_combiner, "vec4 c_c = gl_Color; \n");
1925 case GR_CMBX_TEXTURE_RGB:
1926 strcat(fragment_shader_color_combiner, "vec4 c_c = ctexture1; \n");
1929 display_warning("grColorCombineExt : c = %x", c);
1930 strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(0.0); \n");
1934 strcat(fragment_shader_color_combiner, "c_c = vec4(1.0) - c_c; \n");
1939 strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(0.0); \n");
1941 case GR_CMBX_ALOCAL:
1942 strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(c_b.a); \n");
1945 strcat(fragment_shader_color_combiner, "vec4 c_d = cs_b; \n");
1947 case GR_CMBX_TEXTURE_RGB:
1948 strcat(fragment_shader_color_combiner, "vec4 c_d = ctexture1; \n");
1951 strcat(fragment_shader_color_combiner, "vec4 c_d = gl_Color; \n");
1954 display_warning("grColorCombineExt : d = %x", d);
1955 strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(0.0); \n");
1959 strcat(fragment_shader_color_combiner, "c_d = vec4(1.0) - c_d; \n");
1961 strcat(fragment_shader_color_combiner, "gl_FragColor = (c_a + c_b) * c_c + c_d; \n");
1963 need_to_compile = 1;
1966 FX_ENTRY void FX_CALL
1967 grAlphaCombineExt(GrACUColor_t a, GrCombineMode_t a_mode,
1968 GrACUColor_t b, GrCombineMode_t b_mode,
1969 GrACUColor_t c, FxBool c_invert,
1970 GrACUColor_t d, FxBool d_invert,
1971 FxU32 shift, FxBool invert)
1973 LOG("grAlphaCombineExt(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)\r\n", a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
1974 if (invert) display_warning("grAlphaCombineExt : inverted result");
1975 if (shift) display_warning("grAlphaCombineExt : shift = %d", shift);
1977 alpha_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
1978 ((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
1979 ((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
1980 ((d & 0x1F) << 20) | ((d_invert & 1) << 25);
1982 strcpy(fragment_shader_alpha_combiner, "");
1987 strcat(fragment_shader_alpha_combiner, "float as_a = 0.0; \n");
1989 case GR_CMBX_TEXTURE_ALPHA:
1990 strcat(fragment_shader_alpha_combiner, "float as_a = ctexture1.a; \n");
1992 case GR_CMBX_CONSTANT_ALPHA:
1993 strcat(fragment_shader_alpha_combiner, "float as_a = constant_color.a; \n");
1995 case GR_CMBX_ITALPHA:
1996 strcat(fragment_shader_alpha_combiner, "float as_a = gl_Color.a; \n");
1999 display_warning("grAlphaCombineExt : a = %x", a);
2000 strcat(fragment_shader_alpha_combiner, "float as_a = 0.0; \n");
2005 case GR_FUNC_MODE_ZERO:
2006 strcat(fragment_shader_alpha_combiner, "float a_a = 0.0; \n");
2008 case GR_FUNC_MODE_X:
2009 strcat(fragment_shader_alpha_combiner, "float a_a = as_a; \n");
2011 case GR_FUNC_MODE_ONE_MINUS_X:
2012 strcat(fragment_shader_alpha_combiner, "float a_a = 1.0 - as_a; \n");
2014 case GR_FUNC_MODE_NEGATIVE_X:
2015 strcat(fragment_shader_alpha_combiner, "float a_a = -as_a; \n");
2018 display_warning("grAlphaCombineExt : a_mode = %x", a_mode);
2019 strcat(fragment_shader_alpha_combiner, "float a_a = 0.0; \n");
2025 strcat(fragment_shader_alpha_combiner, "float as_b = 0.0; \n");
2027 case GR_CMBX_TEXTURE_ALPHA:
2028 strcat(fragment_shader_alpha_combiner, "float as_b = ctexture1.a; \n");
2030 case GR_CMBX_CONSTANT_ALPHA:
2031 strcat(fragment_shader_alpha_combiner, "float as_b = constant_color.a; \n");
2033 case GR_CMBX_ITALPHA:
2034 strcat(fragment_shader_alpha_combiner, "float as_b = gl_Color.a; \n");
2037 display_warning("grAlphaCombineExt : b = %x", b);
2038 strcat(fragment_shader_alpha_combiner, "float as_b = 0.0; \n");
2043 case GR_FUNC_MODE_ZERO:
2044 strcat(fragment_shader_alpha_combiner, "float a_b = 0.0; \n");
2046 case GR_FUNC_MODE_X:
2047 strcat(fragment_shader_alpha_combiner, "float a_b = as_b; \n");
2049 case GR_FUNC_MODE_ONE_MINUS_X:
2050 strcat(fragment_shader_alpha_combiner, "float a_b = 1.0 - as_b; \n");
2052 case GR_FUNC_MODE_NEGATIVE_X:
2053 strcat(fragment_shader_alpha_combiner, "float a_b = -as_b; \n");
2056 display_warning("grAlphaCombineExt : b_mode = %x", b_mode);
2057 strcat(fragment_shader_alpha_combiner, "float a_b = 0.0; \n");
2063 strcat(fragment_shader_alpha_combiner, "float a_c = 0.0; \n");
2065 case GR_CMBX_TEXTURE_ALPHA:
2066 strcat(fragment_shader_alpha_combiner, "float a_c = ctexture1.a; \n");
2068 case GR_CMBX_ALOCAL:
2069 strcat(fragment_shader_alpha_combiner, "float a_c = as_b; \n");
2071 case GR_CMBX_AOTHER:
2072 strcat(fragment_shader_alpha_combiner, "float a_c = as_a; \n");
2075 strcat(fragment_shader_alpha_combiner, "float a_c = as_b; \n");
2077 case GR_CMBX_CONSTANT_ALPHA:
2078 strcat(fragment_shader_alpha_combiner, "float a_c = constant_color.a; \n");
2080 case GR_CMBX_ITALPHA:
2081 strcat(fragment_shader_alpha_combiner, "float a_c = gl_Color.a; \n");
2084 display_warning("grAlphaCombineExt : c = %x", c);
2085 strcat(fragment_shader_alpha_combiner, "float a_c = 0.0; \n");
2089 strcat(fragment_shader_alpha_combiner, "a_c = 1.0 - a_c; \n");
2094 strcat(fragment_shader_alpha_combiner, "float a_d = 0.0; \n");
2096 case GR_CMBX_TEXTURE_ALPHA:
2097 strcat(fragment_shader_alpha_combiner, "float a_d = ctexture1.a; \n");
2099 case GR_CMBX_ALOCAL:
2100 strcat(fragment_shader_alpha_combiner, "float a_d = as_b; \n");
2103 strcat(fragment_shader_alpha_combiner, "float a_d = as_b; \n");
2106 display_warning("grAlphaCombineExt : d = %x", d);
2107 strcat(fragment_shader_alpha_combiner, "float a_d = 0.0; \n");
2111 strcat(fragment_shader_alpha_combiner, "a_d = 1.0 - a_d; \n");
2113 strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = (a_a + a_b) * a_c + a_d; \n");
2115 need_to_compile = 1;
2118 FX_ENTRY void FX_CALL
2119 grTexColorCombineExt(GrChipID_t tmu,
2120 GrTCCUColor_t a, GrCombineMode_t a_mode,
2121 GrTCCUColor_t b, GrCombineMode_t b_mode,
2122 GrTCCUColor_t c, FxBool c_invert,
2123 GrTCCUColor_t d, FxBool d_invert,
2124 FxU32 shift, FxBool invert)
2127 LOG("grTexColorCombineExt(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)\r\n", tmu, a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
2129 if (invert) display_warning("grTexColorCombineExt : inverted result");
2130 if (shift) display_warning("grTexColorCombineExt : shift = %d", shift);
2132 if (tmu == GR_TMU0) num_tex = 1;
2137 texture0_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2138 ((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2139 ((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2140 ((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2141 tex0_combiner_ext = 1;
2142 strcpy(fragment_shader_texture0, "");
2146 texture1_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2147 ((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2148 ((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2149 ((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2150 tex1_combiner_ext = 1;
2151 strcpy(fragment_shader_texture1, "");
2158 strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2160 strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(0.0); \n");
2162 case GR_CMBX_ITALPHA:
2164 strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(gl_Color.a); \n");
2166 strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(gl_Color.a); \n");
2170 strcat(fragment_shader_texture0, "vec4 ctex0s_a = gl_Color; \n");
2172 strcat(fragment_shader_texture1, "vec4 ctex1s_a = gl_Color; \n");
2174 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2176 strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(readtex0.a); \n");
2178 strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(readtex1.a); \n");
2180 case GR_CMBX_LOCAL_TEXTURE_RGB:
2182 strcat(fragment_shader_texture0, "vec4 ctex0s_a = readtex0; \n");
2184 strcat(fragment_shader_texture1, "vec4 ctex1s_a = readtex1; \n");
2186 case GR_CMBX_OTHER_TEXTURE_ALPHA:
2188 strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2190 strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(ctexture0.a); \n");
2192 case GR_CMBX_OTHER_TEXTURE_RGB:
2194 strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2196 strcat(fragment_shader_texture1, "vec4 ctex1s_a = ctexture0; \n");
2198 case GR_CMBX_TMU_CCOLOR:
2200 strcat(fragment_shader_texture0, "vec4 ctex0s_a = ccolor0; \n");
2202 strcat(fragment_shader_texture1, "vec4 ctex1s_a = ccolor1; \n");
2204 case GR_CMBX_TMU_CALPHA:
2206 strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(ccolor0.a); \n");
2208 strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(ccolor1.a); \n");
2211 display_warning("grTexColorCombineExt : a = %x", a);
2213 strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2215 strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(0.0); \n");
2220 case GR_FUNC_MODE_ZERO:
2222 strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(0.0); \n");
2224 strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(0.0); \n");
2226 case GR_FUNC_MODE_X:
2228 strcat(fragment_shader_texture0, "vec4 ctex0_a = ctex0s_a; \n");
2230 strcat(fragment_shader_texture1, "vec4 ctex1_a = ctex1s_a; \n");
2232 case GR_FUNC_MODE_ONE_MINUS_X:
2234 strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(1.0) - ctex0s_a; \n");
2236 strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(1.0) - ctex1s_a; \n");
2238 case GR_FUNC_MODE_NEGATIVE_X:
2240 strcat(fragment_shader_texture0, "vec4 ctex0_a = -ctex0s_a; \n");
2242 strcat(fragment_shader_texture1, "vec4 ctex1_a = -ctex1s_a; \n");
2245 display_warning("grTexColorCombineExt : a_mode = %x", a_mode);
2247 strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(0.0); \n");
2249 strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(0.0); \n");
2256 strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2258 strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(0.0); \n");
2260 case GR_CMBX_ITALPHA:
2262 strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(gl_Color.a); \n");
2264 strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(gl_Color.a); \n");
2268 strcat(fragment_shader_texture0, "vec4 ctex0s_b = gl_Color; \n");
2270 strcat(fragment_shader_texture1, "vec4 ctex1s_b = gl_Color; \n");
2272 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2274 strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(readtex0.a); \n");
2276 strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(readtex1.a); \n");
2278 case GR_CMBX_LOCAL_TEXTURE_RGB:
2280 strcat(fragment_shader_texture0, "vec4 ctex0s_b = readtex0; \n");
2282 strcat(fragment_shader_texture1, "vec4 ctex1s_b = readtex1; \n");
2284 case GR_CMBX_OTHER_TEXTURE_ALPHA:
2286 strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2288 strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(ctexture0.a); \n");
2290 case GR_CMBX_OTHER_TEXTURE_RGB:
2292 strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2294 strcat(fragment_shader_texture1, "vec4 ctex1s_b = ctexture0; \n");
2296 case GR_CMBX_TMU_CALPHA:
2298 strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(ccolor0.a); \n");
2300 strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(ccolor1.a); \n");
2302 case GR_CMBX_TMU_CCOLOR:
2304 strcat(fragment_shader_texture0, "vec4 ctex0s_b = ccolor0; \n");
2306 strcat(fragment_shader_texture1, "vec4 ctex1s_b = ccolor1; \n");
2309 display_warning("grTexColorCombineExt : b = %x", b);
2311 strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2313 strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(0.0); \n");
2318 case GR_FUNC_MODE_ZERO:
2320 strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(0.0); \n");
2322 strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(0.0); \n");
2324 case GR_FUNC_MODE_X:
2326 strcat(fragment_shader_texture0, "vec4 ctex0_b = ctex0s_b; \n");
2328 strcat(fragment_shader_texture1, "vec4 ctex1_b = ctex1s_b; \n");
2330 case GR_FUNC_MODE_ONE_MINUS_X:
2332 strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(1.0) - ctex0s_b; \n");
2334 strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(1.0) - ctex1s_b; \n");
2336 case GR_FUNC_MODE_NEGATIVE_X:
2338 strcat(fragment_shader_texture0, "vec4 ctex0_b = -ctex0s_b; \n");
2340 strcat(fragment_shader_texture1, "vec4 ctex1_b = -ctex1s_b; \n");
2343 display_warning("grTexColorCombineExt : b_mode = %x", b_mode);
2345 strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(0.0); \n");
2347 strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(0.0); \n");
2354 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2356 strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(0.0); \n");
2360 strcat(fragment_shader_texture0, "vec4 ctex0_c = ctex0s_b; \n");
2362 strcat(fragment_shader_texture1, "vec4 ctex1_c = ctex1s_b; \n");
2364 case GR_CMBX_DETAIL_FACTOR:
2366 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(lambda); \n");
2368 strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(lambda); \n");
2372 strcat(fragment_shader_texture0, "vec4 ctex0_c = gl_Color; \n");
2374 strcat(fragment_shader_texture1, "vec4 ctex1_c = gl_Color; \n");
2376 case GR_CMBX_ITALPHA:
2378 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(gl_Color.a); \n");
2380 strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(gl_Color.a); \n");
2382 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2384 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(readtex0.a); \n");
2386 strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(readtex1.a); \n");
2388 case GR_CMBX_LOCAL_TEXTURE_RGB:
2390 strcat(fragment_shader_texture0, "vec4 ctex0_c = readtex0; \n");
2392 strcat(fragment_shader_texture1, "vec4 ctex1_c = readtex1; \n");
2394 case GR_CMBX_OTHER_TEXTURE_ALPHA:
2396 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2398 strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(ctexture0.a); \n");
2400 case GR_CMBX_OTHER_TEXTURE_RGB:
2402 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2404 strcat(fragment_shader_texture1, "vec4 ctex1_c = ctexture0; \n");
2406 case GR_CMBX_TMU_CALPHA:
2408 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(ccolor0.a); \n");
2410 strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(ccolor1.a); \n");
2412 case GR_CMBX_TMU_CCOLOR:
2414 strcat(fragment_shader_texture0, "vec4 ctex0_c = ccolor0; \n");
2416 strcat(fragment_shader_texture1, "vec4 ctex1_c = ccolor1; \n");
2419 display_warning("grTexColorCombineExt : c = %x", c);
2421 strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2423 strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(0.0); \n");
2429 strcat(fragment_shader_texture0, "ctex0_c = vec4(1.0) - ctex0_c; \n");
2431 strcat(fragment_shader_texture1, "ctex1_c = vec4(1.0) - ctex1_c; \n");
2438 strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(0.0); \n");
2440 strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(0.0); \n");
2444 strcat(fragment_shader_texture0, "vec4 ctex0_d = ctex0s_b; \n");
2446 strcat(fragment_shader_texture1, "vec4 ctex1_d = ctex1s_b; \n");
2450 strcat(fragment_shader_texture0, "vec4 ctex0_d = gl_Color; \n");
2452 strcat(fragment_shader_texture1, "vec4 ctex1_d = gl_Color; \n");
2454 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2456 strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(readtex0.a); \n");
2458 strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(readtex1.a); \n");
2461 display_warning("grTexColorCombineExt : d = %x", d);
2463 strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(0.0); \n");
2465 strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(0.0); \n");
2471 strcat(fragment_shader_texture0, "ctex0_d = vec4(1.0) - ctex0_d; \n");
2473 strcat(fragment_shader_texture1, "ctex1_d = vec4(1.0) - ctex1_d; \n");
2477 strcat(fragment_shader_texture0, "vec4 ctexture0 = (ctex0_a + ctex0_b) * ctex0_c + ctex0_d; \n");
2479 strcat(fragment_shader_texture1, "vec4 ctexture1 = (ctex1_a + ctex1_b) * ctex1_c + ctex1_d; \n");
2480 need_to_compile = 1;
2483 FX_ENTRY void FX_CALL
2484 grTexAlphaCombineExt(GrChipID_t tmu,
2485 GrTACUColor_t a, GrCombineMode_t a_mode,
2486 GrTACUColor_t b, GrCombineMode_t b_mode,
2487 GrTACUColor_t c, FxBool c_invert,
2488 GrTACUColor_t d, FxBool d_invert,
2489 FxU32 shift, FxBool invert)
2492 LOG("grTexAlphaCombineExt(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)\r\n", tmu, a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
2494 if (invert) display_warning("grTexAlphaCombineExt : inverted result");
2495 if (shift) display_warning("grTexAlphaCombineExt : shift = %d", shift);
2497 if (tmu == GR_TMU0) num_tex = 1;
2502 texture0_combinera_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2503 ((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2504 ((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2505 ((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2509 texture1_combinera_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2510 ((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2511 ((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2512 ((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2517 case GR_CMBX_ITALPHA:
2519 strcat(fragment_shader_texture0, "ctex0s_a.a = gl_Color.a; \n");
2521 strcat(fragment_shader_texture1, "ctex1s_a.a = gl_Color.a; \n");
2523 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2525 strcat(fragment_shader_texture0, "ctex0s_a.a = readtex0.a; \n");
2527 strcat(fragment_shader_texture1, "ctex1s_a.a = readtex1.a; \n");
2529 case GR_CMBX_OTHER_TEXTURE_ALPHA:
2531 strcat(fragment_shader_texture0, "ctex0s_a.a = 0.0; \n");
2533 strcat(fragment_shader_texture1, "ctex1s_a.a = ctexture0.a; \n");
2535 case GR_CMBX_TMU_CALPHA:
2537 strcat(fragment_shader_texture0, "ctex0s_a.a = ccolor0.a; \n");
2539 strcat(fragment_shader_texture1, "ctex1s_a.a = ccolor1.a; \n");
2542 display_warning("grTexAlphaCombineExt : a = %x", a);
2544 strcat(fragment_shader_texture0, "ctex0s_a.a = 0.0; \n");
2546 strcat(fragment_shader_texture1, "ctex1s_a.a = 0.0; \n");
2551 case GR_FUNC_MODE_ZERO:
2553 strcat(fragment_shader_texture0, "ctex0_a.a = 0.0; \n");
2555 strcat(fragment_shader_texture1, "ctex1_a.a = 0.0; \n");
2557 case GR_FUNC_MODE_X:
2559 strcat(fragment_shader_texture0, "ctex0_a.a = ctex0s_a.a; \n");
2561 strcat(fragment_shader_texture1, "ctex1_a.a = ctex1s_a.a; \n");
2563 case GR_FUNC_MODE_ONE_MINUS_X:
2565 strcat(fragment_shader_texture0, "ctex0_a.a = 1.0 - ctex0s_a.a; \n");
2567 strcat(fragment_shader_texture1, "ctex1_a.a = 1.0 - ctex1s_a.a; \n");
2569 case GR_FUNC_MODE_NEGATIVE_X:
2571 strcat(fragment_shader_texture0, "ctex0_a.a = -ctex0s_a.a; \n");
2573 strcat(fragment_shader_texture1, "ctex1_a.a = -ctex1s_a.a; \n");
2576 display_warning("grTexAlphaCombineExt : a_mode = %x", a_mode);
2578 strcat(fragment_shader_texture0, "ctex0_a.a = 0.0; \n");
2580 strcat(fragment_shader_texture1, "ctex1_a.a = 0.0; \n");
2585 case GR_CMBX_ITALPHA:
2587 strcat(fragment_shader_texture0, "ctex0s_b.a = gl_Color.a; \n");
2589 strcat(fragment_shader_texture1, "ctex1s_b.a = gl_Color.a; \n");
2591 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2593 strcat(fragment_shader_texture0, "ctex0s_b.a = readtex0.a; \n");
2595 strcat(fragment_shader_texture1, "ctex1s_b.a = readtex1.a; \n");
2597 case GR_CMBX_OTHER_TEXTURE_ALPHA:
2599 strcat(fragment_shader_texture0, "ctex0s_b.a = 0.0; \n");
2601 strcat(fragment_shader_texture1, "ctex1s_b.a = ctexture0.a; \n");
2603 case GR_CMBX_TMU_CALPHA:
2605 strcat(fragment_shader_texture0, "ctex0s_b.a = ccolor0.a; \n");
2607 strcat(fragment_shader_texture1, "ctex1s_b.a = ccolor1.a; \n");
2610 display_warning("grTexAlphaCombineExt : b = %x", b);
2612 strcat(fragment_shader_texture0, "ctex0s_b.a = 0.0; \n");
2614 strcat(fragment_shader_texture1, "ctex1s_b.a = 0.0; \n");
2619 case GR_FUNC_MODE_ZERO:
2621 strcat(fragment_shader_texture0, "ctex0_b.a = 0.0; \n");
2623 strcat(fragment_shader_texture1, "ctex1_b.a = 0.0; \n");
2625 case GR_FUNC_MODE_X:
2627 strcat(fragment_shader_texture0, "ctex0_b.a = ctex0s_b.a; \n");
2629 strcat(fragment_shader_texture1, "ctex1_b.a = ctex1s_b.a; \n");
2631 case GR_FUNC_MODE_ONE_MINUS_X:
2633 strcat(fragment_shader_texture0, "ctex0_b.a = 1.0 - ctex0s_b.a; \n");
2635 strcat(fragment_shader_texture1, "ctex1_b.a = 1.0 - ctex1s_b.a; \n");
2637 case GR_FUNC_MODE_NEGATIVE_X:
2639 strcat(fragment_shader_texture0, "ctex0_b.a = -ctex0s_b.a; \n");
2641 strcat(fragment_shader_texture1, "ctex1_b.a = -ctex1s_b.a; \n");
2644 display_warning("grTexAlphaCombineExt : b_mode = %x", b_mode);
2646 strcat(fragment_shader_texture0, "ctex0_b.a = 0.0; \n");
2648 strcat(fragment_shader_texture1, "ctex1_b.a = 0.0; \n");
2655 strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");
2657 strcat(fragment_shader_texture1, "ctex1_c.a = 0.0; \n");
2661 strcat(fragment_shader_texture0, "ctex0_c.a = ctex0s_b.a; \n");
2663 strcat(fragment_shader_texture1, "ctex1_c.a = ctex1s_b.a; \n");
2665 case GR_CMBX_DETAIL_FACTOR:
2667 strcat(fragment_shader_texture0, "ctex0_c.a = lambda; \n");
2669 strcat(fragment_shader_texture1, "ctex1_c.a = lambda; \n");
2671 case GR_CMBX_ITALPHA:
2673 strcat(fragment_shader_texture0, "ctex0_c.a = gl_Color.a; \n");
2675 strcat(fragment_shader_texture1, "ctex1_c.a = gl_Color.a; \n");
2677 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2679 strcat(fragment_shader_texture0, "ctex0_c.a = readtex0.a; \n");
2681 strcat(fragment_shader_texture1, "ctex1_c.a = readtex1.a; \n");
2683 case GR_CMBX_OTHER_TEXTURE_ALPHA:
2685 strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");
2687 strcat(fragment_shader_texture1, "ctex1_c.a = ctexture0.a; \n");
2689 case GR_CMBX_TMU_CALPHA:
2691 strcat(fragment_shader_texture0, "ctex0_c.a = ccolor0.a; \n");
2693 strcat(fragment_shader_texture1, "ctex1_c.a = ccolor1.a; \n");
2696 display_warning("grTexAlphaCombineExt : c = %x", c);
2698 strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");
2700 strcat(fragment_shader_texture1, "ctex1_c.a = 0.0; \n");
2706 strcat(fragment_shader_texture0, "ctex0_c.a = 1.0 - ctex0_c.a; \n");
2708 strcat(fragment_shader_texture1, "ctex1_c.a = 1.0 - ctex1_c.a; \n");
2715 strcat(fragment_shader_texture0, "ctex0_d.a = 0.0; \n");
2717 strcat(fragment_shader_texture1, "ctex1_d.a = 0.0; \n");
2721 strcat(fragment_shader_texture0, "ctex0_d.a = ctex0s_b.a; \n");
2723 strcat(fragment_shader_texture1, "ctex1_d.a = ctex1s_b.a; \n");
2725 case GR_CMBX_ITALPHA:
2727 strcat(fragment_shader_texture0, "ctex0_d.a = gl_Color.a; \n");
2729 strcat(fragment_shader_texture1, "ctex1_d.a = gl_Color.a; \n");
2733 strcat(fragment_shader_texture0, "ctex0_d.a = gl_Color.a; \n");
2735 strcat(fragment_shader_texture1, "ctex1_d.a = gl_Color.a; \n");
2737 case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2739 strcat(fragment_shader_texture0, "ctex0_d.a = readtex0.a; \n");
2741 strcat(fragment_shader_texture1, "ctex1_d.a = readtex1.a; \n");
2744 display_warning("grTexAlphaCombineExt : d = %x", d);
2746 strcat(fragment_shader_texture0, "ctex0_d.a = 0.0; \n");
2748 strcat(fragment_shader_texture1, "ctex1_d.a = 0.0; \n");
2754 strcat(fragment_shader_texture0, "ctex0_d.a = 1.0 - ctex0_d.a; \n");
2756 strcat(fragment_shader_texture1, "ctex1_d.a = 1.0 - ctex1_d.a; \n");
2760 strcat(fragment_shader_texture0, "ctexture0.a = (ctex0_a.a + ctex0_b.a) * ctex0_c.a + ctex0_d.a; \n");
2762 strcat(fragment_shader_texture1, "ctexture1.a = (ctex1_a.a + ctex1_b.a) * ctex1_c.a + ctex1_d.a; \n");
2764 need_to_compile = 1;
2767 FX_ENTRY void FX_CALL
2768 grConstantColorValueExt(GrChipID_t tmu,
2772 LOG("grConstantColorValueExt(%d,%d)\r\n", tmu, value);
2774 if (tmu == GR_TMU0) num_tex = 1;
2777 switch(lfb_color_fmt)
2779 case GR_COLORFORMAT_ARGB:
2782 ccolor0[3] = ((value >> 24) & 0xFF) / 255.0f;
2783 ccolor0[0] = ((value >> 16) & 0xFF) / 255.0f;
2784 ccolor0[1] = ((value >> 8) & 0xFF) / 255.0f;
2785 ccolor0[2] = (value & 0xFF) / 255.0f;
2789 ccolor1[3] = ((value >> 24) & 0xFF) / 255.0f;
2790 ccolor1[0] = ((value >> 16) & 0xFF) / 255.0f;
2791 ccolor1[1] = ((value >> 8) & 0xFF) / 255.0f;
2792 ccolor1[2] = (value & 0xFF) / 255.0f;
2795 case GR_COLORFORMAT_RGBA:
2798 ccolor0[0] = ((value >> 24) & 0xFF) / 255.0f;
2799 ccolor0[1] = ((value >> 16) & 0xFF) / 255.0f;
2800 ccolor0[2] = ((value >> 8) & 0xFF) / 255.0f;
2801 ccolor0[3] = (value & 0xFF) / 255.0f;
2805 ccolor1[0] = ((value >> 24) & 0xFF) / 255.0f;
2806 ccolor1[1] = ((value >> 16) & 0xFF) / 255.0f;
2807 ccolor1[2] = ((value >> 8) & 0xFF) / 255.0f;
2808 ccolor1[3] = (value & 0xFF) / 255.0f;
2812 display_warning("grConstantColorValue: unknown color format : %x", lfb_color_fmt);
2818 ccolor0_location = glGetUniformLocation(program_object, "ccolor0");
2819 glUniform4f(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);
2823 ccolor1_location = glGetUniformLocation(program_object, "ccolor1");
2824 glUniform4f(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);