summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author W. M. Martinez <anikom15@gmail.com>2018-09-14 19:00:52 -0700
committer W. M. Martinez <anikom15@gmail.com>2018-09-14 19:00:52 -0700
commitb4888aabc09a9a83ee2ae0e7e5a84d1a3a8bf2c6 (patch)
tree34ed95134e3eef5d387a97447c84b92929f4cc75
parente04d8520348ad845675539c08e10a1a628f6fb1a (diff)
Port scanline modification to BGFX
-rw-r--r--bgfx/chains/hlsl.json32
-rw-r--r--bgfx/effects/hlsl/post.json11
-rw-r--r--bgfx/effects/hlsl/scanline.json44
-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_post.binbin3737 -> 2411 bytes
-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_scanline.binbin0 -> 2091 bytes
-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_scanline.binbin0 -> 577 bytes
-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_post.binbin3374 -> 2112 bytes
-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_scanline.binbin0 -> 2024 bytes
-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_scanline.binbin0 -> 320 bytes
-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_post.binbin5701 -> 3516 bytes
-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_scanline.binbin0 -> 3094 bytes
-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_scanline.binbin0 -> 419 bytes
-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_post.binbin5417 -> 3333 bytes
-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_scanline.binbin0 -> 2936 bytes
-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_scanline.binbin0 -> 377 bytes
-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_post.binbin6251 -> 4020 bytes
-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_scanline.binbin0 -> 3503 bytes
-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_scanline.binbin0 -> 778 bytes
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc39
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc101
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc14
21 files changed, 184 insertions, 57 deletions
diff --git a/bgfx/chains/hlsl.json b/bgfx/chains/hlsl.json
index a3499dc7283..378102444fe 100644
--- a/bgfx/chains/hlsl.json
+++ b/bgfx/chains/hlsl.json
@@ -390,6 +390,29 @@
],
"output": "internal"
},
+ {
+ "effect": "hlsl/scanline",
+ "name": "Scanline Pass",
+ "disablewhen": [
+ { "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
+ { "type": "slider", "condition": "equal", "combine": "or", "name": "scanline_alpha", "value": 0 }
+ ],
+ "uniforms": [
+ { "uniform": "u_scanline_alpha", "slider": "scanline_alpha" },
+ { "uniform": "u_scanline_scale", "slider": "scanline_scale" },
+ { "uniform": "u_scanline_bright_scale", "slider": "scanline_bright_scale" },
+ { "uniform": "u_scanline_bright_offset", "slider": "scanline_bright_offset" },
+ { "uniform": "u_scanline_height", "slider": "scanline_height" },
+ { "uniform": "u_scanline_variation", "slider": "scanline_variation" },
+ { "uniform": "u_scanline_jitter", "slider": "scanline_jitter_amount" },
+ { "uniform": "u_jitter_amount", "parameter": "jitter" },
+ { "uniform": "u_time", "parameter": "time" }
+ ],
+ "input": [
+ { "sampler": "s_tex", "target": "internal" }
+ ],
+ "output": "internal"
+ },
{ "effect": "hlsl/defocus",
"name": "Defocus Pass",
"disablewhen": [
@@ -440,19 +463,12 @@
"name": "Non-Bloom Post Pass",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
- { "type": "slider", "condition": "equal", "combine": "and", "name": "scanline_alpha", "value": 0.0 },
{ "type": "slider", "condition": "equal", "combine": "and", "name": "shadow_alpha", "value": 0.0 },
{ "type": "slider", "condition": "equal", "combine": "and", "name": "humbar_alpha", "value": 0.0 },
{ "type": "slider", "condition": "equal", "combine": "and", "name": "floor", "value": [ 0, 0, 0 ] },
{ "type": "slider", "condition": "equal", "combine": "and", "name": "power", "value": [ 0, 0, 0 ] }
],
"uniforms": [
- { "uniform": "u_scanline_alpha", "slider": "scanline_alpha" },
- { "uniform": "u_scanline_scale", "slider": "scanline_scale" },
- { "uniform": "u_scanline_bright_scale", "slider": "scanline_bright_scale" },
- { "uniform": "u_scanline_bright_offset", "slider": "scanline_bright_offset" },
- { "uniform": "u_scanline_height", "slider": "scanline_height" },
- { "uniform": "u_scanline_variation", "slider": "scanline_variation" },
{ "uniform": "u_shadow_tile_mode", "slider": "shadow_tile_mode" },
{ "uniform": "u_shadow_alpha", "slider": "shadow_alpha" },
{ "uniform": "u_shadow_count", "slider": "shadow_uv_count" },
@@ -462,8 +478,6 @@
{ "uniform": "u_humbar_hertz_rate", "slider": "humbar_hertz_rate" },
{ "uniform": "u_floor", "slider": "floor" },
{ "uniform": "u_power", "slider": "power" },
- { "uniform": "u_scanline_jitter", "slider": "scanline_jitter_amount" },
- { "uniform": "u_jitter_amount", "parameter": "jitter" },
{ "uniform": "u_time", "parameter": "time" }
],
"input": [
diff --git a/bgfx/effects/hlsl/post.json b/bgfx/effects/hlsl/post.json
index db08baa4d82..904a27fb336 100644
--- a/bgfx/effects/hlsl/post.json
+++ b/bgfx/effects/hlsl/post.json
@@ -2,7 +2,7 @@
// copyright-holders:Ryan Holtz,ImJezze
//============================================================
//
-// post.json: Scanline, hum-bar, shadow-mask, and final
+// post.json: Hum-bar, shadow-mask, and final
// color convolution shader for CRT simulation.
//
//============================================================
@@ -31,21 +31,12 @@
{ "name": "u_source_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
{ "name": "u_target_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
{ "name": "u_target_scale", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_quad_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
{ "name": "u_humbar_hertz_rate", "type": "vec4", "values": [ 0.001, 0.0, 0.0, 0.0 ] },
{ "name": "u_humbar_alpha", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
{ "name": "u_time", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
{ "name": "u_screen_scale", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
{ "name": "u_screen_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
{ "name": "u_shadow_tile_mode", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_alpha", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_bright_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_bright_offset", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_jitter", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_height", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_variation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
{ "name": "u_shadow_alpha", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
{ "name": "u_shadow_count", "type": "vec4", "values": [ 12.0, 12.0, 0.0, 0.0 ] },
{ "name": "u_shadow_uv", "type": "vec4", "values": [ 0.25, 0.25, 0.0, 0.0 ] },
diff --git a/bgfx/effects/hlsl/scanline.json b/bgfx/effects/hlsl/scanline.json
new file mode 100644
index 00000000000..7f4f188c202
--- /dev/null
+++ b/bgfx/effects/hlsl/scanline.json
@@ -0,0 +1,44 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz,ImJezze
+//============================================================
+//
+// scanline.json: Scanline shader for CRT simulation.
+//
+//============================================================
+{
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_scanline",
+ "fragment": "chains/hlsl/fs_scanline",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 0.0 ] },
+ { "name": "u_swap_xy", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_source_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
+ { "name": "u_target_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
+ { "name": "u_quad_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
+ { "name": "u_time", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_screen_scale", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_screen_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_alpha", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_bright_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_bright_offset", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_jitter", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_height", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_variation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
+ ]
+} \ No newline at end of file
diff --git a/bgfx/shaders/dx11/chains/hlsl/fs_post.bin b/bgfx/shaders/dx11/chains/hlsl/fs_post.bin
index 913cbd52afa..86f083ae517 100644
--- a/bgfx/shaders/dx11/chains/hlsl/fs_post.bin
+++ b/bgfx/shaders/dx11/chains/hlsl/fs_post.bin
Binary files differ
diff --git a/bgfx/shaders/dx11/chains/hlsl/fs_scanline.bin b/bgfx/shaders/dx11/chains/hlsl/fs_scanline.bin
new file mode 100644
index 00000000000..e51bfe7350d
--- /dev/null
+++ b/bgfx/shaders/dx11/chains/hlsl/fs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/dx11/chains/hlsl/vs_scanline.bin b/bgfx/shaders/dx11/chains/hlsl/vs_scanline.bin
new file mode 100644
index 00000000000..d97141ff5f2
--- /dev/null
+++ b/bgfx/shaders/dx11/chains/hlsl/vs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/dx9/chains/hlsl/fs_post.bin b/bgfx/shaders/dx9/chains/hlsl/fs_post.bin
index 4d6c83c7559..499b7d46a1e 100644
--- a/bgfx/shaders/dx9/chains/hlsl/fs_post.bin
+++ b/bgfx/shaders/dx9/chains/hlsl/fs_post.bin
Binary files differ
diff --git a/bgfx/shaders/dx9/chains/hlsl/fs_scanline.bin b/bgfx/shaders/dx9/chains/hlsl/fs_scanline.bin
new file mode 100644
index 00000000000..00f33632d2b
--- /dev/null
+++ b/bgfx/shaders/dx9/chains/hlsl/fs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/dx9/chains/hlsl/vs_scanline.bin b/bgfx/shaders/dx9/chains/hlsl/vs_scanline.bin
new file mode 100644
index 00000000000..923fba0a293
--- /dev/null
+++ b/bgfx/shaders/dx9/chains/hlsl/vs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/essl/chains/hlsl/fs_post.bin b/bgfx/shaders/essl/chains/hlsl/fs_post.bin
index a2beed2eb7a..cf41b694573 100644
--- a/bgfx/shaders/essl/chains/hlsl/fs_post.bin
+++ b/bgfx/shaders/essl/chains/hlsl/fs_post.bin
Binary files differ
diff --git a/bgfx/shaders/essl/chains/hlsl/fs_scanline.bin b/bgfx/shaders/essl/chains/hlsl/fs_scanline.bin
new file mode 100644
index 00000000000..6d383ca99c5
--- /dev/null
+++ b/bgfx/shaders/essl/chains/hlsl/fs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/essl/chains/hlsl/vs_scanline.bin b/bgfx/shaders/essl/chains/hlsl/vs_scanline.bin
new file mode 100644
index 00000000000..02eb754eaa3
--- /dev/null
+++ b/bgfx/shaders/essl/chains/hlsl/vs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/glsl/chains/hlsl/fs_post.bin b/bgfx/shaders/glsl/chains/hlsl/fs_post.bin
index 330fd3d7a1e..226bbd57b86 100644
--- a/bgfx/shaders/glsl/chains/hlsl/fs_post.bin
+++ b/bgfx/shaders/glsl/chains/hlsl/fs_post.bin
Binary files differ
diff --git a/bgfx/shaders/glsl/chains/hlsl/fs_scanline.bin b/bgfx/shaders/glsl/chains/hlsl/fs_scanline.bin
new file mode 100644
index 00000000000..e9ca861a2a8
--- /dev/null
+++ b/bgfx/shaders/glsl/chains/hlsl/fs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/glsl/chains/hlsl/vs_scanline.bin b/bgfx/shaders/glsl/chains/hlsl/vs_scanline.bin
new file mode 100644
index 00000000000..391ef1fda40
--- /dev/null
+++ b/bgfx/shaders/glsl/chains/hlsl/vs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/metal/chains/hlsl/fs_post.bin b/bgfx/shaders/metal/chains/hlsl/fs_post.bin
index 5695a0a7393..a7881efd77d 100644
--- a/bgfx/shaders/metal/chains/hlsl/fs_post.bin
+++ b/bgfx/shaders/metal/chains/hlsl/fs_post.bin
Binary files differ
diff --git a/bgfx/shaders/metal/chains/hlsl/fs_scanline.bin b/bgfx/shaders/metal/chains/hlsl/fs_scanline.bin
new file mode 100644
index 00000000000..c7e4065d7bf
--- /dev/null
+++ b/bgfx/shaders/metal/chains/hlsl/fs_scanline.bin
Binary files differ
diff --git a/bgfx/shaders/metal/chains/hlsl/vs_scanline.bin b/bgfx/shaders/metal/chains/hlsl/vs_scanline.bin
new file mode 100644
index 00000000000..00695b802d3
--- /dev/null
+++ b/bgfx/shaders/metal/chains/hlsl/vs_scanline.bin
Binary files differ
diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc
index beba1f1743f..4aa3719c0ab 100644
--- a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc
+++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc
@@ -13,19 +13,11 @@ uniform vec4 u_swap_xy;
uniform vec4 u_source_dims; // size of the guest machine
uniform vec4 u_target_dims;
uniform vec4 u_target_scale;
-uniform vec4 u_quad_dims;
uniform vec4 u_screen_scale;
uniform vec4 u_screen_offset;
// uniform vec4 u_back_color; // TODO
// User-supplied
-uniform vec4 u_scanline_alpha;
-uniform vec4 u_scanline_scale;
-uniform vec4 u_scanline_bright_scale;
-uniform vec4 u_scanline_bright_offset;
-uniform vec4 u_scanline_jitter;
-uniform vec4 u_scanline_height;
-uniform vec4 u_scanline_variation;
uniform vec4 u_shadow_tile_mode;
uniform vec4 u_shadow_alpha;
uniform vec4 u_shadow_count;
@@ -38,14 +30,13 @@ uniform vec4 u_floor;
// Parametric
uniform vec4 u_time; // milliseconds
-uniform vec4 u_jitter_amount;
// Samplers
SAMPLER2D(s_tex, 0);
SAMPLER2D(s_shadow, 1);
//-----------------------------------------------------------------------------
-// Scanline & Shadowmask Pixel Shader
+// Shadowmask Pixel Shader
//-----------------------------------------------------------------------------
vec2 GetAdjustedCoords(vec2 coord)
@@ -148,34 +139,6 @@ void main()
BaseColor.g = pow(BaseColor.g, u_power.g);
BaseColor.b = pow(BaseColor.b, u_power.b);
- // Scanline Simulation
- if (u_scanline_alpha.x > 0.0f)
- {
- float BrightnessOffset = (u_scanline_bright_offset.x * u_scanline_alpha.x);
- float BrightnessScale = (u_scanline_bright_scale.x * u_scanline_alpha.x) + (1.0 - u_scanline_alpha.x);
-
- float ColorBrightness = 0.299 * BaseColor.r + 0.587 * BaseColor.g + 0.114 * BaseColor.b;
-
- float ScanCoord = BaseCoord.y;
- ScanCoord += u_swap_xy.x > 0.0
- ? u_quad_dims.x <= u_source_dims.x * 2.0
- ? 0.5 / u_quad_dims.x // uncenter scanlines if the quad is less than twice the size of the source
- : 0.0
- : u_quad_dims.y <= u_source_dims.y * 2.0
- ? 0.5 / u_quad_dims.y // uncenter scanlines if the quad is less than twice the size of the source
- : 0.0;
-
- ScanCoord *= u_source_dims.y * u_scanline_scale.x * 3.1415927; // PI
-
- float ScanCoordJitter = u_scanline_jitter.x * u_jitter_amount.x * 1.5707963; // half PI
- float ScanSine = sin(ScanCoord + ScanCoordJitter);
- float ScanlineWide = u_scanline_height.x + u_scanline_variation.x * max(1.0, u_scanline_height.x) * (1.0 - ColorBrightness);
- float ScanSineScaled = pow(ScanSine * ScanSine, ScanlineWide);
- float ScanBrightness = ScanSineScaled * BrightnessScale + BrightnessOffset * BrightnessScale;
-
- BaseColor.rgb *= mix(vec3(1.0, 1.0, 1.0), vec3(ScanBrightness, ScanBrightness, ScanBrightness), u_scanline_alpha.xxx);
- }
-
// Hum Bar Simulation
if (u_humbar_alpha.x > 0.0f)
{
diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc
new file mode 100644
index 00000000000..5942c75bab6
--- /dev/null
+++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc
@@ -0,0 +1,101 @@
+$input v_color0, v_texcoord0
+
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz,ImJezze
+//-----------------------------------------------------------------------------
+// Scanline Effect
+//-----------------------------------------------------------------------------
+
+#include "common.sh"
+
+// Autos
+uniform vec4 u_swap_xy;
+uniform vec4 u_source_dims; // size of the guest machine
+uniform vec4 u_target_dims;
+uniform vec4 u_quad_dims;
+uniform vec4 u_screen_scale;
+uniform vec4 u_screen_offset;
+
+// User-supplied
+uniform vec4 u_scanline_alpha;
+uniform vec4 u_scanline_scale;
+uniform vec4 u_scanline_bright_scale;
+uniform vec4 u_scanline_bright_offset;
+uniform vec4 u_scanline_jitter;
+uniform vec4 u_scanline_height;
+uniform vec4 u_scanline_variation;
+
+// Parametric
+uniform vec4 u_time; // milliseconds
+uniform vec4 u_jitter_amount;
+
+// Samplers
+SAMPLER2D(s_tex, 0);
+SAMPLER2D(s_shadow, 1);
+
+//-----------------------------------------------------------------------------
+// Scanline Pixel Shader
+//-----------------------------------------------------------------------------
+
+vec2 GetAdjustedCoords(vec2 coord)
+{
+ // center coordinates
+ coord -= 0.5;
+
+ // apply screen scale
+ coord *= u_screen_scale.xy;
+
+ // un-center coordinates
+ coord += 0.5;
+
+ // apply screen offset
+ coord += u_screen_offset.xy;
+
+ return coord;
+}
+
+void main()
+{
+ vec2 BaseCoord = GetAdjustedCoords(v_texcoord0);
+
+ // Color
+ vec4 BaseColor = texture2D(s_tex, BaseCoord);
+
+ // Clamp
+ if (BaseCoord.x < 0.0 || BaseCoord.y < 0.0 || BaseCoord.x > 1.0 || BaseCoord.y > 1.0)
+ {
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
+ }
+ else
+ {
+ // Scanline Simulation
+ if (u_scanline_alpha.x > 0.0f)
+ {
+ float BrightnessOffset = (u_scanline_bright_offset.x * u_scanline_alpha.x);
+ float BrightnessScale = (u_scanline_bright_scale.x * u_scanline_alpha.x) + (1.0 - u_scanline_alpha.x);
+
+ float ColorBrightness = 0.299 * BaseColor.r + 0.587 * BaseColor.g + 0.114 * BaseColor.b;
+
+ float ScanCoord = BaseCoord.y;
+ ScanCoord += u_swap_xy.x > 0.0
+ ? u_quad_dims.x <= u_source_dims.x * 2.0
+ ? 0.5 / u_quad_dims.x // uncenter scanlines if the quad is less than twice the size of the source
+ : 0.0
+ : u_quad_dims.y <= u_source_dims.y * 2.0
+ ? 0.5 / u_quad_dims.y // uncenter scanlines if the quad is less than twice the size of the source
+ : 0.0;
+
+ ScanCoord *= u_source_dims.y * u_scanline_scale.x * 3.1415927; // PI
+
+ float ScanCoordJitter = u_scanline_jitter.x * u_jitter_amount.x * 1.5707963; // half PI
+ float ScanSine = sin(ScanCoord + ScanCoordJitter);
+ float ScanlineWide = u_scanline_height.x + u_scanline_variation.x * max(1.0, u_scanline_height.x) * (1.0 - ColorBrightness);
+ float ScanSineScaled = pow(ScanSine * ScanSine, ScanlineWide);
+ float ScanBrightness = ScanSineScaled * BrightnessScale + BrightnessOffset * BrightnessScale;
+
+ BaseColor.rgb *= mix(vec3(1.0, 1.0, 1.0), vec3(ScanBrightness, ScanBrightness, ScanBrightness), u_scanline_alpha.xxx);
+ }
+
+ gl_FragColor = vec4(BaseColor.rgb * v_color0.rgb, BaseColor.a);
+ }
+}
diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc
new file mode 100644
index 00000000000..405ef8feb3b
--- /dev/null
+++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc
@@ -0,0 +1,14 @@
+$input a_position, a_texcoord0, a_color0
+$output v_texcoord0, v_color0
+
+// license:BSD-3-Clause
+// copyright-holders:Dario Manesku
+
+#include "common.sh"
+
+void main()
+{
+ gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0));
+ v_texcoord0 = a_texcoord0;
+ v_color0 = a_color0;
+}