all repos — mgba @ e0ef6a51de8bf406c8620e2f1f78cde82673bfab

mGBA Game Boy Advance Emulator

GBA Video: Improve speed of window texture generation on AMD
Vicki Pfau vi@endrift.com
Sat, 26 Sep 2020 21:34:18 -0700
commit

e0ef6a51de8bf406c8620e2f1f78cde82673bfab

parent

80054994c3f7a87d05d38bb8a3531d34661145a0

2 files changed, 17 insertions(+), 16 deletions(-)

jump to
M CHANGESCHANGES

@@ -24,6 +24,8 @@ - Qt: Fix camera image being upside-down sometimes (fixes mgba.io/i/829 again)

- mGUI: Fix closing down a game if an exit is signalled - mVL: Fix injecting accidentally draining non-injection buffer - VFS: Fix directory node listing on some filesystems +Misc: + - GBA Video: Improve speed of window texture generation on AMD 0.8.3: (2020-08-03) Emulation fixes:
M src/gba/renderers/gl.csrc/gba/renderers/gl.c

@@ -513,7 +513,7 @@ "uniform ivec4 win0[160];\n"

"uniform ivec4 win1[160];\n" "OUT(0) out ivec4 window;\n" - "void crop(vec4 windowParams, int flags, inout ivec3 windowFlags) {\n" + "bool crop(vec4 windowParams) {\n" " bvec4 compare = lessThan(texCoord.xxyy, windowParams);\n" " compare = equal(compare, bvec4(true, false, true, false));\n" " if (any(compare)) {\n"

@@ -521,25 +521,23 @@ " vec2 h = windowParams.xy;\n"

" vec2 v = windowParams.zw;\n" " if (v.x > v.y) {\n" " if (compare.z && compare.w) {\n" - " return;\n" + " return false;\n" " }\n" " } else if (compare.z || compare.w) {\n" - " return;\n" + " return false;\n" " }\n" " if (h.x > h.y) {\n" " if (compare.x && compare.y) {\n" - " return;\n" + " return false;\n" " }\n" " } else if (compare.x || compare.y) {\n" - " return;\n" + " return false;\n" " }\n" " }\n" - " windowFlags.x = flags;\n" + " return true;\n" "}\n" - "vec4 interpolate(ivec4 win[160]) {\n" - " vec4 bottom = vec4(win[int(texCoord.y) - 1]);\n" - " vec4 top = vec4(win[int(texCoord.y)]);\n" + "vec4 interpolate(vec4 top, vec4 bottom) {\n" " if (distance(top, bottom) > 40.) {\n" " return top;\n" " }\n"

@@ -551,14 +549,15 @@ " int dispflags = (dispcnt & 0x1F) | 0x20;\n"

" if ((dispcnt & 0xE0) == 0) {\n" " window = ivec4(dispflags, blend, 0);\n" " } else {\n" - " ivec3 windowFlags = ivec3(flags.z, blend);\n" - " if ((dispcnt & 0x40) != 0) { \n" - " crop(interpolate(win1), flags.y, windowFlags);\n" + " ivec4 windowFlags = ivec4(flags.z, blend, 0);\n" + " int top = int(texCoord.y);\n" + " int bottom = max(top - 1, 0);\n" + " if ((dispcnt & 0x20) != 0 && crop(interpolate(vec4(win0[top]), vec4(win0[bottom])))) { \n" + " windowFlags.x = flags.x;\n" + " } else if ((dispcnt & 0x40) != 0 && crop(interpolate(vec4(win1[top]), vec4(win1[bottom])))) {\n" + " windowFlags.x = flags.y;\n" " }\n" - " if ((dispcnt & 0x20) != 0) { \n" - " crop(interpolate(win0), flags.x, windowFlags);\n" - " }\n" - " window = ivec4(windowFlags, 0);\n" + " window = windowFlags;\n" " }\n" "}\n";