[GPU] Cleanup the TEV GLSL code a bit"

This commit is contained in:
fleroviux 2023-06-20 21:44:55 +02:00
parent 9b5a24329f
commit b7616cc9ec

View file

@ -72,64 +72,66 @@ const char* fragmentShader = R"(
// OpenGL ES 1.1 reference pages for TEVs (this is what the PICA200 implements): // OpenGL ES 1.1 reference pages for TEVs (this is what the PICA200 implements):
// https://registry.khronos.org/OpenGL-Refpages/es1.1/xhtml/glTexEnv.xml // https://registry.khronos.org/OpenGL-Refpages/es1.1/xhtml/glTexEnv.xml
vec4 tev_fetch_source(uint source) { vec4 tev_fetch_source(uint src_id) {
if (source >= 6u && source < 13u) { if (src_id >= 6u && src_id < 13u) {
tev_unimplemented_source = true; tev_unimplemented_source = true;
} }
return tev_sources[source]; return tev_sources[src_id];
} }
vec4 tev_evaluate_source(int tev_id, int src_id) { vec4 tev_get_color_and_alpha_source(int tev_id, int src_id) {
vec4 rgb_source = tev_fetch_source((u_textureEnvSource[tev_id] >> (src_id * 4)) & 15u); vec4 result;
vec4 alpha_source = tev_fetch_source((u_textureEnvSource[tev_id] >> (16 + src_id * 4)) & 15u);
uint rgb_operand = (u_textureEnvOperand[tev_id] >> (src_id * 4)) & 15u; vec4 color_source = tev_fetch_source((u_textureEnvSource[tev_id] >> (src_id * 4)) & 15u);
vec4 alpha_source = tev_fetch_source((u_textureEnvSource[tev_id] >> (src_id * 4 + 16)) & 15u);
uint color_operand = (u_textureEnvOperand[tev_id] >> (src_id * 4)) & 15u;
uint alpha_operand = (u_textureEnvOperand[tev_id] >> (12 + src_id * 4)) & 7u; uint alpha_operand = (u_textureEnvOperand[tev_id] >> (12 + src_id * 4)) & 7u;
vec4 final;
// TODO: figure out what the undocumented values do // TODO: figure out what the undocumented values do
switch (rgb_operand) { switch (color_operand) {
case 0u: final.rgb = rgb_source.rgb; break; // Source color case 0u: result.rgb = color_source.rgb; break; // Source color
case 1u: final.rgb = 1.0 - rgb_source.rgb; break; // One minus source color case 1u: result.rgb = 1.0 - color_source.rgb; break; // One minus source color
case 2u: final.rgb = vec3(rgb_source.a); break; // Source alpha case 2u: result.rgb = vec3(color_source.a); break; // Source alpha
case 3u: final.rgb = vec3(1.0 - rgb_source.a); break; // One minus source alpha case 3u: result.rgb = vec3(1.0 - color_source.a); break; // One minus source alpha
case 4u: final.rgb = vec3(rgb_source.r); break; // Source red case 4u: result.rgb = vec3(color_source.r); break; // Source red
case 5u: final.rgb = vec3(1.0 - rgb_source.r); break; // One minus source red case 5u: result.rgb = vec3(1.0 - color_source.r); break; // One minus source red
case 8u: final.rgb = vec3(rgb_source.g); break; // Source green case 8u: result.rgb = vec3(color_source.g); break; // Source green
case 9u: final.rgb = vec3(1.0 - rgb_source.g); break; // One minus source green case 9u: result.rgb = vec3(1.0 - color_source.g); break; // One minus source green
case 12u: final.rgb = vec3(rgb_source.b); break; // Source blue case 12u: result.rgb = vec3(color_source.b); break; // Source blue
case 13u: final.rgb = vec3(1.0 - rgb_source.b); break; // One minus source blue case 13u: result.rgb = vec3(1.0 - color_source.b); break; // One minus source blue
default: break; default: break;
} }
// TODO: figure out what the undocumented values do
switch (alpha_operand) { switch (alpha_operand) {
case 0u: final.a = alpha_source.a; break; // Source alpha case 0u: result.a = alpha_source.a; break; // Source alpha
case 1u: final.a = 1.0 - alpha_source.a; break; // One minus source alpha case 1u: result.a = 1.0 - alpha_source.a; break; // One minus source alpha
case 2u: final.a = alpha_source.r; break; // Source red case 2u: result.a = alpha_source.r; break; // Source red
case 3u: final.a = 1.0 - alpha_source.r; break; // One minus source red case 3u: result.a = 1.0 - alpha_source.r; break; // One minus source red
case 4u: final.a = alpha_source.g; break; // Source green case 4u: result.a = alpha_source.g; break; // Source green
case 5u: final.a = 1.0 - alpha_source.g; break; // One minus source green case 5u: result.a = 1.0 - alpha_source.g; break; // One minus source green
case 6u: final.a = alpha_source.b; break; // Source blue case 6u: result.a = alpha_source.b; break; // Source blue
case 7u: final.a = 1.0 - alpha_source.b; break; // One minus source blue case 7u: result.a = 1.0 - alpha_source.b; break; // One minus source blue
default: break;
} }
return final; return result;
} }
vec4 tev_combine(int tev_id) { vec4 tev_combine(int tev_id) {
vec4 source0 = tev_evaluate_source(tev_id, 0); vec4 source0 = tev_get_color_and_alpha_source(tev_id, 0);
vec4 source1 = tev_evaluate_source(tev_id, 1); vec4 source1 = tev_get_color_and_alpha_source(tev_id, 1);
vec4 source2 = tev_evaluate_source(tev_id, 2); vec4 source2 = tev_get_color_and_alpha_source(tev_id, 2);
uint rgb_combine = u_textureEnvCombiner[tev_id] & 15u; uint color_combine = u_textureEnvCombiner[tev_id] & 15u;
uint alpha_combine = (u_textureEnvCombiner[tev_id] >> 16) & 15u; uint alpha_combine = (u_textureEnvCombiner[tev_id] >> 16) & 15u;
vec4 result = vec4(1.0); vec4 result = vec4(1.0);
// TODO: figure out what the undocumented values do // TODO: figure out what the undocumented values do
switch (rgb_combine) { switch (color_combine) {
case 0u: result.rgb = source0.rgb; break; // Replace case 0u: result.rgb = source0.rgb; break; // Replace
case 1u: result.rgb = source0.rgb * source1.rgb; break; // Modulate case 1u: result.rgb = source0.rgb * source1.rgb; break; // Modulate
case 2u: result.rgb = min(vec3(1.0), source0.rgb + source1.rgb); break; // Add case 2u: result.rgb = min(vec3(1.0), source0.rgb + source1.rgb); break; // Add
@ -143,7 +145,7 @@ const char* fragmentShader = R"(
default: break; default: break;
} }
if (rgb_combine != 7u) { // The color combiner also writes the alpha channel in the "Dot3 RGBA" mode. if (color_combine != 7u) { // The color combiner also writes the alpha channel in the "Dot3 RGBA" mode.
// TODO: figure out what the undocumented values do // TODO: figure out what the undocumented values do
// TODO: test if the alpha combiner supports all the same modes as the color combiner. // TODO: test if the alpha combiner supports all the same modes as the color combiner.
switch (alpha_combine) { switch (alpha_combine) {
@ -168,7 +170,7 @@ const char* fragmentShader = R"(
void main() { void main() {
vec2 tex2_uv = (u_textureConfig & (1 << 13)) != 0u ? texcoord1 : texcoord2; vec2 tex2_uv = (u_textureConfig & (1 << 13)) != 0u ? texcoord1 : texcoord2;
// TODO: what do invalid sources, disabled textures read as? // TODO: what do invalid sources and disabled textures read as?
// And what does the "previous combiner" source read initially? // And what does the "previous combiner" source read initially?
tev_sources[0] = colour; // Primary/vertex color tev_sources[0] = colour; // Primary/vertex color
tev_sources[1] = vec4(vec3(0.5), 1.0); // Fragment primary color tev_sources[1] = vec4(vec3(0.5), 1.0); // Fragment primary color