mirror of https://github.com/mgba-emu/mgba.git
GBA Video: Use interpolation not extrapolation for first few scanlines (fixes #1431)
This commit is contained in:
parent
14b3bdf414
commit
cc71f7f964
|
@ -214,7 +214,6 @@ static const char* const _interpolate =
|
|||
|
||||
"void loadAffine(int y, out ivec2 mat[4], out ivec2 aff[4]) {\n"
|
||||
" int start = max(range.x, y - 3);\n"
|
||||
|
||||
" mat[0] = transform[start + 0].xy;\n"
|
||||
" aff[0] = transform[start + 0].zw;\n"
|
||||
" mat[1] = transform[start + 1].xy;\n"
|
||||
|
@ -223,45 +222,6 @@ static const char* const _interpolate =
|
|||
" aff[2] = transform[start + 2].zw;\n"
|
||||
" mat[3] = transform[start + 3].xy;\n"
|
||||
" aff[3] = transform[start + 3].zw;\n"
|
||||
|
||||
" if (y - 3 < range.x) {\n"
|
||||
" ivec2 tempMat[3];\n"
|
||||
" ivec2 tempAff[3];\n"
|
||||
" tempMat[0] = ivec2(interpolate(mat, -0.75));\n"
|
||||
" tempMat[1] = ivec2(interpolate(mat, -0.5));\n"
|
||||
" tempMat[2] = ivec2(interpolate(mat, -0.25));\n"
|
||||
" tempAff[0] = ivec2(interpolate(aff, -0.75));\n"
|
||||
" tempAff[1] = ivec2(interpolate(aff, -0.5));\n"
|
||||
" tempAff[2] = ivec2(interpolate(aff, -0.25));\n"
|
||||
" if (range.x == y) {\n"
|
||||
" mat[3] = mat[0];\n"
|
||||
" mat[2] = tempMat[2];\n"
|
||||
" mat[1] = tempMat[1];\n"
|
||||
" mat[0] = tempMat[0];\n"
|
||||
" aff[3] = aff[0];\n"
|
||||
" aff[2] = tempAff[2];\n"
|
||||
" aff[1] = tempAff[1];\n"
|
||||
" aff[0] = tempAff[0];\n"
|
||||
" } else if (range.x == y - 1) {\n"
|
||||
" mat[3] = mat[1];\n"
|
||||
" mat[2] = mat[0];\n"
|
||||
" mat[1] = tempMat[2];\n"
|
||||
" mat[0] = tempMat[1];\n"
|
||||
" aff[3] = aff[1];\n"
|
||||
" aff[2] = aff[0];\n"
|
||||
" aff[1] = tempAff[2];\n"
|
||||
" aff[0] = tempAff[1];\n"
|
||||
" } else if (range.x == y - 2) {\n"
|
||||
" mat[3] = mat[2];\n"
|
||||
" mat[2] = mat[1];\n"
|
||||
" mat[1] = mat[0];\n"
|
||||
" mat[0] = tempMat[0];\n"
|
||||
" aff[3] = aff[2];\n"
|
||||
" aff[2] = aff[1];\n"
|
||||
" aff[1] = aff[0];\n"
|
||||
" aff[0] = tempAff[0];\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n";
|
||||
|
||||
static const char* const _renderMode2 =
|
||||
|
@ -311,7 +271,12 @@ static const char* const _renderMode2 =
|
|||
" }\n"
|
||||
" loadAffine(int(incoord.y), mat, offset);\n"
|
||||
" float y = fract(incoord.y);\n"
|
||||
" float lin = 0.75 + y * 0.25;\n"
|
||||
" float start = 0.75;\n"
|
||||
" if (int(incoord.y) - range.x < 4) {\n"
|
||||
" y = incoord.y - float(range.x);\n"
|
||||
" start = 0.;\n"
|
||||
" }\n"
|
||||
" float lin = start + y * 0.25;\n"
|
||||
" vec2 mixedTransform = interpolate(mat, lin);\n"
|
||||
" vec2 mixedOffset = interpolate(offset, lin);\n"
|
||||
" color = fetchTile(ivec2(mixedTransform * incoord.x + mixedOffset));\n"
|
||||
|
@ -359,7 +324,12 @@ static const char* const _renderMode35 =
|
|||
" }\n"
|
||||
" loadAffine(int(incoord.y), mat, offset);\n"
|
||||
" float y = fract(incoord.y);\n"
|
||||
" float lin = 0.75 + y * 0.25;\n"
|
||||
" float start = 0.75;\n"
|
||||
" if (int(incoord.y) - range.x < 4) {\n"
|
||||
" y = incoord.y - float(range.x);\n"
|
||||
" start = 0.;\n"
|
||||
" }\n"
|
||||
" float lin = start + y * 0.25;\n"
|
||||
" vec2 mixedTransform = interpolate(mat, lin);\n"
|
||||
" vec2 mixedOffset = interpolate(offset, lin);\n"
|
||||
" ivec2 coord = ivec2(mixedTransform * incoord.x + mixedOffset);\n"
|
||||
|
@ -419,7 +389,12 @@ static const char* const _renderMode4 =
|
|||
" }\n"
|
||||
" loadAffine(int(incoord.y), mat, offset);\n"
|
||||
" float y = fract(incoord.y);\n"
|
||||
" float lin = 0.75 + y * 0.25;\n"
|
||||
" float start = 0.75;\n"
|
||||
" if (int(incoord.y) - range.x < 4) {\n"
|
||||
" y = incoord.y - float(range.x);\n"
|
||||
" start = 0.;\n"
|
||||
" }\n"
|
||||
" float lin = start + y * 0.25;\n"
|
||||
" vec2 mixedTransform = interpolate(mat, lin);\n"
|
||||
" vec2 mixedOffset = interpolate(offset, lin);\n"
|
||||
" ivec2 coord = ivec2(mixedTransform * incoord.x + mixedOffset);\n"
|
||||
|
|
Loading…
Reference in New Issue