GBA Video: Improve speed of window texture generation on AMD

This commit is contained in:
Vicki Pfau 2020-09-26 21:34:18 -07:00
parent b5ca2b89e2
commit a3d5e3481f
2 changed files with 16 additions and 16 deletions

View File

@ -82,6 +82,7 @@ Misc:
- GBA: Allow pausing event loop while CPU is blocked
- GBA BIOS: Division by zero should emit a FATAL error
- GBA Video: Convert OpenGL VRAM texture to integer
- GBA Video: Improve speed of window texture generation on AMD
- Debugger: Keep track of global cycle count
- FFmpeg: Add looping option for GIF/APNG
- mGUI: Show battery percentage

View File

@ -497,7 +497,7 @@ static const char* const _renderWindow =
"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"
@ -505,25 +505,23 @@ static const char* const _renderWindow =
" 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"
@ -535,14 +533,15 @@ static const char* const _renderWindow =
" 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";