From 5be501672e59025e1f148d14551dc3883ff82ca7 Mon Sep 17 00:00:00 2001 From: ro8inmorgan Date: Wed, 14 May 2025 09:09:47 +0200 Subject: [PATCH 1/3] pixellate.glsl as pixel perfect screen sharpness option --- skeleton/BASE/Shaders/cubic.glsl | 137 ----------------- .../sharp-shimmerless-subpixel-bgr.glsl | 107 ------------- .../sharp-shimmerless-subpixel-rgb.glsl | 107 ------------- .../sharp-shimmerless-subpixel-vbgr.glsl | 107 ------------- skeleton/SYSTEM/tg5040/shaders/pixellate.glsl | 143 ++++++++++++++++++ workspace/all/common/defines.h | 2 +- workspace/all/minarch/minarch.c | 4 +- workspace/tg5040/platform/platform.c | 57 ++++++- 8 files changed, 195 insertions(+), 469 deletions(-) delete mode 100644 skeleton/BASE/Shaders/cubic.glsl delete mode 100644 skeleton/BASE/Shaders/sharp-shimmerless-subpixel-bgr.glsl delete mode 100644 skeleton/BASE/Shaders/sharp-shimmerless-subpixel-rgb.glsl delete mode 100644 skeleton/BASE/Shaders/sharp-shimmerless-subpixel-vbgr.glsl create mode 100644 skeleton/SYSTEM/tg5040/shaders/pixellate.glsl diff --git a/skeleton/BASE/Shaders/cubic.glsl b/skeleton/BASE/Shaders/cubic.glsl deleted file mode 100644 index d7b90959a..000000000 --- a/skeleton/BASE/Shaders/cubic.glsl +++ /dev/null @@ -1,137 +0,0 @@ -#version 130 - -#if defined(VERTEX) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING out -#define COMPAT_ATTRIBUTE in -#define COMPAT_TEXTURE texture -#else -#define COMPAT_VARYING varying -#define COMPAT_ATTRIBUTE attribute -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#define COMPAT_PRECISION mediump -precision COMPAT_PRECISION float; -#else -#define COMPAT_PRECISION -#endif - -COMPAT_ATTRIBUTE vec4 VertexCoord; -COMPAT_ATTRIBUTE vec4 COLOR; -COMPAT_ATTRIBUTE vec4 TexCoord; -COMPAT_VARYING vec4 COL0; -COMPAT_VARYING vec4 TEX0; - -uniform mat4 MVPMatrix; -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; - -void main() -{ - gl_Position = MVPMatrix * VertexCoord; - COL0 = COLOR; - TEX0.xy = TexCoord.xy; -} - -#elif defined(FRAGMENT) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING in -#define COMPAT_TEXTURE texture -out vec4 FragColor; -#else -#define COMPAT_VARYING varying -#define FragColor gl_FragColor -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#ifdef GL_FRAGMENT_PRECISION_HIGH -precision highp float; -#else -precision mediump float; -#endif -#define COMPAT_PRECISION mediump -#else -#define COMPAT_PRECISION -#endif - -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; -uniform sampler2D Texture; -COMPAT_VARYING vec4 TEX0; - -// compatibility #defines -#define Source Texture -#define vTexCoord TEX0.xy - -#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize -#define outsize vec4(OutputSize, 1.0 / OutputSize) - -void weights(out vec4 x, out vec4 y, vec2 t) -{ - vec2 t2 = t * t; - vec2 t3 = t2 * t; - - vec4 xs = vec4(1.0, t.x, t2.x, t3.x); - vec4 ys = vec4(1.0, t.y, t2.y, t3.y); - - const vec4 p0 = vec4(+0.0, -0.5, +1.0, -0.5); - const vec4 p1 = vec4(+1.0, 0.0, -2.5, +1.5); - const vec4 p2 = vec4(+0.0, +0.5, +2.0, -1.5); - const vec4 p3 = vec4(+0.0, 0.0, -0.5, +0.5); - - x = vec4(dot(xs, p0), dot(xs, p1), dot(xs, p2), dot(xs, p3)); - y = vec4(dot(ys, p0), dot(ys, p1), dot(ys, p2), dot(ys, p3)); -} - -void main() -{ - vec2 uv = vTexCoord * SourceSize.xy - 0.5; - vec2 texel = floor(uv); - vec2 tex = (texel + 0.5) * SourceSize.zw; - vec2 phase = uv - texel; - -#define TEX(x, y) textureLodOffset(Source, tex, 0.0, ivec2(x, y)).rgb - - vec4 x; - vec4 y; - weights(x, y, phase); - - vec3 color; - vec4 row = x * y.x; - color = TEX(-1, -1) * row.x; - color += TEX(+0, -1) * row.y; - color += TEX(+1, -1) * row.z; - color += TEX(+2, -1) * row.w; - - row = x * y.y; - color += TEX(-1, +0) * row.x; - color += TEX(+0, +0) * row.y; - color += TEX(+1, +0) * row.z; - color += TEX(+2, +0) * row.w; - - row = x * y.z; - color += TEX(-1, +1) * row.x; - color += TEX(+0, +1) * row.y; - color += TEX(+1, +1) * row.z; - color += TEX(+2, +1) * row.w; - - row = x * y.w; - color += TEX(-1, +2) * row.x; - color += TEX(+0, +2) * row.y; - color += TEX(+1, +2) * row.z; - color += TEX(+2, +2) * row.w; - - FragColor = vec4(color, 1.0); -} -#endif diff --git a/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-bgr.glsl b/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-bgr.glsl deleted file mode 100644 index 9ddd5ddcf..000000000 --- a/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-bgr.glsl +++ /dev/null @@ -1,107 +0,0 @@ -/* - * sharp-shimmerless-vrgb - * Author: zadpos - * License: Public domain - * - * Sharp-Shimmerless shader for v-RGB subpixels - */ - -#if defined(VERTEX) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING out -#define COMPAT_ATTRIBUTE in -#define COMPAT_TEXTURE texture -#else -#define COMPAT_VARYING varying -#define COMPAT_ATTRIBUTE attribute -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#define COMPAT_PRECISION mediump -#else -#define COMPAT_PRECISION -#endif - -COMPAT_ATTRIBUTE vec4 VertexCoord; -COMPAT_ATTRIBUTE vec4 COLOR; -COMPAT_ATTRIBUTE vec4 TexCoord; -COMPAT_VARYING vec4 pixel; -COMPAT_VARYING vec4 scale; -COMPAT_VARYING vec4 invscale; - -uniform mat4 MVPMatrix; -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; - -void main() -{ - gl_Position = MVPMatrix * VertexCoord; - - vec2 pixel_xy = TexCoord.xy * OutputSize * TextureSize / InputSize; - vec2 scale_xy = OutputSize / InputSize; - vec2 invscale_xy = InputSize / OutputSize; - - pixel = pixel_xy.xxxy; - scale = scale_xy.xxxy; - invscale = invscale_xy.xxxy; -} - -#elif defined(FRAGMENT) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING in -#define COMPAT_TEXTURE texture -out vec4 FragColor; -#else -#define COMPAT_VARYING varying -#define FragColor gl_FragColor -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#ifdef GL_FRAGMENT_PRECISION_HIGH -precision highp float; -#else -precision mediump float; -#endif -#define COMPAT_PRECISION mediump -#else -#define COMPAT_PRECISION -#endif - -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; -uniform sampler2D Texture; -COMPAT_VARYING vec4 pixel; -COMPAT_VARYING vec4 scale; -COMPAT_VARYING vec4 invscale; - -void main() -{ - vec4 pixel_tl = floor(pixel); - pixel_tl.y -= 0.33; - pixel_tl.w += 0.33; - vec4 pixel_br = ceil(pixel); - pixel_br.y -= 0.33; - pixel_br.w += 0.33; - - vec4 texel_tl = floor(invscale * pixel_tl); - vec4 texel_br = floor(invscale * pixel_br); - - vec4 mod_texel = texel_br + vec4(0.5, 0.5, 0.5, 0.5); - mod_texel -= (vec4(1.0, 1.0, 1.0, 1.0) - step(texel_br, texel_tl)) * (scale * texel_br - pixel_tl); - - FragColor.b = COMPAT_TEXTURE(Texture, mod_texel.xw / TextureSize).b; - FragColor.g = COMPAT_TEXTURE(Texture, mod_texel.yw / TextureSize).g; - FragColor.r = COMPAT_TEXTURE(Texture, mod_texel.zw / TextureSize).r; - FragColor.a = 1.0; -} -#endif diff --git a/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-rgb.glsl b/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-rgb.glsl deleted file mode 100644 index fa73e38ad..000000000 --- a/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-rgb.glsl +++ /dev/null @@ -1,107 +0,0 @@ -/* - * sharp-shimmerless-vrgb - * Author: zadpos - * License: Public domain - * - * Sharp-Shimmerless shader for v-RGB subpixels - */ - -#if defined(VERTEX) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING out -#define COMPAT_ATTRIBUTE in -#define COMPAT_TEXTURE texture -#else -#define COMPAT_VARYING varying -#define COMPAT_ATTRIBUTE attribute -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#define COMPAT_PRECISION mediump -#else -#define COMPAT_PRECISION -#endif - -COMPAT_ATTRIBUTE vec4 VertexCoord; -COMPAT_ATTRIBUTE vec4 COLOR; -COMPAT_ATTRIBUTE vec4 TexCoord; -COMPAT_VARYING vec4 pixel; -COMPAT_VARYING vec4 scale; -COMPAT_VARYING vec4 invscale; - -uniform mat4 MVPMatrix; -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; - -void main() -{ - gl_Position = MVPMatrix * VertexCoord; - - vec2 pixel_xy = TexCoord.xy * OutputSize * TextureSize / InputSize; - vec2 scale_xy = OutputSize / InputSize; - vec2 invscale_xy = InputSize / OutputSize; - - pixel = pixel_xy.xxxy; - scale = scale_xy.xxxy; - invscale = invscale_xy.xxxy; -} - -#elif defined(FRAGMENT) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING in -#define COMPAT_TEXTURE texture -out vec4 FragColor; -#else -#define COMPAT_VARYING varying -#define FragColor gl_FragColor -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#ifdef GL_FRAGMENT_PRECISION_HIGH -precision highp float; -#else -precision mediump float; -#endif -#define COMPAT_PRECISION mediump -#else -#define COMPAT_PRECISION -#endif - -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; -uniform sampler2D Texture; -COMPAT_VARYING vec4 pixel; -COMPAT_VARYING vec4 scale; -COMPAT_VARYING vec4 invscale; - -void main() -{ - vec4 pixel_tl = floor(pixel); - pixel_tl.y -= 0.33; - pixel_tl.w += 0.33; - vec4 pixel_br = ceil(pixel); - pixel_br.y -= 0.33; - pixel_br.w += 0.33; - - vec4 texel_tl = floor(invscale * pixel_tl); - vec4 texel_br = floor(invscale * pixel_br); - - vec4 mod_texel = texel_br + vec4(0.5, 0.5, 0.5, 0.5); - mod_texel -= (vec4(1.0, 1.0, 1.0, 1.0) - step(texel_br, texel_tl)) * (scale * texel_br - pixel_tl); - - FragColor.r = COMPAT_TEXTURE(Texture, mod_texel.xw / TextureSize).r; - FragColor.g = COMPAT_TEXTURE(Texture, mod_texel.yw / TextureSize).g; - FragColor.b = COMPAT_TEXTURE(Texture, mod_texel.zw / TextureSize).b; - FragColor.a = 1.0; -} -#endif diff --git a/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-vbgr.glsl b/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-vbgr.glsl deleted file mode 100644 index c4a073ef9..000000000 --- a/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-vbgr.glsl +++ /dev/null @@ -1,107 +0,0 @@ -/* - * sharp-shimmerless-vrgb - * Author: zadpos - * License: Public domain - * - * Sharp-Shimmerless shader for v-RGB subpixels - */ - -#if defined(VERTEX) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING out -#define COMPAT_ATTRIBUTE in -#define COMPAT_TEXTURE texture -#else -#define COMPAT_VARYING varying -#define COMPAT_ATTRIBUTE attribute -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#define COMPAT_PRECISION mediump -#else -#define COMPAT_PRECISION -#endif - -COMPAT_ATTRIBUTE vec4 VertexCoord; -COMPAT_ATTRIBUTE vec4 COLOR; -COMPAT_ATTRIBUTE vec4 TexCoord; -COMPAT_VARYING vec4 pixel; -COMPAT_VARYING vec4 scale; -COMPAT_VARYING vec4 invscale; - -uniform mat4 MVPMatrix; -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; - -void main() -{ - gl_Position = MVPMatrix * VertexCoord; - - vec2 pixel_xy = TexCoord.xy * OutputSize * TextureSize / InputSize; - vec2 scale_xy = OutputSize / InputSize; - vec2 invscale_xy = InputSize / OutputSize; - - pixel = pixel_xy.xyyy; - scale = scale_xy.xyyy; - invscale = invscale_xy.xyyy; -} - -#elif defined(FRAGMENT) - -#if __VERSION__ >= 130 -#define COMPAT_VARYING in -#define COMPAT_TEXTURE texture -out vec4 FragColor; -#else -#define COMPAT_VARYING varying -#define FragColor gl_FragColor -#define COMPAT_TEXTURE texture2D -#endif - -#ifdef GL_ES -#ifdef GL_FRAGMENT_PRECISION_HIGH -precision highp float; -#else -precision mediump float; -#endif -#define COMPAT_PRECISION mediump -#else -#define COMPAT_PRECISION -#endif - -uniform COMPAT_PRECISION int FrameDirection; -uniform COMPAT_PRECISION int FrameCount; -uniform COMPAT_PRECISION vec2 OutputSize; -uniform COMPAT_PRECISION vec2 TextureSize; -uniform COMPAT_PRECISION vec2 InputSize; -uniform sampler2D Texture; -COMPAT_VARYING vec4 pixel; -COMPAT_VARYING vec4 scale; -COMPAT_VARYING vec4 invscale; - -void main() -{ - vec4 pixel_tl = floor(pixel); - pixel_tl.y -= 0.33; - pixel_tl.w += 0.33; - vec4 pixel_br = ceil(pixel); - pixel_br.y -= 0.33; - pixel_br.w += 0.33; - - vec4 texel_tl = floor(invscale * pixel_tl); - vec4 texel_br = floor(invscale * pixel_br); - - vec4 mod_texel = texel_br + vec4(0.5, 0.5, 0.5, 0.5); - mod_texel -= (vec4(1.0, 1.0, 1.0, 1.0) - step(texel_br, texel_tl)) * (scale * texel_br - pixel_tl); - - FragColor.b = COMPAT_TEXTURE(Texture, mod_texel.xy / TextureSize).b; - FragColor.g = COMPAT_TEXTURE(Texture, mod_texel.xz / TextureSize).g; - FragColor.r = COMPAT_TEXTURE(Texture, mod_texel.xw / TextureSize).r; - FragColor.a = 1.0; -} -#endif diff --git a/skeleton/SYSTEM/tg5040/shaders/pixellate.glsl b/skeleton/SYSTEM/tg5040/shaders/pixellate.glsl new file mode 100644 index 000000000..aa248462f --- /dev/null +++ b/skeleton/SYSTEM/tg5040/shaders/pixellate.glsl @@ -0,0 +1,143 @@ +// Pixellate Shader +// Copyright (c) 2011, 2012 Fes +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// (Fes gave their permission to have this shader distributed under this +// licence in this forum post: +// http://board.byuu.org/viewtopic.php?p=57295#p57295 + +// Parameter lines go here: +#pragma parameter INTERPOLATE_IN_LINEAR_GAMMA "Linear Gamma Weight" 1.0 0.0 1.0 1.0 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// vertex compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define outsize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + COL0 = COLOR; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION highp +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// fragment compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define outsize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float INTERPOLATE_IN_LINEAR_GAMMA; +#else +#define INTERPOLATE_IN_LINEAR_GAMMA 1.0 +#endif + +void main() +{ + vec2 texelSize = SourceSize.zw; + + vec2 range = vec2(abs(InputSize.x / (outsize.x * SourceSize.x)), abs(InputSize.y / (outsize.y * SourceSize.y))); + range = range / 2.0 * 0.999; + + float left = vTexCoord.x - range.x; + float top = vTexCoord.y + range.y; + float right = vTexCoord.x + range.x; + float bottom = vTexCoord.y - range.y; + + vec3 topLeftColor = COMPAT_TEXTURE(Source, (floor(vec2(left, top) / texelSize) + 0.5) * texelSize).rgb; + vec3 bottomRightColor = COMPAT_TEXTURE(Source, (floor(vec2(right, bottom) / texelSize) + 0.5) * texelSize).rgb; + vec3 bottomLeftColor = COMPAT_TEXTURE(Source, (floor(vec2(left, bottom) / texelSize) + 0.5) * texelSize).rgb; + vec3 topRightColor = COMPAT_TEXTURE(Source, (floor(vec2(right, top) / texelSize) + 0.5) * texelSize).rgb; + + if (INTERPOLATE_IN_LINEAR_GAMMA > 0.5){ + topLeftColor = pow(topLeftColor, vec3(2.2)); + bottomRightColor = pow(bottomRightColor, vec3(2.2)); + bottomLeftColor = pow(bottomLeftColor, vec3(2.2)); + topRightColor = pow(topRightColor, vec3(2.2)); + } + + vec2 border = clamp(floor((vTexCoord / texelSize) + vec2(0.5)) * texelSize, vec2(left, bottom), vec2(right, top)); + + float totalArea = 4.0 * range.x * range.y; + + vec3 averageColor; + averageColor = ((border.x - left) * (top - border.y) / totalArea) * topLeftColor; + averageColor += ((right - border.x) * (border.y - bottom) / totalArea) * bottomRightColor; + averageColor += ((border.x - left) * (border.y - bottom) / totalArea) * bottomLeftColor; + averageColor += ((right - border.x) * (top - border.y) / totalArea) * topRightColor; + + FragColor = (INTERPOLATE_IN_LINEAR_GAMMA > 0.5) ? vec4(pow(averageColor, vec3(1.0 / 2.2)), 1.0) : vec4(averageColor, 1.0); +} +#endif diff --git a/workspace/all/common/defines.h b/workspace/all/common/defines.h index 453e6dcea..933716f53 100644 --- a/workspace/all/common/defines.h +++ b/workspace/all/common/defines.h @@ -78,7 +78,7 @@ #define MAX_LIGHTS 0 #endif #ifndef MAXSHADERS -#define MAXSHADERS 3 +#define MAXSHADERS 4 #endif enum { diff --git a/workspace/all/minarch/minarch.c b/workspace/all/minarch/minarch.c index 67de9ac10..b0f30b391 100644 --- a/workspace/all/minarch/minarch.c +++ b/workspace/all/minarch/minarch.c @@ -972,6 +972,7 @@ static char* overlay_labels[] = { static char* sharpness_labels[] = { "NEAREST", "LINEAR", + "PIXEL PERFECT", NULL }; static char* tearing_labels[] = { @@ -1460,8 +1461,7 @@ static struct Config { .desc = "LINEAR smooths lines, but works better when final image is at higher resolution, so either core that outputs higher resolution or upscaling with shaders", .default_value = 1, .value = 1, - // .count = 3, - .count = 2, + .count = 3, .values = sharpness_labels, .labels = sharpness_labels, }, diff --git a/workspace/tg5040/platform/platform.c b/workspace/tg5040/platform/platform.c index 2fd21c865..6fa3b65a5 100644 --- a/workspace/tg5040/platform/platform.c +++ b/workspace/tg5040/platform/platform.c @@ -61,6 +61,7 @@ Shader* shaders[MAXSHADERS] = { &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, + &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, }; static int nrofshaders = 0; // choose between 1 and 3 pipelines, > pipelines = more cpu usage, but more shader options and shader upscaling stuff @@ -364,6 +365,19 @@ void PLAT_initShaders() { vertex = load_shader_from_file(GL_VERTEX_SHADER, "noshader.glsl",SYSSHADERS_FOLDER); fragment = load_shader_from_file(GL_FRAGMENT_SHADER, "noshader.glsl",SYSSHADERS_FOLDER); g_noshader = link_program(vertex, fragment,"noshader.glsl"); + + vertex = load_shader_from_file(GL_VERTEX_SHADER, "pixellate.glsl",SYSSHADERS_FOLDER); + fragment = load_shader_from_file(GL_FRAGMENT_SHADER, "pixellate.glsl",SYSSHADERS_FOLDER); + + shaders[3]->shader_p = link_program(vertex, fragment,"sys_pixellate.glsl"); + + shaders[3]->u_FrameDirection = glGetUniformLocation( shaders[3]->shader_p, "FrameDirection"); + shaders[3]->u_FrameCount = glGetUniformLocation( shaders[3]->shader_p, "FrameCount"); + shaders[3]->u_OutputSize = glGetUniformLocation( shaders[3]->shader_p, "OutputSize"); + shaders[3]->u_TextureSize = glGetUniformLocation( shaders[3]->shader_p, "TextureSize"); + shaders[3]->u_InputSize = glGetUniformLocation( shaders[3]->shader_p, "InputSize"); + shaders[3]->texLocation = glGetUniformLocation( shaders[3]->shader_p, "Texture"); + shaders[3]->texelSizeLocation = glGetUniformLocation( shaders[3]->shader_p, "texelSize"); LOG_info("default shaders loaded, %i\n\n",g_shader_default); } @@ -738,11 +752,13 @@ void PLAT_setVideoScaleClip(int x, int y, int width, int height) { void PLAT_setSharpness(int sharpness) { if(sharpness==1) { - LOG_info("finalScaleFilter set to GL_LINEAR\n"); finalScaleFilter=GL_LINEAR; + } else if(sharpness==2) { + LOG_info("Sharpness setting: PIXEL PERFECT\n"); + + finalScaleFilter = GL_NEAREST; } else { - LOG_info("finalScaleFilter set to GL_NEAREST\n"); finalScaleFilter = GL_NEAREST; } reloadShaderTextures = 1; @@ -1936,11 +1952,27 @@ void PLAT_GL_Swap() { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, vid.blit->src_w, vid.blit->src_h, GL_RGBA, GL_UNSIGNED_BYTE, vid.blit->src); } - if (nrofshaders < 1) { - runShaderPass(src_texture, g_shader_default, NULL, dst_rect.x, dst_rect.y, - dst_rect.w, dst_rect.h, - &(Shader){.srcw = vid.blit->src_w, .srch = vid.blit->src_h, .texw = vid.blit->src_w, .texh = vid.blit->src_h}, - 0, GL_NONE); + + static GLuint pixellate_texture = 0; + if (shaders[3]->shader_p) { + shaders[3]->srcw = vid.blit->src_w; + shaders[3]->srch = vid.blit->src_h; + shaders[3]->texw = vid.blit->src_w; + shaders[3]->texh = vid.blit->src_h; + runShaderPass( + src_texture,shaders[3]->shader_p, + &pixellate_texture, + 0, 0, dst_rect.w, dst_rect.h, + shaders[3], + 0, + finalScaleFilter + ); + + } else if (nrofshaders < 1) { + runShaderPass(src_texture, g_shader_default, NULL, dst_rect.x, dst_rect.y, + dst_rect.w, dst_rect.h, + &(Shader){.srcw = vid.blit->src_w, .srch = vid.blit->src_h, .texw = vid.blit->src_w, .texh = vid.blit->src_h}, + 0, GL_NONE); } last_w = vid.blit->src_w; @@ -2021,7 +2053,16 @@ void PLAT_GL_Swap() { &(Shader){.srcw = last_w, .srch = last_h, .texw = last_w, .texh = last_h}, 0, GL_NONE ); - } + } else { + runShaderPass( + pixellate_texture, + g_shader_default, + NULL, + dst_rect.x, dst_rect.y, dst_rect.w, dst_rect.h, + &(Shader){.srcw = last_w, .srch = last_h, .texw = last_w, .texh = last_h}, + 0, GL_NONE + ); + } if (effect_tex) { runShaderPass( From b267c99d88bcacf7e2282768575a87f5e5832f0c Mon Sep 17 00:00:00 2001 From: ro8inmorgan Date: Wed, 14 May 2025 12:57:10 +0200 Subject: [PATCH 2/3] shader presets! --- .../Shaders/{ => glsl}/aa-shader-4.0.glsl | 0 .../Shaders/{ => glsl}/barrel-distortion.glsl | 0 skeleton/BASE/Shaders/{ => glsl}/bicubic.glsl | 0 .../BASE/Shaders/{ => glsl}/edge1pixel.glsl | 0 .../BASE/Shaders/{ => glsl}/fast-sharpen.glsl | 0 skeleton/BASE/Shaders/{ => glsl}/lcd3x.glsl | 0 .../BASE/Shaders/{ => glsl}/pixel_art_AA.glsl | 0 .../BASE/Shaders/{ => glsl}/pixellate.glsl | 0 .../glsl/res-independent-scanlines.glsl | 138 +++++++++ .../BASE/Shaders/{ => glsl}/retro-v2.glsl | 0 skeleton/BASE/Shaders/{ => glsl}/scale3x.glsl | 0 .../BASE/Shaders/{ => glsl}/scanline.glsl | 0 .../Shaders/{ => glsl}/sharp-bilinear.glsl | 0 .../{ => glsl}/sharp-shimmerless-grid.glsl | 0 .../sharp-shimmerless-subpixel-vrgb.glsl | 0 .../Shaders/{ => glsl}/sharp-shimmerless.glsl | 0 skeleton/BASE/Shaders/{ => glsl}/stock.glsl | 0 .../BASE/Shaders/{ => glsl}/waterpaint.glsl | 0 skeleton/BASE/Shaders/old-tv.cfg | 11 + skeleton/BASE/Shaders/pixelperfect-sharp.cfg | 7 + skeleton/BASE/Shaders/pixelperfect-smooth.cfg | 7 + skeleton/BASE/Shaders/real-gameboy.cfg | 16 + skeleton/BASE/Shaders/real-gba.cfg | 12 + workspace/all/minarch/minarch.c | 276 +++++++++++------- workspace/macos/platform/platform.c | 2 +- workspace/tg5040/platform/platform.c | 60 +--- 26 files changed, 366 insertions(+), 163 deletions(-) rename skeleton/BASE/Shaders/{ => glsl}/aa-shader-4.0.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/barrel-distortion.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/bicubic.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/edge1pixel.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/fast-sharpen.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/lcd3x.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/pixel_art_AA.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/pixellate.glsl (100%) create mode 100644 skeleton/BASE/Shaders/glsl/res-independent-scanlines.glsl rename skeleton/BASE/Shaders/{ => glsl}/retro-v2.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/scale3x.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/scanline.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/sharp-bilinear.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/sharp-shimmerless-grid.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/sharp-shimmerless-subpixel-vrgb.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/sharp-shimmerless.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/stock.glsl (100%) rename skeleton/BASE/Shaders/{ => glsl}/waterpaint.glsl (100%) create mode 100644 skeleton/BASE/Shaders/old-tv.cfg create mode 100644 skeleton/BASE/Shaders/pixelperfect-sharp.cfg create mode 100644 skeleton/BASE/Shaders/pixelperfect-smooth.cfg create mode 100644 skeleton/BASE/Shaders/real-gameboy.cfg create mode 100644 skeleton/BASE/Shaders/real-gba.cfg diff --git a/skeleton/BASE/Shaders/aa-shader-4.0.glsl b/skeleton/BASE/Shaders/glsl/aa-shader-4.0.glsl similarity index 100% rename from skeleton/BASE/Shaders/aa-shader-4.0.glsl rename to skeleton/BASE/Shaders/glsl/aa-shader-4.0.glsl diff --git a/skeleton/BASE/Shaders/barrel-distortion.glsl b/skeleton/BASE/Shaders/glsl/barrel-distortion.glsl similarity index 100% rename from skeleton/BASE/Shaders/barrel-distortion.glsl rename to skeleton/BASE/Shaders/glsl/barrel-distortion.glsl diff --git a/skeleton/BASE/Shaders/bicubic.glsl b/skeleton/BASE/Shaders/glsl/bicubic.glsl similarity index 100% rename from skeleton/BASE/Shaders/bicubic.glsl rename to skeleton/BASE/Shaders/glsl/bicubic.glsl diff --git a/skeleton/BASE/Shaders/edge1pixel.glsl b/skeleton/BASE/Shaders/glsl/edge1pixel.glsl similarity index 100% rename from skeleton/BASE/Shaders/edge1pixel.glsl rename to skeleton/BASE/Shaders/glsl/edge1pixel.glsl diff --git a/skeleton/BASE/Shaders/fast-sharpen.glsl b/skeleton/BASE/Shaders/glsl/fast-sharpen.glsl similarity index 100% rename from skeleton/BASE/Shaders/fast-sharpen.glsl rename to skeleton/BASE/Shaders/glsl/fast-sharpen.glsl diff --git a/skeleton/BASE/Shaders/lcd3x.glsl b/skeleton/BASE/Shaders/glsl/lcd3x.glsl similarity index 100% rename from skeleton/BASE/Shaders/lcd3x.glsl rename to skeleton/BASE/Shaders/glsl/lcd3x.glsl diff --git a/skeleton/BASE/Shaders/pixel_art_AA.glsl b/skeleton/BASE/Shaders/glsl/pixel_art_AA.glsl similarity index 100% rename from skeleton/BASE/Shaders/pixel_art_AA.glsl rename to skeleton/BASE/Shaders/glsl/pixel_art_AA.glsl diff --git a/skeleton/BASE/Shaders/pixellate.glsl b/skeleton/BASE/Shaders/glsl/pixellate.glsl similarity index 100% rename from skeleton/BASE/Shaders/pixellate.glsl rename to skeleton/BASE/Shaders/glsl/pixellate.glsl diff --git a/skeleton/BASE/Shaders/glsl/res-independent-scanlines.glsl b/skeleton/BASE/Shaders/glsl/res-independent-scanlines.glsl new file mode 100644 index 000000000..49dc269d3 --- /dev/null +++ b/skeleton/BASE/Shaders/glsl/res-independent-scanlines.glsl @@ -0,0 +1,138 @@ +/* + Resolution-Independent Scanlines + based on + Scanlines Sine Absolute Value + An ultra light scanline shader + by RiskyJumps + license: public domain +*/ + +#pragma parameter amp "Amplitude" 1.2500 0.000 2.000 0.05 +#pragma parameter phase "Phase" 0.5000 0.000 2.000 0.05 +#pragma parameter lines_black "Lines Blacks" 0.0000 0.000 1.000 0.05 +#pragma parameter lines_white "Lines Whites" 1.0000 0.000 2.000 0.05 +#pragma parameter imageSize "Simulated Image Height" 224.0 144.0 288.0 1.0 +#pragma parameter autoscale "Automatic Scale" 0.0 0.0 1.0 1.0 + +#define freq 0.500000 +#define offset 0.000000 +#define pi 3.141592654 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING float omega; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#define pi 3.141592654 + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy; + omega = 2.0 * pi * freq; // Angular frequency +} + +#elif defined(FRAGMENT) + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out COMPAT_PRECISION vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING float omega; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float amp, phase, lines_black, lines_white, + imageSize, autoscale; +#else +#define amp 1.25 +#define phase 0.5 +#define lines_black 0.0 +#define lines_white 1.0 +#define imageSize 224.0 +#define autoscale 0.0 + +#endif + +void main() +{ + float scale = imageSize; if (autoscale == 1.0) scale = InputSize.y; + float angle = (gl_FragCoord.y * OutSize.w) * omega * scale + phase; + vec3 color = COMPAT_TEXTURE(Source, vTexCoord).xyz; + float grid; + + float lines; + + lines = sin(angle); + lines *= amp; + lines += offset; + lines = abs(lines); + lines *= lines_white - lines_black; + lines += lines_black; + color *= lines; + + FragColor = vec4(color.xyz, 1.0); +} + +#endif diff --git a/skeleton/BASE/Shaders/retro-v2.glsl b/skeleton/BASE/Shaders/glsl/retro-v2.glsl similarity index 100% rename from skeleton/BASE/Shaders/retro-v2.glsl rename to skeleton/BASE/Shaders/glsl/retro-v2.glsl diff --git a/skeleton/BASE/Shaders/scale3x.glsl b/skeleton/BASE/Shaders/glsl/scale3x.glsl similarity index 100% rename from skeleton/BASE/Shaders/scale3x.glsl rename to skeleton/BASE/Shaders/glsl/scale3x.glsl diff --git a/skeleton/BASE/Shaders/scanline.glsl b/skeleton/BASE/Shaders/glsl/scanline.glsl similarity index 100% rename from skeleton/BASE/Shaders/scanline.glsl rename to skeleton/BASE/Shaders/glsl/scanline.glsl diff --git a/skeleton/BASE/Shaders/sharp-bilinear.glsl b/skeleton/BASE/Shaders/glsl/sharp-bilinear.glsl similarity index 100% rename from skeleton/BASE/Shaders/sharp-bilinear.glsl rename to skeleton/BASE/Shaders/glsl/sharp-bilinear.glsl diff --git a/skeleton/BASE/Shaders/sharp-shimmerless-grid.glsl b/skeleton/BASE/Shaders/glsl/sharp-shimmerless-grid.glsl similarity index 100% rename from skeleton/BASE/Shaders/sharp-shimmerless-grid.glsl rename to skeleton/BASE/Shaders/glsl/sharp-shimmerless-grid.glsl diff --git a/skeleton/BASE/Shaders/sharp-shimmerless-subpixel-vrgb.glsl b/skeleton/BASE/Shaders/glsl/sharp-shimmerless-subpixel-vrgb.glsl similarity index 100% rename from skeleton/BASE/Shaders/sharp-shimmerless-subpixel-vrgb.glsl rename to skeleton/BASE/Shaders/glsl/sharp-shimmerless-subpixel-vrgb.glsl diff --git a/skeleton/BASE/Shaders/sharp-shimmerless.glsl b/skeleton/BASE/Shaders/glsl/sharp-shimmerless.glsl similarity index 100% rename from skeleton/BASE/Shaders/sharp-shimmerless.glsl rename to skeleton/BASE/Shaders/glsl/sharp-shimmerless.glsl diff --git a/skeleton/BASE/Shaders/stock.glsl b/skeleton/BASE/Shaders/glsl/stock.glsl similarity index 100% rename from skeleton/BASE/Shaders/stock.glsl rename to skeleton/BASE/Shaders/glsl/stock.glsl diff --git a/skeleton/BASE/Shaders/waterpaint.glsl b/skeleton/BASE/Shaders/glsl/waterpaint.glsl similarity index 100% rename from skeleton/BASE/Shaders/waterpaint.glsl rename to skeleton/BASE/Shaders/glsl/waterpaint.glsl diff --git a/skeleton/BASE/Shaders/old-tv.cfg b/skeleton/BASE/Shaders/old-tv.cfg new file mode 100644 index 000000000..d45161660 --- /dev/null +++ b/skeleton/BASE/Shaders/old-tv.cfg @@ -0,0 +1,11 @@ +minarch_nrofshaders = 2 +minarch_shader1 = barrel-distortion.glsl +minarch_shader1_filter = NEAREST +minarch_shader1_srctype = source +minarch_shader1_scaletype = source +minarch_shader1_upscale = screen +minarch_shader2 = res-independent-scanlines.glsl +minarch_shader2_filter = NEAREST +minarch_shader2_srctype = source +minarch_shader2_scaletype = source +minarch_shader2_upscale = screen \ No newline at end of file diff --git a/skeleton/BASE/Shaders/pixelperfect-sharp.cfg b/skeleton/BASE/Shaders/pixelperfect-sharp.cfg new file mode 100644 index 000000000..366f16c28 --- /dev/null +++ b/skeleton/BASE/Shaders/pixelperfect-sharp.cfg @@ -0,0 +1,7 @@ +minarch_nrofshaders = 1 +minarch_shader1 = pixellate.glsl +minarch_shader1_filter = NEAREST +minarch_shader1_srctype = source +minarch_shader1_scaletype = source +minarch_shader1_upscale = screen +minarch_scale_filter = NEAREST \ No newline at end of file diff --git a/skeleton/BASE/Shaders/pixelperfect-smooth.cfg b/skeleton/BASE/Shaders/pixelperfect-smooth.cfg new file mode 100644 index 000000000..d1ea27e88 --- /dev/null +++ b/skeleton/BASE/Shaders/pixelperfect-smooth.cfg @@ -0,0 +1,7 @@ +minarch_nrofshaders = 1 +minarch_shader1 = stock.glsl +minarch_shader1_filter = NEAREST +minarch_shader1_srctype = source +minarch_shader1_scaletype = source +minarch_shader1_upscale = 3 +minarch_scale_filter = LINEAR \ No newline at end of file diff --git a/skeleton/BASE/Shaders/real-gameboy.cfg b/skeleton/BASE/Shaders/real-gameboy.cfg new file mode 100644 index 000000000..7bdac9a3f --- /dev/null +++ b/skeleton/BASE/Shaders/real-gameboy.cfg @@ -0,0 +1,16 @@ +minarch_nrofshaders = 2 +minarch_shader1 = pixellate.glsl +minarch_shader1_filter = NEAREST +minarch_shader1_srctype = source +minarch_shader1_scaletype = source +minarch_shader1_upscale = screen +minarch_shader2 = lcd3x.glsl +minarch_shader2_filter = NEAREST +minarch_shader2_srctype = source +minarch_shader2_scaletype = source +minarch_shader2_upscale = screen +minarch_scale_filter = NEAREST +gambatte_gb_palette_twb64_2 = TWB64 163 - Classic LCD +gambatte_gb_colorization = internal +gambatte_gbc_color_correction = always +gambatte_gbc_color_correction_mode = accurate \ No newline at end of file diff --git a/skeleton/BASE/Shaders/real-gba.cfg b/skeleton/BASE/Shaders/real-gba.cfg new file mode 100644 index 000000000..eebddbeb2 --- /dev/null +++ b/skeleton/BASE/Shaders/real-gba.cfg @@ -0,0 +1,12 @@ +minarch_nrofshaders = 2 +minarch_shader1 = pixellate.glsl +minarch_shader1_filter = NEAREST +minarch_shader1_srctype = source +minarch_shader1_scaletype = source +minarch_shader1_upscale = screen +minarch_shader2 = lcd3x.glsl +minarch_shader2_filter = NEAREST +minarch_shader2_srctype = source +minarch_shader2_scaletype = source +minarch_shader2_upscale = screen +minarch_scale_filter = NEAREST \ No newline at end of file diff --git a/workspace/all/minarch/minarch.c b/workspace/all/minarch/minarch.c index b0f30b391..5c99c3645 100644 --- a/workspace/all/minarch/minarch.c +++ b/workspace/all/minarch/minarch.c @@ -972,7 +972,6 @@ static char* overlay_labels[] = { static char* sharpness_labels[] = { "NEAREST", "LINEAR", - "PIXEL PERFECT", NULL }; static char* tearing_labels[] = { @@ -1200,6 +1199,7 @@ enum { SYNC_SRC_CORE }; enum { + SH_SHADERS_PRESET, SH_NROFSHADERS, SH_SHADER1, SH_SHADER1_FILTER, @@ -1372,6 +1372,7 @@ static struct Config { char* system_cfg; // system.cfg based on system limitations char* default_cfg; // pak.cfg based on platform limitations char* user_cfg; // minarch.cfg or game.cfg based on user preference + char* shaders_preset; // minarch.cfg or game.cfg based on user preference char* device_tag; OptionList frontend; OptionList core; @@ -1535,8 +1536,18 @@ static struct Config { }, }, .shaders = { // (OptionList) - .count = 16, + .count = 17, .options = (Option[]){ + [SH_SHADERS_PRESET] = { + .key = "minarch_shaders_preset", + .name = "Preset", + .desc = "Load a premade shaders config", // will call getScreenScalingDesc() + .default_value = 1, + .value = 1, + .count = 0, + .values = NULL, + .labels = NULL, + }, [SH_NROFSHADERS] = { .key = "minarch_nrofshaders", .name = "Number of Shaders", @@ -1765,6 +1776,7 @@ static void setOverclock(int i) { } } static int toggle_thread = 0; +static int shadersreload = 0; static void Config_syncFrontend(char* key, int value) { int i = -1; if (exactMatch(key,config.frontend.options[FE_OPT_SCALING].key)) { @@ -1898,109 +1910,8 @@ char** list_files_in_folder(const char* folderPath, int* fileCount) { } -static void Config_syncShaders(char* key, int value) { - int i = -1; - if (exactMatch(key,config.shaders.options[SH_NROFSHADERS].key)) { - GFX_setShaders(value); - i = SH_NROFSHADERS; - } - if (exactMatch(key, config.shaders.options[SH_SHADER1].key)) { - char** shaderList = config.shaders.options[SH_SHADER1].values; - if (shaderList) { - LOG_info("minarch: updating shader 1 - %i\n",value); - int count = 0; - while (shaderList && shaderList[count]) count++; - if (value >= 0 && value < count) { - GFX_updateShader(0, shaderList[value], NULL, NULL,NULL,NULL); - i = SH_SHADER1; - } - } - } - if (exactMatch(key,config.shaders.options[SH_SHADER1_FILTER].key)) { - GFX_updateShader(0,NULL,NULL,&value,NULL,NULL); - i = SH_SHADER1_FILTER; - } - if (exactMatch(key,config.shaders.options[SH_SRCTYPE1].key)) { - GFX_updateShader(0,NULL,NULL,NULL,NULL,&value); - i = SH_SRCTYPE1; - } - if (exactMatch(key,config.shaders.options[SH_SCALETYPE1].key)) { - GFX_updateShader(0,NULL,NULL,NULL,&value,NULL); - i = SH_SCALETYPE1; - } - if (exactMatch(key,config.shaders.options[SH_UPSCALE1].key)) { - GFX_updateShader(0,NULL,&value,NULL,NULL,NULL); - i = SH_UPSCALE1; - } - if (exactMatch(key, config.shaders.options[SH_SHADER2].key)) { - char** shaderList = config.shaders.options[SH_SHADER2].values; - if (shaderList) { - LOG_info("minarch: updating shader 2 - %i\n",value); - int count = 0; - while (shaderList && shaderList[count]) count++; - if (value >= 0 && value < count) { - GFX_updateShader(1, shaderList[value], NULL, NULL,NULL,NULL); - i = SH_SHADER2; - } - } - } - if (exactMatch(key,config.shaders.options[SH_SHADER2_FILTER].key)) { - GFX_updateShader(1,NULL,NULL,&value,NULL,NULL); - i = SH_SHADER2_FILTER; - } - if (exactMatch(key,config.shaders.options[SH_SRCTYPE2].key)) { - GFX_updateShader(1,NULL,NULL,NULL,NULL,&value); - i = SH_SRCTYPE2; - } - if (exactMatch(key,config.shaders.options[SH_SCALETYPE2].key)) { - GFX_updateShader(1,NULL,NULL,NULL,&value,NULL); - i = SH_SCALETYPE2; - } - if (exactMatch(key,config.shaders.options[SH_UPSCALE2].key)) { - GFX_updateShader(1,NULL,&value,NULL,NULL,NULL); - i = SH_UPSCALE2; - } - if (exactMatch(key, config.shaders.options[SH_SHADER3].key)) { - char** shaderList = config.shaders.options[SH_SHADER3].values; - if (shaderList) { - LOG_info("minarch: updating shader 3 - %i\n",value); - int count = 0; - while (shaderList && shaderList[count]) count++; - if (value >= 0 && value < count) { - GFX_updateShader(2, shaderList[value], NULL, NULL,NULL,NULL); - i = SH_SHADER3; - } - } - } - if (exactMatch(key,config.shaders.options[SH_SHADER3_FILTER].key)) { - GFX_updateShader(2,NULL,NULL,&value,NULL,NULL); - i = SH_SHADER3_FILTER; - } - if (exactMatch(key,config.shaders.options[SH_SRCTYPE3].key)) { - GFX_updateShader(2,NULL,NULL,NULL,NULL,&value); - i = SH_SRCTYPE3; - } - if (exactMatch(key,config.shaders.options[SH_SCALETYPE3].key)) { - GFX_updateShader(2,NULL,NULL,NULL,&value,NULL); - i = SH_SCALETYPE3; - } - if (exactMatch(key,config.shaders.options[SH_UPSCALE3].key)) { - GFX_updateShader(2,NULL,&value,NULL,NULL,NULL); - i = SH_UPSCALE3; - } - - if (i==-1) return; - Option* option = &config.shaders.options[i]; - option->value = value; -} -void initShaders() { - LOG_info("Init shaders\n"); - for (int i=0; config.shaders.options[i].key; i++) { - Option* option = &config.shaders.options[i]; - Config_syncShaders(option->key, option->value); - } -} + static void OptionList_setOptionValue(OptionList* list, const char* key, const char* value); enum { CONFIG_WRITE_ALL, @@ -2079,16 +1990,24 @@ static void Config_init(void) { // populate shader options int filecount; - char** filelist = list_files_in_folder(SHADERS_FOLDER, &filecount); + char** filelist = list_files_in_folder(SHADERS_FOLDER "/glsl", &filecount); + int preset_filecount; + char** preset_filelist = list_files_in_folder(SHADERS_FOLDER, &preset_filecount); + config.shaders.options[SH_SHADER1].values = filelist; config.shaders.options[SH_SHADER2].values = filelist; config.shaders.options[SH_SHADER3].values = filelist; + config.shaders.options[SH_SHADERS_PRESET].values = preset_filelist; + config.shaders.options[SH_SHADER1].labels = filelist; config.shaders.options[SH_SHADER2].labels = filelist; config.shaders.options[SH_SHADER3].labels = filelist; + config.shaders.options[SH_SHADERS_PRESET].labels = preset_filelist; + config.shaders.options[SH_SHADER1].count = filecount; config.shaders.options[SH_SHADER2].count = filecount; config.shaders.options[SH_SHADER3].count = filecount; + config.shaders.options[SH_SHADERS_PRESET].count = preset_filecount; char overlaypath[255]; snprintf(overlaypath, sizeof(overlaypath), "%s/%s", OVERLAYS_FOLDER, core.tag); @@ -2153,6 +2072,7 @@ static void Config_readOptionsString(char* cfg) { for (int i=0; config.shaders.options[i].key; i++) { Option* option = &config.shaders.options[i]; if (!Config_getValue(cfg, option->key, value, &option->lock)) continue; + LOG_info("set value toch %s %s\n",option->key,value); OptionList_setOptionValue(&config.shaders, option->key, value); } } @@ -2243,6 +2163,8 @@ static void Config_load(void) { else if (exists(system_path)) config.system_cfg = allocFile(system_path); else config.system_cfg = NULL; + + // LOG_info("config.system_cfg: %s\n", config.system_cfg); char default_path[MAX_PATH]; @@ -2292,6 +2214,8 @@ static void Config_readOptions(void) { Config_readOptionsString(config.default_cfg); Config_readOptionsString(config.user_cfg); + + // screen_scaling = SCALE_NATIVE; // TODO: tmp } static void Config_readControls(void) { @@ -2406,6 +2330,130 @@ static void Config_restore(void) { renderer.dst_p = 0; } +void readShadersPreset(int i) { + char shaderspath[MAX_PATH] = {0}; + sprintf(shaderspath, SHADERS_FOLDER "/%s", config.shaders.options[SH_SHADERS_PRESET].values[i]); + LOG_info("read shaders preset %s\n",shaderspath); + if (exists(shaderspath)) config.shaders_preset = allocFile(shaderspath); + else config.shaders_preset = NULL; + Config_readOptionsString(config.shaders_preset); +} + +static void Config_syncShaders(char* key, int value) { + int i = -1; + if (exactMatch(key,config.shaders.options[SH_SHADERS_PRESET].key)) { + readShadersPreset(value); + i = SH_SHADERS_PRESET; + } + if (exactMatch(key,config.shaders.options[SH_NROFSHADERS].key)) { + GFX_setShaders(value); + shadersreload = 1; + i = SH_NROFSHADERS; + } + + if (exactMatch(key, config.shaders.options[SH_SHADER1].key)) { + char** shaderList = config.shaders.options[SH_SHADER1].values; + if (shaderList) { + LOG_info("minarch: updating shader 1 - %i\n",value); + int count = 0; + while (shaderList && shaderList[count]) count++; + if (value >= 0 && value < count) { + GFX_updateShader(0, shaderList[value], NULL, NULL,NULL,NULL); + i = SH_SHADER1; + } + } + } + if (exactMatch(key,config.shaders.options[SH_SHADER1_FILTER].key)) { + GFX_updateShader(0,NULL,NULL,&value,NULL,NULL); + i = SH_SHADER1_FILTER; + } + if (exactMatch(key,config.shaders.options[SH_SRCTYPE1].key)) { + GFX_updateShader(0,NULL,NULL,NULL,NULL,&value); + i = SH_SRCTYPE1; + } + if (exactMatch(key,config.shaders.options[SH_SCALETYPE1].key)) { + GFX_updateShader(0,NULL,NULL,NULL,&value,NULL); + i = SH_SCALETYPE1; + } + if (exactMatch(key,config.shaders.options[SH_UPSCALE1].key)) { + GFX_updateShader(0,NULL,&value,NULL,NULL,NULL); + i = SH_UPSCALE1; + } + if (exactMatch(key, config.shaders.options[SH_SHADER2].key)) { + char** shaderList = config.shaders.options[SH_SHADER2].values; + if (shaderList) { + LOG_info("minarch: updating shader 2 - %i\n",value); + int count = 0; + while (shaderList && shaderList[count]) count++; + if (value >= 0 && value < count) { + GFX_updateShader(1, shaderList[value], NULL, NULL,NULL,NULL); + i = SH_SHADER2; + } + } + } + if (exactMatch(key,config.shaders.options[SH_SHADER2_FILTER].key)) { + GFX_updateShader(1,NULL,NULL,&value,NULL,NULL); + i = SH_SHADER2_FILTER; + } + if (exactMatch(key,config.shaders.options[SH_SRCTYPE2].key)) { + GFX_updateShader(1,NULL,NULL,NULL,NULL,&value); + i = SH_SRCTYPE2; + } + if (exactMatch(key,config.shaders.options[SH_SCALETYPE2].key)) { + GFX_updateShader(1,NULL,NULL,NULL,&value,NULL); + i = SH_SCALETYPE2; + } + if (exactMatch(key,config.shaders.options[SH_UPSCALE2].key)) { + GFX_updateShader(1,NULL,&value,NULL,NULL,NULL); + i = SH_UPSCALE2; + } + if (exactMatch(key, config.shaders.options[SH_SHADER3].key)) { + char** shaderList = config.shaders.options[SH_SHADER3].values; + if (shaderList) { + LOG_info("minarch: updating shader 3 - %i\n",value); + int count = 0; + while (shaderList && shaderList[count]) count++; + if (value >= 0 && value < count) { + GFX_updateShader(2, shaderList[value], NULL, NULL,NULL,NULL); + i = SH_SHADER3; + } + } + } + if (exactMatch(key,config.shaders.options[SH_SHADER3_FILTER].key)) { + GFX_updateShader(2,NULL,NULL,&value,NULL,NULL); + i = SH_SHADER3_FILTER; + } + if (exactMatch(key,config.shaders.options[SH_SRCTYPE3].key)) { + GFX_updateShader(2,NULL,NULL,NULL,NULL,&value); + i = SH_SRCTYPE3; + } + if (exactMatch(key,config.shaders.options[SH_SCALETYPE3].key)) { + GFX_updateShader(2,NULL,NULL,NULL,&value,NULL); + i = SH_SCALETYPE3; + } + if (exactMatch(key,config.shaders.options[SH_UPSCALE3].key)) { + GFX_updateShader(2,NULL,&value,NULL,NULL,NULL); + i = SH_UPSCALE3; + } + + if (i==-1) return; + Option* option = &config.shaders.options[i]; + option->value = value; + shadersreload = 1; +} + +//////// + +void initShaders() { + for (int i=0; config.shaders.options[i].key; i++) { + if(i!=SH_SHADERS_PRESET) { + Option* option = &config.shaders.options[i]; + Config_syncShaders(option->key, option->value); + } + } + shadersreload = 0; +} + /////////////////////////////// static struct Special { int palette_updated; @@ -5253,8 +5301,12 @@ static int OptionCheats_openMenu(MenuList* list, int i) { static int OptionShaders_optionChanged(MenuList* list, int i) { MenuItem* item = &list->items[i]; Config_syncShaders(item->key, item->value); - if(i==SH_NROFSHADERS) - initShaders(); + + for (int i = 0; i < config.shaders.count; i++) { + MenuItem* item = &list->items[i]; + item->value = config.shaders.options[i].value; + + } return MENU_CALLBACK_NOP; } @@ -5267,9 +5319,9 @@ static MenuList ShaderOptions_menu = { static int OptionShaders_openMenu(MenuList* list, int i) { LOG_info("OptionShaders_openMenu\n"); - if (ShaderOptions_menu.items == NULL) { + int filecount; - char** filelist = list_files_in_folder(SHADERS_FOLDER, &filecount); + char** filelist = list_files_in_folder(SHADERS_FOLDER "/glsl", &filecount); // Check if folder read failed or no files found if (!filelist || filecount == 0) { @@ -5299,7 +5351,7 @@ static int OptionShaders_openMenu(MenuList* list, int i) { item->values = config.shaders.options[i].values; } } - } + if (ShaderOptions_menu.items[0].name) { Menu_options(&ShaderOptions_menu); @@ -6620,10 +6672,14 @@ int main(int argc , char* argv[]) { if (show_menu) { + Menu_loop(); has_pending_opt_change = config.core.changed; resetFPSCounter(); chooseSyncRef(); + // reload shaders if needed (dont want to always do it as it blacks the screen) + if(shadersreload) + initShaders(); // this is not needed // SND_resetAudio(core.sample_rate, core.fps); } diff --git a/workspace/macos/platform/platform.c b/workspace/macos/platform/platform.c index 78db1aea3..0e0ee123c 100644 --- a/workspace/macos/platform/platform.c +++ b/workspace/macos/platform/platform.c @@ -496,7 +496,7 @@ char* load_shader_source(const char* filename) { GLuint load_shader_from_file(GLenum type, const char* filename, const char* path) { char filepath[256]; - snprintf(filepath, sizeof(filepath), "%s/%s", path,filename); + snprintf(filepath, sizeof(filepath), "%s/glsl/%s", path,filename); char* source = load_shader_source(filepath); if (!source) return 0; diff --git a/workspace/tg5040/platform/platform.c b/workspace/tg5040/platform/platform.c index 6fa3b65a5..338169e7f 100644 --- a/workspace/tg5040/platform/platform.c +++ b/workspace/tg5040/platform/platform.c @@ -61,7 +61,6 @@ Shader* shaders[MAXSHADERS] = { &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, - &(Shader){ .shader_p = 0, .scale = 1, .filter = GL_LINEAR, .scaletype = 1, .srctype = 0, .filename ="stock.glsl", .texture = 0, .updated = 1 }, }; static int nrofshaders = 0; // choose between 1 and 3 pipelines, > pipelines = more cpu usage, but more shader options and shader upscaling stuff @@ -212,7 +211,7 @@ char* load_shader_source(const char* filename) { GLuint load_shader_from_file(GLenum type, const char* filename, const char* path) { char filepath[256]; - snprintf(filepath, sizeof(filepath), "%s/%s", path,filename); + snprintf(filepath, sizeof(filepath), "%s/glsl/%s", path,filename); char* source = load_shader_source(filepath); if (!source) return 0; @@ -365,19 +364,6 @@ void PLAT_initShaders() { vertex = load_shader_from_file(GL_VERTEX_SHADER, "noshader.glsl",SYSSHADERS_FOLDER); fragment = load_shader_from_file(GL_FRAGMENT_SHADER, "noshader.glsl",SYSSHADERS_FOLDER); g_noshader = link_program(vertex, fragment,"noshader.glsl"); - - vertex = load_shader_from_file(GL_VERTEX_SHADER, "pixellate.glsl",SYSSHADERS_FOLDER); - fragment = load_shader_from_file(GL_FRAGMENT_SHADER, "pixellate.glsl",SYSSHADERS_FOLDER); - - shaders[3]->shader_p = link_program(vertex, fragment,"sys_pixellate.glsl"); - - shaders[3]->u_FrameDirection = glGetUniformLocation( shaders[3]->shader_p, "FrameDirection"); - shaders[3]->u_FrameCount = glGetUniformLocation( shaders[3]->shader_p, "FrameCount"); - shaders[3]->u_OutputSize = glGetUniformLocation( shaders[3]->shader_p, "OutputSize"); - shaders[3]->u_TextureSize = glGetUniformLocation( shaders[3]->shader_p, "TextureSize"); - shaders[3]->u_InputSize = glGetUniformLocation( shaders[3]->shader_p, "InputSize"); - shaders[3]->texLocation = glGetUniformLocation( shaders[3]->shader_p, "Texture"); - shaders[3]->texelSizeLocation = glGetUniformLocation( shaders[3]->shader_p, "texelSize"); LOG_info("default shaders loaded, %i\n\n",g_shader_default); } @@ -749,15 +735,10 @@ SDL_Surface* PLAT_resizeVideo(int w, int h, int p) { void PLAT_setVideoScaleClip(int x, int y, int width, int height) { // buh } - void PLAT_setSharpness(int sharpness) { if(sharpness==1) { finalScaleFilter=GL_LINEAR; - } else if(sharpness==2) { - LOG_info("Sharpness setting: PIXEL PERFECT\n"); - - finalScaleFilter = GL_NEAREST; - } + } else { finalScaleFilter = GL_NEAREST; } @@ -1952,27 +1933,11 @@ void PLAT_GL_Swap() { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, vid.blit->src_w, vid.blit->src_h, GL_RGBA, GL_UNSIGNED_BYTE, vid.blit->src); } - - static GLuint pixellate_texture = 0; - if (shaders[3]->shader_p) { - shaders[3]->srcw = vid.blit->src_w; - shaders[3]->srch = vid.blit->src_h; - shaders[3]->texw = vid.blit->src_w; - shaders[3]->texh = vid.blit->src_h; - runShaderPass( - src_texture,shaders[3]->shader_p, - &pixellate_texture, - 0, 0, dst_rect.w, dst_rect.h, - shaders[3], - 0, - finalScaleFilter - ); - - } else if (nrofshaders < 1) { - runShaderPass(src_texture, g_shader_default, NULL, dst_rect.x, dst_rect.y, - dst_rect.w, dst_rect.h, - &(Shader){.srcw = vid.blit->src_w, .srch = vid.blit->src_h, .texw = vid.blit->src_w, .texh = vid.blit->src_h}, - 0, GL_NONE); + if (nrofshaders < 1) { + runShaderPass(src_texture, g_shader_default, NULL, dst_rect.x, dst_rect.y, + dst_rect.w, dst_rect.h, + &(Shader){.srcw = vid.blit->src_w, .srch = vid.blit->src_h, .texw = vid.blit->src_w, .texh = vid.blit->src_h}, + 0, GL_NONE); } last_w = vid.blit->src_w; @@ -2053,16 +2018,7 @@ void PLAT_GL_Swap() { &(Shader){.srcw = last_w, .srch = last_h, .texw = last_w, .texh = last_h}, 0, GL_NONE ); - } else { - runShaderPass( - pixellate_texture, - g_shader_default, - NULL, - dst_rect.x, dst_rect.y, dst_rect.w, dst_rect.h, - &(Shader){.srcw = last_w, .srch = last_h, .texw = last_w, .texh = last_h}, - 0, GL_NONE - ); - } + } if (effect_tex) { runShaderPass( From 7e22ae2fb0a90d03a3fc960c4b499dc245f9d44a Mon Sep 17 00:00:00 2001 From: ro8inmorgan Date: Wed, 14 May 2025 12:58:53 +0200 Subject: [PATCH 3/3] ff --- workspace/all/common/defines.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspace/all/common/defines.h b/workspace/all/common/defines.h index 933716f53..453e6dcea 100644 --- a/workspace/all/common/defines.h +++ b/workspace/all/common/defines.h @@ -78,7 +78,7 @@ #define MAX_LIGHTS 0 #endif #ifndef MAXSHADERS -#define MAXSHADERS 4 +#define MAXSHADERS 3 #endif enum {