diff --git a/bgfx/chains/hlsl.json b/bgfx/chains/hlsl.json index df743cd9d7d..d9d85020bd5 100644 --- a/bgfx/chains/hlsl.json +++ b/bgfx/chains/hlsl.json @@ -40,6 +40,12 @@ "prescale": 1, "doublebuffer": true }, + { + "name": "deadend", + "mode": "guest", + "prescale": 1, + "doublebuffer": true + }, { "name": "native", "mode": "native", "prescale": 1, @@ -53,7 +59,7 @@ ], "passes": [ { "effect": "ntsc_encode", - "name": "NTSC Decode", + "name": "NTSC Encode", "disablewhen": [ { "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 }, { "type": "slider", "condition": "equal", "combine": "or", "name": "ntsc", "value": 0 } @@ -108,7 +114,25 @@ ], "output": "guest" }, - { "effect": "blit", + { "effect": "color", + "name": "Color Convolution", + "disablewhen": [ + { "type": "slider", "condition": "equal", "name": "adjustments", "value": 0 } + ], + "uniforms": [ + { "uniform": "u_red_ratios", "slider": "red_ratios" }, + { "uniform": "u_grn_ratios", "slider": "grn_ratios" }, + { "uniform": "u_blu_ratios", "slider": "blu_ratios" }, + { "uniform": "u_offset", "slider": "offset" }, + { "uniform": "u_scale", "slider": "scale" }, + { "uniform": "u_saturation", "slider": "saturation" } + ], + "input": [ + { "sampler": "DiffuseSampler", "texture": "guest" } + ], + "output": "guest" + }, + { "effect": "blit", "name": "Prescale", "input": [ { "sampler": "s_tex", "texture": "guest" } diff --git a/bgfx/shaders/dx11/fs_blit.bin b/bgfx/shaders/dx11/fs_blit.bin index a85e820871c..bcc74538c33 100644 Binary files a/bgfx/shaders/dx11/fs_blit.bin and b/bgfx/shaders/dx11/fs_blit.bin differ diff --git a/bgfx/shaders/dx11/fs_color.bin b/bgfx/shaders/dx11/fs_color.bin index 0d67b7ae49a..29925bc9dd2 100644 Binary files a/bgfx/shaders/dx11/fs_color.bin and b/bgfx/shaders/dx11/fs_color.bin differ diff --git a/bgfx/shaders/dx11/fs_deconverge.bin b/bgfx/shaders/dx11/fs_deconverge.bin index 16f2c569081..7c949f52c1d 100644 Binary files a/bgfx/shaders/dx11/fs_deconverge.bin and b/bgfx/shaders/dx11/fs_deconverge.bin differ diff --git a/bgfx/shaders/dx11/fs_gui.bin b/bgfx/shaders/dx11/fs_gui.bin index d7b1df5f758..ab00cc60da6 100644 Binary files a/bgfx/shaders/dx11/fs_gui.bin and b/bgfx/shaders/dx11/fs_gui.bin differ diff --git a/bgfx/shaders/dx11/fs_ntsc_decode.bin b/bgfx/shaders/dx11/fs_ntsc_decode.bin index 8b8c4806386..0b32595c26b 100644 Binary files a/bgfx/shaders/dx11/fs_ntsc_decode.bin and b/bgfx/shaders/dx11/fs_ntsc_decode.bin differ diff --git a/bgfx/shaders/dx11/fs_ntsc_encode.bin b/bgfx/shaders/dx11/fs_ntsc_encode.bin index 739ac01c72f..f9f9d79fcdb 100644 Binary files a/bgfx/shaders/dx11/fs_ntsc_encode.bin and b/bgfx/shaders/dx11/fs_ntsc_encode.bin differ diff --git a/bgfx/shaders/dx11/fs_phosphor.bin b/bgfx/shaders/dx11/fs_phosphor.bin index 4de9fe2d94f..bdea6c132ea 100644 Binary files a/bgfx/shaders/dx11/fs_phosphor.bin and b/bgfx/shaders/dx11/fs_phosphor.bin differ diff --git a/bgfx/shaders/dx11/fs_ratios.bin b/bgfx/shaders/dx11/fs_ratios.bin index 74aaff2e824..0c321faea93 100644 Binary files a/bgfx/shaders/dx11/fs_ratios.bin and b/bgfx/shaders/dx11/fs_ratios.bin differ diff --git a/bgfx/shaders/dx11/fs_screen.bin b/bgfx/shaders/dx11/fs_screen.bin index 27b8da9aa5f..b8102b8b1c0 100644 Binary files a/bgfx/shaders/dx11/fs_screen.bin and b/bgfx/shaders/dx11/fs_screen.bin differ diff --git a/bgfx/shaders/dx11/fs_tint.bin b/bgfx/shaders/dx11/fs_tint.bin index 3c85a877510..bae1d78d0b5 100644 Binary files a/bgfx/shaders/dx11/fs_tint.bin and b/bgfx/shaders/dx11/fs_tint.bin differ diff --git a/bgfx/shaders/dx11/vs_blit.bin b/bgfx/shaders/dx11/vs_blit.bin index c9df5a9aa19..ef289c07bb2 100644 Binary files a/bgfx/shaders/dx11/vs_blit.bin and b/bgfx/shaders/dx11/vs_blit.bin differ diff --git a/bgfx/shaders/dx11/vs_color.bin b/bgfx/shaders/dx11/vs_color.bin index f4162cb7460..1f44cbbc0c3 100644 Binary files a/bgfx/shaders/dx11/vs_color.bin and b/bgfx/shaders/dx11/vs_color.bin differ diff --git a/bgfx/shaders/dx11/vs_deconverge.bin b/bgfx/shaders/dx11/vs_deconverge.bin index 1ff405263ad..f41efa6ecc2 100644 Binary files a/bgfx/shaders/dx11/vs_deconverge.bin and b/bgfx/shaders/dx11/vs_deconverge.bin differ diff --git a/bgfx/shaders/dx11/vs_gui.bin b/bgfx/shaders/dx11/vs_gui.bin index 38b6e0ca8ba..0645a268fc4 100644 Binary files a/bgfx/shaders/dx11/vs_gui.bin and b/bgfx/shaders/dx11/vs_gui.bin differ diff --git a/bgfx/shaders/dx11/vs_ntsc_decode.bin b/bgfx/shaders/dx11/vs_ntsc_decode.bin index 523172676c5..b52ec9d374d 100644 Binary files a/bgfx/shaders/dx11/vs_ntsc_decode.bin and b/bgfx/shaders/dx11/vs_ntsc_decode.bin differ diff --git a/bgfx/shaders/dx11/vs_ntsc_encode.bin b/bgfx/shaders/dx11/vs_ntsc_encode.bin index f063fcbb7bc..cb37598ab61 100644 Binary files a/bgfx/shaders/dx11/vs_ntsc_encode.bin and b/bgfx/shaders/dx11/vs_ntsc_encode.bin differ diff --git a/bgfx/shaders/dx11/vs_phosphor.bin b/bgfx/shaders/dx11/vs_phosphor.bin index 3c73f85053e..ca2a6ee9654 100644 Binary files a/bgfx/shaders/dx11/vs_phosphor.bin and b/bgfx/shaders/dx11/vs_phosphor.bin differ diff --git a/bgfx/shaders/dx11/vs_ratios.bin b/bgfx/shaders/dx11/vs_ratios.bin index 2dfcd19c4cd..87a97456f61 100644 Binary files a/bgfx/shaders/dx11/vs_ratios.bin and b/bgfx/shaders/dx11/vs_ratios.bin differ diff --git a/bgfx/shaders/dx11/vs_screen.bin b/bgfx/shaders/dx11/vs_screen.bin index d4c1054ae31..4b5f0d0f6f2 100644 Binary files a/bgfx/shaders/dx11/vs_screen.bin and b/bgfx/shaders/dx11/vs_screen.bin differ diff --git a/bgfx/shaders/dx11/vs_tint.bin b/bgfx/shaders/dx11/vs_tint.bin index 2aa021d990d..71db63aa558 100644 Binary files a/bgfx/shaders/dx11/vs_tint.bin and b/bgfx/shaders/dx11/vs_tint.bin differ diff --git a/bgfx/shaders/dx9/fs_ntsc_decode.bin b/bgfx/shaders/dx9/fs_ntsc_decode.bin index 988dd059efa..801e212fe1c 100644 Binary files a/bgfx/shaders/dx9/fs_ntsc_decode.bin and b/bgfx/shaders/dx9/fs_ntsc_decode.bin differ diff --git a/bgfx/shaders/dx9/fs_ntsc_encode.bin b/bgfx/shaders/dx9/fs_ntsc_encode.bin index 754b52af0e4..5aff8b1d48c 100644 Binary files a/bgfx/shaders/dx9/fs_ntsc_encode.bin and b/bgfx/shaders/dx9/fs_ntsc_encode.bin differ diff --git a/bgfx/shaders/gles/fs_ntsc_decode.bin b/bgfx/shaders/gles/fs_ntsc_decode.bin index 49458ff0b80..3676644d741 100644 Binary files a/bgfx/shaders/gles/fs_ntsc_decode.bin and b/bgfx/shaders/gles/fs_ntsc_decode.bin differ diff --git a/bgfx/shaders/gles/fs_ntsc_encode.bin b/bgfx/shaders/gles/fs_ntsc_encode.bin index 0d0bdbeea37..42a30179227 100644 Binary files a/bgfx/shaders/gles/fs_ntsc_encode.bin and b/bgfx/shaders/gles/fs_ntsc_encode.bin differ diff --git a/bgfx/shaders/glsl/fs_ntsc_decode.bin b/bgfx/shaders/glsl/fs_ntsc_decode.bin index 59fdbb640ed..aab5144f780 100644 Binary files a/bgfx/shaders/glsl/fs_ntsc_decode.bin and b/bgfx/shaders/glsl/fs_ntsc_decode.bin differ diff --git a/bgfx/shaders/glsl/fs_ntsc_encode.bin b/bgfx/shaders/glsl/fs_ntsc_encode.bin index 7a11254d662..23b12243808 100644 Binary files a/bgfx/shaders/glsl/fs_ntsc_encode.bin and b/bgfx/shaders/glsl/fs_ntsc_encode.bin differ diff --git a/bgfx/shaders/metal/fs_ntsc_decode.bin b/bgfx/shaders/metal/fs_ntsc_decode.bin index 22787c6ef21..ce6bc5aab2e 100644 Binary files a/bgfx/shaders/metal/fs_ntsc_decode.bin and b/bgfx/shaders/metal/fs_ntsc_decode.bin differ diff --git a/bgfx/shaders/metal/fs_ntsc_encode.bin b/bgfx/shaders/metal/fs_ntsc_encode.bin index 179129f0e95..c41d301b780 100644 Binary files a/bgfx/shaders/metal/fs_ntsc_encode.bin and b/bgfx/shaders/metal/fs_ntsc_encode.bin differ diff --git a/src/osd/modules/render/bgfx/entryuniformreader.cpp b/src/osd/modules/render/bgfx/entryuniformreader.cpp index 8bac8399292..d1affe9ca09 100644 --- a/src/osd/modules/render/bgfx/entryuniformreader.cpp +++ b/src/osd/modules/render/bgfx/entryuniformreader.cpp @@ -22,6 +22,7 @@ bgfx_entry_uniform* entry_uniform_reader::read_from_value(const Value& value, bg std::string name = value["uniform"].GetString(); bgfx_uniform* uniform = effect->uniform(name); + assert(uniform != nullptr); if (value.HasMember("slider")) diff --git a/src/osd/modules/render/bgfx/fs_ntsc_decode.sc b/src/osd/modules/render/bgfx/fs_ntsc_decode.sc index fa40850ff58..8479377817c 100644 --- a/src/osd/modules/render/bgfx/fs_ntsc_decode.sc +++ b/src/osd/modules/render/bgfx/fs_ntsc_decode.sc @@ -31,20 +31,6 @@ SAMPLER2D(DiffuseSampler, 0); // Constants //----------------------------------------------------------------------------- -const vec4 PI = vec4(3.1415927, 3.1415927, 3.1415927, 3.1415927); -const vec4 PI2 = vec4(6.2831854, 6.2831854, 6.2831854, 6.2831854); - -const vec4 YDot = vec4(0.299, 0.587, 0.114, 0.0); -const vec4 IDot = vec4(0.595716, -0.274453, -0.321263, 0.0); -const vec4 QDot = vec4(0.211456, -0.522591, 0.311135, 0.0); - -const vec3 RDot = vec3(1.0, 0.956, 0.621); -const vec3 GDot = vec3(1.0, -0.272, -0.647); -const vec3 BDot = vec3(1.0, -1.106, 1.703); - -const vec4 OffsetX = vec4(0.0, 0.25, 0., 0.75); -const vec4 NotchOffset = vec4(0.0, 1.0, 2.0, 3.0); - void main() { vec4 BaseTexel = texture2D(DiffuseSampler, v_texcoord0.xy); @@ -68,6 +54,9 @@ void main() vec4 Fc_i_2 = Fc_i * two; vec4 Fc_q_2 = Fc_q * two; + const vec4 PI = vec4(3.1415927, 3.1415927, 3.1415927, 3.1415927); + const vec4 PI2 = vec4(6.2831854, 6.2831854, 6.2831854, 6.2831854); + vec4 W = PI2 * u_cc_value.xxxx * u_scan_time.xxxx; vec4 WoPI = W / PI; @@ -81,16 +70,15 @@ void main() vec4 Cy = v_texcoord0.yyyy; vec4 VPosition = vec4(Cy / u_screenrect.y); - vec4 i = zero; - /* for (int i = 0; i < 64; i = i + 4) */ - /* { &*/ - // float n = i - 32.0; - // vec4 n4 = vec4(n, n, n, n) + NotchOffset; - vec4 n4 = i + NotchOffset; + for (int index = 0; index < 64; index = index + 4) + { + float n = float(index); + vec4 n4 = vec4(n, n, n, n) + vec4(0.0, 1.0, 2.0, 3.0); vec4 Cx = v_texcoord0.xxxx + SourceTexelDims.xxxx * (n4 * quarter); vec4 HPosition = Cx / u_screenrect.xxxx; + // theory: What if we put white in the input of the NTSC decode shader? vec4 C = texture2D(DiffuseSampler, vec2(Cx.x, Cy.x)); vec4 T = HPosition + HOffset + VPosition * VScale; @@ -104,13 +92,20 @@ void main() vec4 SincIIn = Fc_i * PI2 * n4; vec4 SincQIn = Fc_q * PI2 * n4; + SincYIn1 = SincYIn1 == zero ? one : SincYIn1; + SincYIn2 = SincYIn2 == zero ? one : SincYIn2; + SincYIn3 = SincYIn3 == zero ? one : SincYIn3; + + SincIIn = SincIIn == zero ? one : SincIIn; + SincQIn = SincQIn == zero ? one : SincQIn; + vec4 SincY1 = SincYIn1 != zero ? sin(SincYIn1) / SincYIn1 : one; vec4 SincY2 = SincYIn2 != zero ? sin(SincYIn2) / SincYIn2 : one; vec4 SincY3 = SincYIn3 != zero ? sin(SincYIn3) / SincYIn3 : one; vec4 IdealY = (Fc_y1 * two * SincY1 - Fc_y2 * two * SincY2) + Fc_y3 * two * SincY3; vec4 IdealI = Fc_i_2 * (SincIIn != zero ? sin(SincIIn) / SincIIn : one); - vec4 IdealQ = Fc_q_2 * (SincQIn != zero ? sin(SincIIn) / SincIIn : one); + vec4 IdealQ = Fc_q_2 * (SincQIn != zero ? sin(SincQIn) / SincQIn : one); vec4 FilterY = SincKernel * IdealY; vec4 FilterI = SincKernel * IdealI; @@ -119,17 +114,18 @@ void main() YAccum = YAccum + C * FilterY; IAccum = IAccum + C * cos(WT) * FilterI; QAccum = QAccum + C * sin(WT) * FilterQ; - /* } */ - + } + vec3 YIQ = vec3( (YAccum.r + YAccum.g + YAccum.b + YAccum.a), (IAccum.r + IAccum.g + IAccum.b + IAccum.a) * 2.0, (QAccum.r + QAccum.g + QAccum.b + QAccum.a) * 2.0); vec3 RGB = vec3( - dot(YIQ, RDot), - dot(YIQ, GDot), - dot(YIQ, BDot)); + dot(YIQ, vec3(1.0, 0.956, 0.621)), + dot(YIQ, vec3(1.0, -0.272, -0.647)), + dot(YIQ, vec3(1.0, -1.106, 1.703))); + // RGB obviously contains a NaN somewhere along the line! Returns black if vec4 etc. are included, white if just vec4(1.0) gl_FragColor = vec4(RGB, BaseTexel.a) * v_color0; } diff --git a/src/osd/modules/render/bgfx/fs_ntsc_encode.sc b/src/osd/modules/render/bgfx/fs_ntsc_encode.sc index 5cf8a8ada26..5812b01a8a0 100644 --- a/src/osd/modules/render/bgfx/fs_ntsc_encode.sc +++ b/src/osd/modules/render/bgfx/fs_ntsc_encode.sc @@ -27,27 +27,16 @@ SAMPLER2D(DiffuseSampler, 0); // Constants //----------------------------------------------------------------------------- -const vec4 PI = vec4(3.1415927, 3.1415927, 3.1415927, 3.1415927); -const vec4 PI2 = vec4(6.2831854, 6.2831854, 6.2831854, 6.2831854); - -const vec4 YDot = vec4(0.299, 0.587, 0.114, 0.0); -const vec4 IDot = vec4(0.595716, -0.274453, -0.321263, 0.0); -const vec4 QDot = vec4(0.211456, -0.522591, 0.311135, 0.0); - -const vec4 OffsetX = vec4(0.0, 0.25, 0., 0.75); -const vec4 NotchOffset = vec4(0.0, 1.0, 2.0, 3.0); - void main() { - vec2 SourceTexelDims = u_texsize.xy; vec2 SourceRes = (1.0 / u_texsize.xy) * u_screenrect.xy; vec2 PValueSourceTexel = vec2(u_p_value.x, 0.0) * u_texsize.xy; - vec2 C0 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.x, 0.0); - vec2 C1 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.y, 0.0); - vec2 C2 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.z, 0.0); - vec2 C3 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.w, 0.0); + vec2 C0 = v_texcoord0 + PValueSourceTexel * vec2(0.0, 0.0); + vec2 C1 = v_texcoord0 + PValueSourceTexel * vec2(0.25, 0.0); + vec2 C2 = v_texcoord0 + PValueSourceTexel * vec2(0.5, 0.0); + vec2 C3 = v_texcoord0 + PValueSourceTexel * vec2(0.75, 0.0); vec4 Cx = vec4(C0.x, C1.x, C2.x, C3.x); vec4 Cy = vec4(C0.y, C1.y, C2.y, C3.y); vec4 Texel0 = texture2D(DiffuseSampler, C0); @@ -55,13 +44,18 @@ void main() vec4 Texel2 = texture2D(DiffuseSampler, C2); vec4 Texel3 = texture2D(DiffuseSampler, C3); - vec4 HPosition = Cx / u_screenrect.x; - vec4 VPosition = Cy / u_screenrect.y; + vec4 HPosition = Cx / u_screenrect.xxxx; + vec4 VPosition = Cy / u_screenrect.yyyy; + const vec4 YDot = vec4(0.299, 0.587, 0.114, 0.0); + const vec4 IDot = vec4(0.595716, -0.274453, -0.321263, 0.0); + const vec4 QDot = vec4(0.211456, -0.522591, 0.311135, 0.0); vec4 Y = vec4(dot(Texel0, YDot), dot(Texel1, YDot), dot(Texel2, YDot), dot(Texel3, YDot)); vec4 I = vec4(dot(Texel0, IDot), dot(Texel1, IDot), dot(Texel2, IDot), dot(Texel3, IDot)); vec4 Q = vec4(dot(Texel0, QDot), dot(Texel1, QDot), dot(Texel2, QDot), dot(Texel3, QDot)); + const vec4 PI = vec4(3.1415927, 3.1415927, 3.1415927, 3.1415927); + const vec4 PI2 = vec4(6.2831854, 6.2831854, 6.2831854, 6.2831854); vec4 W = PI2 * u_cc_value.xxxx * u_scan_time.xxxx; vec4 WoPI = W / PI;