From 555fbac213973fc66eb7984d7164d684ff57cc8d Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Sun, 13 Feb 2022 21:40:31 +0700 Subject: [PATCH] Fix mip-mapped textures not filtered with fast texture path when "emulate mip-map" is disabled. --- .../glsl_CombinerProgramBuilderAccurate.cpp | 3 +- .../GLSL/glsl_CombinerProgramBuilderFast.cpp | 95 ++++++++++++++----- 2 files changed, 70 insertions(+), 28 deletions(-) diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp index 58f00d81..263e283a 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp @@ -785,8 +785,7 @@ public: " return lod_frac; \n" "} \n" ; - } - else { + } else { static const std::string strReadTex0 = "#define READ_TEX0_MIPMAP(name, tex, tcData) \\\n" "{ \\\n" diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderFast.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderFast.cpp index 695c2d49..e1b4ad70 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderFast.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderFast.cpp @@ -795,27 +795,11 @@ public: "} \n" ; } - } - else { - if (config.generalEmulation.enableLOD == 0) { - // Fake mipmap + } else { + if (config.texture.bilinearMode == BILINEAR_3POINT) { m_part = - "uniform lowp int uMaxTile; \n" - "uniform mediump float uMinLod; \n" - " \n" - "mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n" - " readtex0 = texture(uTex0, texCoord0); \n" - " readtex1 = texture(uTex1, texCoord1); \n" - " if (uMaxTile == 0) return 1.0; \n" - " return uMinLod; \n" - "} \n" - ; - } else { - if (config.texture.bilinearMode == BILINEAR_3POINT) - m_part = "#define TEX_OFFSET_NORMAL(off, tex, texCoord, lod) texture(tex, texCoord - (off)/texSize) \n" - "#define TEX_OFFSET_MIPMAP(off, tex, texCoord, lod) textureLod(tex, texCoord - (off)/texSize, lod) \n" - "#define READ_TEX_NORMAL(name, tex, texCoord, lod) \\\n" + "#define READ_TEX_NORMAL(name, tex, texCoord, lod) \\\n" " { \\\n" " mediump vec2 texSize = vec2(textureSize(tex, int(lod))); \\\n" " mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n" @@ -825,6 +809,10 @@ public: " lowp vec4 c2 = TEX_OFFSET_NORMAL(vec2(offset.x, offset.y - sign(offset.y)), tex, texCoord, lod); \\\n" " name = c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \\\n" " } \n" + ; + if (config.generalEmulation.enableLOD != 0) { + m_part += + "#define TEX_OFFSET_MIPMAP(off, tex, texCoord, lod) textureLod(tex, texCoord - (off)/texSize, lod) \n" "#define READ_TEX_MIPMAP(name, tex, texCoord, lod) \\\n" " { \\\n" " mediump vec2 texSize = vec2(textureSize(tex, int(lod))); \\\n" @@ -836,13 +824,68 @@ public: " name = c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \\\n" " } \n" ; - else + } + } else { m_part = - "#define TEX_FETCH_NORMAL(tex, texCoord, lod) texture(tex, texCoord) \n" - "#define TEX_FETCH_MIPMAP(tex, texCoord, lod) textureLod(tex, texCoord, lod) \n" - "#define READ_TEX_NORMAL(name, tex, texCoord, lod) name = TEX_FETCH_NORMAL(tex, texCoord, lod) \n" - "#define READ_TEX_MIPMAP(name, tex, texCoord, lod) name = TEX_FETCH_MIPMAP(tex, texCoord, lod) \n" - ; + "#define TEX_OFFSET_NORMAL(off, tex, texCoord, lod) texture(tex, texCoord - (off)/texSize) \n" + "#define READ_TEX_NORMAL(name, tex, texCoord, lod) \\\n" + " { \\\n" + " mediump vec2 texSize = vec2(textureSize(tex, int(lod))); \\\n" + " mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n" + " offset -= step(1.0, offset.x + offset.y); \\\n" + " lowp vec4 zero = vec4(0.0); \\\n" + " \\\n" + " lowp vec4 p0q0 = TEX_OFFSET_NORMAL(offset, tex, texCoord, lod); \\\n" + " lowp vec4 p1q0 = TEX_OFFSET_NORMAL(vec2(offset.x - sign(offset.x), offset.y), tex, texCoord, lod); \\\n" + " \\\n" + " lowp vec4 p0q1 = TEX_OFFSET_NORMAL(vec2(offset.x, offset.y - sign(offset.y)), tex, texCoord, lod); \\\n" + " lowp vec4 p1q1 = TEX_OFFSET_NORMAL(vec2(offset.x - sign(offset.x), offset.y - sign(offset.y)), tex, texCoord, lod); \\\n" + " \\\n" + " mediump vec2 interpolationFactor = abs(offset); \\\n" + " lowp vec4 pInterp_q0 = mix( p0q0, p1q0, interpolationFactor.x ); \\\n" + " lowp vec4 pInterp_q1 = mix( p0q1, p1q1, interpolationFactor.x ); \\\n" + " name = mix( pInterp_q0, pInterp_q1, interpolationFactor.y ); \\\n" + "} \n" + ; + if (config.generalEmulation.enableLOD != 0) { + m_part += + "#define TEX_OFFSET_MIPMAP(off, tex, texCoord, lod) textureLod(tex, texCoord - (off)/texSize, lod) \n" + "#define READ_TEX_MIPMAP(name, tex, texCoord, lod) \\\n" + " { \\\n" + " mediump vec2 texSize = vec2(textureSize(tex, int(lod))); \\\n" + " mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n" + " offset -= step(1.0, offset.x + offset.y); \\\n" + " lowp vec4 zero = vec4(0.0); \\\n" + " \\\n" + " lowp vec4 p0q0 = TEX_OFFSET_MIPMAP(offset, tex, texCoord, lod); \\\n" + " lowp vec4 p1q0 = TEX_OFFSET_MIPMAP(vec2(offset.x - sign(offset.x), offset.y), tex, texCoord, lod); \\\n" + " \\\n" + " lowp vec4 p0q1 = TEX_OFFSET_MIPMAP(vec2(offset.x, offset.y - sign(offset.y)), tex, texCoord, lod); \\\n" + " lowp vec4 p1q1 = TEX_OFFSET_MIPMAP(vec2(offset.x - sign(offset.x), offset.y - sign(offset.y)), tex, texCoord, lod); \\\n" + " \\\n" + " mediump vec2 interpolationFactor = abs(offset); \\\n" + " lowp vec4 pInterp_q0 = mix( p0q0, p1q0, interpolationFactor.x ); \\\n" + " lowp vec4 pInterp_q1 = mix( p0q1, p1q1, interpolationFactor.x ); \\\n" + " name = mix( pInterp_q0, pInterp_q1, interpolationFactor.y ); \\\n" + "} \n" + ; + } + } + + if (config.generalEmulation.enableLOD == 0) { + // Fake mipmap + m_part += + "uniform lowp int uMaxTile; \n" + "uniform mediump float uMinLod; \n" + " \n" + "mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n" + " READ_TEX_NORMAL(readtex0, uTex0, texCoord0, 0.0); \n" + " READ_TEX_NORMAL(readtex1, uTex1, texCoord1, 0.0); \n" + " if (uMaxTile == 0) return 1.0; \n" + " return uMinLod; \n" + "} \n" + ; + } else { m_part += "uniform lowp int uEnableLod; \n" "uniform mediump float uMinLod; \n" @@ -906,7 +949,7 @@ public: " } \n" " return lod_frac; \n" "} \n" - ; + ; } } }