From 134aa31e61d59092af6639c48d60fdaf7c724b5c Mon Sep 17 00:00:00 2001 From: s2s <12202580+standard-two-simplex@users.noreply.github.com> Date: Sun, 22 Aug 2021 18:33:32 +0200 Subject: [PATCH] LOD: tile selection and lod_frac calculation changes --- .../GLSL/glsl_CombinerProgramBuilder.cpp | 104 +++++++----------- 1 file changed, 41 insertions(+), 63 deletions(-) diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp index 69a42292..52df5510 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp @@ -2122,14 +2122,13 @@ public: else { if (config.texture.bilinearMode == BILINEAR_3POINT) m_part = - "#define READ_TEX0_MIPMAP(name, tex, tcData, lod) \\\n" + "#define READ_TEX0_MIPMAP(name, tex, tcData) \\\n" "{ \\\n" " lowp float bottomRightTri = step(1.0, tcData[4].s + tcData[4].t); \\\n" - " lowp vec2 lod_scale = vec2(textureSize(tex,int(lod))) / vec2(textureSize(tex,0)); \\\n" - " lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]*lod_scale), int(lod)); \\\n" - " lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]*lod_scale), int(lod)); \\\n" - " lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]*lod_scale), int(lod)); \\\n" - " lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]*lod_scale), int(lod)); \\\n" + " lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]), 0); \\\n" + " lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]), 0); \\\n" + " lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]), 0); \\\n" + " lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]), 0); \\\n" " lowp vec4 c0 = c00 + tcData[4].s*(c10-c00) + tcData[4].t*(c01-c00); \\\n" " lowp vec4 c1 = c11 + (1.0-tcData[4].s)*(c01-c11) + (1.0-tcData[4].t)*(c10-c11); \\\n" " name = c0 + bottomRightTri * (c1-c0); \\\n" @@ -2159,13 +2158,12 @@ public: ; else m_part = - "#define READ_TEX0_MIPMAP(name, tex, tcData, lod) \\\n" + "#define READ_TEX0_MIPMAP(name, tex, tcData) \\\n" "{ \\\n" - " lowp vec2 lod_scale = vec2(textureSize(tex,int(lod))) / vec2(textureSize(tex,0)); \\\n" - " lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]*lod_scale), int(lod)); \\\n" - " lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]*lod_scale), int(lod)); \\\n" - " lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]*lod_scale), int(lod)); \\\n" - " lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]*lod_scale), int(lod)); \\\n" + " lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]), 0); \\\n" + " lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]), 0); \\\n" + " lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]), 0); \\\n" + " lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]), 0); \\\n" " lowp vec4 c0 = c00 + tcData[4].s * (c10-c00); \\\n" " lowp vec4 c1 = c01 + tcData[4].s * (c11-c01); \\\n" " name = c0 + tcData[4].t * (c1-c0); \\\n" @@ -2199,8 +2197,8 @@ public: "uniform mediump float uMinLod; \n" " \n" "mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n" - " READ_TEX_MIPMAP0(readtex0, uTex0, tcData0, 0); \n" - " READ_TEX_MIPMAP0(readtex1, uTex1, tcData1, 0); \n" + " READ_TEX0_MIPMAP(readtex0, uTex0, tcData0); \n" + " READ_TEX0_MIPMAP(readtex1, uTex1, tcData1); \n" " if (uMaxTile == 0) return 1.0; \n" " return uMinLod; \n" "} \n" @@ -2213,63 +2211,43 @@ public: "uniform lowp int uTextureDetail; \n" " \n" "mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n" - " READ_TEX0_MIPMAP(readtex0, uTex0, tcData0, 0) \n" - " if (uMaxTile > 1) READ_TEX1_MIPMAP(readtex1, uTex1, tcData1, 0) \n" - " else READ_TEX0_MIPMAP(readtex1, uTex1, tcData1, 0) \n" " \n" - " mediump float fMaxTile = float(uMaxTile); \n" " mediump vec2 dx = abs(dFdx(vLodTexCoord)) * uScreenScale; \n" " mediump vec2 dy = abs(dFdy(vLodTexCoord)) * uScreenScale; \n" " mediump float lod = max(max(dx.x, dx.y), max(dy.x, dy.y)); \n" - " bool magnify = lod < 1.0; \n" - " mediump float lod_tile = magnify ? 0.0 : floor(log2(floor(lod))); \n" - " bool distant = lod > 128.0 || lod_tile >= fMaxTile; \n" - " mediump float lod_frac = fract(lod/pow(2.0, lod_tile)); \n" - " if (magnify) lod_frac = max(lod_frac, uMinLod); \n" - " if (uTextureDetail == 0) { \n" - " if (distant) lod_frac = 1.0; \n" - " else if (magnify) lod_frac = 0.0; \n" - " } \n" - " if (magnify && ((uTextureDetail & 1) != 0)) \n" - " lod_frac = 1.0 - lod_frac; \n" - " if (uMaxTile == 0) { \n" - " if (uEnableLod != 0) { \n" - " if ((uTextureDetail & 2) == 0) readtex1 = readtex0; \n" - " else if (!magnify) readtex0 = readtex1; \n" + " lowp int max_tile = min(uTextureDetail != 2 ? 7 : 6, uMaxTile); \n" + " mediump float min_lod = uTextureDetail != 0 ? uMinLod : 1.0; \n" + " mediump float max_lod = pow(2.0, float(max_tile)) - 1.0 / 32.0; \n" + " mediump float lod_clamp = min(max(lod, min_lod), max_lod); \n" + " lowp int lod_tile = clamp(int(log2(lod_clamp)), 0 , max_tile); \n" + " lowp int tile0 = 0; \n" + " lowp int tile1 = 1; \n" + " if (uEnableLod != 0) { \n" + " if (lod_clamp < 1.0 && uTextureDetail == 0) { \n" + " tile0 = 0; \n" + " tile1 = 0; \n" + " } else if (lod_clamp >= 1.0 && uTextureDetail == 2) { \n" + " tile0 = lod_tile + 1; \n" + " tile1 = lod_tile + 2; \n" + " } else { \n" + " tile0 = lod_tile; \n" + " tile1 = lod_tile + 1; \n" " } \n" - " return lod_frac; \n" " } \n" - " if (uEnableLod == 0) return lod_frac; \n" + " mediump float lod_frac = lod_clamp / pow(2.0, float(lod_tile)); \n" + " if (uTextureDetail == 1 || lod_clamp >= 1.0) { \n" + " lod_frac = clamp(lod_frac - 1.0, -1.0, 1.0); \n" + " } \n" " \n" - " lod_tile = min(lod_tile, fMaxTile - 1.0); \n" - " lowp float lod_tile_m1 = max(0.0, lod_tile - 1.0); \n" - " lowp float lod_tile_p1 = min(fMaxTile - 1.0, lod_tile + 1.0); \n" - " lowp vec4 lodT, lodT_m1, lodT_p1; \n" - " READ_TEX1_MIPMAP(lodT, uTex1, tcData1, lod_tile); \n" - " READ_TEX1_MIPMAP(lodT_m1, uTex1, tcData1, lod_tile_m1); \n" - " READ_TEX1_MIPMAP(lodT_p1, uTex1, tcData1, lod_tile_p1); \n" - " if (lod_tile < 1.0) { \n" - " if (magnify) { \n" - // !sharpen && !detail - " if (uTextureDetail == 0) readtex1 = readtex0; \n" - " } else { \n" - // detail - " if ((uTextureDetail & 2) != 0 ) { \n" - " readtex0 = lodT; \n" - " readtex1 = lodT_p1; \n" - " } \n" - " } \n" - " } else { \n" - " if ((uTextureDetail & 2) != 0 ) { \n" - " readtex0 = lodT; \n" - " readtex1 = lodT_p1; \n" - " } else { \n" - " readtex0 = lodT_m1; \n" - " readtex1 = lodT; \n" - " } \n" - " } \n" + " if(tile0 == 0) {READ_TEX0_MIPMAP(readtex0, uTex0, tcData0);} \n" + " else if (uEnableLod == 0 || uMaxTile == 1) {READ_TEX0_MIPMAP(readtex0, uTex1, tcData1);}\n" + " else {READ_TEX1_MIPMAP(readtex0, uTex1, tcData1, tile0 - 1);} \n" + " if(tile1 == 0) {READ_TEX0_MIPMAP(readtex1, uTex0, tcData0);} \n" + " else if (uEnableLod == 0 || uMaxTile == 1) {READ_TEX0_MIPMAP(readtex1, uTex1, tcData1);}\n" + " else {READ_TEX1_MIPMAP(readtex1, uTex1, tcData1, tile1 - 1);} \n" " return lod_frac; \n" - "} \n" + "} \n" + ; } }