From 1aa4dea63e5a505a15085c95ebafb87c60895b70 Mon Sep 17 00:00:00 2001 From: fleroviux Date: Fri, 16 Jun 2023 00:41:48 +0200 Subject: [PATCH] [GPU] Add the remaining two TEV units Looks like I overlooked the fact there actually are fix texture combiners, not just four. The last two texture combiners are easy to miss, because there are other GPU registers between the first four combiners and the last two. --- src/core/renderer_gl/renderer_gl.cpp | 60 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp index 1e3f9100..73b0368d 100644 --- a/src/core/renderer_gl/renderer_gl.cpp +++ b/src/core/renderer_gl/renderer_gl.cpp @@ -39,11 +39,11 @@ const char* fragmentShader = R"( uniform uint u_textureConfig; // TEV uniforms - uniform uint u_textureEnvSource[4]; - uniform uint u_textureEnvOperand[4]; - uniform uint u_textureEnvCombiner[4]; - uniform vec4 u_textureEnvColor[4]; - uniform uint u_textureEnvScale[4]; + uniform uint u_textureEnvSource[6]; + uniform uint u_textureEnvOperand[6]; + uniform uint u_textureEnvCombiner[6]; + uniform vec4 u_textureEnvColor[6]; + uniform uint u_textureEnvScale[6]; // Depth control uniforms uniform float u_depthScale; @@ -68,7 +68,7 @@ const char* fragmentShader = R"( case 3u: source.rgb = texture(u_tex0, tex0_UVs).rgb; break; // Texture 0 case 14u: source.rgb = u_textureEnvColor[tev_id].rgb; break; // Constant (GPUREG_TEXENVi_COLOR) case 15u: source.rgb = previous.rgb; // Previous (output from TEV #n-1) - default: return vec4(0.0, 1.0, 1.0, 1.0); break; // TODO: implement remaining sources + default: break;//return vec4(0.0, 1.0, 1.0, 1.0); break; // TODO: implement remaining sources } switch (alpha_source) { @@ -76,7 +76,7 @@ const char* fragmentShader = R"( case 3u: source.a = texture(u_tex0, tex0_UVs).a; break; // Texture 0 case 14u: source.a = u_textureEnvColor[tev_id].a; break; // Constant (GPUREG_TEXENVi_COLOR) case 15u: source.a = previous.a; // Previous (output from TEV #n-1) - default: return vec4(0.0, 1.0, 1.0, 1.0); break; // TODO: implement remaining sources + default: break;//return vec4(0.0, 1.0, 1.0, 1.0); break; // TODO: implement remaining sources } uint rgb_operand = (u_textureEnvOperand[tev_id] >> (src_id * 4)) & 15u; @@ -160,9 +160,9 @@ const char* fragmentShader = R"( previous = tev_combine(0); previous = tev_combine(1); previous = tev_combine(2); - fragColour = tev_combine(3); - -// fragColour = tev_combine(0); + previous = tev_combine(3); + previous = tev_combine(4); + fragColour = tev_combine(5); } else { fragColour = colour; } @@ -455,35 +455,37 @@ void Renderer::drawVertices(OpenGL::Primitives primType, Vertex* vertices, u32 c // TODO: only update TEV uniforms when the configuration changes. // TODO: define registers in the PICAInternalRegs enumeration { - u32 textureEnvSourceRegs[4]; - u32 textureEnvOperandRegs[4]; - u32 textureEnvCombinerRegs[4]; - float textureEnvColourRegs[4][4]; - u32 textureEnvScaleRegs[4]; + u32 textureEnvSourceRegs[6]; + u32 textureEnvOperandRegs[6]; + u32 textureEnvCombinerRegs[6]; + float textureEnvColourRegs[6][4]; + u32 textureEnvScaleRegs[6]; - u32 base_reg = 0xc0; + static constexpr std::array ioBases = { + 0xc0, 0xc8, 0xd0, 0xd8, 0xf0, 0xf8 + }; - for (int i = 0; i < 4; i++) { - textureEnvSourceRegs[i] = regs[base_reg]; - textureEnvOperandRegs[i] = regs[base_reg + 1]; - textureEnvCombinerRegs[i] = regs[base_reg + 2]; + for (int i = 0; i < 6; i++) { + const u32 ioBase = ioBases[i]; - const u32 rgba = regs[base_reg + 3]; + textureEnvSourceRegs[i] = regs[ioBase]; + textureEnvOperandRegs[i] = regs[ioBase + 1]; + textureEnvCombinerRegs[i] = regs[ioBase + 2]; + + const u32 rgba = regs[ioBase + 3]; textureEnvColourRegs[i][0] = (float)(rgba & 0xff) / 255.0f; textureEnvColourRegs[i][1] = (float)((rgba >> 8) & 0xff) / 255.0f; textureEnvColourRegs[i][2] = (float)((rgba >> 16) & 0xff) / 255.0f; textureEnvColourRegs[i][3] = (float)(rgba >> 24) / 255.0f; - textureEnvScaleRegs[i] = regs[base_reg + 4]; - - base_reg += 8; + textureEnvScaleRegs[i] = regs[ioBase + 4]; } - glUniform1uiv(textureEnvSourceLoc, 4, textureEnvSourceRegs); - glUniform1uiv(textureEnvOperandLoc, 4, textureEnvOperandRegs); - glUniform1uiv(textureEnvCombinerLoc, 4, textureEnvCombinerRegs); - glUniform4fv(textureEnvColorLoc, 4, (const GLfloat*)textureEnvColourRegs); - glUniform1uiv(textureEnvScaleLoc, 4, textureEnvScaleRegs); + glUniform1uiv(textureEnvSourceLoc, 6, textureEnvSourceRegs); + glUniform1uiv(textureEnvOperandLoc, 6, textureEnvOperandRegs); + glUniform1uiv(textureEnvCombinerLoc, 6, textureEnvCombinerRegs); + glUniform4fv(textureEnvColorLoc, 6, (const GLfloat*)textureEnvColourRegs); + glUniform1uiv(textureEnvScaleLoc, 6, textureEnvScaleRegs); } // Hack for rendering texture 1