[retro-gtk] Add GLSL video filter resources



commit 91587dc8fee2ffa396773831919f9d57e428530a
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Sun Oct 15 09:36:05 2017 +0200

    Add GLSL video filter resources
    
    These will be used in the following commits to render the video output
    with shaders rather than by blitting it on the screen.

 retro-gtk/glsl-filters/bicubic.filter |    5 ++
 retro-gtk/glsl-filters/bicubic.fs     |   90 +++++++++++++++++++++++++++++++++
 retro-gtk/glsl-filters/sharp.filter   |    7 +++
 retro-gtk/glsl-filters/sharp.fs       |   13 +++++
 retro-gtk/glsl-filters/sharp.vs       |   20 +++++++
 retro-gtk/meson.build                 |    9 +++
 retro-gtk/retro-gtk.gresource.xml     |   10 ++++
 7 files changed, 154 insertions(+), 0 deletions(-)
---
diff --git a/retro-gtk/glsl-filters/bicubic.filter b/retro-gtk/glsl-filters/bicubic.filter
new file mode 100644
index 0000000..5ace147
--- /dev/null
+++ b/retro-gtk/glsl-filters/bicubic.filter
@@ -0,0 +1,5 @@
+[GLSL Filter]
+Fragment=bicubic.fs
+Authors=hunterk;
+License=GPL-2.0+;
+URL=https://github.com/hizzlekizzle/quark-shaders/tree/master/Bicubic.shader
diff --git a/retro-gtk/glsl-filters/bicubic.fs b/retro-gtk/glsl-filters/bicubic.fs
new file mode 100644
index 0000000..8024039
--- /dev/null
+++ b/retro-gtk/glsl-filters/bicubic.fs
@@ -0,0 +1,90 @@
+#version 150
+
+uniform sampler2D source[];
+uniform vec4 sourceSize[];
+
+in Vertex {
+  vec2 texCoord;
+};
+
+               out vec4 fragColor;
+
+       float weight(float x)
+       {
+           float ax = abs(x);
+           // Mitchel-Netravali coefficients.
+           // Best psychovisual result.
+           const float B = 1.0 / 3.0;
+           const float C = 1.0 / 3.0;
+
+           if (ax < 1.0) {
+               return (
+                   pow(x, 2.0) * (
+                       (12.0 - 9.0 * B - 6.0 * C) * ax +
+                       (-18.0 + 12.0 * B + 6.0 * C)
+                   ) +
+                   (6.0 - 2.0 * B)
+               ) / 6.0;
+
+           } else if ((ax >= 1.0) && (ax < 2.0)) {
+               return (
+                   pow(x, 2.0) * (
+                       (-B - 6.0 * C) * ax +
+                       (6.0 * B + 30.0 * C)
+                   ) +
+                   (-12.0 * B - 48.0 * C) * ax +
+                   (8.0 * B + 24.0 * C)
+               ) / 6.0;
+
+           } else {
+               return 0.0;
+           }
+       }
+
+       vec4 weight4(float x)
+       {
+           return vec4(
+               weight(x + 1.0),
+               weight(x),
+               weight(1.0 - x),
+               weight(2.0 - x));
+       }
+
+       vec3 pixel(float xpos, float ypos)
+       {
+           return texture2D(source[0], vec2(xpos, ypos)).rgb;
+       }
+
+       vec3 line(float ypos, vec4 xpos, vec4 linetaps)
+       {
+           return
+               pixel(xpos.r, ypos) * linetaps.r +
+               pixel(xpos.g, ypos) * linetaps.g +
+               pixel(xpos.b, ypos) * linetaps.b +
+               pixel(xpos.a, ypos) * linetaps.a;
+       }
+
+       void main()
+       {
+           vec2 stepxy = 1.0 / sourceSize[0].xy;
+           vec2 pos = texCoord.xy + stepxy * 0.5;
+           vec2 f = fract(pos / stepxy);
+
+           vec4 linetaps   = weight4(f.x);
+           vec4 columntaps = weight4(f.y);
+
+           // make sure all taps added together is exactly 1.0, otherwise some
+           // (very small) distortion can occur
+           linetaps /= linetaps.r + linetaps.g + linetaps.b + linetaps.a;
+           columntaps /= columntaps.r + columntaps.g + columntaps.b + columntaps.a;
+
+           vec2 xystart = (-1.5 - f) * stepxy + pos;
+           vec4 xpos = vec4(
+               xystart.x,
+               xystart.x + stepxy.x,
+               xystart.x + stepxy.x * 2.0,
+               xystart.x + stepxy.x * 3.0);
+
+               fragColor.a = 1.0;
+           fragColor.rgb = line(xystart.y, xpos, linetaps) * columntaps.r + line(xystart.y + stepxy.y, xpos, 
linetaps) * columntaps.g + line(xystart.y + stepxy.y * 2.0, xpos, linetaps) * columntaps.b + line(xystart.y + 
stepxy.y * 3.0, xpos, linetaps) * columntaps.a;
+       }
diff --git a/retro-gtk/glsl-filters/sharp.filter b/retro-gtk/glsl-filters/sharp.filter
new file mode 100644
index 0000000..cb22335
--- /dev/null
+++ b/retro-gtk/glsl-filters/sharp.filter
@@ -0,0 +1,7 @@
+[GLSL Filter]
+Filter=Nearest
+Wrap=Border
+Vertex=sharp.vs
+Fragment=sharp.fs
+Authors=Adrien Plazas;
+License=GPL-3.0+;
diff --git a/retro-gtk/glsl-filters/sharp.fs b/retro-gtk/glsl-filters/sharp.fs
new file mode 100644
index 0000000..93f7013
--- /dev/null
+++ b/retro-gtk/glsl-filters/sharp.fs
@@ -0,0 +1,13 @@
+#version 150
+
+uniform sampler2D source[];
+
+in Vertex {
+  vec2 texCoord;
+};
+
+out vec4 fragColor;
+
+void main() {
+  fragColor = texture(source[0], texCoord);
+}
diff --git a/retro-gtk/glsl-filters/sharp.vs b/retro-gtk/glsl-filters/sharp.vs
new file mode 100644
index 0000000..cfe4a83
--- /dev/null
+++ b/retro-gtk/glsl-filters/sharp.vs
@@ -0,0 +1,20 @@
+#version 150 core
+
+in vec2 position;
+in vec2 texCoord;
+
+out Vertex {
+  vec2 texCoord;
+} vertexOut;
+
+uniform float relative_aspect_ratio;
+
+void main ()
+{
+  vec2 aspect_ratio = (relative_aspect_ratio > 1.0f) ?
+    vec2 (1.0 / relative_aspect_ratio, 1.0) :
+    vec2 (1.0, relative_aspect_ratio);
+
+  vertexOut.texCoord = texCoord;
+  gl_Position = vec4 (position.xy * aspect_ratio, 0.0, 1.0);
+}
diff --git a/retro-gtk/meson.build b/retro-gtk/meson.build
index 403d934..00e9486 100644
--- a/retro-gtk/meson.build
+++ b/retro-gtk/meson.build
@@ -2,7 +2,15 @@ api_version = '0.14'
 
 retro_gtk_module = 'retro-gtk-' + api_version
 
+retro_gtk_resources = gnome.compile_resources(
+  'retro_gtk_resources',
+  'retro-gtk.gresource.xml',
+  c_name: 'retro_gtk',
+  source_dir: '.',
+)
+
 retro_gtk_sources = [
+  retro_gtk_resources[0],
   'retro-cairo-display.c',
   'retro-controller.c',
   'retro-controller-codes.c',
@@ -15,6 +23,7 @@ retro_gtk_sources = [
   'retro-environment.c',
   'retro-game-info.c',
   'retro-gl-display.c',
+  'retro-glsl-filter.c',
   'retro-input.c',
   'retro-input-descriptor.c',
   'retro-keyboard-key.c',
diff --git a/retro-gtk/retro-gtk.gresource.xml b/retro-gtk/retro-gtk.gresource.xml
new file mode 100644
index 0000000..8d845ec
--- /dev/null
+++ b/retro-gtk/retro-gtk.gresource.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/Retro">
+    <file>glsl-filters/bicubic.filter</file>
+    <file>glsl-filters/bicubic.fs</file>
+    <file>glsl-filters/sharp.filter</file>
+    <file>glsl-filters/sharp.fs</file>
+    <file>glsl-filters/sharp.vs</file>
+  </gresource>
+</gresources>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]