(view as text)
diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h
index da12822..14b9309 100644
--- a/Source/Core/Common/MathUtil.h
+++ b/Source/Core/Common/MathUtil.h
@@ -150,7 +150,7 @@ float MathFloatVectorSum(const std::vector<float>&);
#define ROUND_DOWN(x, a) ((x) & ~((a) - 1))
// Rounds down. 0 -> undefined
-inline u64 Log2(u64 val)
+inline int Log2(u64 val)
{
#if defined(__GNUC__)
return 63 - __builtin_clzll(val);
@@ -161,7 +161,7 @@ inline u64 Log2(u64 val)
return result;
#else
- u64 result = -1;
+ int result = -1;
while (val != 0)
{
val >>= 1;
diff --git a/Source/Core/VideoBackends/OGL/TextureConverter.cpp b/Source/Core/VideoBackends/OGL/TextureConverter.cpp
index 753bd64..dbbb605 100644
--- a/Source/Core/VideoBackends/OGL/TextureConverter.cpp
+++ b/Source/Core/VideoBackends/OGL/TextureConverter.cpp
@@ -117,7 +117,7 @@ void CreatePrograms()
" ivec2 uv = ivec2(gl_FragCoord.xy);\n"
// We switch top/bottom here. TODO: move this to screen blit.
" ivec2 ts = textureSize(samp9, 0);\n"
- " vec4 c0 = texelFetch(samp9, ivec2(uv.x/2, ts.y-uv.y-1), 0);\n"
+ " vec4 c0 = texelFetch(samp9, ivec2(uv.x>>1, ts.y-uv.y-1), 0);\n"
" float y = mix(c0.b, c0.r, (uv.x & 1) == 1);\n"
" float yComp = 1.164 * (y - 0.0625);\n"
" float uComp = c0.g - 0.5;\n"
diff --git a/Source/Core/VideoCommon/TextureConversionShader.cpp b/Source/Core/VideoCommon/TextureConversionShader.cpp
index a7db334..76f26c6 100644
--- a/Source/Core/VideoCommon/TextureConversionShader.cpp
+++ b/Source/Core/VideoCommon/TextureConversionShader.cpp
@@ -9,6 +9,8 @@
#include <xlocale.h>
#endif
+#include "Common/MathUtil.h"
+
#include "VideoCommon/BPMemory.h"
#include "VideoCommon/RenderBase.h"
#include "VideoCommon/TextureConversionShader.h"
@@ -90,21 +92,17 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
" float2 uv0 = float2(0.0, 0.0);\n"
);
- WRITE(p, " uv1.x = uv1.x * %d;\n", samples);
+ WRITE(p, " uv1.x = uv1.x << %d;\n", Log2(samples));
- WRITE(p, " int yl = uv1.y / %d;\n", blkH);
- WRITE(p, " int yb = yl * %d;\n", blkH);
- WRITE(p, " int yoff = uv1.y - yb;\n");
+ WRITE(p, " int yb = uv1.y & ~(%d - 1);\n", blkH);
+ WRITE(p, " int yoff = uv1.y & (%d - 1);\n", blkH);
WRITE(p, " int xp = uv1.x + yoff * position.z;\n");
- WRITE(p, " int xel = xp / %d;\n", samples == 1 ? factor : blkW);
- WRITE(p, " int xb = xel / %d;\n", blkH);
- WRITE(p, " int xoff = xel - xb * %d;\n", blkH);
- WRITE(p, " int xl = uv1.x * %d / %d;\n", factor, blkW);
- WRITE(p, " int xib = uv1.x * %d - xl * %d;\n", factor, blkW);
- WRITE(p, " int halfxb = xb / %d;\n", factor);
-
- WRITE(p, " sampleUv.x = xib + halfxb * %d;\n", blkW);
- WRITE(p, " sampleUv.y = yb + xoff;\n");
+ WRITE(p, " int xel = xp >> %d;\n", Log2(samples == 1 ? factor : blkW));
+ WRITE(p, " int xib = (uv1.x << %d) & (%d - 1);\n", factor-1, blkW);
+
+ WRITE(p, " sampleUv.x = xib + (xel >> %d << %d);\n", Log2(blkH * factor), Log2(blkW));
+ WRITE(p, " sampleUv.y = yb + (xel & (%d - 1));\n", blkH);
+ WRITE(p, " bool first = 0 == (uv1.x & 1);\n");
}
void WriteSampleColor(char*& p, const char* colorComp, const char* dest, int xoffset, API_TYPE ApiType)
@@ -373,8 +371,6 @@ void WriteRGBA8Encoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_RGBA8, ApiType);
- WRITE(p, " bool first = xb == (halfxb * 2);\n");
-
WRITE(p, " float4 texSample;\n");
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
@@ -563,8 +559,6 @@ void WriteZ24Encoder(char* p, API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_Z24X8, ApiType);
- WRITE(p, " bool first = xb == (halfxb * 2);\n");
-
WRITE(p, " float depth0;\n");
WRITE(p, " float depth1;\n");
WRITE(p, " float3 expanded0;\n");