From 4cccc0183cef3dc959500d708256d18a98a62c46 Mon Sep 17 00:00:00 2001 From: MooglyGuy Date: Sun, 24 Nov 2019 15:40:14 +0100 Subject: -bgfx: Fixed Github issues #5830 and #5956. [Ryan Holtz] --- bgfx/chains/crt-geom-deluxe.json | 1 + bgfx/chains/crt-geom.json | 1 + bgfx/chains/default.json | 1 + bgfx/chains/eagle/super-eagle.json | 1 + bgfx/chains/hqx/hq2x.json | 1 + bgfx/chains/hqx/hq3x.json | 1 + bgfx/chains/hqx/hq4x.json | 1 + bgfx/chains/lut.json | 1 + bgfx/chains/unfiltered.json | 1 + bgfx/chains/xbr/super-2xbr-3d-2p.json | 1 + bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json | 1 + bgfx/chains/xbr/super-4xbr-3d-4p.json | 1 + bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json | 1 + bgfx/chains/xbr/super-xbr-2p.json | 1 + bgfx/chains/xbr/super-xbr-3p-smoother.json | 1 + bgfx/chains/xbr/super-xbr-6p.json | 1 + bgfx/chains/xbr/super-xbr-deposterize.json | 1 + bgfx/chains/xbr/super-xbr-fast-3p.json | 1 + bgfx/chains/xbr/super-xbr-fast-6p.json | 1 + bgfx/chains/xbr/xbr-hybrid.json | 1 + bgfx/chains/xbr/xbr-lv1-noblend.json | 1 + bgfx/chains/xbr/xbr-lv2-3d.json | 1 + bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json | 1 + bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json | 1 + bgfx/chains/xbr/xbr-lv2-deposterize.json | 1 + bgfx/chains/xbr/xbr-lv2-fast.json | 1 + bgfx/chains/xbr/xbr-lv2-multipass.json | 1 + bgfx/chains/xbr/xbr-lv2-noblend.json | 1 + bgfx/chains/xbr/xbr-lv2.json | 1 + bgfx/chains/xbr/xbr-lv3-multipass.json | 1 + bgfx/chains/xbr/xbr-lv3-noblend.json | 1 + bgfx/chains/xbr/xbr-lv3.json | 1 + bgfx/chains/xbr/xbr-mlv4-dilation.json | 1 + bgfx/chains/xbr/xbr-mlv4-multipass.json | 1 + bgfx/effects/default/blit.json | 21 ------- bgfx/effects/misc/bcg_adjust.json | 26 +++++++++ bgfx/shaders/dx11/chains/misc/fs_blit_bcg.bin | Bin 0 -> 804 bytes bgfx/shaders/dx9/chains/misc/fs_blit_bcg.bin | Bin 0 -> 569 bytes bgfx/shaders/essl/chains/misc/fs_blit_bcg.bin | Bin 0 -> 830 bytes bgfx/shaders/glsl/chains/misc/fs_blit_bcg.bin | Bin 0 -> 787 bytes bgfx/shaders/metal/chains/misc/fs_blit_bcg.bin | Bin 0 -> 1059 bytes bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin | Bin 1846 -> 1794 bytes .../chains/misc/fs_bob-and-ghost-deinterlace.bin | Bin 1685 -> 1650 bytes bgfx/shaders/metal/chains/misc/fs_saturation.bin | Bin 862 -> 838 bytes .../metal/chains/misc/vs_deposterize-pass0.bin | Bin 1167 -> 1152 bytes .../metal/chains/misc/vs_deposterize-pass1.bin | Bin 1167 -> 1152 bytes bgfx/shaders/spirv/chains/misc/fs_blit.bin | Bin 846 -> 846 bytes bgfx/shaders/spirv/chains/misc/fs_blit_bcg.bin | Bin 0 -> 1992 bytes .../spirv/chains/misc/fs_blit_palette16.bin | Bin 1580 -> 1580 bytes bgfx/shaders/spirv/chains/misc/fs_blit_rgb32.bin | Bin 950 -> 950 bytes bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin | Bin 2740 -> 2740 bytes .../chains/misc/fs_bob-and-ghost-deinterlace.bin | Bin 2757 -> 2757 bytes .../spirv/chains/misc/fs_deposterize-pass0.bin | Bin 2506 -> 2506 bytes .../spirv/chains/misc/fs_deposterize-pass1.bin | Bin 2506 -> 2506 bytes bgfx/shaders/spirv/chains/misc/fs_lut.bin | Bin 1804 -> 1804 bytes bgfx/shaders/spirv/chains/misc/fs_saturation.bin | Bin 1469 -> 1469 bytes bgfx/shaders/spirv/chains/misc/vs_blit.bin | Bin 1305 -> 1305 bytes .../chains/misc/vs_bob-and-ghost-deinterlace.bin | Bin 1305 -> 1305 bytes .../spirv/chains/misc/vs_deposterize-pass0.bin | Bin 1771 -> 1771 bytes .../spirv/chains/misc/vs_deposterize-pass1.bin | Bin 1771 -> 1771 bytes bgfx/shaders/spirv/chains/misc/vs_lut.bin | Bin 1305 -> 1305 bytes bgfx/shaders/spirv/chains/misc/vs_saturation.bin | Bin 1305 -> 1305 bytes src/emu/render.cpp | 2 +- src/osd/modules/render/bgfx/chain.cpp | 7 +-- src/osd/modules/render/bgfx/chain.h | 7 ++- src/osd/modules/render/bgfx/chainentry.cpp | 30 +++++++--- src/osd/modules/render/bgfx/chainentry.h | 5 +- src/osd/modules/render/bgfx/chainentryreader.cpp | 7 ++- src/osd/modules/render/bgfx/chainmanager.cpp | 65 ++++++++++++++------- src/osd/modules/render/bgfx/chainmanager.h | 1 + src/osd/modules/render/bgfx/inputpair.cpp | 4 +- .../render/bgfx/shaders/chains/misc/fs_blit_bcg.sc | 24 ++++++++ src/osd/modules/render/bgfx/statereader.h | 6 +- src/osd/modules/render/bgfx/writereader.h | 8 +-- src/osd/modules/render/bgfxutil.cpp | 2 +- 75 files changed, 180 insertions(+), 69 deletions(-) create mode 100644 bgfx/effects/misc/bcg_adjust.json create mode 100644 bgfx/shaders/dx11/chains/misc/fs_blit_bcg.bin create mode 100644 bgfx/shaders/dx9/chains/misc/fs_blit_bcg.bin create mode 100644 bgfx/shaders/essl/chains/misc/fs_blit_bcg.bin create mode 100644 bgfx/shaders/glsl/chains/misc/fs_blit_bcg.bin create mode 100644 bgfx/shaders/metal/chains/misc/fs_blit_bcg.bin create mode 100644 bgfx/shaders/spirv/chains/misc/fs_blit_bcg.bin create mode 100644 src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_bcg.sc diff --git a/bgfx/chains/crt-geom-deluxe.json b/bgfx/chains/crt-geom-deluxe.json index 49b91437818..d71df646d7b 100644 --- a/bgfx/chains/crt-geom-deluxe.json +++ b/bgfx/chains/crt-geom-deluxe.json @@ -156,6 +156,7 @@ "passes": [ { "effect": "crt-geom/phosphor_apply", + "applytint": true, "name": "phosphor apply", "uniforms": [ { "uniform": "u_phosphor_power", "slider": "phosphor_power" }, diff --git a/bgfx/chains/crt-geom.json b/bgfx/chains/crt-geom.json index c8bc2a2e2ab..56e2210cbdb 100644 --- a/bgfx/chains/crt-geom.json +++ b/bgfx/chains/crt-geom.json @@ -108,6 +108,7 @@ "passes": [ { "effect": "crt-geom/crt-geom", + "applytint": true, "name": "CRT", "uniforms": [ { "uniform": "curvature", "slider": "curvature" }, diff --git a/bgfx/chains/default.json b/bgfx/chains/default.json index d7e31536780..b2c6aed2378 100644 --- a/bgfx/chains/default.json +++ b/bgfx/chains/default.json @@ -8,6 +8,7 @@ ], "passes": [ { "effect": "misc/blit", + "applytint": true, "name": "Copy To Filtered Texture", "input": [ { "sampler": "s_tex", "texture": "screen" } diff --git a/bgfx/chains/eagle/super-eagle.json b/bgfx/chains/eagle/super-eagle.json index 017c03b7179..fc88e38c40a 100644 --- a/bgfx/chains/eagle/super-eagle.json +++ b/bgfx/chains/eagle/super-eagle.json @@ -26,6 +26,7 @@ "passes": [ { "effect": "eagle/supereagle", + "applytint": true, "name": "Super Eagle pass", "input": [ { "sampler": "decal", "texture": "screen" }, diff --git a/bgfx/chains/hqx/hq2x.json b/bgfx/chains/hqx/hq2x.json index b206d2ea663..c60f46c1be8 100644 --- a/bgfx/chains/hqx/hq2x.json +++ b/bgfx/chains/hqx/hq2x.json @@ -43,6 +43,7 @@ "passes": [ { "effect": "hqx/hq2x", + "applytint": true, "name": "HQ2x pass", "input": [ { "sampler": "decal", "texture": "screen" }, diff --git a/bgfx/chains/hqx/hq3x.json b/bgfx/chains/hqx/hq3x.json index 0ee2e277912..3f5815cf7a4 100644 --- a/bgfx/chains/hqx/hq3x.json +++ b/bgfx/chains/hqx/hq3x.json @@ -43,6 +43,7 @@ "passes": [ { "effect": "hqx/hq3x", + "applytint": true, "name": "HQ3x pass", "input": [ { "sampler": "decal", "texture": "screen" }, diff --git a/bgfx/chains/hqx/hq4x.json b/bgfx/chains/hqx/hq4x.json index 792cc666219..17abf352797 100644 --- a/bgfx/chains/hqx/hq4x.json +++ b/bgfx/chains/hqx/hq4x.json @@ -43,6 +43,7 @@ "passes": [ { "effect": "hqx/hq4x", + "applytint": true, "name": "HQ4x pass", "input": [ { "sampler": "decal", "texture": "screen" }, diff --git a/bgfx/chains/lut.json b/bgfx/chains/lut.json index 50353b5292b..6143410f009 100644 --- a/bgfx/chains/lut.json +++ b/bgfx/chains/lut.json @@ -10,6 +10,7 @@ "passes": [ { "effect": "misc/blit", + "applytint": true, "name": "Copy To Filtered Texture", "input": [ { "sampler": "s_tex", "texture": "screen" } diff --git a/bgfx/chains/unfiltered.json b/bgfx/chains/unfiltered.json index 6a65031f349..c69bcd319b5 100644 --- a/bgfx/chains/unfiltered.json +++ b/bgfx/chains/unfiltered.json @@ -2,6 +2,7 @@ "author": "Ryan Holtz", "passes": [ { "effect": "misc/blit", + "applytint": true, "name": "Unfiltered Upscale", "input": [ { "sampler": "s_tex", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-2xbr-3d-2p.json b/bgfx/chains/xbr/super-2xbr-3d-2p.json index a196141548d..1fafe6497f1 100644 --- a/bgfx/chains/xbr/super-2xbr-3d-2p.json +++ b/bgfx/chains/xbr/super-2xbr-3d-2p.json @@ -42,6 +42,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-2xbr-3d-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json b/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json index d3e3d33d7c4..307e0b6a149 100644 --- a/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json +++ b/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json @@ -42,6 +42,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-2xbr-3d-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-4xbr-3d-4p.json b/bgfx/chains/xbr/super-4xbr-3d-4p.json index 046897b62d5..cd1fa47ff73 100644 --- a/bgfx/chains/xbr/super-4xbr-3d-4p.json +++ b/bgfx/chains/xbr/super-4xbr-3d-4p.json @@ -42,6 +42,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-4xbr-3d-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json b/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json index f3bd617258f..b3ef9004d82 100644 --- a/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json +++ b/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json @@ -42,6 +42,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-4xbr-3d-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-xbr-2p.json b/bgfx/chains/xbr/super-xbr-2p.json index cdb8c3f84a5..d4fabc092ad 100644 --- a/bgfx/chains/xbr/super-xbr-2p.json +++ b/bgfx/chains/xbr/super-xbr-2p.json @@ -49,6 +49,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-xbr-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-xbr-3p-smoother.json b/bgfx/chains/xbr/super-xbr-3p-smoother.json index 96bda7904b6..487b62059e0 100644 --- a/bgfx/chains/xbr/super-xbr-3p-smoother.json +++ b/bgfx/chains/xbr/super-xbr-3p-smoother.json @@ -49,6 +49,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-xbr-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-xbr-6p.json b/bgfx/chains/xbr/super-xbr-6p.json index 4f5c69369d7..3c3a867df88 100644 --- a/bgfx/chains/xbr/super-xbr-6p.json +++ b/bgfx/chains/xbr/super-xbr-6p.json @@ -63,6 +63,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-xbr-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-xbr-deposterize.json b/bgfx/chains/xbr/super-xbr-deposterize.json index 8eac3770465..4a1ec028bbf 100644 --- a/bgfx/chains/xbr/super-xbr-deposterize.json +++ b/bgfx/chains/xbr/super-xbr-deposterize.json @@ -48,6 +48,7 @@ "passes": [ { "effect": "misc/deposterize-pass0", + "applytint": true, "name": "Deposterize, Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-xbr-fast-3p.json b/bgfx/chains/xbr/super-xbr-fast-3p.json index f0d0411acc0..92d067c67b8 100644 --- a/bgfx/chains/xbr/super-xbr-fast-3p.json +++ b/bgfx/chains/xbr/super-xbr-fast-3p.json @@ -42,6 +42,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-xbr-fast-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/super-xbr-fast-6p.json b/bgfx/chains/xbr/super-xbr-fast-6p.json index 6d19e28f9b2..bd97d17a496 100644 --- a/bgfx/chains/xbr/super-xbr-fast-6p.json +++ b/bgfx/chains/xbr/super-xbr-fast-6p.json @@ -55,6 +55,7 @@ "passes": [ { "effect": "xbr/super-xbr/super-xbr-fast-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "s0", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-hybrid.json b/bgfx/chains/xbr/xbr-hybrid.json index 4529f829423..9c187c7cd7c 100644 --- a/bgfx/chains/xbr/xbr-hybrid.json +++ b/bgfx/chains/xbr/xbr-hybrid.json @@ -22,6 +22,7 @@ "passes": [ { "effect": "xbr/xbr-hybrid/2xbr-hybrid-v4b", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv1-noblend.json b/bgfx/chains/xbr/xbr-lv1-noblend.json index f5353a0b6b6..b350a3bf279 100644 --- a/bgfx/chains/xbr/xbr-lv1-noblend.json +++ b/bgfx/chains/xbr/xbr-lv1-noblend.json @@ -32,6 +32,7 @@ "passes": [ { "effect": "xbr/xbr-lv1-noblend", + "applytint": true, "name": "Main Pass", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2-3d.json b/bgfx/chains/xbr/xbr-lv2-3d.json index accc199ee3d..74bc2d4c5b4 100644 --- a/bgfx/chains/xbr/xbr-lv2-3d.json +++ b/bgfx/chains/xbr/xbr-lv2-3d.json @@ -32,6 +32,7 @@ "passes": [ { "effect": "xbr/xbr-lv2-3d", + "applytint": true, "name": "Main Pass", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json b/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json index 772703ec9eb..a4fcbdcb951 100644 --- a/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json +++ b/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json @@ -41,6 +41,7 @@ "passes": [ { "effect": "xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json b/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json index d37d687f7a0..03d9acd7f0d 100644 --- a/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json +++ b/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json @@ -21,6 +21,7 @@ "passes": [ { "effect": "xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2-deposterize.json b/bgfx/chains/xbr/xbr-lv2-deposterize.json index 38b6fabd501..7c5099960fb 100644 --- a/bgfx/chains/xbr/xbr-lv2-deposterize.json +++ b/bgfx/chains/xbr/xbr-lv2-deposterize.json @@ -15,6 +15,7 @@ "passes": [ { "effect": "misc/deposterize-pass0", + "applytint": true, "name": "Deposterize, Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2-fast.json b/bgfx/chains/xbr/xbr-lv2-fast.json index dee37b63f50..ad39d50c046 100644 --- a/bgfx/chains/xbr/xbr-lv2-fast.json +++ b/bgfx/chains/xbr/xbr-lv2-fast.json @@ -32,6 +32,7 @@ "passes": [ { "effect": "xbr/xbr-lv2-fast", + "applytint": true, "name": "Main Pass", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2-multipass.json b/bgfx/chains/xbr/xbr-lv2-multipass.json index 50a46de3287..64e500112b3 100644 --- a/bgfx/chains/xbr/xbr-lv2-multipass.json +++ b/bgfx/chains/xbr/xbr-lv2-multipass.json @@ -42,6 +42,7 @@ "passes": [ { "effect": "xbr/xbr-lv2-multipass/xbr-lv2-c-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2-noblend.json b/bgfx/chains/xbr/xbr-lv2-noblend.json index 6469df993c5..d83225eea28 100644 --- a/bgfx/chains/xbr/xbr-lv2-noblend.json +++ b/bgfx/chains/xbr/xbr-lv2-noblend.json @@ -32,6 +32,7 @@ "passes": [ { "effect": "xbr/xbr-lv2-noblend", + "applytint": true, "name": "Main Pass", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv2.json b/bgfx/chains/xbr/xbr-lv2.json index fbcda45917d..6b098b5cec9 100644 --- a/bgfx/chains/xbr/xbr-lv2.json +++ b/bgfx/chains/xbr/xbr-lv2.json @@ -32,6 +32,7 @@ "passes": [ { "effect": "xbr/xbr-lv2", + "applytint": true, "name": "Main Pass", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv3-multipass.json b/bgfx/chains/xbr/xbr-lv3-multipass.json index 801ffff34da..18aed86e084 100644 --- a/bgfx/chains/xbr/xbr-lv3-multipass.json +++ b/bgfx/chains/xbr/xbr-lv3-multipass.json @@ -42,6 +42,7 @@ "passes": [ { "effect": "xbr/xbr-lv3-multipass/xbr-lv3-pass0", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv3-noblend.json b/bgfx/chains/xbr/xbr-lv3-noblend.json index eedfab7217d..37e006885d5 100644 --- a/bgfx/chains/xbr/xbr-lv3-noblend.json +++ b/bgfx/chains/xbr/xbr-lv3-noblend.json @@ -32,6 +32,7 @@ "passes": [ { "effect": "xbr/xbr-lv3-noblend", + "applytint": true, "name": "Main Pass", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-lv3.json b/bgfx/chains/xbr/xbr-lv3.json index 6d6046e9712..ca4866bee37 100644 --- a/bgfx/chains/xbr/xbr-lv3.json +++ b/bgfx/chains/xbr/xbr-lv3.json @@ -32,6 +32,7 @@ "passes": [ { "effect": "xbr/xbr-lv3", + "applytint": true, "name": "Main Pass", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-mlv4-dilation.json b/bgfx/chains/xbr/xbr-mlv4-dilation.json index a3dfd50e912..e0a55017754 100644 --- a/bgfx/chains/xbr/xbr-mlv4-dilation.json +++ b/bgfx/chains/xbr/xbr-mlv4-dilation.json @@ -56,6 +56,7 @@ "passes": [ { "effect": "xbr/xbr-mlv4-multipass/xbr-mlv4-pass1", + "applytint": true, "name": "Pass 1", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/chains/xbr/xbr-mlv4-multipass.json b/bgfx/chains/xbr/xbr-mlv4-multipass.json index decb4db3ec2..010a5f99250 100644 --- a/bgfx/chains/xbr/xbr-mlv4-multipass.json +++ b/bgfx/chains/xbr/xbr-mlv4-multipass.json @@ -49,6 +49,7 @@ "passes": [ { "effect": "xbr/xbr-mlv4-multipass/xbr-mlv4-pass1", + "applytint": true, "name": "Pass 0", "input": [ { "sampler": "decal", "texture": "screen" } diff --git a/bgfx/effects/default/blit.json b/bgfx/effects/default/blit.json index ed957e812b3..a3c21f4c964 100644 --- a/bgfx/effects/default/blit.json +++ b/bgfx/effects/default/blit.json @@ -6,27 +6,6 @@ // //============================================================ { - // blend (required): The blend state for this effect. - "blend": { - // equation (optional): What equation to perform on the source and destination blend values. - // values: "add", "sub", "revSub", "min", "max" - // default: "add" - // - // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub" - "equation": "add", - - // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel. - // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha" - // defaults (srcColor, srcAlpha): "1" - // defaults (dstColor, dstAlpha): "0" - // - // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha" - "srcColor": "srcalpha", - "dstColor": "1-srcalpha", - "srcAlpha": "srcalpha", - "dstAlpha": "1-srcalpha" - }, - // depth (required): The depth state for this effect. "depth": { // function (optional): The depth function to use when drawing. diff --git a/bgfx/effects/misc/bcg_adjust.json b/bgfx/effects/misc/bcg_adjust.json new file mode 100644 index 00000000000..545910e5224 --- /dev/null +++ b/bgfx/effects/misc/bcg_adjust.json @@ -0,0 +1,26 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//=============================================================== +// +// bcg_adjust.json: Brightness/Contrast/Gamma adjustment. +// +//=============================================================== +{ + "blend": { + "equation": "add", + "srcColor": "srcalpha", + "dstColor": "1-srcalpha", + "srcAlpha": "srcalpha", + "dstAlpha": "1-srcalpha" + }, + "depth": { "function": "always", "writeenable": false }, + "cull": { "mode": "none" }, + "write": { "rgb": true, "alpha": true }, + "vertex": "chains/misc/vs_blit", + "fragment": "chains/misc/fs_blit_bcg", + "uniforms": [ + { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, + { "name": "s_pal", "type": "int", "values": [ 1.0 ] }, + { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_bcg.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_bcg.bin new file mode 100644 index 00000000000..b1c9e92a142 Binary files /dev/null and b/bgfx/shaders/dx11/chains/misc/fs_blit_bcg.bin differ diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_bcg.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_bcg.bin new file mode 100644 index 00000000000..34c03c8626d Binary files /dev/null and b/bgfx/shaders/dx9/chains/misc/fs_blit_bcg.bin differ diff --git a/bgfx/shaders/essl/chains/misc/fs_blit_bcg.bin b/bgfx/shaders/essl/chains/misc/fs_blit_bcg.bin new file mode 100644 index 00000000000..0b3f68af136 Binary files /dev/null and b/bgfx/shaders/essl/chains/misc/fs_blit_bcg.bin differ diff --git a/bgfx/shaders/glsl/chains/misc/fs_blit_bcg.bin b/bgfx/shaders/glsl/chains/misc/fs_blit_bcg.bin new file mode 100644 index 00000000000..6d501412a01 Binary files /dev/null and b/bgfx/shaders/glsl/chains/misc/fs_blit_bcg.bin differ diff --git a/bgfx/shaders/metal/chains/misc/fs_blit_bcg.bin b/bgfx/shaders/metal/chains/misc/fs_blit_bcg.bin new file mode 100644 index 00000000000..fa0181d4b98 Binary files /dev/null and b/bgfx/shaders/metal/chains/misc/fs_blit_bcg.bin differ diff --git a/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin index cd086562e78..5a3347b9461 100644 Binary files a/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin and b/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin differ diff --git a/bgfx/shaders/metal/chains/misc/fs_bob-and-ghost-deinterlace.bin b/bgfx/shaders/metal/chains/misc/fs_bob-and-ghost-deinterlace.bin index 4890df57e53..1a8c2b61c46 100644 Binary files a/bgfx/shaders/metal/chains/misc/fs_bob-and-ghost-deinterlace.bin and b/bgfx/shaders/metal/chains/misc/fs_bob-and-ghost-deinterlace.bin differ diff --git a/bgfx/shaders/metal/chains/misc/fs_saturation.bin b/bgfx/shaders/metal/chains/misc/fs_saturation.bin index cc5e1c52b64..b0f748aaa6e 100644 Binary files a/bgfx/shaders/metal/chains/misc/fs_saturation.bin and b/bgfx/shaders/metal/chains/misc/fs_saturation.bin differ diff --git a/bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.bin b/bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.bin index 1d21506a0b8..58de2c17249 100644 Binary files a/bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.bin and b/bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.bin differ diff --git a/bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.bin b/bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.bin index 877f0f3321c..95798b897d1 100644 Binary files a/bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.bin and b/bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit.bin b/bgfx/shaders/spirv/chains/misc/fs_blit.bin index 4d71b00e1f3..a08fb70c7e6 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_blit.bin and b/bgfx/shaders/spirv/chains/misc/fs_blit.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_bcg.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_bcg.bin new file mode 100644 index 00000000000..beed088c3bd Binary files /dev/null and b/bgfx/shaders/spirv/chains/misc/fs_blit_bcg.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin index 0de699278db..604197ef811 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin and b/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_rgb32.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_rgb32.bin index bd7bc7bb3ab..d602784f416 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_blit_rgb32.bin and b/bgfx/shaders/spirv/chains/misc/fs_blit_rgb32.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin index 4d4e3a64454..d939846fb34 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin and b/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_bob-and-ghost-deinterlace.bin b/bgfx/shaders/spirv/chains/misc/fs_bob-and-ghost-deinterlace.bin index 5791486e270..5579239421c 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_bob-and-ghost-deinterlace.bin and b/bgfx/shaders/spirv/chains/misc/fs_bob-and-ghost-deinterlace.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass0.bin b/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass0.bin index 0e2efcb82ca..b3f2533ce25 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass0.bin and b/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass0.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass1.bin b/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass1.bin index f287855f505..30c3a3f6b20 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass1.bin and b/bgfx/shaders/spirv/chains/misc/fs_deposterize-pass1.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_lut.bin b/bgfx/shaders/spirv/chains/misc/fs_lut.bin index 15bd5b1e8d6..2a046164fd9 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_lut.bin and b/bgfx/shaders/spirv/chains/misc/fs_lut.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/fs_saturation.bin b/bgfx/shaders/spirv/chains/misc/fs_saturation.bin index 0d1a86a73d4..6c9449ed085 100644 Binary files a/bgfx/shaders/spirv/chains/misc/fs_saturation.bin and b/bgfx/shaders/spirv/chains/misc/fs_saturation.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/vs_blit.bin b/bgfx/shaders/spirv/chains/misc/vs_blit.bin index 49f68528d2c..7d21cea1f97 100644 Binary files a/bgfx/shaders/spirv/chains/misc/vs_blit.bin and b/bgfx/shaders/spirv/chains/misc/vs_blit.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/vs_bob-and-ghost-deinterlace.bin b/bgfx/shaders/spirv/chains/misc/vs_bob-and-ghost-deinterlace.bin index 49f68528d2c..7d21cea1f97 100644 Binary files a/bgfx/shaders/spirv/chains/misc/vs_bob-and-ghost-deinterlace.bin and b/bgfx/shaders/spirv/chains/misc/vs_bob-and-ghost-deinterlace.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass0.bin b/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass0.bin index 626720b9f25..e0672497f82 100644 Binary files a/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass0.bin and b/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass0.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass1.bin b/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass1.bin index 07a53c4c599..4756202c8e0 100644 Binary files a/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass1.bin and b/bgfx/shaders/spirv/chains/misc/vs_deposterize-pass1.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/vs_lut.bin b/bgfx/shaders/spirv/chains/misc/vs_lut.bin index 49f68528d2c..7d21cea1f97 100644 Binary files a/bgfx/shaders/spirv/chains/misc/vs_lut.bin and b/bgfx/shaders/spirv/chains/misc/vs_lut.bin differ diff --git a/bgfx/shaders/spirv/chains/misc/vs_saturation.bin b/bgfx/shaders/spirv/chains/misc/vs_saturation.bin index 49f68528d2c..7d21cea1f97 100644 Binary files a/bgfx/shaders/spirv/chains/misc/vs_saturation.bin and b/bgfx/shaders/spirv/chains/misc/vs_saturation.bin differ diff --git a/src/emu/render.cpp b/src/emu/render.cpp index 55340803345..f20650fb4be 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -697,7 +697,7 @@ const rgb_t *render_container::bcg_lookup_table(int texformat, u32 &out_length, case TEXFORMAT_RGB32: case TEXFORMAT_ARGB32: case TEXFORMAT_YUY16: - out_length = 256; + out_length = ARRAY_LENGTH(m_bcglookup256); return m_bcglookup256; default: diff --git a/src/osd/modules/render/bgfx/chain.cpp b/src/osd/modules/render/bgfx/chain.cpp index 940bf85d81d..a8f8e895b7b 100644 --- a/src/osd/modules/render/bgfx/chain.cpp +++ b/src/osd/modules/render/bgfx/chain.cpp @@ -143,14 +143,14 @@ uint32_t bgfx_chain::applicable_passes() return applicable_passes; } -void bgfx_chain::prepend_converter(bgfx_effect *effect, chain_manager &chains) +void bgfx_chain::insert_effect(uint32_t index, bgfx_effect *effect, std::string name, std::string source, chain_manager &chains) { clear_state *clear = new clear_state(BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH | BGFX_CLEAR_STENCIL, 0, 1.0f, 0); std::vector suppressors; std::vector inputs; std::vector available_textures; - inputs.push_back(new bgfx_input_pair(0, "s_tex", "source", available_textures, "", chains, m_screen_index)); + inputs.push_back(new bgfx_input_pair(0, "s_tex", source, available_textures, "", chains, m_screen_index)); inputs.push_back(new bgfx_input_pair(1, "s_pal", "palette", available_textures, "", chains, m_screen_index)); std::vector uniforms; @@ -163,8 +163,7 @@ void bgfx_chain::prepend_converter(bgfx_effect *effect, chain_manager &chains) uniforms.push_back(new bgfx_value_uniform(new bgfx_uniform("u_inv_tex_size0", bgfx::UniformType::Vec4), values, 4)); uniforms.push_back(new bgfx_value_uniform(new bgfx_uniform("u_inv_tex_size1", bgfx::UniformType::Vec4), values, 4)); - m_entries.insert(m_entries.begin(), new bgfx_chain_entry("XXconvert", effect, clear, suppressors, inputs, uniforms, m_targets, "screen")); - m_has_converter = true; + m_entries.insert(m_entries.begin() + index, new bgfx_chain_entry(name, effect, clear, suppressors, inputs, uniforms, m_targets, "screen", false)); const uint32_t screen_width = chains.targets().width(TARGET_STYLE_GUEST, m_screen_index); const uint32_t screen_height = chains.targets().height(TARGET_STYLE_GUEST, m_screen_index); diff --git a/src/osd/modules/render/bgfx/chain.h b/src/osd/modules/render/bgfx/chain.h index 856e9ae1fa3..6faf8634e8b 100644 --- a/src/osd/modules/render/bgfx/chain.h +++ b/src/osd/modules/render/bgfx/chain.h @@ -39,8 +39,12 @@ public: uint32_t applicable_passes(); bool transform() const { return m_transform; } bool has_converter() const { return m_has_converter; } + bool has_adjuster() const { return m_has_adjuster; } - void prepend_converter(bgfx_effect *effect, chain_manager &chains); + // Setters + void set_has_converter(bool has_converter) { m_has_converter = has_converter; } + void set_has_adjuster(bool has_adjuster) { m_has_adjuster = has_adjuster; } + void insert_effect(uint32_t index, bgfx_effect *effect, std::string name, std::string source, chain_manager &chains); private: std::string m_name; @@ -56,6 +60,7 @@ private: int64_t m_current_time; uint32_t m_screen_index; bool m_has_converter; + bool m_has_adjuster; }; #endif // __DRAWBGFX_CHAIN__ diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp index 7d25785ab64..8f8eedc1214 100644 --- a/src/osd/modules/render/bgfx/chainentry.cpp +++ b/src/osd/modules/render/bgfx/chainentry.cpp @@ -13,6 +13,7 @@ #include #include +#include #include "chainmanager.h" #include "chainentry.h" @@ -29,7 +30,7 @@ #include "render.h" -bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, clear_state* clear, std::vector suppressors, std::vector inputs, std::vector uniforms, target_manager& targets, std::string output) +bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, clear_state* clear, std::vector suppressors, std::vector inputs, std::vector uniforms, target_manager& targets, std::string output, bool apply_tint) : m_name(name) , m_effect(effect) , m_clear(clear) @@ -38,6 +39,7 @@ bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, clear_ , m_uniforms(uniforms) , m_targets(targets) , m_output(output) + , m_apply_tint(apply_tint) { } @@ -68,8 +70,18 @@ void bgfx_chain_entry::submit(int view, chain_manager::screen_prim &prim, textur input->bind(m_effect, screen); } + uint32_t tint = 0xffffffff; + if (m_apply_tint) + { + const uint8_t a = (uint8_t)std::round(prim.m_prim->color.a * 255); + const uint8_t r = (uint8_t)std::round(prim.m_prim->color.r * 255); + const uint8_t g = (uint8_t)std::round(prim.m_prim->color.g * 255); + const uint8_t b = (uint8_t)std::round(prim.m_prim->color.b * 255); + tint = (a << 24) | (r << 16) | (g << 8) | b; + } + bgfx::TransientVertexBuffer buffer; - put_screen_buffer(prim.m_screen_width, prim.m_screen_height, &buffer); + put_screen_buffer(prim.m_screen_width, prim.m_screen_height, tint, &buffer); bgfx::setVertexBuffer(0, &buffer); setup_auto_uniforms(prim, textures, screen_count, screen_width, screen_height, screen_scale_x, screen_scale_y, screen_offset_x, screen_offset_y, rotation_type, swap_xy, screen); @@ -268,7 +280,7 @@ bool bgfx_chain_entry::setup_view(int view, uint16_t screen_width, uint16_t scre return true; } -void bgfx_chain_entry::put_screen_buffer(uint16_t screen_width, uint16_t screen_height, bgfx::TransientVertexBuffer* buffer) const +void bgfx_chain_entry::put_screen_buffer(uint16_t screen_width, uint16_t screen_height, uint32_t screen_tint, bgfx::TransientVertexBuffer* buffer) const { if (6 == bgfx::getAvailTransientVertexBuffer(6, ScreenVertex::ms_decl)) { @@ -304,42 +316,42 @@ void bgfx_chain_entry::put_screen_buffer(uint16_t screen_width, uint16_t screen_ vertex[0].m_x = x[0]; vertex[0].m_y = y[0]; vertex[0].m_z = 0; - vertex[0].m_rgba = 0xffffffff; + vertex[0].m_rgba = screen_tint; vertex[0].m_u = u[0]; vertex[0].m_v = v[0]; vertex[1].m_x = x[1]; vertex[1].m_y = y[1]; vertex[1].m_z = 0; - vertex[1].m_rgba = 0xffffffff; + vertex[1].m_rgba = screen_tint; vertex[1].m_u = u[1]; vertex[1].m_v = v[1]; vertex[2].m_x = x[3]; vertex[2].m_y = y[3]; vertex[2].m_z = 0; - vertex[2].m_rgba = 0xffffffff; + vertex[2].m_rgba = screen_tint; vertex[2].m_u = u[3]; vertex[2].m_v = v[3]; vertex[3].m_x = x[3]; vertex[3].m_y = y[3]; vertex[3].m_z = 0; - vertex[3].m_rgba = 0xffffffff; + vertex[3].m_rgba = screen_tint; vertex[3].m_u = u[3]; vertex[3].m_v = v[3]; vertex[4].m_x = x[2]; vertex[4].m_y = y[2]; vertex[4].m_z = 0; - vertex[4].m_rgba = 0xffffffff; + vertex[4].m_rgba = screen_tint; vertex[4].m_u = u[2]; vertex[4].m_v = v[2]; vertex[5].m_x = x[0]; vertex[5].m_y = y[0]; vertex[5].m_z = 0; - vertex[5].m_rgba = 0xffffffff; + vertex[5].m_rgba = screen_tint; vertex[5].m_u = u[0]; vertex[5].m_v = v[0]; } diff --git a/src/osd/modules/render/bgfx/chainentry.h b/src/osd/modules/render/bgfx/chainentry.h index d9408531476..56c34653266 100644 --- a/src/osd/modules/render/bgfx/chainentry.h +++ b/src/osd/modules/render/bgfx/chainentry.h @@ -34,7 +34,7 @@ class target_manager; class bgfx_chain_entry { public: - bgfx_chain_entry(std::string name, bgfx_effect* effect, clear_state* clear, std::vector suppressors, std::vector inputs, std::vector uniforms, target_manager& targets, std::string output); + bgfx_chain_entry(std::string name, bgfx_effect* effect, clear_state* clear, std::vector suppressors, std::vector inputs, std::vector uniforms, target_manager& targets, std::string output, bool apply_tint); ~bgfx_chain_entry(); void submit(int view, chain_manager::screen_prim &prim, texture_manager& textures, uint16_t screen_count, uint16_t screen_width, uint16_t screen_height, float screen_scale_x, float screen_scale_y, float screen_offset_x, float screen_offset_y, uint32_t rotation_type, bool swap_xy, uint64_t blend, int32_t screen); @@ -59,7 +59,7 @@ private: void setup_screenindex_uniform(int32_t screen) const; bool setup_view(int view, uint16_t screen_width, uint16_t screen_height, int32_t screen) const; - void put_screen_buffer(uint16_t screen_width, uint16_t screen_height, bgfx::TransientVertexBuffer* buffer) const; + void put_screen_buffer(uint16_t screen_width, uint16_t screen_height, uint32_t screen_tint, bgfx::TransientVertexBuffer* buffer) const; std::string m_name; bgfx_effect* m_effect; @@ -69,6 +69,7 @@ private: std::vector m_uniforms; target_manager& m_targets; std::string m_output; + bool m_apply_tint; }; #endif // __DRAWBGFX_CHAIN_ENTRY__ diff --git a/src/osd/modules/render/bgfx/chainentryreader.cpp b/src/osd/modules/render/bgfx/chainentryreader.cpp index d48b214f83d..f14d9d76f64 100644 --- a/src/osd/modules/render/bgfx/chainentryreader.cpp +++ b/src/osd/modules/render/bgfx/chainentryreader.cpp @@ -183,6 +183,10 @@ bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, std::s } } + // Parse whether or not to apply screen tint in this pass + bool applytint = get_bool(value, "applytint", false); + + // Parse uniforms std::vector uniforms; if (value.HasMember("uniforms")) { @@ -228,7 +232,7 @@ bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, std::s } std::string output = value["output"].GetString(); - return new bgfx_chain_entry(name, effect, clear, suppressors, inputs, uniforms, chains.targets(), output); + return new bgfx_chain_entry(name, effect, clear, suppressors, inputs, uniforms, chains.targets(), output, applytint); } bool chain_entry_reader::validate_parameters(const Value& value, std::string prefix) @@ -242,5 +246,6 @@ bool chain_entry_reader::validate_parameters(const Value& value, std::string pre if (!READER_CHECK(!value.HasMember("input") || value["input"].IsArray(), (prefix + "Value 'input' must be an array\n").c_str())) return false; if (!READER_CHECK(!value.HasMember("uniforms") || value["uniforms"].IsArray(), (prefix + "Value 'uniforms' must be an array\n").c_str())) return false; if (!READER_CHECK(!value.HasMember("disablewhen") || value["disablewhen"].IsArray(), (prefix + "Value 'disablewhen' must be an array\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("applytint") || value["applytint"].IsBool(), (prefix + "Value 'applytint' must be a bool\n").c_str())) return false; return true; } diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index 313c78f3623..c2eea4c9a8b 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -64,6 +64,7 @@ void chain_manager::init_texture_converters() m_converters.push_back(m_effects.effect("misc/texconv_rgb32")); m_converters.push_back(nullptr); m_converters.push_back(m_effects.effect("misc/texconv_yuy16")); + m_adjuster = m_effects.effect("misc/bcg_adjust"); } void chain_manager::refresh_available_chains() @@ -156,7 +157,7 @@ bgfx_chain* chain_manager::load_chain(std::string name, uint32_t screen_index) bx::FileReader reader; if (!bx::open(&reader, path.c_str())) { - printf("Unable to open chain file %s, falling back to no post processing\n", path.c_str()); + osd_printf_warning("Unable to open chain file %s, falling back to no post processing\n", path.c_str()); return nullptr; } @@ -175,8 +176,8 @@ bgfx_chain* chain_manager::load_chain(std::string name, uint32_t screen_index) if (document.HasParseError()) { std::string error(GetParseError_En(document.GetParseError())); - printf("Unable to parse chain %s. Errors returned:\n", path.c_str()); - printf("%s\n", error.c_str()); + osd_printf_warning("Unable to parse chain %s. Errors returned:\n", path.c_str()); + osd_printf_warning("%s\n", error.c_str()); return nullptr; } @@ -184,7 +185,7 @@ bgfx_chain* chain_manager::load_chain(std::string name, uint32_t screen_index) if (chain == nullptr) { - printf("Unable to load chain %s, falling back to no post processing\n", path.c_str()); + osd_printf_warning("Unable to load chain %s, falling back to no post processing\n", path.c_str()); return nullptr; } @@ -443,11 +444,12 @@ uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive * const uint32_t src_format = (prim.m_flags & PRIMFLAG_TEXFORMAT_MASK) >> PRIMFLAG_TEXFORMAT_SHIFT; const bool needs_conversion = m_converters[src_format] != nullptr; + const bool needs_adjust = prim.m_prim->texture.palette != nullptr && src_format != TEXFORMAT_PALETTE16; std::string screen_index = std::to_string(screen); std::string source_name = "source" + screen_index; std::string screen_name = "screen" + screen_index; std::string palette_name = "palette" + screen_index; - std::string full_name = needs_conversion ? source_name : screen_name; + std::string full_name = (needs_conversion || needs_adjust) ? source_name : screen_name; if (texture && (texture->width() != tex_width || texture->height() != tex_height)) { m_textures.add_provider(full_name, nullptr); @@ -483,21 +485,19 @@ uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive * m_textures.add_provider(palette_name, palette); } - if (screen >= m_screen_textures.size()) + while (screen >= m_screen_textures.size()) { - m_screen_textures.push_back(texture); - if (palette) - { - m_screen_palettes.push_back(palette); - } + m_screen_textures.push_back(nullptr); } - else + m_screen_textures[screen] = texture; + + while (screen >= m_screen_palettes.size()) { - m_screen_textures[screen] = texture; - if (palette) - { - m_screen_palettes[screen] = palette; - } + m_screen_palettes.push_back(nullptr); + } + if (palette) + { + m_screen_palettes[screen] = palette; } } else @@ -506,17 +506,40 @@ uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive * if (prim.m_prim->texture.palette) { - m_palette_temp.resize(palette->width() * palette->height() * 4); + uint16_t palette_width = (uint16_t)std::min(prim.m_palette_length, 256U); + uint16_t palette_height = (uint16_t)std::max((prim.m_palette_length + 255) / 256, 1U); + const uint32_t palette_size = palette_width * palette_height * 4; + m_palette_temp.resize(palette_size); memcpy(&m_palette_temp[0], prim.m_prim->texture.palette, prim.m_palette_length * 4); - const bgfx::Memory *palmem = bgfx::copy(&m_palette_temp[0], palette->width() * palette->height() * 4); - palette->update(palmem); + const bgfx::Memory *palmem = bgfx::copy(&m_palette_temp[0], palette_size); + + if (palette) + { + palette->update(palmem); + } + else + { + palette = new bgfx_texture(palette_name, bgfx::TextureFormat::BGRA8, palette_width, palette_height, palmem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, palette_width * 4); + m_textures.add_provider(palette_name, palette); + while (screen >= m_screen_palettes.size()) + { + m_screen_palettes.push_back(nullptr); + } + m_screen_palettes[screen] = palette; + } } } bgfx_chain* chain = screen_chain(screen); + if (chain && needs_adjust && !chain->has_adjuster()) + { + chain->insert_effect(chain->has_converter() ? 1 : 0, m_adjuster, "XXadjust", needs_conversion ? "screen" : "source", *this); + chain->set_has_adjuster(true); + } if (chain && needs_conversion && !chain->has_converter()) { - chain->prepend_converter(m_converters[src_format], *this); + chain->insert_effect(0, m_converters[src_format], "XXconvert", "source", *this); + chain->set_has_converter(true); } } diff --git a/src/osd/modules/render/bgfx/chainmanager.h b/src/osd/modules/render/bgfx/chainmanager.h index 36a6847455f..2786714bb98 100644 --- a/src/osd/modules/render/bgfx/chainmanager.h +++ b/src/osd/modules/render/bgfx/chainmanager.h @@ -147,6 +147,7 @@ private: std::vector m_screen_textures; std::vector m_screen_palettes; std::vector m_converters; + bgfx_effect * m_adjuster; std::vector m_screen_prims; std::vector m_palette_temp; diff --git a/src/osd/modules/render/bgfx/inputpair.cpp b/src/osd/modules/render/bgfx/inputpair.cpp index f6e695a9992..9fd2b0e6855 100644 --- a/src/osd/modules/render/bgfx/inputpair.cpp +++ b/src/osd/modules/render/bgfx/inputpair.cpp @@ -46,7 +46,9 @@ bgfx_input_pair::~bgfx_input_pair() void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const { - assert(effect->uniform(m_sampler) != nullptr); + if (effect->uniform(m_sampler) == nullptr) + return; + std::string name = m_texture + std::to_string(screen); bgfx_texture_handle_provider* provider = chains().textures().provider(name); diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_bcg.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_bcg.sc new file mode 100644 index 00000000000..37d64462c51 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_bcg.sc @@ -0,0 +1,24 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); +SAMPLER2D(s_pal, 1); + +uniform vec4 u_inv_tex_size1; + +void main() +{ + vec4 src = texture2D(s_tex, v_texcoord0); + vec2 blu_uv = vec2(src.b * 256.0, 0.0) * u_inv_tex_size1.xy; + vec2 grn_uv = vec2(src.g * 256.0, 1.0) * u_inv_tex_size1.xy; + vec2 red_uv = vec2(src.r * 256.0, 2.0) * u_inv_tex_size1.xy; + float blu = texture2D(s_pal, blu_uv).b; + float grn = texture2D(s_pal, grn_uv).g; + float red = texture2D(s_pal, red_uv).r; + gl_FragColor = vec4(red, grn, blu, src.a) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/statereader.h b/src/osd/modules/render/bgfx/statereader.h index 8026b4b07d0..d725eb792ee 100644 --- a/src/osd/modules/render/bgfx/statereader.h +++ b/src/osd/modules/render/bgfx/statereader.h @@ -9,8 +9,8 @@ #pragma once -#ifndef __DRAWBGFX_STATE_READER__ -#define __DRAWBGFX_STATE_READER__ +#ifndef DRAWBGFX_STATE_READER +#define DRAWBGFX_STATE_READER #include @@ -63,4 +63,4 @@ private: static void get_vec_values(const Value& value_array, float* data, const unsigned int count); }; -#endif // __DRAWBGFX_STATE_READER__ +#endif // DRAWBGFX_STATE_READER diff --git a/src/osd/modules/render/bgfx/writereader.h b/src/osd/modules/render/bgfx/writereader.h index 7dcd1ac16c9..9f60efd846a 100644 --- a/src/osd/modules/render/bgfx/writereader.h +++ b/src/osd/modules/render/bgfx/writereader.h @@ -2,14 +2,14 @@ // copyright-holders:Ryan Holtz //============================================================ // -// cullreader.h - BGFX alpha/color write state JSON reader +// writereader.h - BGFX alpha/color write state JSON reader // //============================================================ #pragma once -#ifndef __DRAWBGFX_WRITE_READER__ -#define __DRAWBGFX_WRITE_READER__ +#ifndef DRAWBGFX_WRITE_READER +#define DRAWBGFX_WRITE_READER #include "statereader.h" @@ -18,4 +18,4 @@ public: static uint64_t read_from_value(const Value& value); }; -#endif // __DRAWBGFX_WRITE_READER__ +#endif // DRAWBGFX_WRITE_READER diff --git a/src/osd/modules/render/bgfxutil.cpp b/src/osd/modules/render/bgfxutil.cpp index b82b0742ebb..1ce3c244ba4 100644 --- a/src/osd/modules/render/bgfxutil.cpp +++ b/src/osd/modules/render/bgfxutil.cpp @@ -78,7 +78,7 @@ uint64_t bgfx_util::get_blend_state(uint32_t blend) case BLENDMODE_ALPHA: return BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA); case BLENDMODE_RGB_MULTIPLY: - return BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_DST_COLOR, BGFX_STATE_BLEND_ZERO); + return BGFX_STATE_BLEND_FUNC_SEPARATE(BGFX_STATE_BLEND_DST_COLOR, BGFX_STATE_BLEND_ZERO, BGFX_STATE_BLEND_DST_ALPHA, BGFX_STATE_BLEND_ZERO); case BLENDMODE_ADD: return BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_ONE); default: -- cgit v1.2.3