From dca4b1eef387d7e2ccf995f954593ef918a75408 Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 10 Jul 2013 02:17:47 +0800 Subject: [PATCH 1/2] Fix Render-to-texture sizing in SW T&L --- GPU/GLES/TransformPipeline.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index d1b4f2b150..a3532f9205 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -725,9 +725,19 @@ void TransformDrawEngine::SoftwareTransformAndDraw( memcpy(&transformed[index].x, v, 3 * sizeof(float)); transformed[index].fog = fogCoef; memcpy(&transformed[index].u, uv, 3 * sizeof(float)); + int w = 1 << (gstate.texsize[0] & 0xf); + int h = 1 << ((gstate.texsize[0] >> 8) & 0xf); - if (gstate_c.flipTexture) - transformed[index].v = 1.0f - transformed[index].v; + if (gstate_c.flipTexture) { + if (throughmode) { + transformed[index].v = 1.0f - transformed[index].v; + } else { + int widthFactor = gstate_c.curTextureWidth/w ; + int heightFactor = gstate_c.curTextureHeight/h; + transformed[index].u = transformed[index].u / widthFactor ; + transformed[index].v = 1.0f - transformed[index].v / heightFactor; + } + } for (int i = 0; i < 4; i++) { transformed[index].color0[i] = c0[i] * 255.0f; From 78f85db1bbce5c2a456472f1fed1fd5f41639984 Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 10 Jul 2013 02:55:08 +0800 Subject: [PATCH 2/2] Use multiplies instead of divide --- GPU/GLES/TransformPipeline.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index a3532f9205..7f55167c44 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -521,6 +521,11 @@ void TransformDrawEngine::SoftwareTransformAndDraw( vscale /= gstate_c.curTextureHeight; } + int w = 1 << (gstate.texsize[0] & 0xf); + int h = 1 << ((gstate.texsize[0] >> 8) & 0xf); + float widthFactor = (float) w / (float) gstate_c.curTextureWidth; + float heightFactor = (float) h / (float) gstate_c.curTextureHeight; + Lighter lighter; float fog_end = getFloat24(gstate.fog1); float fog_slope = getFloat24(gstate.fog2); @@ -725,20 +730,14 @@ void TransformDrawEngine::SoftwareTransformAndDraw( memcpy(&transformed[index].x, v, 3 * sizeof(float)); transformed[index].fog = fogCoef; memcpy(&transformed[index].u, uv, 3 * sizeof(float)); - int w = 1 << (gstate.texsize[0] & 0xf); - int h = 1 << ((gstate.texsize[0] >> 8) & 0xf); - if (gstate_c.flipTexture) { if (throughmode) { transformed[index].v = 1.0f - transformed[index].v; } else { - int widthFactor = gstate_c.curTextureWidth/w ; - int heightFactor = gstate_c.curTextureHeight/h; - transformed[index].u = transformed[index].u / widthFactor ; - transformed[index].v = 1.0f - transformed[index].v / heightFactor; + transformed[index].u = transformed[index].u * (float) widthFactor ; + transformed[index].v = 1.0f - transformed[index].v * (float) heightFactor; } } - for (int i = 0; i < 4; i++) { transformed[index].color0[i] = c0[i] * 255.0f; }