From a72ad0c4fe65b507bc4fd17aac580683e289e2fd Mon Sep 17 00:00:00 2001 From: dankan1890 Date: Thu, 21 Apr 2016 06:48:26 +0200 Subject: [PATCH 01/16] fix sdl build. (nw) --- src/emu/ui/auditmenu.cpp | 1 - src/emu/ui/custui.cpp | 8 +++----- src/emu/ui/custui.h | 6 ------ src/emu/ui/inifile.cpp | 1 - src/emu/ui/miscmenu.h | 4 ++-- src/emu/ui/moptions.cpp | 1 + src/emu/ui/moptions.h | 2 -- src/emu/ui/selgame.cpp | 2 -- src/emu/ui/selgame.h | 1 - src/emu/ui/selsoft.cpp | 1 - src/emu/ui/utils.cpp | 1 - src/emu/ui/utils.h | 3 --- src/osd/modules/font/font_sdl.cpp | 2 +- 13 files changed, 7 insertions(+), 26 deletions(-) diff --git a/src/emu/ui/auditmenu.cpp b/src/emu/ui/auditmenu.cpp index 5d6ce8fa8d1..70aa5e2f258 100644 --- a/src/emu/ui/auditmenu.cpp +++ b/src/emu/ui/auditmenu.cpp @@ -13,7 +13,6 @@ #include "ui/menu.h" #include "audit.h" #include "ui/auditmenu.h" -#include extern const char UI_VERSION_TAG[]; diff --git a/src/emu/ui/custui.cpp b/src/emu/ui/custui.cpp index f2e86eeeca1..42ef567ce02 100644 --- a/src/emu/ui/custui.cpp +++ b/src/emu/ui/custui.cpp @@ -10,14 +10,12 @@ #include "emu.h" #include "emuopts.h" -#include "ui/custui.h" - +#include "osdepend.h" #include "ui/ui.h" +#include "ui/menu.h" #include "ui/selector.h" #include "ui/utils.h" - -#include - +#include "ui/custui.h" const char *const ui_menu_custom_ui::hide_status[] = { __("Show All"), diff --git a/src/emu/ui/custui.h b/src/emu/ui/custui.h index 0a2e55745c9..0aeffca9c5b 100644 --- a/src/emu/ui/custui.h +++ b/src/emu/ui/custui.h @@ -13,12 +13,6 @@ #ifndef MAME_EMU_UI_UI_CUSTUI_H #define MAME_EMU_UI_UI_CUSTUI_H -#include "ui/menu.h" - -#include -#include - - //------------------------------------------------- // Custom UI menu //------------------------------------------------- diff --git a/src/emu/ui/inifile.cpp b/src/emu/ui/inifile.cpp index f230e5ba0e7..1a2b894a5fb 100644 --- a/src/emu/ui/inifile.cpp +++ b/src/emu/ui/inifile.cpp @@ -13,7 +13,6 @@ #include "ui/inifile.h" #include "softlist.h" #include "drivenum.h" -#include //------------------------------------------------- // GLOBAL VARIABLES diff --git a/src/emu/ui/miscmenu.h b/src/emu/ui/miscmenu.h index f2fb394784d..18f22c49d54 100644 --- a/src/emu/ui/miscmenu.h +++ b/src/emu/ui/miscmenu.h @@ -13,10 +13,10 @@ #ifndef __UI_MISCMENU_H__ #define __UI_MISCMENU_H__ -#include "drivenum.h" #include "crsshair.h" #include "emuopts.h" -#include "ui/selsoft.h" + +using s_bios = std::vector>; class ui_menu_keyboard_mode : public ui_menu { public: diff --git a/src/emu/ui/moptions.cpp b/src/emu/ui/moptions.cpp index 4f41c7fbdac..3c8d37fec12 100644 --- a/src/emu/ui/moptions.cpp +++ b/src/emu/ui/moptions.cpp @@ -9,6 +9,7 @@ ***************************************************************************/ #include "emu.h" +#include "options.h" #include "ui/moptions.h" diff --git a/src/emu/ui/moptions.h b/src/emu/ui/moptions.h index 55d800651f4..9a657d69d0e 100644 --- a/src/emu/ui/moptions.h +++ b/src/emu/ui/moptions.h @@ -13,8 +13,6 @@ #ifndef __UI_OPTS_H__ #define __UI_OPTS_H__ -#include "options.h" - // core directory options #define OPTION_HISTORY_PATH "historypath" #define OPTION_EXTRAINI_PATH "extrainipath" diff --git a/src/emu/ui/selgame.cpp b/src/emu/ui/selgame.cpp index 1a7f02eb920..2df9cd35012 100644 --- a/src/emu/ui/selgame.cpp +++ b/src/emu/ui/selgame.cpp @@ -11,7 +11,6 @@ #include "emu.h" #include "emuopts.h" #include "ui/ui.h" -#include "ui/menu.h" #include "uiinput.h" #include "ui/selgame.h" #include "ui/miscmenu.h" @@ -29,7 +28,6 @@ #include "ui/auditmenu.h" #include "rendutil.h" #include "softlist.h" -#include extern const char UI_VERSION_TAG[]; diff --git a/src/emu/ui/selgame.h b/src/emu/ui/selgame.h index 06401d3523d..225e9c2cf3a 100644 --- a/src/emu/ui/selgame.h +++ b/src/emu/ui/selgame.h @@ -13,7 +13,6 @@ #ifndef __UI_MAIN_H__ #define __UI_MAIN_H__ -#include "drivenum.h" #include "ui/menu.h" class ui_menu_select_game : public ui_menu diff --git a/src/emu/ui/selsoft.cpp b/src/emu/ui/selsoft.cpp index 0cc5a951df9..16808d2a963 100644 --- a/src/emu/ui/selsoft.cpp +++ b/src/emu/ui/selsoft.cpp @@ -22,7 +22,6 @@ #include "rendfont.h" #include "rendutil.h" #include "softlist.h" -#include std::string reselect_last::driver; std::string reselect_last::software; diff --git a/src/emu/ui/utils.cpp b/src/emu/ui/utils.cpp index 6a59208cd30..d65bbc52ef7 100644 --- a/src/emu/ui/utils.cpp +++ b/src/emu/ui/utils.cpp @@ -10,7 +10,6 @@ #include "emu.h" #include "ui/utils.h" -#include extern const char UI_VERSION_TAG[]; const char UI_VERSION_TAG[] = "# UI INFO "; diff --git a/src/emu/ui/utils.h b/src/emu/ui/utils.h index 0e2ff2354b3..d31b3746e77 100644 --- a/src/emu/ui/utils.h +++ b/src/emu/ui/utils.h @@ -13,9 +13,6 @@ #ifndef __UI_UTILS_H__ #define __UI_UTILS_H__ -#include "osdepend.h" -#include "rendutil.h" - #define MAX_CHAR_INFO 256 #define MAX_CUST_FILTER 8 diff --git a/src/osd/modules/font/font_sdl.cpp b/src/osd/modules/font/font_sdl.cpp index c5a73b0a541..629bc9046a8 100644 --- a/src/osd/modules/font/font_sdl.cpp +++ b/src/osd/modules/font/font_sdl.cpp @@ -88,7 +88,7 @@ bool osd_font_sdl::open(std::string const &font_path, std::string const &_name, // if no success, try the font path if (!font) { - osd_printf_verbose("Searching font %s in -%s\n", family.c_str(), OPTION_FONTPATH); + osd_printf_verbose("Searching font %s in -%s path/s\n", family.c_str(), font_path.c_str()); //emu_file file(options().font_path(), OPEN_FLAG_READ); emu_file file(font_path.c_str(), OPEN_FLAG_READ); if (file.open(family.c_str()) == osd_file::error::NONE) From b1c06acb61c741fc9bcb1bd7428728e291510a39 Mon Sep 17 00:00:00 2001 From: ImJezze Date: Thu, 21 Apr 2016 07:52:29 +0200 Subject: [PATCH 02/16] Implemented handling for u_screen_scale and u_screen_offset (nw) --- bgfx/chains/hlsl.json | 3 ++ bgfx/effects/hlsl/distortion.json | 34 +++++++++--------- bgfx/effects/hlsl/post.json | 2 +- bgfx/shaders/dx11/chains/hlsl/fs_post.bin | Bin 2886 -> 3095 bytes bgfx/shaders/dx9/chains/hlsl/fs_post.bin | Bin 2587 -> 2800 bytes bgfx/shaders/gles/chains/hlsl/fs_post.bin | Bin 3784 -> 3941 bytes bgfx/shaders/glsl/chains/hlsl/fs_post.bin | Bin 3582 -> 3733 bytes bgfx/shaders/metal/chains/hlsl/fs_post.bin | Bin 4351 -> 4477 bytes hlsl/post.fx | 2 +- src/emu/render.cpp | 4 +-- src/emu/render.h | 6 ++-- src/osd/modules/render/bgfx/chain.cpp | 27 ++++++++++---- src/osd/modules/render/bgfx/chain.h | 4 ++- src/osd/modules/render/bgfx/chainentry.cpp | 28 +++++++++++++-- src/osd/modules/render/bgfx/chainentry.h | 6 ++-- src/osd/modules/render/bgfx/chainreader.cpp | 9 ++++- .../bgfx/shaders/chains/hlsl/fs_post.sc | 14 ++++---- src/osd/modules/render/d3d/d3dhlsl.cpp | 4 +-- src/osd/modules/render/drawbgfx.h | 13 +++++++ src/osd/modules/render/drawd3d.cpp | 2 +- 20 files changed, 110 insertions(+), 48 deletions(-) diff --git a/bgfx/chains/hlsl.json b/bgfx/chains/hlsl.json index 2b730966a47..7e431f72803 100644 --- a/bgfx/chains/hlsl.json +++ b/bgfx/chains/hlsl.json @@ -14,6 +14,9 @@ // type: string "author": "Ryan Holtz & ImJezze", + // transform (optional): This value determines whether the screen container is transformed the chain's shaders, otherwise the core renderer will handle the transformation (scale, offset). + "transform": true, + // sliders (optional): The list of sliders used by all of the entries in this chain. Can be omitted if no entries use any sliders. "sliders": [ // type (required): The sliders's conceptual type. Is it a list of string selections? Is it a single floating-point value? Does it require RGB values, or XY values? diff --git a/bgfx/effects/hlsl/distortion.json b/bgfx/effects/hlsl/distortion.json index 14a7b79891a..c459d70a6c3 100644 --- a/bgfx/effects/hlsl/distortion.json +++ b/bgfx/effects/hlsl/distortion.json @@ -8,34 +8,34 @@ //============================================================ { "blend": { - "equation": "add", - "srcColor": "srcalpha", - "dstColor": "1-srcalpha", - "srcAlpha": "srcalpha", - "dstAlpha": "1-srcalpha" + "equation": "add", + "srcColor": "srcalpha", + "dstColor": "1-srcalpha", + "srcAlpha": "srcalpha", + "dstAlpha": "1-srcalpha" }, "depth": { - "function": "always" + "function": "always" }, "cull": { "mode": "none" }, "write": { - "rgb": true, - "alpha": true + "rgb": true, + "alpha": true }, "vertex": "chains/hlsl/vs_distortion", "fragment": "chains/hlsl/fs_distortion", "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_screen_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, + { "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_screen_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, { "name": "u_target_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, - { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, + { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, { "name": "u_distortion", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, { "name": "u_cubic_distortion", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, - { "name": "u_distort_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, - { "name": "u_round_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, - { "name": "u_smooth_border", "type": "vec4", "values": [ 0.05, 0.0, 0.0, 0.0 ] }, - { "name": "u_vignetting", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, - { "name": "u_reflection", "type": "vec4", "values": [ 0.30, 0.0, 0.0, 0.0 ] } + { "name": "u_distort_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, + { "name": "u_round_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, + { "name": "u_smooth_border", "type": "vec4", "values": [ 0.05, 0.0, 0.0, 0.0 ] }, + { "name": "u_vignetting", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] }, + { "name": "u_reflection", "type": "vec4", "values": [ 0.30, 0.0, 0.0, 0.0 ] } ] } \ No newline at end of file diff --git a/bgfx/effects/hlsl/post.json b/bgfx/effects/hlsl/post.json index 16ebbe01c9f..a30e921e4c2 100644 --- a/bgfx/effects/hlsl/post.json +++ b/bgfx/effects/hlsl/post.json @@ -28,7 +28,7 @@ { "name": "s_tex", "type": "int", "values": [ 0.0 ] }, { "name": "s_shadow", "type": "int", "values": [ 1.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_source_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_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 ] }, diff --git a/bgfx/shaders/dx11/chains/hlsl/fs_post.bin b/bgfx/shaders/dx11/chains/hlsl/fs_post.bin index b436f6b57ebb35f88b3b5a62f1c467d90a1ef983..52f2fbaa78fdb8b81b7d37dbb08af8bbe7a97c24 100644 GIT binary patch delta 957 zcmZ8eJ#5oJ6n^LUFAiy4^Al2uDymc=0fN#DMSvg_NMUNEqC&-BOzPlNNgO3MVM`(g z1`uEl#DWA88w)I~rJ@K177$|>m{<@(T^Qk=a}FUV-Mja`_ucp2y?ejw@$Ptj@tjC* zZhcDy@!6#j-)t5ewq3)+s@Mih1A);#=$1-N+cO}CsLoKURw>tP)2h@R%YecV%r&kA z-94lpJe?q&U@eutkF2qQ%Z^>X=Ah`a;OBVz6((5|jpBHi`>z@qEdkp2n5M4#zj zH{dHG#sFeQ?f&ZBcl_#As}YF;A)xqX-EG+o1N2^GmnyD{VFp9lH@$L|%>VBAqZ2rwow+o3`p)HppP#gick@#x9?^-F7s$j6{Xy2! zg*f0G0WJst%K&2jZU!TOopeK3ZEG{2hhbjV0U03V&;Y#QI}Bz35`A98?_|PU3~iqK zVu-*$P0kf^Vd5lOw!?K6Aif2(5S!HAa+)mC_1Jj(IDj(8p`-lV$Irt6+5_$jIVRNU zD>7ded#_;{IBZ4$ZAfD<7wJcwSpfPvcAjjbe_{({lrD(3lS$NA>SoXaBn5=-`v;9rhvAX0qK{KevUd)0lmQOscTOS3 zmP8LJ4@LGE`a#)0B_qVjFbVc?ku-jH-`_z~s!KF_OWjKn^rbqF{%`dQk?6;`n`Yxd U1$DU5?Q~IdiB31Pu23L<0T6JohyVZp delta 754 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 PvrnHkeLmg6Kt%orjMn;9 diff --git a/bgfx/shaders/gles/chains/hlsl/fs_post.bin b/bgfx/shaders/gles/chains/hlsl/fs_post.bin index 0d5393b4be6085549c74429639c6b17ef2a1ef7d..b044cef536b9de3185cca9eac12369377c3cdffa 100644 GIT binary patch delta 205 zcmX>h`&5q8E!cyFvH8ZD&Xo5s*Y7|f830y3K12Wj delta 94 zcmaDVcS4raE!cyFvH8!mfhI__rbYo(vJxSw36e$9 dWv5^W)P*WqsQ?t++{gNig&k`A=6bGrW&l<;J52xp delta 93 zcmbO#`%jwFE!cyFvH88QY*mX2AjpW>zM(|v>v7a diff --git a/bgfx/shaders/metal/chains/hlsl/fs_post.bin b/bgfx/shaders/metal/chains/hlsl/fs_post.bin index 3b137b246715bd40f6d38c025727d57033e28981..4ccc6e11b7b1fe3357b070f9c92a5cdf4eb18b32 100644 GIT binary patch delta 192 zcmeyb_*aR?E!cyFvH8+Nawf}-EDbINAkaw8&o4@eH`1$6uu(A3GtdNy*3>AVN>(ByH9@jSy6hAT jfx1vdD;1!knhMoGgC;-Z6xrO!+Q-HYwQRE@&pj3Zvy3;r delta 94 zcmeyX^k0$3E!cyFvH8XjgP diff --git a/hlsl/post.fx b/hlsl/post.fx index 1ef59fcca39..f0babe68bca 100644 --- a/hlsl/post.fx +++ b/hlsl/post.fx @@ -147,7 +147,7 @@ float2 GetAdjustedCoords(float2 coord, float2 centerOffset) coord -= centerOffset; // apply screen scale - coord /= ScreenScale; + coord *= ScreenScale; // un-center coordinates coord += centerOffset; diff --git a/src/emu/render.cpp b/src/emu/render.cpp index 129ba82b356..27dab8b7189 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -922,7 +922,7 @@ render_target::render_target(render_manager &manager, const internal_layout *lay m_base_orientation(ROT0), m_maxtexwidth(65536), m_maxtexheight(65536), - m_transform_primitives(true) + m_transform_container(true) { // determine the base layer configuration based on options m_base_layerconfig.set_backdrops_enabled(manager.machine().options().use_backdrops()); @@ -1766,7 +1766,7 @@ void render_target::add_container_primitives(render_primitive_list &list, const float yoffs = (container_xform.orientation & ORIENTATION_SWAP_XY) ? container.xoffset() : container.yoffset(); if (container_xform.orientation & ORIENTATION_FLIP_X) xoffs = -xoffs; if (container_xform.orientation & ORIENTATION_FLIP_Y) yoffs = -yoffs; - if (!m_transform_primitives) + if (!m_transform_container) { xscale = 1.0f; yscale = 1.0f; diff --git a/src/emu/render.h b/src/emu/render.h index 6092a37b45a..ccc0c5f6cd7 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -922,7 +922,7 @@ public: void set_orientation(int orientation) { m_orientation = orientation; } void set_view(int viewindex); void set_max_texture_size(int maxwidth, int maxheight); - void set_transform_primitives(bool transform_primitives) { m_transform_primitives = transform_primitives; } + void set_transform_container(bool transform_container) { m_transform_container = transform_container; } void set_keepaspect(bool keepaspect) { m_keepaspect = keepaspect; } void set_scale_mode(bool scale_mode) { m_scale_mode = scale_mode; } @@ -1029,8 +1029,8 @@ private: simple_list m_debug_containers; // list of debug containers INT32 m_clear_extent_count; // number of clear extents INT32 m_clear_extents[MAX_CLEAR_EXTENTS]; // array of clear extents - bool m_transform_primitives; // determines if the primitives shall be scaled/offset by screen settings, - // otherwise the respective render API will handle it (default is true) + bool m_transform_container; // determines whether the screen container is transformed by the core renderer, + // otherwise the respective render API will handle the transformation (scale, offset) static render_screen_list s_empty_screen_list; }; diff --git a/src/osd/modules/render/bgfx/chain.cpp b/src/osd/modules/render/bgfx/chain.cpp index 3cc6e022573..aa1c3739dbe 100644 --- a/src/osd/modules/render/bgfx/chain.cpp +++ b/src/osd/modules/render/bgfx/chain.cpp @@ -21,9 +21,10 @@ #include "chain.h" -bgfx_chain::bgfx_chain(std::string name, std::string author, target_manager& targets, std::vector sliders, std::vector params, std::vector entries, std::vector target_list, std::uint32_t screen_index) +bgfx_chain::bgfx_chain(std::string name, std::string author, bool transform, target_manager& targets, std::vector sliders, std::vector params, std::vector entries, std::vector target_list, std::uint32_t screen_index) : m_name(name) , m_author(author) + , m_transform(transform) , m_targets(targets) , m_sliders(sliders) , m_params(params) @@ -60,22 +61,34 @@ bgfx_chain::~bgfx_chain() void bgfx_chain::process(render_primitive* prim, int view, int screen, texture_manager& textures, osd_window& window, uint64_t blend) { + screen_device_iterator screen_iterator(window.machine().root_device()); + screen_device* screen_device = screen_iterator.first(); + for (int i = 0; i < screen; i++) + { + screen_device = screen_iterator.next(); + } + render_container &screen_container = screen_device->container(); + int current_view = view; uint16_t screen_width(floor((prim->bounds.x1 - prim->bounds.x0) + 0.5f)); uint16_t screen_height(floor((prim->bounds.y1 - prim->bounds.y0) + 0.5f)); - uint32_t rotation_type = (window.target()->orientation() & ROT90) == ROT90 ? - 1 : (window.target()->orientation() & ROT180) == ROT180 ? - 2 : (window.target()->orientation() & ROT270) == ROT270 ? - 3 : 0; + uint32_t rotation_type = + (window.target()->orientation() & ROT90) == ROT90 ? 1 : + (window.target()->orientation() & ROT180) == ROT180 ? 2 : + (window.target()->orientation() & ROT270) == ROT270 ? 3 : 0; bool orientation_swap_xy = (window.machine().system().flags & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY; - bool rotation_swap_xy = (window.target()->orientation() & ROT90) == ROT90 || (window.target()->orientation() & ROT270) == ROT270; + bool rotation_swap_xy = (window.target()->orientation() & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY; bool swap_xy = orientation_swap_xy ^ rotation_swap_xy; + float screen_scale_x = 1.0f / screen_container.xscale(); + float screen_scale_y = 1.0f / screen_container.yscale(); + float screen_offset_x = -screen_container.xoffset(); + float screen_offset_y = -screen_container.yoffset(); for (bgfx_chain_entry* entry : m_entries) { if (!entry->skip()) { - entry->submit(current_view, prim, textures, screen_width, screen_height, rotation_type, swap_xy, blend, screen); + entry->submit(current_view, prim, textures, screen_width, screen_height, screen_scale_x, screen_scale_y, screen_offset_x, screen_offset_y, rotation_type, swap_xy, blend, screen); current_view++; } } diff --git a/src/osd/modules/render/bgfx/chain.h b/src/osd/modules/render/bgfx/chain.h index bc68d4d5af2..465e44fea85 100644 --- a/src/osd/modules/render/bgfx/chain.h +++ b/src/osd/modules/render/bgfx/chain.h @@ -28,7 +28,7 @@ class osd_window; class bgfx_chain { public: - bgfx_chain(std::string name, std::string author, target_manager& targets, std::vector sliders, std::vector params, std::vector entries, std::vector target_list, uint32_t screen_index); + bgfx_chain(std::string name, std::string author, bool transform, target_manager& targets, std::vector sliders, std::vector params, std::vector entries, std::vector target_list, uint32_t screen_index); ~bgfx_chain(); void process(render_primitive* prim, int view, int screen, texture_manager& textures, osd_window &window, uint64_t blend = 0L); @@ -36,10 +36,12 @@ public: // Getters std::vector& sliders() { return m_sliders; } uint32_t applicable_passes(); + bool transform() { return m_transform; } private: std::string m_name; std::string m_author; + bool m_transform; target_manager& m_targets; std::vector m_sliders; std::vector m_params; diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp index 156bc435f09..fc97e909260 100644 --- a/src/osd/modules/render/bgfx/chainentry.cpp +++ b/src/osd/modules/render/bgfx/chainentry.cpp @@ -50,7 +50,7 @@ bgfx_chain_entry::~bgfx_chain_entry() delete m_clear; } -void bgfx_chain_entry::submit(int view, render_primitive* prim, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint32_t rotation_type, bool swap_xy, uint64_t blend, int32_t screen) +void bgfx_chain_entry::submit(int view, render_primitive* prim, texture_manager& textures, 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) { bgfx::setViewSeq(view, true); @@ -68,7 +68,7 @@ void bgfx_chain_entry::submit(int view, render_primitive* prim, texture_manager& put_screen_buffer(prim, &buffer); bgfx::setVertexBuffer(&buffer); - setup_auto_uniforms(prim, textures, screen_width, screen_height, rotation_type, swap_xy, screen); + setup_auto_uniforms(prim, textures, screen_width, screen_height, screen_scale_x, screen_scale_y, screen_offset_x, screen_offset_y, rotation_type, swap_xy, screen); for (bgfx_entry_uniform* uniform : m_uniforms) { @@ -112,6 +112,26 @@ void bgfx_chain_entry::setup_screensize_uniforms(texture_manager& textures, uint } } +void bgfx_chain_entry::setup_screenscale_uniforms(float screen_scale_x, float screen_scale_y) +{ + bgfx_uniform* screen_scale = m_effect->uniform("u_screen_scale"); + if (screen_scale != nullptr) + { + float values[2] = { screen_scale_x, screen_scale_y }; + screen_scale->set(values, sizeof(float) * 2); + } +} + +void bgfx_chain_entry::setup_screenoffset_uniforms(float screen_offset_x, float screen_offset_y) +{ + bgfx_uniform* screen_offset = m_effect->uniform("u_screen_offset"); + if (screen_offset != nullptr) + { + float values[2] = { screen_offset_x, screen_offset_y }; + screen_offset->set(values, sizeof(float) * 2); + } +} + void bgfx_chain_entry::setup_sourcesize_uniform(render_primitive* prim) const { bgfx_uniform* source_dims = m_effect->uniform("u_source_dims"); @@ -176,9 +196,11 @@ void bgfx_chain_entry::setup_screenindex_uniform(int32_t screen) const } } -void bgfx_chain_entry::setup_auto_uniforms(render_primitive* prim, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint32_t rotation_type, bool swap_xy, int32_t screen) +void bgfx_chain_entry::setup_auto_uniforms(render_primitive* prim, texture_manager& textures, 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, int32_t screen) { setup_screensize_uniforms(textures, screen_width, screen_height, screen); + setup_screenscale_uniforms(screen_scale_x, screen_scale_y); + setup_screenoffset_uniforms(screen_offset_x, screen_offset_y); setup_sourcesize_uniform(prim); setup_targetsize_uniform(screen); setup_rotationtype_uniform(rotation_type); diff --git a/src/osd/modules/render/bgfx/chainentry.h b/src/osd/modules/render/bgfx/chainentry.h index e9e5112bf1b..d6452861de2 100644 --- a/src/osd/modules/render/bgfx/chainentry.h +++ b/src/osd/modules/render/bgfx/chainentry.h @@ -37,15 +37,17 @@ 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(); - void submit(int view, render_primitive* prim, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint32_t rotation_type, bool swap_xy, uint64_t blend, int32_t screen); + void submit(int view, render_primitive* prim, texture_manager& textures, 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); // Getters std::string name() const { return m_name; } bool skip(); private: - void setup_auto_uniforms(render_primitive* prim, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint32_t rotation_type, bool swap_xy, int32_t screen); + void setup_auto_uniforms(render_primitive* prim, texture_manager& textures, 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, int32_t screen); void setup_screensize_uniforms(texture_manager& textures, uint16_t screen_width, uint16_t screen_height, int32_t screen); + void setup_screenscale_uniforms(float screen_scale_x, float screen_scale_y); + void setup_screenoffset_uniforms(float screen_offset_x, float screen_offset_y); void setup_sourcesize_uniform(render_primitive* prim) const; void setup_targetsize_uniform(int32_t screen) const; void setup_rotationtype_uniform(uint32_t rotation_type) const; diff --git a/src/osd/modules/render/bgfx/chainreader.cpp b/src/osd/modules/render/bgfx/chainreader.cpp index 332ba139fd0..9e79eb1f19d 100644 --- a/src/osd/modules/render/bgfx/chainreader.cpp +++ b/src/osd/modules/render/bgfx/chainreader.cpp @@ -53,6 +53,13 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, std::string prefix } } + // Parse whether the screen container is transformed by the chain's shaders + bool transform = false; + if (value.HasMember("transform")) + { + transform = value["transform"].GetBool(); + } + // Map sliders std::map slider_map; for (bgfx_slider* slider : sliders) @@ -116,7 +123,7 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, std::string prefix } } - return new bgfx_chain(name, author, targets, sliders, parameters, entries, target_list, screen_index); + return new bgfx_chain(name, author, transform, targets, sliders, parameters, entries, target_list, screen_index); } bool chain_reader::validate_parameters(const Value& value, std::string prefix) 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 e4a3a984e6b..68fe25a32cc 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 @@ -12,8 +12,8 @@ $input v_color0, v_texcoord0 uniform vec4 u_swap_xy; uniform vec4 u_source_dims; // size of the guest machine uniform vec4 u_quad_dims; -uniform vec4 u_screen_scale; // TODO: Hook up ScreenScale code-side -uniform vec4 u_screen_offset; // TODO: Hook up ScreenOffset code-side +uniform vec4 u_screen_scale; +uniform vec4 u_screen_offset; // User-supplied uniform vec4 u_scanline_alpha; @@ -50,7 +50,7 @@ vec2 GetAdjustedCoords(vec2 coord, vec2 center_offset) coord -= center_offset; // apply screen scale - //coord /= u_screen_scale.xy; + coord *= u_screen_scale.xy; // un-center coordinates coord += center_offset; @@ -102,7 +102,7 @@ void main() // Color vec4 BaseColor = texture2D(s_tex, BaseCoord); - if (BaseCoord.x < 0.0 || BaseCoord.y < 0.0) + if (BaseCoord.x < 0.0 || BaseCoord.y < 0.0 || BaseCoord.x > 1.0 || BaseCoord.y > 1.0) { BaseColor.rgb = vec3(0.0, 0.0, 0.0); } @@ -111,7 +111,7 @@ void main() if (u_shadow_alpha.x > 0.0) { vec2 ShadowCoord = GetShadowCoord(v_texcoord0.xy, v_texcoord0.xy); - + vec4 ShadowColor = texture2D(s_shadow, ShadowCoord); vec3 ShadowMaskColor = mix(vec3(1.0, 1.0, 1.0), ShadowColor.rgb, u_shadow_alpha.xxx); @@ -122,7 +122,7 @@ void main() // Color Compression // increasing the floor of the signal without affecting the ceiling BaseColor.rgb = u_floor.rgb + (vec3(1.0, 1.0, 1.0) - u_floor.rgb) * BaseColor.rgb; - + // Color Power BaseColor.r = pow(BaseColor.r, u_power.r); BaseColor.g = pow(BaseColor.g, u_power.g); @@ -136,7 +136,7 @@ void main() float ColorBrightness = 0.299 * BaseColor.r + 0.587 * BaseColor.g + 0.114 * BaseColor.b; - float ScanCoord = v_texcoord0.y * u_source_dims.y * u_scanline_scale.x * 3.1415927; + float ScanCoord = BaseCoord.y * u_source_dims.y * u_scanline_scale.x * 3.1415927; float ScanCoordJitter = u_scanline_jitter.x * u_jitter_amount.x * 1.618034; 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); diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 497cde4ffaa..d8ce75c06db 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -1379,8 +1379,8 @@ int shaders::post_pass(d3d_render_target *rt, int source_index, poly_info *poly, screen_device *screen = screen_iterator.byindex(curr_screen); render_container &screen_container = screen->container(); - float xscale = screen_container.xscale(); - float yscale = screen_container.yscale(); + float xscale = 1.0f / screen_container.xscale(); + float yscale = 1.0f / screen_container.yscale(); float xoffset = -screen_container.xoffset(); float yoffset = -screen_container.yoffset(); diff --git a/src/osd/modules/render/drawbgfx.h b/src/osd/modules/render/drawbgfx.h index a6f66a6eff3..1a21b5c8259 100644 --- a/src/osd/modules/render/drawbgfx.h +++ b/src/osd/modules/render/drawbgfx.h @@ -12,6 +12,8 @@ #include "binpacker.h" #include "bgfx/vertex.h" +#include "bgfx/chain.h" +#include "bgfx/chainmanager.h" #include "sliderdirtynotifier.h" class texture_manager; @@ -53,8 +55,19 @@ public: virtual render_primitive_list *get_primitives() override { + // determines whether the screen container is transformed by the chain's shaders + bool chain_transform = false; + + // check the first chain + bgfx_chain* chain = this->m_chains->screen_chain(0); + if (chain != nullptr) + { + chain_transform = chain->transform(); + } + osd_dim wdim = window().get_size(); window().target()->set_bounds(wdim.width(), wdim.height(), window().pixel_aspect()); + window().target()->set_transform_container(!chain_transform); return &window().target()->get_primitives(); } diff --git a/src/osd/modules/render/drawd3d.cpp b/src/osd/modules/render/drawd3d.cpp index fa5dc500e2e..e28c3e7928a 100644 --- a/src/osd/modules/render/drawd3d.cpp +++ b/src/osd/modules/render/drawd3d.cpp @@ -209,7 +209,7 @@ render_primitive_list *renderer_d3d9::get_primitives() if (m_shaders != nullptr) { // do not transform primitives (scale, offset) if shaders are enabled, the shaders will handle the transformation - window().target()->set_transform_primitives(!m_shaders->enabled()); + window().target()->set_transform_container(!m_shaders->enabled()); } return &window().target()->get_primitives(); } From 057eefd060af60932c338a145df801ebd3c762d1 Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Thu, 21 Apr 2016 09:29:33 +0200 Subject: [PATCH 03/16] neogeo.cpp: more accurate implementation of contollers through slot devices. If you want to launch janshin in the multislot driver (neogeo) you shall now prescribe -edge "" -ctrl1 mahjong and set accordingly the dipswitch. The janshin driver already comes pre-configured in the proper way, instead. [Fabio Priuli] --- scripts/src/bus.lua | 2 + src/devices/bus/neogeo_ctrl/ctrl.cpp | 117 +++++++++++++++-- src/devices/bus/neogeo_ctrl/ctrl.h | 52 +++++++- src/devices/bus/neogeo_ctrl/dial.cpp | 63 +++++++--- src/devices/bus/neogeo_ctrl/dial.h | 11 +- src/devices/bus/neogeo_ctrl/irrmaze.cpp | 114 +++++++++++++++++ src/devices/bus/neogeo_ctrl/irrmaze.h | 57 +++++++++ src/devices/bus/neogeo_ctrl/joystick.cpp | 154 ++++++++++++++++++----- src/devices/bus/neogeo_ctrl/joystick.h | 64 +++++----- src/devices/bus/neogeo_ctrl/kizuna4p.cpp | 94 ++++++++++---- src/devices/bus/neogeo_ctrl/kizuna4p.h | 10 +- src/mame/drivers/neogeo.cpp | 20 +-- src/mame/drivers/neogeo_noslot.cpp | 71 +++++------ src/mame/drivers/ng_aes.cpp | 1 - src/mame/includes/neogeo.h | 5 +- 15 files changed, 659 insertions(+), 176 deletions(-) create mode 100644 src/devices/bus/neogeo_ctrl/irrmaze.cpp create mode 100644 src/devices/bus/neogeo_ctrl/irrmaze.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 78032cabff0..cd9923ea1fc 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1964,6 +1964,8 @@ if (BUSES["NEOGEO_CTRL"]~=null) then MAME_DIR .. "src/devices/bus/neogeo_ctrl/mahjong.h", MAME_DIR .. "src/devices/bus/neogeo_ctrl/dial.cpp", MAME_DIR .. "src/devices/bus/neogeo_ctrl/dial.h", + MAME_DIR .. "src/devices/bus/neogeo_ctrl/irrmaze.cpp", + MAME_DIR .. "src/devices/bus/neogeo_ctrl/irrmaze.h", MAME_DIR .. "src/devices/bus/neogeo_ctrl/kizuna4p.cpp", MAME_DIR .. "src/devices/bus/neogeo_ctrl/kizuna4p.h", } diff --git a/src/devices/bus/neogeo_ctrl/ctrl.cpp b/src/devices/bus/neogeo_ctrl/ctrl.cpp index 74d0c10586f..bdfeb657065 100644 --- a/src/devices/bus/neogeo_ctrl/ctrl.cpp +++ b/src/devices/bus/neogeo_ctrl/ctrl.cpp @@ -3,6 +3,16 @@ /********************************************************************** SNK Neo Geo Controller Port emulation + + This actually covers two separate piece of hardware of Neo Geo system: + - The 15-pin controller ports that are used for controllers in the + AES home system and for mahjong controllers in the MVS arcade PCB + - The controller part of the main edge connector that is used for + joystick inputs in the MVS arcade PCB + + Technically, the latter is not a configurable slot, because it's not + a component that arcade operators could simply change with a different + controller, but this implementation allows for simpler code. **********************************************************************/ @@ -11,6 +21,7 @@ #include "joystick.h" #include "mahjong.h" #include "dial.h" +#include "irrmaze.h" #include "kizuna4p.h" @@ -19,6 +30,7 @@ //************************************************************************** const device_type NEOGEO_CONTROL_PORT = &device_creator; +const device_type NEOGEO_CTRL_EDGE_CONNECTOR = &device_creator; //************************************************************************** @@ -44,6 +56,25 @@ device_neogeo_control_port_interface::~device_neogeo_control_port_interface() { } +//------------------------------------------------- +// device_neogeo_ctrl_edge_interface - constructor +//------------------------------------------------- + +device_neogeo_ctrl_edge_interface::device_neogeo_ctrl_edge_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig,device) +{ + m_port = dynamic_cast(device.owner()); +} + + +//------------------------------------------------- +// ~device_neogeo_ctrl_edge_interface - destructor +//------------------------------------------------- + +device_neogeo_ctrl_edge_interface::~device_neogeo_ctrl_edge_interface() +{ +} + //************************************************************************** // LIVE DEVICE @@ -81,17 +112,17 @@ void neogeo_control_port_device::device_start() UINT8 neogeo_control_port_device::read_ctrl() { - UINT8 data = 0; + UINT8 data = 0xff; if (m_device) - data |= m_device->read_ctrl(); + data &= m_device->read_ctrl(); return data; } UINT8 neogeo_control_port_device::read_start_sel() { - UINT8 data = 0; + UINT8 data = 0xff; if (m_device) - data |= m_device->read_start_sel(); + data &= m_device->read_start_sel(); return data; } @@ -103,6 +134,68 @@ void neogeo_control_port_device::write_ctrlsel(UINT8 data) } +//------------------------------------------------- +// neogeo_ctrl_edge_port_device - constructor +//------------------------------------------------- + +neogeo_ctrl_edge_port_device::neogeo_ctrl_edge_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, NEOGEO_CTRL_EDGE_CONNECTOR, "SNK Neo Geo Edge Connector (Controller)", tag, owner, clock, "neogeo_ctrl_edge", __FILE__), + device_slot_interface(mconfig, *this), m_device(nullptr) +{ +} + + +//------------------------------------------------- +// ~neogeo_ctrl_edge_port_device - destructor +//------------------------------------------------- + +neogeo_ctrl_edge_port_device::~neogeo_ctrl_edge_port_device() +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void neogeo_ctrl_edge_port_device::device_start() +{ + m_device = dynamic_cast(get_card_device()); +} + + +READ8_MEMBER(neogeo_ctrl_edge_port_device::in0_r) +{ + UINT8 data = 0xff; + if (m_device) + data &= m_device->in0_r(space, offset, mem_mask); + return data; +} + +READ8_MEMBER(neogeo_ctrl_edge_port_device::in1_r) +{ + UINT8 data = 0xff; + if (m_device) + data &= m_device->in1_r(space, offset, mem_mask); + return data; +} + +UINT8 neogeo_ctrl_edge_port_device::read_start_sel() +{ + UINT8 data = 0xff; + if (m_device) + data &= m_device->read_start_sel(); + return data; +} + +void neogeo_ctrl_edge_port_device::write_ctrlsel(UINT8 data) +{ + if (m_device) + m_device->write_ctrlsel(data); +} + + + //------------------------------------------------- // SLOT_INTERFACE( neogeo_control_port_devices ) //------------------------------------------------- @@ -112,12 +205,18 @@ SLOT_INTERFACE_START( neogeo_controls ) SLOT_INTERFACE("mahjong", NEOGEO_MJCTRL) SLOT_INTERFACE_END -SLOT_INTERFACE_START( neogeo_arc_ctrls ) +SLOT_INTERFACE_START( neogeo_arc_edge ) SLOT_INTERFACE("joy", NEOGEO_JOY_AC) - SLOT_INTERFACE("mahjong", NEOGEO_MJCTRL_AC) - SLOT_INTERFACE("dial", NEOGEO_DIAL) SLOT_INTERFACE_END -SLOT_INTERFACE_START( neogeo_kiz4p ) - SLOT_INTERFACE("kiz4p", NEOGEO_KIZ4P) +SLOT_INTERFACE_START( neogeo_arc_edge_fixed ) + SLOT_INTERFACE("joy", NEOGEO_JOY_AC) + SLOT_INTERFACE("dial", NEOGEO_DIAL) + SLOT_INTERFACE("irrmaze", NEOGEO_IRRMAZE) + SLOT_INTERFACE("kiz4p", NEOGEO_KIZ4P) SLOT_INTERFACE_END + +SLOT_INTERFACE_START( neogeo_arc_pin15 ) + SLOT_INTERFACE("mahjong", NEOGEO_MJCTRL) +SLOT_INTERFACE_END + diff --git a/src/devices/bus/neogeo_ctrl/ctrl.h b/src/devices/bus/neogeo_ctrl/ctrl.h index 0505d35d3eb..437dc8addd3 100644 --- a/src/devices/bus/neogeo_ctrl/ctrl.h +++ b/src/devices/bus/neogeo_ctrl/ctrl.h @@ -19,6 +19,7 @@ //************************************************************************** class neogeo_control_port_device; +class neogeo_ctrl_edge_port_device; // ======================> device_neogeo_control_port_interface @@ -60,8 +61,50 @@ protected: }; +// ======================> device_neogeo_ctrl_edge_interface + +class device_neogeo_ctrl_edge_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_neogeo_ctrl_edge_interface(const machine_config &mconfig, device_t &device); + virtual ~device_neogeo_ctrl_edge_interface(); + + virtual UINT8 read_start_sel() { return 0xff; } + virtual DECLARE_READ8_MEMBER( in0_r ) { return 0xff; } + virtual DECLARE_READ8_MEMBER( in1_r ) { return 0xff; } + virtual void write_ctrlsel(UINT8 data) { } + +protected: + neogeo_ctrl_edge_port_device *m_port; +}; + +// ======================> neogeo_ctrl_edge_port_device + +class neogeo_ctrl_edge_port_device : public device_t, + public device_slot_interface +{ +public: + // construction/destruction + neogeo_ctrl_edge_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~neogeo_ctrl_edge_port_device(); + + UINT8 read_start_sel(); + DECLARE_READ8_MEMBER( in0_r ); + DECLARE_READ8_MEMBER( in1_r ); + void write_ctrlsel(UINT8 data); + +protected: + // device-level overrides + virtual void device_start() override; + + device_neogeo_ctrl_edge_interface *m_device; +}; + + // device type definition extern const device_type NEOGEO_CONTROL_PORT; +extern const device_type NEOGEO_CTRL_EDGE_CONNECTOR; //************************************************************************** @@ -72,11 +115,16 @@ extern const device_type NEOGEO_CONTROL_PORT; MCFG_DEVICE_ADD(_tag, NEOGEO_CONTROL_PORT, 0) \ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) +#define MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD(_tag, _slot_intf, _def_slot, _fixed) \ + MCFG_DEVICE_ADD(_tag, NEOGEO_CTRL_EDGE_CONNECTOR, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) + SLOT_INTERFACE_EXTERN( neogeo_controls ); -SLOT_INTERFACE_EXTERN( neogeo_arc_ctrls ); -SLOT_INTERFACE_EXTERN( neogeo_kiz4p ); +SLOT_INTERFACE_EXTERN( neogeo_arc_edge ); +SLOT_INTERFACE_EXTERN( neogeo_arc_edge_fixed ); +SLOT_INTERFACE_EXTERN( neogeo_arc_pin15 ); #endif diff --git a/src/devices/bus/neogeo_ctrl/dial.cpp b/src/devices/bus/neogeo_ctrl/dial.cpp index 8276ecdc8ac..046ff1ccd06 100644 --- a/src/devices/bus/neogeo_ctrl/dial.cpp +++ b/src/devices/bus/neogeo_ctrl/dial.cpp @@ -16,17 +16,29 @@ const device_type NEOGEO_DIAL = &device_creator; static INPUT_PORTS_START( neogeo_dial ) - PORT_START("JOY") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x90, IP_ACTIVE_LOW, IPT_BUTTON1 ) /* note it needs it from 0x80 when using paddle */ - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_START("JOY1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x90, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* note it needs it from 0x80 when using paddle */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_START("DIAL") - PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(20) + PORT_START("JOY2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x90, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) /* note it needs it from 0x80 when using paddle */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + + PORT_START("DIAL1") + PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(20) PORT_PLAYER(1) + + PORT_START("DIAL2") + PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(20) PORT_PLAYER(2) INPUT_PORTS_END @@ -50,9 +62,11 @@ ioport_constructor neogeo_dial_device::device_input_ports() const neogeo_dial_device::neogeo_dial_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, NEOGEO_DIAL, "SNK Neo Geo Dial Controller", tag, owner, clock, "neogeo_dial", __FILE__), - device_neogeo_control_port_interface(mconfig, *this), - m_joy(*this, "JOY"), - m_dial(*this, "DIAL") + device_neogeo_ctrl_edge_interface(mconfig, *this), + m_joy1(*this, "JOY1"), + m_joy2(*this, "JOY2"), + m_dial1(*this, "DIAL1"), + m_dial2(*this, "DIAL2") { } @@ -78,16 +92,31 @@ void neogeo_dial_device::device_reset() //------------------------------------------------- -// read_ctrl +// in0_r //------------------------------------------------- -UINT8 neogeo_dial_device::read_ctrl() +READ8_MEMBER(neogeo_dial_device::in0_r) { UINT8 res = 0; if (m_ctrl_sel & 0x01) - res = m_joy->read(); + res = m_joy1->read(); else - res = m_dial->read(); + res = m_dial1->read(); + + return res; +} + +//------------------------------------------------- +// in1_r +//------------------------------------------------- + +READ8_MEMBER(neogeo_dial_device::in1_r) +{ + UINT8 res = 0; + if (m_ctrl_sel & 0x01) + res = m_joy2->read(); + else + res = m_dial2->read(); return res; } diff --git a/src/devices/bus/neogeo_ctrl/dial.h b/src/devices/bus/neogeo_ctrl/dial.h index ac968ea1136..0c0e07c474d 100644 --- a/src/devices/bus/neogeo_ctrl/dial.h +++ b/src/devices/bus/neogeo_ctrl/dial.h @@ -22,7 +22,7 @@ // ======================> neogeo_dial_device class neogeo_dial_device : public device_t, - public device_neogeo_control_port_interface + public device_neogeo_ctrl_edge_interface { public: // construction/destruction @@ -37,12 +37,15 @@ protected: virtual void device_reset() override; // device_neogeo_control_port_interface overrides - virtual UINT8 read_ctrl() override; + virtual DECLARE_READ8_MEMBER( in0_r ) override; + virtual DECLARE_READ8_MEMBER( in1_r ) override; virtual void write_ctrlsel(UINT8 data) override; private: - required_ioport m_joy; - required_ioport m_dial; + required_ioport m_joy1; + required_ioport m_joy2; + required_ioport m_dial1; + required_ioport m_dial2; UINT8 m_ctrl_sel; }; diff --git a/src/devices/bus/neogeo_ctrl/irrmaze.cpp b/src/devices/bus/neogeo_ctrl/irrmaze.cpp new file mode 100644 index 00000000000..0172d6f86d4 --- /dev/null +++ b/src/devices/bus/neogeo_ctrl/irrmaze.cpp @@ -0,0 +1,114 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + SNK Neo Geo Irritation Maze Analog Controller emulation + +**********************************************************************/ + +#include "irrmaze.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type NEOGEO_IRRMAZE = &device_creator; + + +static INPUT_PORTS_START( neogeo_irrmaze ) + PORT_START("BUTTONS") + PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + + PORT_START("TRACK_X") + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(20) PORT_REVERSE + + PORT_START("TRACK_Y") + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(20) PORT_REVERSE +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor neogeo_irrmaze_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( neogeo_irrmaze ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// neogeo_irrmaze_device - constructor +//------------------------------------------------- + +neogeo_irrmaze_device::neogeo_irrmaze_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, NEOGEO_IRRMAZE, "SNK Neo Geo Irritating Maze Analog Controller", tag, owner, clock, "neogeo_irrmaze", __FILE__), + device_neogeo_ctrl_edge_interface(mconfig, *this), + m_tx(*this, "TRACK_X"), + m_ty(*this, "TRACK_Y"), + m_buttons(*this, "BUTTONS") +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void neogeo_irrmaze_device::device_start() +{ + save_item(NAME(m_ctrl_sel)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void neogeo_irrmaze_device::device_reset() +{ + m_ctrl_sel = 0; +} + + +//------------------------------------------------- +// in0_r +//------------------------------------------------- + +READ8_MEMBER(neogeo_irrmaze_device::in0_r) +{ + UINT8 res = 0; + if (m_ctrl_sel & 0x01) + res = m_ty->read(); + else + res = m_tx->read(); + + return res; +} + +//------------------------------------------------- +// in1_r +//------------------------------------------------- + +READ8_MEMBER(neogeo_irrmaze_device::in1_r) +{ + return m_buttons->read(); +} + +//------------------------------------------------- +// write_ctrlsel +//------------------------------------------------- + +void neogeo_irrmaze_device::write_ctrlsel(UINT8 data) +{ + m_ctrl_sel = data; +} + diff --git a/src/devices/bus/neogeo_ctrl/irrmaze.h b/src/devices/bus/neogeo_ctrl/irrmaze.h new file mode 100644 index 00000000000..9ec4da5761b --- /dev/null +++ b/src/devices/bus/neogeo_ctrl/irrmaze.h @@ -0,0 +1,57 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + SNK Neo Geo Dial controller emulation + +**********************************************************************/ + +#pragma once + +#ifndef __NEOGEO_IRRMAZE__ +#define __NEOGEO_IRRMAZE__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> neogeo_dial_device + +class neogeo_irrmaze_device : public device_t, + public device_neogeo_ctrl_edge_interface +{ +public: + // construction/destruction + neogeo_irrmaze_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_neogeo_control_port_interface overrides + virtual DECLARE_READ8_MEMBER( in0_r ) override; + virtual DECLARE_READ8_MEMBER( in1_r ) override; + virtual void write_ctrlsel(UINT8 data) override; + +private: + required_ioport m_tx; + required_ioport m_ty; + required_ioport m_buttons; + UINT8 m_ctrl_sel; +}; + + + +// device type definition +extern const device_type NEOGEO_IRRMAZE; + + +#endif diff --git a/src/devices/bus/neogeo_ctrl/joystick.cpp b/src/devices/bus/neogeo_ctrl/joystick.cpp index 2c550d0652d..a2a95c7a7e0 100644 --- a/src/devices/bus/neogeo_ctrl/joystick.cpp +++ b/src/devices/bus/neogeo_ctrl/joystick.cpp @@ -8,15 +8,23 @@ #include "joystick.h" + + +/********************************************************************** + + Implementation through the 15-pin controller port (used by AES) + + **********************************************************************/ + + //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type NEOGEO_JOY_AC = &device_creator; const device_type NEOGEO_JOY = &device_creator; -static INPUT_PORTS_START( neogeo_joy_ac ) +static INPUT_PORTS_START( neogeo_joy ) PORT_START("JOY") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) @@ -26,11 +34,6 @@ static INPUT_PORTS_START( neogeo_joy_ac ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( neogeo_joy ) - PORT_INCLUDE( neogeo_joy_ac ) PORT_START("START_SELECT") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) @@ -42,11 +45,6 @@ INPUT_PORTS_END // input_ports - device-specific input ports //------------------------------------------------- -ioport_constructor neogeo_joy_ac_device::device_input_ports() const -{ - return INPUT_PORTS_NAME( neogeo_joy_ac ); -} - ioport_constructor neogeo_joystick_device::device_input_ports() const { return INPUT_PORTS_NAME( neogeo_joy ); @@ -58,30 +56,118 @@ ioport_constructor neogeo_joystick_device::device_input_ports() const //************************************************************************** //------------------------------------------------- -// neogeo_joy_ac_device / neogeo_joystick_device - constructor +// neogeo_joystick_device - constructor //------------------------------------------------- -neogeo_joy_ac_device::neogeo_joy_ac_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source): - device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_neogeo_control_port_interface(mconfig, *this), - m_joy(*this, "JOY") -{ -} - -neogeo_joy_ac_device::neogeo_joy_ac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - device_t(mconfig, NEOGEO_JOY_AC, "SNK Neo Geo Arcade Joystick", tag, owner, clock, "neogeo_joyac", __FILE__), - device_neogeo_control_port_interface(mconfig, *this), - m_joy(*this, "JOY") -{ -} - neogeo_joystick_device::neogeo_joystick_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - neogeo_joy_ac_device(mconfig, NEOGEO_JOY, "SNK Neo Geo Joystick", tag, owner, clock, "neogeo_joy", __FILE__), + device_t(mconfig, NEOGEO_JOY, "SNK Neo Geo Joystick", tag, owner, clock, "neogeo_joy", __FILE__), + device_neogeo_control_port_interface(mconfig, *this), + m_joy(*this, "JOY"), m_ss(*this, "START_SELECT") { } +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void neogeo_joystick_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void neogeo_joystick_device::device_reset() +{ +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 neogeo_joystick_device::read_ctrl() +{ + return m_joy->read(); +} + +//------------------------------------------------- +// read_start_sel +//------------------------------------------------- + +UINT8 neogeo_joystick_device::read_start_sel() +{ + return m_ss->read(); +} + + + +/********************************************************************** + + Implementation through the edge connector (used by MVS) and + connecting two controllers + + **********************************************************************/ + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type NEOGEO_JOY_AC = &device_creator; + + +static INPUT_PORTS_START( neogeo_joy_ac ) + PORT_START("JOY1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + + PORT_START("JOY2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor neogeo_joy_ac_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( neogeo_joy_ac ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// neogeo_joy_ac_device / neogeo_joystick_device - constructor +//------------------------------------------------- + +neogeo_joy_ac_device::neogeo_joy_ac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, NEOGEO_JOY_AC, "SNK Neo Geo Arcade Joystick", tag, owner, clock, "neogeo_joyac", __FILE__), + device_neogeo_ctrl_edge_interface(mconfig, *this), + m_joy1(*this, "JOY1"), + m_joy2(*this, "JOY2") +{ +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -101,20 +187,20 @@ void neogeo_joy_ac_device::device_reset() //------------------------------------------------- -// read_ctrl +// in0_r //------------------------------------------------- -UINT8 neogeo_joy_ac_device::read_ctrl() +READ8_MEMBER(neogeo_joy_ac_device::in0_r) { - return m_joy->read(); + return m_joy1->read(); } //------------------------------------------------- -// read_start_sel +// in1_r //------------------------------------------------- -UINT8 neogeo_joystick_device::read_start_sel() +READ8_MEMBER(neogeo_joy_ac_device::in1_r) { - return m_ss->read(); + return m_joy2->read(); } diff --git a/src/devices/bus/neogeo_ctrl/joystick.h b/src/devices/bus/neogeo_ctrl/joystick.h index ff084dd7207..4f8ce2a91da 100644 --- a/src/devices/bus/neogeo_ctrl/joystick.h +++ b/src/devices/bus/neogeo_ctrl/joystick.h @@ -19,14 +19,40 @@ // TYPE DEFINITIONS //************************************************************************** -// ======================> neogeo_joy_ac_device +// ======================> neogeo_joystick_device -class neogeo_joy_ac_device : public device_t, - public device_neogeo_control_port_interface +class neogeo_joystick_device : public device_t, + public device_neogeo_control_port_interface +{ +public: + // construction/destruction + neogeo_joystick_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_neogeo_control_port_interface overrides + virtual UINT8 read_ctrl() override; + virtual UINT8 read_start_sel() override; + +private: + required_ioport m_joy; + required_ioport m_ss; +}; + + +// ======================> neogeo_joy_ac_device + +class neogeo_joy_ac_device : public device_t, + public device_neogeo_ctrl_edge_interface { public: // construction/destruction - neogeo_joy_ac_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); neogeo_joy_ac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // optional information overrides @@ -37,37 +63,19 @@ protected: virtual void device_start() override; virtual void device_reset() override; - // device_neogeo_control_port_interface overrides - virtual UINT8 read_ctrl() override; - -private: - required_ioport m_joy; -}; - -// ======================> neogeo_joystick_device - -class neogeo_joystick_device : public neogeo_joy_ac_device -{ -public: - // construction/destruction - neogeo_joystick_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // optional information overrides - virtual ioport_constructor device_input_ports() const override; - -protected: - // device_neogeo_control_port_interface overrides - virtual UINT8 read_start_sel() override; + // device_neogeo_ctrl_edge_interface overrides + virtual DECLARE_READ8_MEMBER( in0_r ) override; + virtual DECLARE_READ8_MEMBER( in1_r ) override; private: - required_ioport m_ss; + required_ioport m_joy1; + required_ioport m_joy2; }; - // device type definition -extern const device_type NEOGEO_JOY_AC; extern const device_type NEOGEO_JOY; +extern const device_type NEOGEO_JOY_AC; #endif diff --git a/src/devices/bus/neogeo_ctrl/kizuna4p.cpp b/src/devices/bus/neogeo_ctrl/kizuna4p.cpp index 097345c8e2e..9a3ef190154 100644 --- a/src/devices/bus/neogeo_ctrl/kizuna4p.cpp +++ b/src/devices/bus/neogeo_ctrl/kizuna4p.cpp @@ -17,28 +17,52 @@ const device_type NEOGEO_KIZ4P = &device_creator; static INPUT_PORTS_START( neogeo_kiz4p ) PORT_START("JOY1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Joy A - Up") PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Joy A - Down") PORT_PLAYER(1) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Joy A - Left") PORT_PLAYER(1) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Joy A - Right") PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Joy A - Button A") PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Joy A - Button B") PORT_PLAYER(1) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Joy A - Button C") PORT_PLAYER(1) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Joy A - Button D") PORT_PLAYER(1) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_START("JOY2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Joy B - Up") PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Joy B - Down") PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Joy B - Left") PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Joy B - Right") PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Joy B - Button A") PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Joy B - Button B") PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Joy B - Button C") PORT_PLAYER(2) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Joy B - Button D") PORT_PLAYER(2) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) - PORT_START("START") + PORT_START("JOY3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(3) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(3) + + PORT_START("JOY4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(4) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(4) + + PORT_START("START13") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START3 ) + + PORT_START("START24") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START4 ) INPUT_PORTS_END @@ -62,10 +86,13 @@ ioport_constructor neogeo_kizuna4p_device::device_input_ports() const neogeo_kizuna4p_device::neogeo_kizuna4p_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, NEOGEO_KIZ4P, "SNK Neo Geo Kizuna 4P Controller", tag, owner, clock, "neogeo_kiz4p", __FILE__), - device_neogeo_control_port_interface(mconfig, *this), + device_neogeo_ctrl_edge_interface(mconfig, *this), m_joy1(*this, "JOY1"), m_joy2(*this, "JOY2"), - m_ss(*this, "START") + m_joy3(*this, "JOY3"), + m_joy4(*this, "JOY4"), + m_ss1(*this, "START13"), + m_ss2(*this, "START24") { } @@ -91,23 +118,38 @@ void neogeo_kizuna4p_device::device_reset() //------------------------------------------------- -// read_ctrl +// in0_r //------------------------------------------------- -UINT8 neogeo_kizuna4p_device::read_ctrl() +READ8_MEMBER(neogeo_kizuna4p_device::in0_r) { UINT8 res = 0; - if (m_ctrl_sel & 0x01) - res = m_joy2->read(); + res = m_joy3->read(); else res = m_joy1->read(); if (m_ctrl_sel & 0x04) res &= ((m_ctrl_sel & 0x01) ? ~0x20 : ~0x10); - + return res; } +//------------------------------------------------- +// in1_r +//------------------------------------------------- + +READ8_MEMBER(neogeo_kizuna4p_device::in1_r) +{ + UINT8 res = 0; + if (m_ctrl_sel & 0x01) + res = m_joy4->read(); + else + res = m_joy2->read(); + + if (m_ctrl_sel & 0x04) res &= ((m_ctrl_sel & 0x01) ? ~0x20 : ~0x10); + + return res; +} //------------------------------------------------- // read_start_sel @@ -115,7 +157,7 @@ UINT8 neogeo_kizuna4p_device::read_ctrl() UINT8 neogeo_kizuna4p_device::read_start_sel() { - return BIT(m_ss->read(), m_ctrl_sel & 0x01); + return (BIT(m_ss1->read(), m_ctrl_sel & 0x01)) | (BIT(m_ss2->read(), m_ctrl_sel & 0x01) << 2); } diff --git a/src/devices/bus/neogeo_ctrl/kizuna4p.h b/src/devices/bus/neogeo_ctrl/kizuna4p.h index 36cdbcf1de9..ef4aa1bad36 100644 --- a/src/devices/bus/neogeo_ctrl/kizuna4p.h +++ b/src/devices/bus/neogeo_ctrl/kizuna4p.h @@ -22,7 +22,7 @@ // ======================> neogeo_kizuna4p_device class neogeo_kizuna4p_device : public device_t, - public device_neogeo_control_port_interface + public device_neogeo_ctrl_edge_interface { public: // construction/destruction @@ -37,14 +37,18 @@ protected: virtual void device_reset() override; // device_neogeo_control_port_interface overrides - virtual UINT8 read_ctrl() override; + virtual DECLARE_READ8_MEMBER( in0_r ) override; + virtual DECLARE_READ8_MEMBER( in1_r ) override; virtual UINT8 read_start_sel() override; virtual void write_ctrlsel(UINT8 data) override; private: required_ioport m_joy1; required_ioport m_joy2; - required_ioport m_ss; + required_ioport m_joy3; + required_ioport m_joy4; + required_ioport m_ss1; + required_ioport m_ss2; UINT8 m_ctrl_sel; }; diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp index 8b420a91ec2..dbf8ab1947e 100644 --- a/src/mame/drivers/neogeo.cpp +++ b/src/mame/drivers/neogeo.cpp @@ -633,18 +633,17 @@ WRITE8_MEMBER(neogeo_state::audio_cpu_enable_nmi_w) READ16_MEMBER(neogeo_state::in0_r) { - return (m_ctrl1->ctrl_r(space, offset) << 8) | m_dsw->read(); + return ((m_edge->in0_r(space, offset) & m_ctrl1->ctrl_r(space, offset)) << 8) | m_dsw->read(); } -READ16_MEMBER(neogeo_state::irrmaze_in0_r) +READ16_MEMBER(neogeo_state::in1_r) { - UINT8 track_ipt = (m_controller_select & 0x01) ? m_tracky->read() : m_trackx->read(); - return (track_ipt << 8) | m_dsw->read(); + return ((m_edge->in1_r(space, offset) & m_ctrl2->ctrl_r(space, offset)) << 8) | 0xff; } CUSTOM_INPUT_MEMBER(neogeo_state::kizuna4p_start_r) { - return (m_ctrl1->read_start_sel()) | (m_ctrl2->read_start_sel() << 2) | ~0x05; + return (m_edge->read_start_sel() & 0x05) | ~0x05; } WRITE8_MEMBER(neogeo_state::io_control_w) @@ -652,9 +651,9 @@ WRITE8_MEMBER(neogeo_state::io_control_w) switch (offset) { case 0x00: - m_controller_select = data; if (m_ctrl1) m_ctrl1->write_ctrlsel(data); if (m_ctrl2) m_ctrl2->write_ctrlsel(data); + if (m_edge) m_edge->write_ctrlsel(data); break; case 0x10: @@ -1025,7 +1024,7 @@ DRIVER_INIT_MEMBER(neogeo_state,neogeo) // install controllers m_maincpu->space(AS_PROGRAM).install_read_handler(0x300000, 0x300001, 0, 0x01ff7e, read16_delegate(FUNC(neogeo_state::in0_r), this)); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x340000, 0x340001, 0, 0x01fffe, read8_delegate(FUNC(neogeo_control_port_device::ctrl_r),(neogeo_control_port_device*)m_ctrl2), 0xff00); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x340000, 0x340001, 0, 0x01fffe, read16_delegate(FUNC(neogeo_state::in1_r), this)); } @@ -1072,7 +1071,6 @@ void neogeo_state::machine_start() save_item(NAME(m_irq3_pending)); save_item(NAME(m_audio_cpu_nmi_enabled)); save_item(NAME(m_audio_cpu_nmi_pending)); - save_item(NAME(m_controller_select)); save_item(NAME(m_save_ram_unlocked)); save_item(NAME(m_output_data)); save_item(NAME(m_output_latch)); @@ -1423,8 +1421,10 @@ static MACHINE_CONFIG_DERIVED( mvs, neogeo_arcade ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(main_map_slot) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_ctrls, "joy", false) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_ctrls, "joy", false) + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false) + + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false) MCFG_NEOGEO_CARTRIDGE_ADD("cartslot1", neogeo_cart, nullptr) MCFG_NEOGEO_CARTRIDGE_ADD("cartslot2", neogeo_cart, nullptr) diff --git a/src/mame/drivers/neogeo_noslot.cpp b/src/mame/drivers/neogeo_noslot.cpp index e80ce2ef086..1fe7d6c8203 100644 --- a/src/mame/drivers/neogeo_noslot.cpp +++ b/src/mame/drivers/neogeo_noslot.cpp @@ -23,8 +23,12 @@ static MACHINE_CONFIG_DERIVED_CLASS( neogeo_noslot, neogeo_arcade, neogeo_noslot MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(main_map_noslot) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_ctrls, "joy", true) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_ctrls, "joy", true) + //joystick controller + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "joy", true) + + //no mahjong controller + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", true) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", true) MCFG_MSLUGX_PROT_ADD("mslugx_prot") MCFG_SMA_PROT_ADD("sma_prot") @@ -42,8 +46,12 @@ static MACHINE_CONFIG_DERIVED_CLASS( neogeo_kog, neogeo_arcade, neogeo_noslot_ko MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(main_map_noslot) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_ctrls, "joy", true) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_ctrls, "joy", true) + //joystick controller + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "joy", true) + + //no mahjong controller + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", true) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", true) MCFG_NGBOOTLEG_PROT_ADD("bootleg_prot") MCFG_KOG_PROT_ADD("kog_prot") @@ -52,27 +60,34 @@ MACHINE_CONFIG_END // these basically correspond to the cabinets which were available in arcades: // with mahjong panel, with dial for Pop'n Bounce and with 4 controls for Kizuna... static MACHINE_CONFIG_DERIVED( neogeo_mj, neogeo_noslot ) + + //no joystick panel + MCFG_DEVICE_REMOVE("edge") + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "", true) + + //P1 mahjong controller MCFG_DEVICE_REMOVE("ctrl1") MCFG_DEVICE_REMOVE("ctrl2") - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_ctrls, "mahjong", true) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_ctrls, "", true) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "mahjong", true) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", true) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( neogeo_dial, neogeo_noslot ) - MCFG_DEVICE_REMOVE("ctrl1") - MCFG_DEVICE_REMOVE("ctrl2") - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_ctrls, "dial", true) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_ctrls, "dial", true) + MCFG_DEVICE_REMOVE("edge") + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "dial", true) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( neogeo_imaze, neogeo_noslot ) + MCFG_DEVICE_REMOVE("edge") + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "irrmaze", true) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( neogeo_kiz4p, neogeo_noslot ) - MCFG_DEVICE_REMOVE("ctrl1") - MCFG_DEVICE_REMOVE("ctrl2") - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_kiz4p, "kiz4p", true) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_kiz4p, "kiz4p", true) + MCFG_DEVICE_REMOVE("edge") + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "kiz4p", true) MACHINE_CONFIG_END -// this is used by V-Liner and Irritating Maze, which handle differently inputs... +// this is used by V-Liner, which handles differently inputs... static MACHINE_CONFIG_DERIVED( neogeo_noctrl, neogeo_noslot ) MCFG_DEVICE_REMOVE("ctrl1") MCFG_DEVICE_REMOVE("ctrl2") @@ -224,19 +239,6 @@ static INPUT_PORTS_START( irrmaze ) PORT_MODIFY("SYSTEM") PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("BUTTONS") - PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - - PORT_START("TRACK_X") - PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(20) PORT_REVERSE - - PORT_START("TRACK_Y") - PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(20) PORT_REVERSE INPUT_PORTS_END static INPUT_PORTS_START( vliner ) @@ -8861,17 +8863,6 @@ DRIVER_INIT_MEMBER(neogeo_noslot_state,jockeygp) // m_maincpu->space(AS_PROGRAM).install_read_port(0x2c0000, 0x2c0001, "IN6"); } - -DRIVER_INIT_MEMBER(neogeo_noslot_state,irrmaze) -{ - if (!m_cartslots[0]) m_banked_cart->install_banks(machine(), m_maincpu, m_region_maincpu->base(), m_region_maincpu->bytes()); - - m_sprgen->m_fixed_layer_bank_type = 0; - - m_maincpu->space(AS_PROGRAM).install_read_handler(0x300000, 0x300001, 0, 0x01ff7e, read16_delegate(FUNC(neogeo_state::irrmaze_in0_r), this)); - m_maincpu->space(AS_PROGRAM).install_read_port(0x340000, 0x340001, 0, 0x01fffe, "BUTTONS"); -} - DRIVER_INIT_MEMBER(neogeo_noslot_state,vliner) { if (!m_cartslots[0]) m_banked_cart->install_banks(machine(), m_maincpu, m_region_maincpu->base(), m_region_maincpu->bytes()); @@ -9676,7 +9667,7 @@ GAME( 1997, kog, kof97, neogeo_kog, neogeo, neogeo_noslot_kog_sta GAME( 1997, lastblad, neogeo, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The Last Blade / Bakumatsu Roman - Gekka no Kenshi (NGM-2340)", MACHINE_SUPPORTS_SAVE ) GAME( 1997, lastbladh, lastblad, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The Last Blade / Bakumatsu Roman - Gekka no Kenshi (NGH-2340)", MACHINE_SUPPORTS_SAVE ) GAME( 1997, lastsold, lastblad, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The Last Soldier (Korean release of The Last Blade)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, irrmaze, neogeo, neogeo_noctrl, irrmaze, neogeo_noslot_state, irrmaze, ROT0, "SNK / Saurus", "The Irritating Maze / Ultra Denryu Iraira Bou", MACHINE_SUPPORTS_SAVE ) +GAME( 1997, irrmaze, neogeo, neogeo_imaze, irrmaze, neogeo_state, neogeo, ROT0, "SNK / Saurus", "The Irritating Maze / Ultra Denryu Iraira Bou", MACHINE_SUPPORTS_SAVE ) GAME( 1998, rbff2, neogeo, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - the newcomers (NGM-2400)", MACHINE_SUPPORTS_SAVE ) GAME( 1998, rbff2h, rbff2, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - the newcomers (NGH-2400)", MACHINE_SUPPORTS_SAVE ) GAME( 1998, rbff2k, rbff2, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Real Bout Fatal Fury 2 - The Newcomers (Korean release)", MACHINE_SUPPORTS_SAVE ) // no Japanese title / mode diff --git a/src/mame/drivers/ng_aes.cpp b/src/mame/drivers/ng_aes.cpp index 7d9c822a893..dacd14c15fb 100644 --- a/src/mame/drivers/ng_aes.cpp +++ b/src/mame/drivers/ng_aes.cpp @@ -140,7 +140,6 @@ void ng_aes_state::common_machine_start() save_item(NAME(m_irq3_pending)); save_item(NAME(m_audio_cpu_nmi_enabled)); save_item(NAME(m_audio_cpu_nmi_pending)); - save_item(NAME(m_controller_select)); save_item(NAME(m_use_cart_vectors)); save_item(NAME(m_use_cart_audio)); //save_item(NAME(m_main_cpu_bank_address)); diff --git a/src/mame/includes/neogeo.h b/src/mame/includes/neogeo.h index a57731436cc..3994a818796 100644 --- a/src/mame/includes/neogeo.h +++ b/src/mame/includes/neogeo.h @@ -52,6 +52,7 @@ public: m_dsw(*this, "DSW"), m_trackx(*this, "TRACK_X"), m_tracky(*this, "TRACK_Y"), + m_edge(*this, "edge"), m_ctrl1(*this, "ctrl1"), m_ctrl2(*this, "ctrl2"), m_sprgen(*this, "spritegen"), @@ -81,7 +82,7 @@ public: DECLARE_WRITE16_MEMBER(neogeo_video_register_w); READ16_MEMBER(banked_vectors_r); DECLARE_READ16_MEMBER(in0_r); - DECLARE_READ16_MEMBER(irrmaze_in0_r); + DECLARE_READ16_MEMBER(in1_r); void set_slot_number(int slot); @@ -161,7 +162,6 @@ protected: enum {NEOGEO_MVS, NEOGEO_AES, NEOGEO_CD} m_type; // internal state - UINT8 m_controller_select; bool m_recurse; bool m_audio_cpu_nmi_enabled; bool m_audio_cpu_nmi_pending; @@ -177,6 +177,7 @@ protected: optional_ioport m_dsw; optional_ioport m_trackx; optional_ioport m_tracky; + optional_device m_edge; optional_device m_ctrl1; optional_device m_ctrl2; From 6e9ef69b7c1d2eaa9e55a5d39d24f5ad2408d9fa Mon Sep 17 00:00:00 2001 From: ImJezze Date: Thu, 21 Apr 2016 09:59:10 +0200 Subject: [PATCH 04/16] Fixed b1c06ac (nw) --- src/osd/modules/render/bgfx/chain.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/osd/modules/render/bgfx/chain.cpp b/src/osd/modules/render/bgfx/chain.cpp index aa1c3739dbe..8c517c8dc2f 100644 --- a/src/osd/modules/render/bgfx/chain.cpp +++ b/src/osd/modules/render/bgfx/chain.cpp @@ -17,6 +17,7 @@ #include "targetmanager.h" #include "target.h" #include "vertex.h" +#include "screen.h" #include "modules/osdwindow.h" #include "chain.h" @@ -62,11 +63,7 @@ bgfx_chain::~bgfx_chain() void bgfx_chain::process(render_primitive* prim, int view, int screen, texture_manager& textures, osd_window& window, uint64_t blend) { screen_device_iterator screen_iterator(window.machine().root_device()); - screen_device* screen_device = screen_iterator.first(); - for (int i = 0; i < screen; i++) - { - screen_device = screen_iterator.next(); - } + screen_device* screen_device = screen_iterator.byindex(screen); render_container &screen_container = screen_device->container(); int current_view = view; From 5e26d00e6b608f59558051b60c4eb9e3d2a41a5d Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Thu, 21 Apr 2016 21:29:05 +1200 Subject: [PATCH 05/16] debugimgui: added sending of mouse clicks to debugger views. Please note that you have to click the view area first to give it focus before you can set the cursor in a disassmbler or memory view. --- src/osd/modules/debugger/debugimgui.cpp | 98 ++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp index a5d29550e02..5a6d2b1e8a0 100644 --- a/src/osd/modules/debugger/debugimgui.cpp +++ b/src/osd/modules/debugger/debugimgui.cpp @@ -64,10 +64,11 @@ public: int ofs_x; int ofs_y; int width; - int height; // width and height of the view area, passed to ImGui::BeginChild + int height; // initial view size std::string title; - int last_x; - int last_y; + int view_width; + int view_height; + bool has_focus; bool exec_cmd; // console only int src_sel; char console_input[512]; @@ -95,6 +96,7 @@ public: private: void handle_mouse(); + void handle_mouse_views(); void handle_keys(); void handle_console(running_machine* machine); void update(); @@ -114,9 +116,11 @@ private: INT32 m_mouse_x; INT32 m_mouse_y; bool m_mouse_button; + bool m_prev_mouse_button; bool m_running; const char* font_name; float font_size; + ImVec2 m_text_size; // size of character (assumes monospaced font is in use) ImguiFontHandle m_font; UINT8 m_key_char; bool m_hide; @@ -182,9 +186,54 @@ static inline void map_attr_to_fg_bg(unsigned char attr, rgb_t *fg, rgb_t *bg) void debug_imgui::handle_mouse() { + m_prev_mouse_button = m_mouse_button; m_machine->ui_input().find_mouse(&m_mouse_x, &m_mouse_y, &m_mouse_button); } +void debug_imgui::handle_mouse_views() +{ + rectangle rect; + bool clicked = false; + if(m_mouse_button == true && m_prev_mouse_button == false) + clicked = true; + + // check all views, and pass mouse clicks to them + if(!m_mouse_button) + return; + rect.min_x = view_main_disasm->ofs_x; + rect.min_y = view_main_disasm->ofs_y; + rect.max_x = view_main_disasm->ofs_x + view_main_disasm->view_width; + rect.max_y = view_main_disasm->ofs_y + view_main_disasm->view_height; + if(rect.contains(m_mouse_x,m_mouse_y) && clicked && view_main_disasm->has_focus) + { + debug_view_xy topleft = view_main_disasm->view->visible_position(); + debug_view_xy newpos; + newpos.x = topleft.x + (m_mouse_x-view_main_disasm->ofs_x) / m_text_size.x; + newpos.y = topleft.y + (m_mouse_y-view_main_disasm->ofs_y) / m_text_size.y; + view_main_disasm->view->set_cursor_position(newpos); + view_main_disasm->view->set_cursor_visible(true); + } + for(std::vector::iterator it = view_list.begin();it != view_list.end();++it) + { + rect.min_x = (*it)->ofs_x; + rect.min_y = (*it)->ofs_y; + rect.max_x = (*it)->ofs_x + (*it)->view_width; + rect.max_y = (*it)->ofs_y + (*it)->view_height; + if(rect.contains(m_mouse_x,m_mouse_y) && clicked && (*it)->has_focus) + { + if((*it)->view->cursor_supported()) + { + debug_view_xy topleft = (*it)->view->visible_position(); + debug_view_xy newpos; + newpos.x = topleft.x + (m_mouse_x-(*it)->ofs_x) / m_text_size.x; + newpos.y = topleft.y + (m_mouse_y-(*it)->ofs_y) / m_text_size.y; + (*it)->view->set_cursor_position(newpos); + (*it)->view->set_cursor_visible(true); + } + } + } +} + void debug_imgui::handle_keys() { ImGuiIO& io = ImGui::GetIO(); @@ -377,6 +426,10 @@ void debug_imgui::draw_bpoints(debug_area* view_ptr, bool* opened) ImGui::BeginChild("##break_output", ImVec2(ImGui::GetWindowWidth() - 16,ImGui::GetWindowHeight() - ImGui::GetTextLineHeight() - ImGui::GetCursorPosY())); // account for title bar and widgets already drawn ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0)); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0)); + // update view location, while the cursor is at 0,0. + view_ptr->ofs_x = ImGui::GetCursorScreenPos().x; + view_ptr->ofs_y = ImGui::GetCursorScreenPos().y; + view_ptr->has_focus = ImGui::IsWindowFocused(); for(y=0;yofs_x = ImGui::GetCursorScreenPos().x; + view_ptr->ofs_y = ImGui::GetCursorScreenPos().y; + view_ptr->view_width = ImGui::GetContentRegionMax().x; + view_ptr->view_height = ImGui::GetContentRegionMax().y; + view_ptr->has_focus = ImGui::IsWindowFocused(); for(y=0;yofs_x = ImGui::GetCursorScreenPos().x; + view_ptr->ofs_y = ImGui::GetCursorScreenPos().y; + view_ptr->view_width = ImGui::GetContentRegionMax().x; + view_ptr->view_height = ImGui::GetContentRegionMax().y; + view_ptr->has_focus = ImGui::IsWindowFocused(); for(y=0;yofs_x = ImGui::GetCursorScreenPos().x; + view_ptr->ofs_y = ImGui::GetCursorScreenPos().y; + view_ptr->view_width = ImGui::GetContentRegionMax().x; + view_ptr->view_height = ImGui::GetContentRegionMax().y; + view_ptr->has_focus = ImGui::IsWindowFocused(); for(y=0;yofs_x = ImGui::GetCursorScreenPos().x; + view_main_regs->ofs_y = ImGui::GetCursorScreenPos().y; + view_main_regs->view_width = ImGui::GetContentRegionMax().x; + view_main_regs->view_height = ImGui::GetContentRegionMax().y; + view_main_regs->has_focus = ImGui::IsWindowFocused(); for(y=0;yofs_x = ImGui::GetCursorScreenPos().x; + view_main_disasm->ofs_y = ImGui::GetCursorScreenPos().y; + view_main_disasm->view_width = ImGui::GetContentRegionMax().x; + view_main_disasm->view_height = ImGui::GetContentRegionMax().y; + view_main_disasm->has_focus = ImGui::IsWindowFocused(); for(y=0;yofs_x = ImGui::GetCursorScreenPos().x; + view_main_console->ofs_y = ImGui::GetCursorScreenPos().y; + view_main_console->view_width = ImGui::GetContentRegionMax().x; + view_main_console->view_height = ImGui::GetContentRegionMax().y; + view_main_console->has_focus = ImGui::IsWindowFocused(); for(y=0;y(m_machine->options()).video(),"bgfx") != 0) fatalerror("Error: ImGui debugger requires the BGFX renderer.\n"); @@ -1117,6 +1208,7 @@ void debug_imgui::wait_for_debugger(device_t &device, bool firststop) imguiBeginFrame(m_mouse_x,m_mouse_y,m_mouse_button ? IMGUI_MBUT_LEFT : 0, 0, width, height,m_key_char); update(); imguiEndFrame(); + handle_mouse_views(); device.machine().osd().update(false); } From ff27716bec51cad5f073019bee093a2deee6fc47 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 21 Apr 2016 15:21:08 +0200 Subject: [PATCH 06/16] compile just one chain with make shaders CHAIN=unfiltered --- makefile | 2 +- src/osd/modules/render/bgfx/shaders/makefile | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/makefile b/makefile index 18a6526375d..04db4cc6942 100644 --- a/makefile +++ b/makefile @@ -1589,7 +1589,7 @@ shaders: bgfx-tools -$(call MKDIR,build/bgfx/shaders/gles) -$(call MKDIR,build/bgfx/shaders/glsl) -$(call MKDIR,build/bgfx/shaders/metal) - $(SILENT) $(MAKE) -C $(SRC)/osd/modules/render/bgfx/shaders rebuild + $(SILENT) $(MAKE) -C $(SRC)/osd/modules/render/bgfx/shaders rebuild CHAIN="$(CHAIN)" #------------------------------------------------- # Translation diff --git a/src/osd/modules/render/bgfx/shaders/makefile b/src/osd/modules/render/bgfx/shaders/makefile index e5ee052ab31..70c1ac31127 100644 --- a/src/osd/modules/render/bgfx/shaders/makefile +++ b/src/osd/modules/render/bgfx/shaders/makefile @@ -6,8 +6,11 @@ include shader.mk SUBDIRS := $(patsubst .,,$(patsubst ./,,$(shell find . -type d))) - +ifneq ($(CHAIN),) +rebuild: chains/$(CHAIN) +else rebuild: main $(SUBDIRS) +endif $(SUBDIRS): @echo $@ From f5aa86dfc67b045cdf5044e0e38c369a98e06ca6 Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Thu, 21 Apr 2016 15:47:50 +0200 Subject: [PATCH 07/16] Checkpoint 1, nw --- bgfx/chains/default.json | 2 +- bgfx/chains/hlsl.json | 4 +- bgfx/chains/hq2x.json | 2 +- bgfx/chains/hq3x.json | 2 +- bgfx/chains/hq4x.json | 2 +- bgfx/chains/pillarbox_left_horizontal.json | 6 +- bgfx/chains/pillarbox_left_vertical.json | 6 +- bgfx/chains/pillarbox_right_horizontal.json | 6 +- bgfx/chains/pillarbox_right_vertical.json | 6 +- bgfx/chains/super-2xbr-3d-2p.json | 69 +++++ bgfx/chains/super-2xbr-3d-3p-smoother.json | 78 ++++++ bgfx/chains/super-4xbr-3d-4p.json | 86 ++++++ bgfx/chains/super-4xbr-3d-6p-smoother.json | 86 ++++++ bgfx/chains/super-xbr-2p.json | 76 +++++ bgfx/chains/super-xbr-3p-smoother.json | 84 ++++++ bgfx/chains/super-xbr-6p.json | 123 +++++++++ bgfx/chains/super-xbr-deposterize.json | 98 +++++++ bgfx/chains/super-xbr-fast-3p.json | 76 +++++ bgfx/chains/super-xbr-fast-6p.json | 113 ++++++++ bgfx/chains/supereagle.json | 2 +- bgfx/chains/unfiltered.json | 4 +- bgfx/effects/hq3x/blit.json | 121 -------- bgfx/effects/hq4x/blit.json | 121 -------- bgfx/effects/{hq2x => misc}/blit.json | 4 +- bgfx/effects/misc/deposterize-pass0.json | 37 +++ bgfx/effects/misc/deposterize-pass1.json | 37 +++ .../saturation.json | 4 +- .../pillarbox_left_horizontal/blit.json | 121 -------- .../pillarbox_left_horizontal/saturation.json | 30 -- .../effects/pillarbox_left_vertical/blit.json | 121 -------- .../pillarbox_right_horizontal/blit.json | 121 -------- .../saturation.json | 30 -- .../pillarbox_right_vertical/blit.json | 121 -------- .../pillarbox_right_vertical/saturation.json | 30 -- .../xbr/super-xbr/custom-jinc2-sharper.json | 38 +++ .../xbr/super-xbr/super-2xbr-3d-pass0.json | 58 ++++ .../xbr/super-xbr/super-2xbr-3d-pass1.json | 59 ++++ .../xbr/super-xbr/super-2xbr-3d-pass2.json | 59 ++++ .../xbr/super-xbr/super-4xbr-3d-pass0.json | 58 ++++ .../xbr/super-xbr/super-4xbr-3d-pass1.json | 59 ++++ .../xbr/super-xbr/super-4xbr-3d-pass2.json | 58 ++++ .../xbr/super-xbr/super-4xbr-3d-pass3.json | 59 ++++ .../xbr/super-xbr/super-xbr-fast-pass0.json | 58 ++++ .../xbr/super-xbr/super-xbr-fast-pass1.json | 58 ++++ .../xbr/super-xbr/super-xbr-fast-pass2.json | 58 ++++ .../xbr/super-xbr/super-xbr-pass0.json | 58 ++++ .../xbr/super-xbr/super-xbr-pass1.json | 59 ++++ .../xbr/super-xbr/super-xbr-pass2.json | 58 ++++ .../dx11/chains/{hlsl => misc}/fs_blit.bin | Bin .../misc/fs_bob-and-ghost-deinterlace.bin | Bin 0 -> 1451 bytes .../dx11/chains/misc/fs_deposterize-pass0.bin | Bin 0 -> 1296 bytes .../dx11/chains/misc/fs_deposterize-pass1.bin | Bin 0 -> 1296 bytes .../fs_saturation.bin | Bin .../dx11/chains/{hlsl => misc}/vs_blit.bin | Bin .../vs_bob-and-ghost-deinterlace.bin} | Bin .../dx11/chains/misc/vs_deposterize-pass0.bin | Bin 0 -> 817 bytes .../dx11/chains/misc/vs_deposterize-pass1.bin | Bin 0 -> 817 bytes .../vs_saturation.bin | Bin .../pillarbox_left_vertical/fs_saturation.bin | Bin 523 -> 0 bytes .../fs_saturation.bin | Bin 523 -> 0 bytes .../fs_saturation.bin | Bin 523 -> 0 bytes .../{hq2x => super-4xbr-3d-4p}/fs_blit.bin | Bin .../{hq3x => super-4xbr-3d-4p}/vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../chains/{hq4x => xbr-hybrid}/fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin} | Bin 615 -> 575 bytes .../chains/xbr-lv2-deposterize/fs_blit.bin | Bin 0 -> 396 bytes .../vs_blit.bin} | Bin 615 -> 575 bytes .../dx11/chains/xbr-lv2-fast/fs_blit.bin | Bin 0 -> 396 bytes .../vs_blit.bin} | Bin 615 -> 575 bytes .../dx11/chains/xbr-lv2-multipass/fs_blit.bin | Bin 0 -> 396 bytes .../dx11/chains/xbr-lv2-multipass/vs_blit.bin | Bin 0 -> 575 bytes .../dx11/chains/xbr-lv2-noblend/fs_blit.bin | Bin 0 -> 396 bytes .../dx11/chains/xbr-lv2-noblend/vs_blit.bin | Bin 0 -> 575 bytes .../dx11/chains/xbr-lv3-multipass/fs_blit.bin | Bin 0 -> 396 bytes .../dx11/chains/xbr-lv3-multipass/vs_blit.bin | Bin 0 -> 575 bytes .../dx11/chains/xbr-lv3-noblend/fs_blit.bin | Bin 0 -> 396 bytes .../dx11/chains/xbr-lv3-noblend/vs_blit.bin | Bin 0 -> 575 bytes bgfx/shaders/dx11/chains/xbr-lv3/fs_blit.bin | Bin 0 -> 396 bytes bgfx/shaders/dx11/chains/xbr-lv3/vs_blit.bin | Bin 0 -> 575 bytes .../dx11/chains/xbr-mlv4-dilation/fs_blit.bin | Bin 0 -> 396 bytes .../dx11/chains/xbr-mlv4-dilation/vs_blit.bin | Bin 0 -> 575 bytes .../chains/xbr-mlv4-multipass/fs_blit.bin | Bin 0 -> 396 bytes .../chains/xbr-mlv4-multipass/vs_blit.bin | Bin 0 -> 575 bytes .../dx11/chains/xbr/fs_xbr-lv1-noblend.bin | Bin 0 -> 3680 bytes .../shaders/dx11/chains/xbr/fs_xbr-lv2-3d.bin | Bin 0 -> 9531 bytes .../dx11/chains/xbr/fs_xbr-lv2-fast.bin | Bin 0 -> 4949 bytes bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2.bin | Bin 0 -> 5885 bytes .../xbr/super-xbr/fs_custom-jinc2-sharper.bin | Bin 0 -> 5497 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass0.bin | Bin 0 -> 7650 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass1.bin | Bin 0 -> 7649 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass2.bin | Bin 0 -> 6949 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass0.bin | Bin 0 -> 7662 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1.bin | Bin 0 -> 7661 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin | Bin 0 -> 6961 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass2.bin | Bin 0 -> 7650 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3.bin | Bin 0 -> 7649 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin | Bin 0 -> 6949 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass0.bin | Bin 0 -> 4342 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass1.bin | Bin 0 -> 4262 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass2.bin | Bin 0 -> 4118 bytes .../xbr/super-xbr/fs_super-xbr-pass0.bin | Bin 0 -> 5256 bytes .../xbr/super-xbr/fs_super-xbr-pass1.bin | Bin 0 -> 5921 bytes .../xbr/super-xbr/fs_super-xbr-pass2.bin | Bin 0 -> 4840 bytes .../xbr/super-xbr/vs_custom-jinc2-sharper.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass0.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass1.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass2.bin | Bin 0 -> 1093 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass0.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin | Bin 0 -> 1093 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass2.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin | Bin 0 -> 1093 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass0.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass1.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass2.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-xbr-pass0.bin | Bin 0 -> 1053 bytes .../xbr/super-xbr/vs_super-xbr-pass1.bin | Bin 0 -> 575 bytes .../xbr/super-xbr/vs_super-xbr-pass2.bin | Bin 0 -> 1093 bytes .../xbr/super-xbr/vs_super-xbr-pass3.bin | Bin 0 -> 1093 bytes .../dx11/chains/xbr/vs_xbr-lv1-noblend.bin | Bin 0 -> 729 bytes .../shaders/dx11/chains/xbr/vs_xbr-lv2-3d.bin | Bin 0 -> 711 bytes .../dx11/chains/xbr/vs_xbr-lv2-fast.bin | Bin 0 -> 909 bytes bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2.bin | Bin 0 -> 1337 bytes .../dx9/chains/{hlsl => misc}/fs_blit.bin | Bin .../misc/fs_bob-and-ghost-deinterlace.bin | Bin 0 -> 1168 bytes .../dx9/chains/misc/fs_deposterize-pass0.bin | Bin 0 -> 897 bytes .../dx9/chains/misc/fs_deposterize-pass1.bin | Bin 0 -> 897 bytes .../fs_saturation.bin | Bin .../dx9/chains/{hlsl => misc}/vs_blit.bin | Bin .../vs_bob-and-ghost-deinterlace.bin} | Bin .../dx9/chains/misc/vs_deposterize-pass0.bin | Bin 0 -> 500 bytes .../dx9/chains/misc/vs_deposterize-pass1.bin | Bin 0 -> 500 bytes .../vs_saturation.bin | Bin .../pillarbox_left_vertical/fs_saturation.bin | Bin 372 -> 0 bytes .../fs_saturation.bin | Bin 372 -> 0 bytes .../fs_saturation.bin | Bin 372 -> 0 bytes .../{hq2x => super-4xbr-3d-4p}/fs_blit.bin | Bin .../{hq3x => super-4xbr-3d-4p}/vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../chains/{hq4x => xbr-hybrid}/fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin} | Bin 362 -> 330 bytes .../chains/xbr-lv2-deposterize/fs_blit.bin | Bin 0 -> 241 bytes .../vs_blit.bin} | Bin 362 -> 330 bytes .../dx9/chains/xbr-lv2-fast/fs_blit.bin | Bin 0 -> 241 bytes .../vs_blit.bin} | Bin 362 -> 330 bytes .../dx9/chains/xbr-lv2-multipass/fs_blit.bin | Bin 0 -> 241 bytes .../dx9/chains/xbr-lv2-multipass/vs_blit.bin | Bin 0 -> 330 bytes .../dx9/chains/xbr-lv2-noblend/fs_blit.bin | Bin 0 -> 241 bytes .../dx9/chains/xbr-lv2-noblend/vs_blit.bin | Bin 0 -> 330 bytes .../dx9/chains/xbr-lv3-multipass/fs_blit.bin | Bin 0 -> 241 bytes .../dx9/chains/xbr-lv3-multipass/vs_blit.bin | Bin 0 -> 330 bytes .../dx9/chains/xbr-lv3-noblend/fs_blit.bin | Bin 0 -> 241 bytes .../dx9/chains/xbr-lv3-noblend/vs_blit.bin | Bin 0 -> 330 bytes bgfx/shaders/dx9/chains/xbr-lv3/fs_blit.bin | Bin 0 -> 241 bytes bgfx/shaders/dx9/chains/xbr-lv3/vs_blit.bin | Bin 0 -> 330 bytes .../dx9/chains/xbr-mlv4-dilation/fs_blit.bin | Bin 0 -> 241 bytes .../dx9/chains/xbr-mlv4-dilation/vs_blit.bin | Bin 0 -> 330 bytes .../dx9/chains/xbr-mlv4-multipass/fs_blit.bin | Bin 0 -> 241 bytes .../dx9/chains/xbr-mlv4-multipass/vs_blit.bin | Bin 0 -> 330 bytes .../dx9/chains/xbr/fs_xbr-lv1-noblend.bin | Bin 0 -> 2273 bytes bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-3d.bin | Bin 0 -> 5152 bytes .../dx9/chains/xbr/fs_xbr-lv2-fast.bin | Bin 0 -> 2842 bytes bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2.bin | Bin 0 -> 3354 bytes .../xbr/super-xbr/fs_custom-jinc2-sharper.bin | Bin 0 -> 4974 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass0.bin | Bin 0 -> 4215 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass1.bin | Bin 0 -> 4142 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass2.bin | Bin 0 -> 3722 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass0.bin | Bin 0 -> 4235 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1.bin | Bin 0 -> 4230 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin | Bin 0 -> 3742 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass2.bin | Bin 0 -> 4215 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3.bin | Bin 0 -> 4142 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin | Bin 0 -> 3722 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass0.bin | Bin 0 -> 2459 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass1.bin | Bin 0 -> 2375 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass2.bin | Bin 0 -> 2287 bytes .../xbr/super-xbr/fs_super-xbr-pass0.bin | Bin 0 -> 2705 bytes .../xbr/super-xbr/fs_super-xbr-pass1.bin | Bin 0 -> 3242 bytes .../xbr/super-xbr/fs_super-xbr-pass2.bin | Bin 0 -> 2533 bytes .../xbr/super-xbr/vs_custom-jinc2-sharper.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass0.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass1.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass2.bin | Bin 0 -> 660 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass0.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin | Bin 0 -> 660 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass2.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin | Bin 0 -> 660 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass0.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass1.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass2.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-xbr-pass0.bin | Bin 0 -> 632 bytes .../xbr/super-xbr/vs_super-xbr-pass1.bin | Bin 0 -> 330 bytes .../xbr/super-xbr/vs_super-xbr-pass2.bin | Bin 0 -> 660 bytes .../xbr/super-xbr/vs_super-xbr-pass3.bin | Bin 0 -> 660 bytes .../dx9/chains/xbr/vs_xbr-lv1-noblend.bin | Bin 0 -> 492 bytes bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-3d.bin | Bin 0 -> 526 bytes .../dx9/chains/xbr/vs_xbr-lv2-fast.bin | Bin 0 -> 576 bytes bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2.bin | Bin 0 -> 780 bytes .../gles/chains/{hlsl => misc}/fs_blit.bin | Bin .../misc/fs_bob-and-ghost-deinterlace.bin | Bin 0 -> 1315 bytes .../gles/chains/misc/fs_deposterize-pass0.bin | Bin 0 -> 1533 bytes .../gles/chains/misc/fs_deposterize-pass1.bin | Bin 0 -> 1533 bytes .../fs_saturation.bin | Bin .../gles/chains/{hlsl => misc}/vs_blit.bin | Bin .../vs_bob-and-ghost-deinterlace.bin} | Bin .../gles/chains/misc/vs_deposterize-pass0.bin | Bin 0 -> 745 bytes .../gles/chains/misc/vs_deposterize-pass1.bin | Bin 0 -> 745 bytes .../vs_saturation.bin | Bin .../pillarbox_left_vertical/fs_saturation.bin | Bin 456 -> 0 bytes .../fs_saturation.bin | Bin 456 -> 0 bytes .../fs_saturation.bin | Bin 456 -> 0 bytes .../{hq2x => super-4xbr-3d-4p}/fs_blit.bin | Bin .../{hq3x => super-4xbr-3d-4p}/vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../chains/{hq4x => xbr-hybrid}/fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin} | Bin 458 -> 419 bytes .../chains/xbr-lv2-deposterize/fs_blit.bin | Bin 0 -> 238 bytes .../vs_blit.bin} | Bin 459 -> 419 bytes .../gles/chains/xbr-lv2-fast/fs_blit.bin | Bin 0 -> 238 bytes .../vs_blit.bin} | Bin 469 -> 419 bytes .../gles/chains/xbr-lv2-multipass/fs_blit.bin | Bin 0 -> 238 bytes .../gles/chains/xbr-lv2-multipass/vs_blit.bin | Bin 0 -> 419 bytes .../gles/chains/xbr-lv2-noblend/fs_blit.bin | Bin 0 -> 238 bytes .../gles/chains/xbr-lv2-noblend/vs_blit.bin | Bin 0 -> 419 bytes .../gles/chains/xbr-lv3-multipass/fs_blit.bin | Bin 0 -> 238 bytes .../gles/chains/xbr-lv3-multipass/vs_blit.bin | Bin 0 -> 419 bytes .../gles/chains/xbr-lv3-noblend/fs_blit.bin | Bin 0 -> 238 bytes .../gles/chains/xbr-lv3-noblend/vs_blit.bin | Bin 0 -> 419 bytes bgfx/shaders/gles/chains/xbr-lv3/fs_blit.bin | Bin 0 -> 238 bytes bgfx/shaders/gles/chains/xbr-lv3/vs_blit.bin | Bin 0 -> 419 bytes .../gles/chains/xbr-mlv4-dilation/fs_blit.bin | Bin 0 -> 238 bytes .../gles/chains/xbr-mlv4-dilation/vs_blit.bin | Bin 0 -> 419 bytes .../chains/xbr-mlv4-multipass/fs_blit.bin | Bin 0 -> 238 bytes .../chains/xbr-mlv4-multipass/vs_blit.bin | Bin 0 -> 419 bytes .../gles/chains/xbr/fs_xbr-lv1-noblend.bin | Bin 0 -> 5350 bytes .../shaders/gles/chains/xbr/fs_xbr-lv2-3d.bin | Bin 0 -> 9638 bytes .../gles/chains/xbr/fs_xbr-lv2-fast.bin | Bin 0 -> 5304 bytes bgfx/shaders/gles/chains/xbr/fs_xbr-lv2.bin | Bin 0 -> 6336 bytes .../xbr/super-xbr/fs_custom-jinc2-sharper.bin | Bin 0 -> 7321 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass0.bin | Bin 0 -> 8621 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass1.bin | Bin 0 -> 8690 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass2.bin | Bin 0 -> 8095 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass0.bin | Bin 0 -> 8621 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1.bin | Bin 0 -> 8678 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin | Bin 0 -> 8083 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass2.bin | Bin 0 -> 8621 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3.bin | Bin 0 -> 8678 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin | Bin 0 -> 8083 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass0.bin | Bin 0 -> 5137 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass1.bin | Bin 0 -> 4707 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass2.bin | Bin 0 -> 4786 bytes .../xbr/super-xbr/fs_super-xbr-pass0.bin | Bin 0 -> 6315 bytes .../xbr/super-xbr/fs_super-xbr-pass1.bin | Bin 0 -> 7656 bytes .../xbr/super-xbr/fs_super-xbr-pass2.bin | Bin 0 -> 6037 bytes .../xbr/super-xbr/vs_custom-jinc2-sharper.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass0.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass1.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass2.bin | Bin 0 -> 1415 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass0.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin | Bin 0 -> 1415 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass2.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin | Bin 0 -> 1415 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass0.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass1.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass2.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-xbr-pass0.bin | Bin 0 -> 1436 bytes .../xbr/super-xbr/vs_super-xbr-pass1.bin | Bin 0 -> 419 bytes .../xbr/super-xbr/vs_super-xbr-pass2.bin | Bin 0 -> 1415 bytes .../xbr/super-xbr/vs_super-xbr-pass3.bin | Bin 0 -> 1415 bytes .../gles/chains/xbr/vs_xbr-lv1-noblend.bin | Bin 0 -> 765 bytes .../shaders/gles/chains/xbr/vs_xbr-lv2-3d.bin | Bin 0 -> 745 bytes .../gles/chains/xbr/vs_xbr-lv2-fast.bin | Bin 0 -> 1178 bytes bgfx/shaders/gles/chains/xbr/vs_xbr-lv2.bin | Bin 0 -> 2087 bytes .../glsl/chains/{hlsl => misc}/fs_blit.bin | Bin .../misc/fs_bob-and-ghost-deinterlace.bin | Bin 0 -> 1212 bytes .../glsl/chains/misc/fs_deposterize-pass0.bin | Bin 0 -> 1485 bytes .../glsl/chains/misc/fs_deposterize-pass1.bin | Bin 0 -> 1485 bytes .../fs_saturation.bin | Bin .../glsl/chains/{hlsl => misc}/vs_blit.bin | Bin .../vs_bob-and-ghost-deinterlace.bin} | Bin .../glsl/chains/misc/vs_deposterize-pass0.bin | Bin 0 -> 679 bytes .../glsl/chains/misc/vs_deposterize-pass1.bin | Bin 0 -> 679 bytes .../vs_saturation.bin | Bin .../pillarbox_left_vertical/fs_saturation.bin | Bin 429 -> 0 bytes .../fs_saturation.bin | Bin 429 -> 0 bytes .../fs_saturation.bin | Bin 429 -> 0 bytes .../{hq2x => super-4xbr-3d-4p}/fs_blit.bin | Bin .../{hq3x => super-4xbr-3d-4p}/vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../chains/{hq4x => xbr-hybrid}/fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin} | Bin 416 -> 377 bytes .../chains/xbr-lv2-deposterize/fs_blit.bin | Bin 0 -> 181 bytes .../vs_blit.bin} | Bin 417 -> 377 bytes .../glsl/chains/xbr-lv2-fast/fs_blit.bin | Bin 0 -> 181 bytes .../vs_blit.bin} | Bin 427 -> 377 bytes .../glsl/chains/xbr-lv2-multipass/fs_blit.bin | Bin 0 -> 181 bytes .../glsl/chains/xbr-lv2-multipass/vs_blit.bin | Bin 0 -> 377 bytes .../glsl/chains/xbr-lv2-noblend/fs_blit.bin | Bin 0 -> 181 bytes .../glsl/chains/xbr-lv2-noblend/vs_blit.bin | Bin 0 -> 377 bytes .../glsl/chains/xbr-lv3-multipass/fs_blit.bin | Bin 0 -> 181 bytes .../glsl/chains/xbr-lv3-multipass/vs_blit.bin | Bin 0 -> 377 bytes .../glsl/chains/xbr-lv3-noblend/fs_blit.bin | Bin 0 -> 181 bytes .../glsl/chains/xbr-lv3-noblend/vs_blit.bin | Bin 0 -> 377 bytes bgfx/shaders/glsl/chains/xbr-lv3/fs_blit.bin | Bin 0 -> 181 bytes bgfx/shaders/glsl/chains/xbr-lv3/vs_blit.bin | Bin 0 -> 377 bytes .../glsl/chains/xbr-mlv4-dilation/fs_blit.bin | Bin 0 -> 181 bytes .../glsl/chains/xbr-mlv4-dilation/vs_blit.bin | Bin 0 -> 377 bytes .../chains/xbr-mlv4-multipass/fs_blit.bin | Bin 0 -> 181 bytes .../chains/xbr-mlv4-multipass/vs_blit.bin | Bin 0 -> 377 bytes .../glsl/chains/xbr/fs_xbr-lv1-noblend.bin | Bin 0 -> 5185 bytes .../shaders/glsl/chains/xbr/fs_xbr-lv2-3d.bin | Bin 0 -> 9322 bytes .../glsl/chains/xbr/fs_xbr-lv2-fast.bin | Bin 0 -> 5100 bytes bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2.bin | Bin 0 -> 6083 bytes .../xbr/super-xbr/fs_custom-jinc2-sharper.bin | Bin 0 -> 7003 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass0.bin | Bin 0 -> 8237 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass1.bin | Bin 0 -> 8288 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass2.bin | Bin 0 -> 7741 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass0.bin | Bin 0 -> 8237 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1.bin | Bin 0 -> 8276 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin | Bin 0 -> 7729 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass2.bin | Bin 0 -> 8237 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3.bin | Bin 0 -> 8276 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin | Bin 0 -> 7729 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass0.bin | Bin 0 -> 4866 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass1.bin | Bin 0 -> 4476 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass2.bin | Bin 0 -> 4572 bytes .../xbr/super-xbr/fs_super-xbr-pass0.bin | Bin 0 -> 6026 bytes .../xbr/super-xbr/fs_super-xbr-pass1.bin | Bin 0 -> 7216 bytes .../xbr/super-xbr/fs_super-xbr-pass2.bin | Bin 0 -> 5748 bytes .../xbr/super-xbr/vs_custom-jinc2-sharper.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass0.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass1.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass2.bin | Bin 0 -> 1301 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass0.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin | Bin 0 -> 1301 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass2.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin | Bin 0 -> 1301 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass0.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass1.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass2.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-xbr-pass0.bin | Bin 0 -> 1322 bytes .../xbr/super-xbr/vs_super-xbr-pass1.bin | Bin 0 -> 377 bytes .../xbr/super-xbr/vs_super-xbr-pass2.bin | Bin 0 -> 1301 bytes .../xbr/super-xbr/vs_super-xbr-pass3.bin | Bin 0 -> 1301 bytes .../glsl/chains/xbr/vs_xbr-lv1-noblend.bin | Bin 0 -> 693 bytes .../shaders/glsl/chains/xbr/vs_xbr-lv2-3d.bin | Bin 0 -> 673 bytes .../glsl/chains/xbr/vs_xbr-lv2-fast.bin | Bin 0 -> 1082 bytes bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2.bin | Bin 0 -> 1937 bytes .../metal/chains/{hlsl => misc}/fs_blit.bin | Bin .../misc/fs_bob-and-ghost-deinterlace.bin | Bin 0 -> 2125 bytes .../chains/misc/fs_deposterize-pass0.bin | Bin 0 -> 1959 bytes .../chains/misc/fs_deposterize-pass1.bin | Bin 0 -> 1959 bytes .../fs_saturation.bin | Bin .../metal/chains/{hlsl => misc}/vs_blit.bin | Bin .../vs_bob-and-ghost-deinterlace.bin} | Bin .../chains/misc/vs_deposterize-pass0.bin | Bin 0 -> 1062 bytes .../chains/misc/vs_deposterize-pass1.bin | Bin 0 -> 1062 bytes .../vs_saturation.bin | Bin .../{hq2x => super-4xbr-3d-4p}/fs_blit.bin | Bin .../{hq3x => super-4xbr-3d-4p}/vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../chains/{hq4x => xbr-hybrid}/fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin | Bin .../fs_blit.bin | Bin .../vs_blit.bin} | Bin 800 -> 757 bytes .../fs_blit.bin} | Bin 832 -> 634 bytes .../vs_blit.bin} | Bin 801 -> 757 bytes .../fs_blit.bin} | Bin 832 -> 634 bytes .../vs_blit.bin} | Bin 811 -> 757 bytes .../fs_blit.bin} | Bin 832 -> 634 bytes .../chains/xbr-lv2-multipass/vs_blit.bin | Bin 0 -> 757 bytes .../metal/chains/xbr-lv2-noblend/fs_blit.bin | Bin 0 -> 634 bytes .../metal/chains/xbr-lv2-noblend/vs_blit.bin | Bin 0 -> 757 bytes .../chains/xbr-lv3-multipass/fs_blit.bin | Bin 0 -> 634 bytes .../chains/xbr-lv3-multipass/vs_blit.bin | Bin 0 -> 757 bytes .../metal/chains/xbr-lv3-noblend/fs_blit.bin | Bin 0 -> 634 bytes .../metal/chains/xbr-lv3-noblend/vs_blit.bin | Bin 0 -> 757 bytes bgfx/shaders/metal/chains/xbr-lv3/fs_blit.bin | Bin 0 -> 634 bytes bgfx/shaders/metal/chains/xbr-lv3/vs_blit.bin | Bin 0 -> 757 bytes .../chains/xbr-mlv4-dilation/fs_blit.bin | Bin 0 -> 634 bytes .../chains/xbr-mlv4-dilation/vs_blit.bin | Bin 0 -> 757 bytes .../chains/xbr-mlv4-multipass/fs_blit.bin | Bin 0 -> 634 bytes .../chains/xbr-mlv4-multipass/vs_blit.bin | Bin 0 -> 757 bytes .../metal/chains/xbr/fs_xbr-lv1-noblend.bin | Bin 0 -> 7102 bytes .../metal/chains/xbr/fs_xbr-lv2-3d.bin | Bin 0 -> 13797 bytes .../metal/chains/xbr/fs_xbr-lv2-fast.bin | Bin 0 -> 6167 bytes bgfx/shaders/metal/chains/xbr/fs_xbr-lv2.bin | Bin 0 -> 8213 bytes .../xbr/super-xbr/fs_custom-jinc2-sharper.bin | Bin 0 -> 9524 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass0.bin | Bin 0 -> 10804 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass1.bin | Bin 0 -> 11091 bytes .../xbr/super-xbr/fs_super-2xbr-3d-pass2.bin | Bin 0 -> 9868 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass0.bin | Bin 0 -> 10804 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1.bin | Bin 0 -> 11035 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin | Bin 0 -> 9856 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass2.bin | Bin 0 -> 10804 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3.bin | Bin 0 -> 11035 bytes .../xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin | Bin 0 -> 9856 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass0.bin | Bin 0 -> 6833 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass1.bin | Bin 0 -> 6431 bytes .../xbr/super-xbr/fs_super-xbr-fast-pass2.bin | Bin 0 -> 6329 bytes .../xbr/super-xbr/fs_super-xbr-pass0.bin | Bin 0 -> 7191 bytes .../xbr/super-xbr/fs_super-xbr-pass1.bin | Bin 0 -> 9229 bytes .../xbr/super-xbr/fs_super-xbr-pass2.bin | Bin 0 -> 6889 bytes .../xbr/super-xbr/vs_custom-jinc2-sharper.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass0.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass1.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-2xbr-3d-pass2.bin | Bin 0 -> 1720 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass0.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin | Bin 0 -> 1720 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass2.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin | Bin 0 -> 1720 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass0.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass1.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-xbr-fast-pass2.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-xbr-pass0.bin | Bin 0 -> 1739 bytes .../xbr/super-xbr/vs_super-xbr-pass1.bin | Bin 0 -> 757 bytes .../xbr/super-xbr/vs_super-xbr-pass2.bin | Bin 0 -> 1720 bytes .../xbr/super-xbr/vs_super-xbr-pass3.bin | Bin 0 -> 1720 bytes .../metal/chains/xbr/vs_xbr-lv1-noblend.bin | Bin 0 -> 1074 bytes .../metal/chains/xbr/vs_xbr-lv2-3d.bin | Bin 0 -> 1036 bytes .../metal/chains/xbr/vs_xbr-lv2-fast.bin | Bin 0 -> 1487 bytes bgfx/shaders/metal/chains/xbr/vs_xbr-lv2.bin | Bin 0 -> 2390 bytes src/osd/modules/render/bgfx/chainmanager.cpp | 52 +++- src/osd/modules/render/bgfx/chainmanager.h | 4 + .../shaders/chains/{hlsl => misc}/fs_blit.sc | 0 .../misc/fs_bob-and-ghost-deinterlace.sc | 55 ++++ .../chains/misc/fs_deposterize-pass0.sc | 45 +++ .../chains/misc/fs_deposterize-pass1.sc | 45 +++ .../fs_saturation.sc | 0 .../bgfx/shaders/chains/misc/varying.def.sc | 7 + .../shaders/chains/{hlsl => misc}/vs_blit.sc | 0 .../vs_bob-and-ghost-deinterlace.sc} | 0 .../chains/misc/vs_deposterize-pass0.sc | 30 ++ .../chains/misc/vs_deposterize-pass1.sc | 30 ++ .../vs_saturation.sc | 0 .../pillarbox_left_vertical/fs_saturation.sc | 25 -- .../fs_saturation.sc | 25 -- .../pillarbox_right_vertical/fs_saturation.sc | 25 -- .../{hq2x => super-4xbr-3d-4p}/fs_blit.sc | 0 .../chains/super-4xbr-3d-4p/varying.def.sc | 10 + .../{hq3x => super-4xbr-3d-4p}/vs_blit.sc | 0 .../fs_blit.sc | 0 .../super-4xbr-3d-6p-smoother/varying.def.sc | 10 + .../vs_blit.sc | 0 .../chains/{hq4x => xbr-hybrid}/fs_blit.sc | 0 .../shaders/chains/xbr-hybrid/varying.def.sc | 10 + .../vs_blit.sc | 0 .../fs_blit.sc | 0 .../chains/xbr-lv1-noblend/varying.def.sc | 10 + .../vs_blit.sc | 0 .../fs_blit.sc | 0 .../shaders/chains/xbr-lv2-3d/varying.def.sc | 10 + .../vs_blit.sc | 0 .../fs_blit.sc | 0 .../xbr-lv2-accuracy-multipass/varying.def.sc | 10 + .../vs_blit.sc | 0 .../fs_blit.sc | 0 .../varying.def.sc | 10 + .../vs_blit.sc} | 2 +- .../chains/xbr-lv2-deposterize/fs_blit.sc | 14 + .../chains/xbr-lv2-deposterize/varying.def.sc | 10 + .../vs_blit.sc} | 2 +- .../shaders/chains/xbr-lv2-fast/fs_blit.sc | 14 + .../chains/xbr-lv2-fast/varying.def.sc | 10 + .../vs_blit.sc} | 2 +- .../chains/xbr-lv2-multipass/fs_blit.sc | 14 + .../chains/xbr-lv2-multipass/varying.def.sc | 10 + .../chains/xbr-lv2-multipass/vs_blit.sc | 14 + .../shaders/chains/xbr-lv2-noblend/fs_blit.sc | 14 + .../chains/xbr-lv2-noblend/varying.def.sc | 10 + .../shaders/chains/xbr-lv2-noblend/vs_blit.sc | 14 + .../chains/xbr-lv3-multipass/fs_blit.sc | 14 + .../chains/xbr-lv3-multipass/varying.def.sc | 10 + .../chains/xbr-lv3-multipass/vs_blit.sc | 14 + .../shaders/chains/xbr-lv3-noblend/fs_blit.sc | 14 + .../chains/xbr-lv3-noblend/varying.def.sc | 10 + .../shaders/chains/xbr-lv3-noblend/vs_blit.sc | 14 + .../bgfx/shaders/chains/xbr-lv3/fs_blit.sc | 14 + .../shaders/chains/xbr-lv3/varying.def.sc | 10 + .../bgfx/shaders/chains/xbr-lv3/vs_blit.sc | 14 + .../chains/xbr-mlv4-dilation/fs_blit.sc | 14 + .../chains/xbr-mlv4-dilation/varying.def.sc | 10 + .../chains/xbr-mlv4-dilation/vs_blit.sc | 14 + .../chains/xbr-mlv4-multipass/fs_blit.sc | 14 + .../chains/xbr-mlv4-multipass/varying.def.sc | 10 + .../chains/xbr-mlv4-multipass/vs_blit.sc | 14 + .../shaders/chains/xbr/fs_xbr-lv1-noblend.sc | 132 +++++++++ .../bgfx/shaders/chains/xbr/fs_xbr-lv2-3d.sc | 260 ++++++++++++++++++ .../shaders/chains/xbr/fs_xbr-lv2-fast.sc | 201 ++++++++++++++ .../bgfx/shaders/chains/xbr/fs_xbr-lv2.sc | 229 +++++++++++++++ .../xbr/super-xbr/fs_custom-jinc2-sharper.sc | 134 +++++++++ .../xbr/super-xbr/fs_super-2xbr-3d-pass0.sc | 227 +++++++++++++++ .../xbr/super-xbr/fs_super-2xbr-3d-pass1.sc | 211 ++++++++++++++ .../xbr/super-xbr/fs_super-2xbr-3d-pass2.sc | 213 ++++++++++++++ .../xbr/super-xbr/fs_super-4xbr-3d-pass0.sc | 217 +++++++++++++++ .../xbr/super-xbr/fs_super-4xbr-3d-pass1.sc | 210 ++++++++++++++ .../xbr/super-xbr/fs_super-4xbr-3d-pass1f.sc | 211 ++++++++++++++ .../xbr/super-xbr/fs_super-4xbr-3d-pass2.sc | 226 +++++++++++++++ .../xbr/super-xbr/fs_super-4xbr-3d-pass3.sc | 210 ++++++++++++++ .../xbr/super-xbr/fs_super-4xbr-3d-pass3f.sc | 211 ++++++++++++++ .../xbr/super-xbr/fs_super-xbr-fast-pass0.sc | 169 ++++++++++++ .../xbr/super-xbr/fs_super-xbr-fast-pass1.sc | 159 +++++++++++ .../xbr/super-xbr/fs_super-xbr-fast-pass2.sc | 162 +++++++++++ .../xbr/super-xbr/fs_super-xbr-pass0.sc | 160 +++++++++++ .../xbr/super-xbr/fs_super-xbr-pass1.sc | 178 ++++++++++++ .../xbr/super-xbr/fs_super-xbr-pass2.sc | 170 ++++++++++++ .../chains/xbr/super-xbr/varying.def.sc | 10 + .../xbr/super-xbr/vs_custom-jinc2-sharper.sc | 14 + .../xbr/super-xbr/vs_super-2xbr-3d-pass0.sc | 14 + .../xbr/super-xbr/vs_super-2xbr-3d-pass1.sc | 14 + .../xbr/super-xbr/vs_super-2xbr-3d-pass2.sc | 50 ++++ .../xbr/super-xbr/vs_super-4xbr-3d-pass0.sc | 14 + .../xbr/super-xbr/vs_super-4xbr-3d-pass1.sc | 14 + .../xbr/super-xbr/vs_super-4xbr-3d-pass1f.sc | 24 ++ .../xbr/super-xbr/vs_super-4xbr-3d-pass2.sc | 14 + .../xbr/super-xbr/vs_super-4xbr-3d-pass3.sc | 14 + .../xbr/super-xbr/vs_super-4xbr-3d-pass3f.sc | 24 ++ .../xbr/super-xbr/vs_super-xbr-fast-pass0.sc | 40 +++ .../xbr/super-xbr/vs_super-xbr-fast-pass1.sc | 40 +++ .../xbr/super-xbr/vs_super-xbr-fast-pass2.sc | 40 +++ .../xbr/super-xbr/vs_super-xbr-pass0.sc | 50 ++++ .../xbr/super-xbr/vs_super-xbr-pass1.sc | 40 +++ .../xbr/super-xbr/vs_super-xbr-pass2.sc | 50 ++++ .../xbr/super-xbr/vs_super-xbr-pass3.sc | 50 ++++ .../bgfx/shaders/chains/xbr/varying.def.sc | 13 + .../shaders/chains/xbr/vs_xbr-lv1-noblend.sc | 22 ++ .../bgfx/shaders/chains/xbr/vs_xbr-lv2-3d.sc | 23 ++ .../shaders/chains/xbr/vs_xbr-lv2-fast.sc | 29 ++ .../bgfx/shaders/chains/xbr/vs_xbr-lv2.sc | 27 ++ 582 files changed, 6955 insertions(+), 924 deletions(-) create mode 100644 bgfx/chains/super-2xbr-3d-2p.json create mode 100644 bgfx/chains/super-2xbr-3d-3p-smoother.json create mode 100644 bgfx/chains/super-4xbr-3d-4p.json create mode 100644 bgfx/chains/super-4xbr-3d-6p-smoother.json create mode 100644 bgfx/chains/super-xbr-2p.json create mode 100644 bgfx/chains/super-xbr-3p-smoother.json create mode 100644 bgfx/chains/super-xbr-6p.json create mode 100644 bgfx/chains/super-xbr-deposterize.json create mode 100644 bgfx/chains/super-xbr-fast-3p.json create mode 100644 bgfx/chains/super-xbr-fast-6p.json delete mode 100644 bgfx/effects/hq3x/blit.json delete mode 100644 bgfx/effects/hq4x/blit.json rename bgfx/effects/{hq2x => misc}/blit.json (98%) create mode 100644 bgfx/effects/misc/deposterize-pass0.json create mode 100644 bgfx/effects/misc/deposterize-pass1.json rename bgfx/effects/{pillarbox_left_vertical => misc}/saturation.json (85%) delete mode 100644 bgfx/effects/pillarbox_left_horizontal/blit.json delete mode 100644 bgfx/effects/pillarbox_left_horizontal/saturation.json delete mode 100644 bgfx/effects/pillarbox_left_vertical/blit.json delete mode 100644 bgfx/effects/pillarbox_right_horizontal/blit.json delete mode 100644 bgfx/effects/pillarbox_right_horizontal/saturation.json delete mode 100644 bgfx/effects/pillarbox_right_vertical/blit.json delete mode 100644 bgfx/effects/pillarbox_right_vertical/saturation.json create mode 100644 bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json create mode 100644 bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json create mode 100644 bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json create mode 100644 bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json create mode 100644 bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json create mode 100644 bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json create mode 100644 bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json create mode 100644 bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json create mode 100644 bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json create mode 100644 bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json create mode 100644 bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json create mode 100644 bgfx/effects/xbr/super-xbr/super-xbr-pass0.json create mode 100644 bgfx/effects/xbr/super-xbr/super-xbr-pass1.json create mode 100644 bgfx/effects/xbr/super-xbr/super-xbr-pass2.json rename bgfx/shaders/dx11/chains/{hlsl => misc}/fs_blit.bin (100%) create mode 100644 bgfx/shaders/dx11/chains/misc/fs_bob-and-ghost-deinterlace.bin create mode 100644 bgfx/shaders/dx11/chains/misc/fs_deposterize-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/misc/fs_deposterize-pass1.bin rename bgfx/shaders/dx11/chains/{pillarbox_left_horizontal => misc}/fs_saturation.bin (100%) rename bgfx/shaders/dx11/chains/{hlsl => misc}/vs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{hq2x/vs_blit.bin => misc/vs_bob-and-ghost-deinterlace.bin} (100%) create mode 100644 bgfx/shaders/dx11/chains/misc/vs_deposterize-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/misc/vs_deposterize-pass1.bin rename bgfx/shaders/dx11/chains/{pillarbox_left_vertical => misc}/vs_saturation.bin (100%) delete mode 100644 bgfx/shaders/dx11/chains/pillarbox_left_vertical/fs_saturation.bin delete mode 100644 bgfx/shaders/dx11/chains/pillarbox_right_horizontal/fs_saturation.bin delete mode 100644 bgfx/shaders/dx11/chains/pillarbox_right_vertical/fs_saturation.bin rename bgfx/shaders/dx11/chains/{hq2x => super-4xbr-3d-4p}/fs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{hq3x => super-4xbr-3d-4p}/vs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{hq3x => super-4xbr-3d-6p-smoother}/fs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{hq4x => super-4xbr-3d-6p-smoother}/vs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{hq4x => xbr-hybrid}/fs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_left_horizontal => xbr-hybrid}/vs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_left_horizontal => xbr-lv1-noblend}/fs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_left_vertical => xbr-lv1-noblend}/vs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_left_vertical => xbr-lv2-3d}/fs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_right_horizontal => xbr-lv2-3d}/vs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_right_horizontal => xbr-lv2-accuracy-multipass}/fs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-multipass}/vs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-smart-blur}/fs_blit.bin (100%) rename bgfx/shaders/dx11/chains/{pillarbox_left_horizontal/vs_saturation.bin => xbr-lv2-accuracy-smart-blur/vs_blit.bin} (63%) create mode 100644 bgfx/shaders/dx11/chains/xbr-lv2-deposterize/fs_blit.bin rename bgfx/shaders/dx11/chains/{pillarbox_right_horizontal/vs_saturation.bin => xbr-lv2-deposterize/vs_blit.bin} (63%) create mode 100644 bgfx/shaders/dx11/chains/xbr-lv2-fast/fs_blit.bin rename bgfx/shaders/dx11/chains/{pillarbox_right_vertical/vs_saturation.bin => xbr-lv2-fast/vs_blit.bin} (63%) create mode 100644 bgfx/shaders/dx11/chains/xbr-lv2-multipass/fs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv2-multipass/vs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv2-noblend/fs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv2-noblend/vs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv3-multipass/fs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv3-multipass/vs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv3-noblend/fs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv3-noblend/vs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv3/fs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-lv3/vs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-mlv4-dilation/fs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-mlv4-dilation/vs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-mlv4-multipass/fs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr-mlv4-multipass/vs_blit.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/fs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass3.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/vs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2.bin rename bgfx/shaders/dx9/chains/{hlsl => misc}/fs_blit.bin (100%) create mode 100644 bgfx/shaders/dx9/chains/misc/fs_bob-and-ghost-deinterlace.bin create mode 100644 bgfx/shaders/dx9/chains/misc/fs_deposterize-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/misc/fs_deposterize-pass1.bin rename bgfx/shaders/dx9/chains/{pillarbox_left_horizontal => misc}/fs_saturation.bin (100%) rename bgfx/shaders/dx9/chains/{hlsl => misc}/vs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{hq2x/vs_blit.bin => misc/vs_bob-and-ghost-deinterlace.bin} (100%) create mode 100644 bgfx/shaders/dx9/chains/misc/vs_deposterize-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/misc/vs_deposterize-pass1.bin rename bgfx/shaders/dx9/chains/{pillarbox_left_vertical => misc}/vs_saturation.bin (100%) delete mode 100644 bgfx/shaders/dx9/chains/pillarbox_left_vertical/fs_saturation.bin delete mode 100644 bgfx/shaders/dx9/chains/pillarbox_right_horizontal/fs_saturation.bin delete mode 100644 bgfx/shaders/dx9/chains/pillarbox_right_vertical/fs_saturation.bin rename bgfx/shaders/dx9/chains/{hq2x => super-4xbr-3d-4p}/fs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{hq3x => super-4xbr-3d-4p}/vs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{hq3x => super-4xbr-3d-6p-smoother}/fs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{hq4x => super-4xbr-3d-6p-smoother}/vs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{hq4x => xbr-hybrid}/fs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_left_horizontal => xbr-hybrid}/vs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_left_horizontal => xbr-lv1-noblend}/fs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_left_vertical => xbr-lv1-noblend}/vs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_left_vertical => xbr-lv2-3d}/fs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_right_horizontal => xbr-lv2-3d}/vs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_right_horizontal => xbr-lv2-accuracy-multipass}/fs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-multipass}/vs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-smart-blur}/fs_blit.bin (100%) rename bgfx/shaders/dx9/chains/{pillarbox_right_horizontal/vs_saturation.bin => xbr-lv2-accuracy-smart-blur/vs_blit.bin} (51%) create mode 100644 bgfx/shaders/dx9/chains/xbr-lv2-deposterize/fs_blit.bin rename bgfx/shaders/dx9/chains/{pillarbox_right_vertical/vs_saturation.bin => xbr-lv2-deposterize/vs_blit.bin} (51%) create mode 100644 bgfx/shaders/dx9/chains/xbr-lv2-fast/fs_blit.bin rename bgfx/shaders/dx9/chains/{pillarbox_left_horizontal/vs_saturation.bin => xbr-lv2-fast/vs_blit.bin} (51%) create mode 100644 bgfx/shaders/dx9/chains/xbr-lv2-multipass/fs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv2-multipass/vs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv2-noblend/fs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv2-noblend/vs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv3-multipass/fs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv3-multipass/vs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv3-noblend/fs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv3-noblend/vs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv3/fs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-lv3/vs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-mlv4-dilation/fs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-mlv4-dilation/vs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-mlv4-multipass/fs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr-mlv4-multipass/vs_blit.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/fs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass3.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/vs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2.bin rename bgfx/shaders/gles/chains/{hlsl => misc}/fs_blit.bin (100%) create mode 100644 bgfx/shaders/gles/chains/misc/fs_bob-and-ghost-deinterlace.bin create mode 100644 bgfx/shaders/gles/chains/misc/fs_deposterize-pass0.bin create mode 100644 bgfx/shaders/gles/chains/misc/fs_deposterize-pass1.bin rename bgfx/shaders/gles/chains/{pillarbox_left_horizontal => misc}/fs_saturation.bin (100%) rename bgfx/shaders/gles/chains/{hlsl => misc}/vs_blit.bin (100%) rename bgfx/shaders/gles/chains/{hq2x/vs_blit.bin => misc/vs_bob-and-ghost-deinterlace.bin} (100%) create mode 100644 bgfx/shaders/gles/chains/misc/vs_deposterize-pass0.bin create mode 100644 bgfx/shaders/gles/chains/misc/vs_deposterize-pass1.bin rename bgfx/shaders/gles/chains/{pillarbox_left_vertical => misc}/vs_saturation.bin (100%) delete mode 100644 bgfx/shaders/gles/chains/pillarbox_left_vertical/fs_saturation.bin delete mode 100644 bgfx/shaders/gles/chains/pillarbox_right_horizontal/fs_saturation.bin delete mode 100644 bgfx/shaders/gles/chains/pillarbox_right_vertical/fs_saturation.bin rename bgfx/shaders/gles/chains/{hq2x => super-4xbr-3d-4p}/fs_blit.bin (100%) rename bgfx/shaders/gles/chains/{hq3x => super-4xbr-3d-4p}/vs_blit.bin (100%) rename bgfx/shaders/gles/chains/{hq3x => super-4xbr-3d-6p-smoother}/fs_blit.bin (100%) rename bgfx/shaders/gles/chains/{hq4x => super-4xbr-3d-6p-smoother}/vs_blit.bin (100%) rename bgfx/shaders/gles/chains/{hq4x => xbr-hybrid}/fs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_left_horizontal => xbr-hybrid}/vs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_left_horizontal => xbr-lv1-noblend}/fs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_left_vertical => xbr-lv1-noblend}/vs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_left_vertical => xbr-lv2-3d}/fs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_right_horizontal => xbr-lv2-3d}/vs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_right_horizontal => xbr-lv2-accuracy-multipass}/fs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-multipass}/vs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-smart-blur}/fs_blit.bin (100%) rename bgfx/shaders/gles/chains/{pillarbox_left_horizontal/vs_saturation.bin => xbr-lv2-accuracy-smart-blur/vs_blit.bin} (73%) create mode 100644 bgfx/shaders/gles/chains/xbr-lv2-deposterize/fs_blit.bin rename bgfx/shaders/gles/chains/{pillarbox_right_horizontal/vs_saturation.bin => xbr-lv2-deposterize/vs_blit.bin} (73%) create mode 100644 bgfx/shaders/gles/chains/xbr-lv2-fast/fs_blit.bin rename bgfx/shaders/gles/chains/{pillarbox_right_vertical/vs_saturation.bin => xbr-lv2-fast/vs_blit.bin} (72%) create mode 100644 bgfx/shaders/gles/chains/xbr-lv2-multipass/fs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv2-multipass/vs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv2-noblend/fs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv2-noblend/vs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv3-multipass/fs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv3-multipass/vs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv3-noblend/fs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv3-noblend/vs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv3/fs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-lv3/vs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-mlv4-dilation/fs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-mlv4-dilation/vs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-mlv4-multipass/fs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr-mlv4-multipass/vs_blit.bin create mode 100644 bgfx/shaders/gles/chains/xbr/fs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/gles/chains/xbr/fs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/gles/chains/xbr/fs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/gles/chains/xbr/fs_xbr-lv2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-pass3.bin create mode 100644 bgfx/shaders/gles/chains/xbr/vs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/gles/chains/xbr/vs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/gles/chains/xbr/vs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/gles/chains/xbr/vs_xbr-lv2.bin rename bgfx/shaders/glsl/chains/{hlsl => misc}/fs_blit.bin (100%) create mode 100644 bgfx/shaders/glsl/chains/misc/fs_bob-and-ghost-deinterlace.bin create mode 100644 bgfx/shaders/glsl/chains/misc/fs_deposterize-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/misc/fs_deposterize-pass1.bin rename bgfx/shaders/glsl/chains/{pillarbox_left_horizontal => misc}/fs_saturation.bin (100%) rename bgfx/shaders/glsl/chains/{hlsl => misc}/vs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{hq2x/vs_blit.bin => misc/vs_bob-and-ghost-deinterlace.bin} (100%) create mode 100644 bgfx/shaders/glsl/chains/misc/vs_deposterize-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/misc/vs_deposterize-pass1.bin rename bgfx/shaders/glsl/chains/{pillarbox_left_vertical => misc}/vs_saturation.bin (100%) delete mode 100644 bgfx/shaders/glsl/chains/pillarbox_left_vertical/fs_saturation.bin delete mode 100644 bgfx/shaders/glsl/chains/pillarbox_right_horizontal/fs_saturation.bin delete mode 100644 bgfx/shaders/glsl/chains/pillarbox_right_vertical/fs_saturation.bin rename bgfx/shaders/glsl/chains/{hq2x => super-4xbr-3d-4p}/fs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{hq3x => super-4xbr-3d-4p}/vs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{hq3x => super-4xbr-3d-6p-smoother}/fs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{hq4x => super-4xbr-3d-6p-smoother}/vs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{hq4x => xbr-hybrid}/fs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_left_horizontal => xbr-hybrid}/vs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_left_horizontal => xbr-lv1-noblend}/fs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_left_vertical => xbr-lv1-noblend}/vs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_left_vertical => xbr-lv2-3d}/fs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_right_horizontal => xbr-lv2-3d}/vs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_right_horizontal => xbr-lv2-accuracy-multipass}/fs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-multipass}/vs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-smart-blur}/fs_blit.bin (100%) rename bgfx/shaders/glsl/chains/{pillarbox_left_horizontal/vs_saturation.bin => xbr-lv2-accuracy-smart-blur/vs_blit.bin} (72%) create mode 100644 bgfx/shaders/glsl/chains/xbr-lv2-deposterize/fs_blit.bin rename bgfx/shaders/glsl/chains/{pillarbox_right_horizontal/vs_saturation.bin => xbr-lv2-deposterize/vs_blit.bin} (72%) create mode 100644 bgfx/shaders/glsl/chains/xbr-lv2-fast/fs_blit.bin rename bgfx/shaders/glsl/chains/{pillarbox_right_vertical/vs_saturation.bin => xbr-lv2-fast/vs_blit.bin} (70%) create mode 100644 bgfx/shaders/glsl/chains/xbr-lv2-multipass/fs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv2-multipass/vs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv2-noblend/fs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv2-noblend/vs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv3-multipass/fs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv3-multipass/vs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv3-noblend/fs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv3-noblend/vs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv3/fs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-lv3/vs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-mlv4-dilation/fs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-mlv4-dilation/vs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-mlv4-multipass/fs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr-mlv4-multipass/vs_blit.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/fs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass3.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/vs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2.bin rename bgfx/shaders/metal/chains/{hlsl => misc}/fs_blit.bin (100%) create mode 100644 bgfx/shaders/metal/chains/misc/fs_bob-and-ghost-deinterlace.bin create mode 100644 bgfx/shaders/metal/chains/misc/fs_deposterize-pass0.bin create mode 100644 bgfx/shaders/metal/chains/misc/fs_deposterize-pass1.bin rename bgfx/shaders/metal/chains/{pillarbox_left_horizontal => misc}/fs_saturation.bin (100%) rename bgfx/shaders/metal/chains/{hlsl => misc}/vs_blit.bin (100%) rename bgfx/shaders/metal/chains/{hq2x/vs_blit.bin => misc/vs_bob-and-ghost-deinterlace.bin} (100%) create mode 100644 bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.bin create mode 100644 bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.bin rename bgfx/shaders/metal/chains/{pillarbox_left_vertical => misc}/vs_saturation.bin (100%) rename bgfx/shaders/metal/chains/{hq2x => super-4xbr-3d-4p}/fs_blit.bin (100%) rename bgfx/shaders/metal/chains/{hq3x => super-4xbr-3d-4p}/vs_blit.bin (100%) rename bgfx/shaders/metal/chains/{hq3x => super-4xbr-3d-6p-smoother}/fs_blit.bin (100%) rename bgfx/shaders/metal/chains/{hq4x => super-4xbr-3d-6p-smoother}/vs_blit.bin (100%) rename bgfx/shaders/metal/chains/{hq4x => xbr-hybrid}/fs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_left_horizontal => xbr-hybrid}/vs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_left_horizontal => xbr-lv1-noblend}/fs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_left_vertical => xbr-lv1-noblend}/vs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_left_vertical => xbr-lv2-3d}/fs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_right_horizontal => xbr-lv2-3d}/vs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_right_horizontal => xbr-lv2-accuracy-multipass}/fs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-multipass}/vs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-smart-blur}/fs_blit.bin (100%) rename bgfx/shaders/metal/chains/{pillarbox_left_horizontal/vs_saturation.bin => xbr-lv2-accuracy-smart-blur/vs_blit.bin} (84%) rename bgfx/shaders/metal/chains/{pillarbox_left_vertical/fs_saturation.bin => xbr-lv2-deposterize/fs_blit.bin} (60%) rename bgfx/shaders/metal/chains/{pillarbox_right_horizontal/vs_saturation.bin => xbr-lv2-deposterize/vs_blit.bin} (84%) rename bgfx/shaders/metal/chains/{pillarbox_right_horizontal/fs_saturation.bin => xbr-lv2-fast/fs_blit.bin} (60%) rename bgfx/shaders/metal/chains/{pillarbox_right_vertical/vs_saturation.bin => xbr-lv2-fast/vs_blit.bin} (83%) rename bgfx/shaders/metal/chains/{pillarbox_right_vertical/fs_saturation.bin => xbr-lv2-multipass/fs_blit.bin} (60%) create mode 100644 bgfx/shaders/metal/chains/xbr-lv2-multipass/vs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv2-noblend/fs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv2-noblend/vs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv3-multipass/fs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv3-multipass/vs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv3-noblend/fs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv3-noblend/vs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv3/fs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-lv3/vs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-mlv4-dilation/fs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-mlv4-dilation/vs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-mlv4-multipass/fs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr-mlv4-multipass/vs_blit.bin create mode 100644 bgfx/shaders/metal/chains/xbr/fs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/metal/chains/xbr/fs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/metal/chains/xbr/fs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/metal/chains/xbr/fs_xbr-lv2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass0.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass1.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass2.bin create mode 100644 bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass3.bin create mode 100644 bgfx/shaders/metal/chains/xbr/vs_xbr-lv1-noblend.bin create mode 100644 bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-3d.bin create mode 100644 bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-fast.bin create mode 100644 bgfx/shaders/metal/chains/xbr/vs_xbr-lv2.bin rename src/osd/modules/render/bgfx/shaders/chains/{hlsl => misc}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/misc/fs_bob-and-ghost-deinterlace.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass1.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_left_horizontal => misc}/fs_saturation.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/misc/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{hlsl => misc}/vs_blit.sc (100%) rename src/osd/modules/render/bgfx/shaders/chains/{hq2x/vs_blit.sc => misc/vs_bob-and-ghost-deinterlace.sc} (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass1.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_left_vertical => misc}/vs_saturation.sc (100%) delete mode 100644 src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_saturation.sc delete mode 100644 src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_saturation.sc delete mode 100644 src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_saturation.sc rename src/osd/modules/render/bgfx/shaders/chains/{hq2x => super-4xbr-3d-4p}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{hq3x => super-4xbr-3d-4p}/vs_blit.sc (100%) rename src/osd/modules/render/bgfx/shaders/chains/{hq3x => super-4xbr-3d-6p-smoother}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{hq4x => super-4xbr-3d-6p-smoother}/vs_blit.sc (100%) rename src/osd/modules/render/bgfx/shaders/chains/{hq4x => xbr-hybrid}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_left_horizontal => xbr-hybrid}/vs_blit.sc (100%) rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_left_horizontal => xbr-lv1-noblend}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_left_vertical => xbr-lv1-noblend}/vs_blit.sc (100%) rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_left_vertical => xbr-lv2-3d}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_right_horizontal => xbr-lv2-3d}/vs_blit.sc (100%) rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_right_horizontal => xbr-lv2-accuracy-multipass}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-multipass}/vs_blit.sc (100%) rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_right_vertical => xbr-lv2-accuracy-smart-blur}/fs_blit.sc (100%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_left_horizontal/vs_saturation.sc => xbr-lv2-accuracy-smart-blur/vs_blit.sc} (75%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_right_vertical/vs_saturation.sc => xbr-lv2-deposterize/vs_blit.sc} (72%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/varying.def.sc rename src/osd/modules/render/bgfx/shaders/chains/{pillarbox_right_horizontal/vs_saturation.sc => xbr-lv2-fast/vs_blit.sc} (71%) create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/vs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/vs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/vs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/vs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/vs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/vs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/fs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/vs_blit.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv1-noblend.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-3d.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-fast.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_custom-jinc2-sharper.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_custom-jinc2-sharper.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass0.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass1.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass2.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass3.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/varying.def.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv1-noblend.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-3d.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-fast.sc create mode 100644 src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2.sc diff --git a/bgfx/chains/default.json b/bgfx/chains/default.json index 115e7072cb3..b25388c3735 100644 --- a/bgfx/chains/default.json +++ b/bgfx/chains/default.json @@ -7,7 +7,7 @@ } ], "passes": [ - { "effect": "default/blit", + { "effect": "misc/blit", "name": "Final Upscale", "input": [ { "sampler": "s_tex", "texture": "screen" } diff --git a/bgfx/chains/hlsl.json b/bgfx/chains/hlsl.json index 7e431f72803..41be4613087 100644 --- a/bgfx/chains/hlsl.json +++ b/bgfx/chains/hlsl.json @@ -318,7 +318,7 @@ ], "output": "guest" }, - { "effect": "hlsl/blit", + { "effect": "misc/blit", "name": "NTSC Skip", "disablewhen": [ { "type": "slider", "condition": "notequal", "combine": "and", "name": "adjustments", "value": 0 }, @@ -499,7 +499,7 @@ ], "output": "internal" }, - { "effect": "hlsl/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "internal" } diff --git a/bgfx/chains/hq2x.json b/bgfx/chains/hq2x.json index 20303a64c90..19eb14d6113 100644 --- a/bgfx/chains/hq2x.json +++ b/bgfx/chains/hq2x.json @@ -49,7 +49,7 @@ ], "output": "scaled_out" }, - { "effect": "hq2x/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "scaled_out" } diff --git a/bgfx/chains/hq3x.json b/bgfx/chains/hq3x.json index 1f767b68825..6e1f031d705 100644 --- a/bgfx/chains/hq3x.json +++ b/bgfx/chains/hq3x.json @@ -49,7 +49,7 @@ ], "output": "scaled_out" }, - { "effect": "hq3x/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "scaled_out" } diff --git a/bgfx/chains/hq4x.json b/bgfx/chains/hq4x.json index 9232966ecc4..78548abfca7 100644 --- a/bgfx/chains/hq4x.json +++ b/bgfx/chains/hq4x.json @@ -49,7 +49,7 @@ ], "output": "scaled_out" }, - { "effect": "hq4x/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "scaled_out" } diff --git a/bgfx/chains/pillarbox_left_horizontal.json b/bgfx/chains/pillarbox_left_horizontal.json index 1959fa30943..8a81352d734 100644 --- a/bgfx/chains/pillarbox_left_horizontal.json +++ b/bgfx/chains/pillarbox_left_horizontal.json @@ -31,7 +31,7 @@ ], "passes": [ - { "effect": "pillarbox_left_horizontal/blit", + { "effect": "misc/blit", "name": "Blit to scalable target", "input": [ { "sampler": "s_tex", "target": "screen" } @@ -79,7 +79,7 @@ "output": "internal" }, { - "effect": "pillarbox_left_horizontal/saturation", + "effect": "misc/saturation", "name": "Saturation Pass", "disablewhen": [ { "type": "slider", "condition": "equal", "name": "saturation", "value": 100 } @@ -92,7 +92,7 @@ ], "output": "internal" }, - { "effect": "pillarbox_left_horizontal/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "internal" } diff --git a/bgfx/chains/pillarbox_left_vertical.json b/bgfx/chains/pillarbox_left_vertical.json index 976a84476b8..64c31108f03 100644 --- a/bgfx/chains/pillarbox_left_vertical.json +++ b/bgfx/chains/pillarbox_left_vertical.json @@ -31,7 +31,7 @@ ], "passes": [ - { "effect": "pillarbox_left_vertical/blit", + { "effect": "misc/blit", "name": "Blit to scalable target", "input": [ { "sampler": "s_tex", "target": "screen" } @@ -79,7 +79,7 @@ "output": "internal" }, { - "effect": "pillarbox_left_vertical/saturation", + "effect": "misc/saturation", "name": "Saturation Pass", "disablewhen": [ { "type": "slider", "condition": "equal", "name": "saturation", "value": 100 } @@ -92,7 +92,7 @@ ], "output": "internal" }, - { "effect": "pillarbox_left_vertical/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "internal" } diff --git a/bgfx/chains/pillarbox_right_horizontal.json b/bgfx/chains/pillarbox_right_horizontal.json index a687510049e..0b7c8c5287b 100644 --- a/bgfx/chains/pillarbox_right_horizontal.json +++ b/bgfx/chains/pillarbox_right_horizontal.json @@ -31,7 +31,7 @@ ], "passes": [ - { "effect": "pillarbox_right_horizontal/blit", + { "effect": "misc/blit", "name": "Blit to scalable target", "input": [ { "sampler": "s_tex", "target": "screen" } @@ -79,7 +79,7 @@ "output": "internal" }, { - "effect": "pillarbox_right_horizontal/saturation", + "effect": "misc/saturation", "name": "Saturation Pass", "disablewhen": [ { "type": "slider", "condition": "equal", "name": "saturation", "value": 100 } @@ -92,7 +92,7 @@ ], "output": "internal" }, - { "effect": "pillarbox_right_horizontal/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "internal" } diff --git a/bgfx/chains/pillarbox_right_vertical.json b/bgfx/chains/pillarbox_right_vertical.json index 16dcb8b8c4b..088d21081ab 100644 --- a/bgfx/chains/pillarbox_right_vertical.json +++ b/bgfx/chains/pillarbox_right_vertical.json @@ -31,7 +31,7 @@ ], "passes": [ - { "effect": "pillarbox_right_vertical/blit", + { "effect": "misc/blit", "name": "Blit to scalable target", "input": [ { "sampler": "s_tex", "target": "screen" } @@ -79,7 +79,7 @@ "output": "internal" }, { - "effect": "pillarbox_right_vertical/saturation", + "effect": "misc/saturation", "name": "Saturation Pass", "disablewhen": [ { "type": "slider", "condition": "equal", "name": "saturation", "value": 100 } @@ -92,7 +92,7 @@ ], "output": "internal" }, - { "effect": "pillarbox_right_vertical/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "internal" } diff --git a/bgfx/chains/super-2xbr-3d-2p.json b/bgfx/chains/super-2xbr-3d-2p.json new file mode 100644 index 00000000000..a196141548d --- /dev/null +++ b/bgfx/chains/super-2xbr-3d-2p.json @@ -0,0 +1,69 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR 3D (2 passes)", + "author": "Hyllian", + "targets": [ + { + "name": "guest", + "mode": "guest", + "scale": 1, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-2xbr-3d-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-2xbr-3d-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "guest" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "guest" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-2xbr-3d-3p-smoother.json b/bgfx/chains/super-2xbr-3d-3p-smoother.json new file mode 100644 index 00000000000..d3e3d33d7c4 --- /dev/null +++ b/bgfx/chains/super-2xbr-3d-3p-smoother.json @@ -0,0 +1,78 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR 3D (3 passes, smoother)", + "author": "Hyllian", + "targets": [ + { + "name": "guest", + "mode": "guest", + "scale": 1, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-2xbr-3d-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-2xbr-3d-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "guest" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-2xbr-3d-pass2", + "name": "Pass 2", + "input": [ + { "sampler": "s0", "target": "guest" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "guest" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-4xbr-3d-4p.json b/bgfx/chains/super-4xbr-3d-4p.json new file mode 100644 index 00000000000..046897b62d5 --- /dev/null +++ b/bgfx/chains/super-4xbr-3d-4p.json @@ -0,0 +1,86 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super 4XBR 3D (4 passes)", + "author": "Hyllian", + "targets": [ + { + "name": "guest", + "mode": "guest", + "scale": 1, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "guest" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass2", + "name": "Pass 2", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass3", + "name": "Pass 3", + "input": [ + { "sampler": "s0", "target": "guest" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "guest" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-4xbr-3d-6p-smoother.json b/bgfx/chains/super-4xbr-3d-6p-smoother.json new file mode 100644 index 00000000000..f3bd617258f --- /dev/null +++ b/bgfx/chains/super-4xbr-3d-6p-smoother.json @@ -0,0 +1,86 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super 4XBR 3D (3 passes, smoother)", + "author": "Hyllian", + "targets": [ + { + "name": "guest", + "mode": "guest", + "scale": 1, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "guest" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass2", + "name": "Pass 2", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/super-4xbr-3d-pass3", + "name": "Pass 3", + "input": [ + { "sampler": "s0", "target": "guest" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "guest" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "guest" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-xbr-2p.json b/bgfx/chains/super-xbr-2p.json new file mode 100644 index 00000000000..cdb8c3f84a5 --- /dev/null +++ b/bgfx/chains/super-xbr-2p.json @@ -0,0 +1,76 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR (2 passes)", + "author": "Hyllian", + "targets": [ + { + "name": "pass0", + "mode": "guest", + "scale": 1, + "bilinear": false, + "doublebuffer": true + }, + { + "name": "pass1", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-xbr-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "pass0" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "pass0" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "pass1" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "pass1" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-xbr-3p-smoother.json b/bgfx/chains/super-xbr-3p-smoother.json new file mode 100644 index 00000000000..96bda7904b6 --- /dev/null +++ b/bgfx/chains/super-xbr-3p-smoother.json @@ -0,0 +1,84 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR (3 passes, smoother)", + "author": "Hyllian", + "targets": [ + { + "name": "pass02", + "mode": "guest", + "scale": 1, + "bilinear": false, + "doublebuffer": true + }, + { + "name": "pass1", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-xbr-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "pass02" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "pass02" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "pass1" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass2", + "name": "Pass 2", + "input": [ + { "sampler": "s0", "target": "pass1" } + ], + "output": "pass1" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "pass1" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-xbr-6p.json b/bgfx/chains/super-xbr-6p.json new file mode 100644 index 00000000000..4f5c69369d7 --- /dev/null +++ b/bgfx/chains/super-xbr-6p.json @@ -0,0 +1,123 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR (6 passes)", + "author": "Hyllian", + "targets": [ + { + "name": "group0_pass02", + "mode": "guest", + "scale": 1, + "bilinear": false, + "doublebuffer": true + }, + { + "name": "group0_pass1", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + }, + { + "name": "group1_pass02", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + }, + { + "name": "group1_pass1", + "mode": "guest", + "scale": 4, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-xbr-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "group0_pass02" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "group0_pass02" }, + { "sampler": "ORIG_texture", "texture": "screen" } + ], + "output": "group0_pass1" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass2", + "name": "Pass 2", + "input": [ + { "sampler": "s0", "target": "group0_pass1" } + ], + "output": "group0_pass1" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "target": "group0_pass1" } + ], + "output": "group1_pass02" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "group1_pass02" }, + { "sampler": "ORIG_texture", "target": "group0_pass1" } + ], + "output": "group1_pass1" + }, + { + "effect": "xbr/super-xbr/super-xbr-pass2", + "name": "Pass 2", + "input": [ + { "sampler": "s0", "target": "group1_pass1" } + ], + "output": "group1_pass1" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "group1_pass1" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-xbr-deposterize.json b/bgfx/chains/super-xbr-deposterize.json new file mode 100644 index 00000000000..8eac3770465 --- /dev/null +++ b/bgfx/chains/super-xbr-deposterize.json @@ -0,0 +1,98 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR (deposterize)", + "author": "Hyllian", + "targets": [ + { + "name": "deposterize", + "mode": "guest", + "bilinear": false, + "doublebuffer": true + }, + { + "name": "pass012", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "misc/deposterize-pass0", + "name": "Deposterize, Pass 0", + "input": [ + { "sampler": "decal", "texture": "screen" } + ], + "output": "deposterize" + }, + { + "effect": "misc/deposterize-pass1", + "name": "Deposterize, Pass 1", + "input": [ + { "sampler": "decal", "target": "deposterize" } + ], + "output": "deposterize" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "target": "deposterize" } + ], + "output": "pass012" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "pass012" } + ], + "output": "pass012" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass2", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "pass012" } + ], + "output": "pass012" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "pass012" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-xbr-fast-3p.json b/bgfx/chains/super-xbr-fast-3p.json new file mode 100644 index 00000000000..f0d0411acc0 --- /dev/null +++ b/bgfx/chains/super-xbr-fast-3p.json @@ -0,0 +1,76 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR (3 passes, faster)", + "author": "Hyllian", + "targets": [ + { + "name": "all_passes", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-xbr-fast-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "all_passes" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "all_passes" } + ], + "output": "all_passes" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass2", + "name": "Pass 5", + "input": [ + { "sampler": "s0", "target": "all_passes" } + ], + "output": "all_passes" + }, + { + "effect": "xbr/super-xbr/custom-jinc2-sharper", + "name": "Jinc2 Upscaler", + "input": [ + { "sampler": "s_p", "target": "all_passes" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/super-xbr-fast-6p.json b/bgfx/chains/super-xbr-fast-6p.json new file mode 100644 index 00000000000..6d19e28f9b2 --- /dev/null +++ b/bgfx/chains/super-xbr-fast-6p.json @@ -0,0 +1,113 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "name": "Super XBR (6 passes, faster)", + "author": "Hyllian", + "targets": [ + { + "name": "group0_pass012", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + }, + { + "name": "group1_pass012", + "mode": "guest", + "scale": 2, + "bilinear": false, + "doublebuffer": true + }, + { + "name": "to_blit", + "mode": "guest", + "scale": 4, + "doublebuffer": true + } + ], + "passes": [ + { + "effect": "xbr/super-xbr/super-xbr-fast-pass0", + "name": "Pass 0", + "input": [ + { "sampler": "s0", "texture": "screen" } + ], + "output": "group0_pass012" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass1", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "group0_pass012" } + ], + "output": "group0_pass012" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass2", + "name": "Pass 1", + "input": [ + { "sampler": "s0", "target": "group0_pass012" } + ], + "output": "group0_pass012" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass0", + "name": "Pass 3", + "input": [ + { "sampler": "s0", "target": "group0_pass012" } + ], + "output": "group1_pass012" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass1", + "name": "Pass 4", + "input": [ + { "sampler": "s0", "target": "group1_pass012" } + ], + "output": "group1_pass012" + }, + { + "effect": "xbr/super-xbr/super-xbr-fast-pass2", + "name": "Pass 5", + "input": [ + { "sampler": "s0", "target": "group1_pass012" } + ], + "output": "to_blit" + }, + { + "effect": "misc/blit", + "name": "Upscaling Blit", + "input": [ + { "sampler": "s_tex", "target": "to_blit" } + ], + "output": "output" + } + ] +} \ No newline at end of file diff --git a/bgfx/chains/supereagle.json b/bgfx/chains/supereagle.json index 0f12a85e095..cf3294e8a36 100644 --- a/bgfx/chains/supereagle.json +++ b/bgfx/chains/supereagle.json @@ -33,7 +33,7 @@ ], "output": "scaled_out" }, - { "effect": "hq2x/blit", + { "effect": "misc/blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "target": "scaled_out" } diff --git a/bgfx/chains/unfiltered.json b/bgfx/chains/unfiltered.json index a644f9af370..e8983f6dd5c 100644 --- a/bgfx/chains/unfiltered.json +++ b/bgfx/chains/unfiltered.json @@ -7,14 +7,14 @@ } ], "passes": [ - { "effect": "unfiltered/blit", + { "effect": "misc/blit", "name": "Copy To Unstretched Texture", "input": [ { "sampler": "s_tex", "texture": "screen" } ], "output": "temp" }, - { "effect": "unfiltered/blit", + { "effect": "misc/blit", "name": "Final Upscale", "input": [ { "sampler": "s_tex", "target": "temp" } diff --git a/bgfx/effects/hq3x/blit.json b/bgfx/effects/hq3x/blit.json deleted file mode 100644 index a3c21b9cf67..00000000000 --- a/bgfx/effects/hq3x/blit.json +++ /dev/null @@ -1,121 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// blit.json: A simple texture-to-target copy. -// -//============================================================ -{ - // 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. - // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always" - // default: "always" - "function": "always", - - // writeenable (optional): Whether to store Z-buffer data. - // values: true, false - // default: false - "writeenable": false - }, - - // cull (required): The cull mode for this effect. - "cull": { - // mode (optional): What winding, if any, to cull. - // values: "none", "cw", "ccw" - // default: "ccw" - // - // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw" - "mode": "none" - }, - - // write (required): Write enable for color and alpha channels. - "write": { - // rgb (optional): Whether to store color data when drawing. - // values: true, false - // default: false - "rgb": true, - - // alpha (optional): Whether to store alpha data when drawing. - // values: true, false - // default: false - "alpha": true - }, - - // vertex (required): The vertex shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "vertex": "chains/hq3x/vs_blit", - - // pixel/fragment (required): The pixel or fragment shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "fragment": "chains/hq3x/fs_blit", - - // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist. - "uniforms": [ - { - // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader. - // value: A string containing the name of the uniform as described above. - // - // NOTE: Some names correspond to special values that will be automatically filled by the BGFX - // code if they are used by the shader. These names are: - // "u_screen_dims" - // The dimensions of the first texture input if present, otherwise the dimensions of the output window. - // Valid values: xy - // "u_inv_screen_dims" - // The reciprocal of u_screen_dims. - // Valid values: xy - // "u_source_dims" - // The size, in pixels, of the screen texture incoming to the chain. - // Valid values: xy - // "u_rotation_type" - // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270. - // Valid values: x - // "u_swap_xy" - // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false. - // Valid values: x - // "u_quad_dims" - // The dimensions, in pixels, occupied by this one screen primitive itself in the output window. - // Valid values: xy - // "u_tex_sizeN" - // The dimensions, in pixels, of the texture in input pair N. Starts at 0. - // valid values: xy - "name": "s_tex", - - // type (required): The type of the uniform. - // values: "int", "vec4", "mat3", "mat4" - // - // Note: "int" should only be used for samplers. - "type": "int", - - // values (required): The array of numbers with which to initialize the uniform. - // value: A JSON array containin the correct amount of numbers to initialize a uniform of the - // above-specified type. The following size rules should be followed: - // "int": 1 float - // "vec4": 4 floats - // "mat3": 9 floats - // "mat4": 16 floats - "values": [ 1.0 ] - } - ] -} \ No newline at end of file diff --git a/bgfx/effects/hq4x/blit.json b/bgfx/effects/hq4x/blit.json deleted file mode 100644 index ddaab93e2ea..00000000000 --- a/bgfx/effects/hq4x/blit.json +++ /dev/null @@ -1,121 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// blit.json: A simple texture-to-target copy. -// -//============================================================ -{ - // 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. - // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always" - // default: "always" - "function": "always", - - // writeenable (optional): Whether to store Z-buffer data. - // values: true, false - // default: false - "writeenable": false - }, - - // cull (required): The cull mode for this effect. - "cull": { - // mode (optional): What winding, if any, to cull. - // values: "none", "cw", "ccw" - // default: "ccw" - // - // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw" - "mode": "none" - }, - - // write (required): Write enable for color and alpha channels. - "write": { - // rgb (optional): Whether to store color data when drawing. - // values: true, false - // default: false - "rgb": true, - - // alpha (optional): Whether to store alpha data when drawing. - // values: true, false - // default: false - "alpha": true - }, - - // vertex (required): The vertex shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "vertex": "chains/hq4x/vs_blit", - - // pixel/fragment (required): The pixel or fragment shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "fragment": "chains/hq4x/fs_blit", - - // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist. - "uniforms": [ - { - // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader. - // value: A string containing the name of the uniform as described above. - // - // NOTE: Some names correspond to special values that will be automatically filled by the BGFX - // code if they are used by the shader. These names are: - // "u_screen_dims" - // The dimensions of the first texture input if present, otherwise the dimensions of the output window. - // Valid values: xy - // "u_inv_screen_dims" - // The reciprocal of u_screen_dims. - // Valid values: xy - // "u_source_dims" - // The size, in pixels, of the screen texture incoming to the chain. - // Valid values: xy - // "u_rotation_type" - // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270. - // Valid values: x - // "u_swap_xy" - // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false. - // Valid values: x - // "u_quad_dims" - // The dimensions, in pixels, occupied by this one screen primitive itself in the output window. - // Valid values: xy - // "u_tex_sizeN" - // The dimensions, in pixels, of the texture in input pair N. Starts at 0. - // valid values: xy - "name": "s_tex", - - // type (required): The type of the uniform. - // values: "int", "vec4", "mat3", "mat4" - // - // Note: "int" should only be used for samplers. - "type": "int", - - // values (required): The array of numbers with which to initialize the uniform. - // value: A JSON array containin the correct amount of numbers to initialize a uniform of the - // above-specified type. The following size rules should be followed: - // "int": 1 float - // "vec4": 4 floats - // "mat3": 9 floats - // "mat4": 16 floats - "values": [ 1.0 ] - } - ] -} \ No newline at end of file diff --git a/bgfx/effects/hq2x/blit.json b/bgfx/effects/misc/blit.json similarity index 98% rename from bgfx/effects/hq2x/blit.json rename to bgfx/effects/misc/blit.json index 9ea3078b35a..3fb849a1eed 100644 --- a/bgfx/effects/hq2x/blit.json +++ b/bgfx/effects/misc/blit.json @@ -65,11 +65,11 @@ // vertex (required): The vertex shader to use when drawing. // value: A string containing the path and name of a shader file to use, minus the extension. - "vertex": "chains/hq2x/vs_blit", + "vertex": "chains/misc/vs_blit", // pixel/fragment (required): The pixel or fragment shader to use when drawing. // value: A string containing the path and name of a shader file to use, minus the extension. - "fragment": "chains/hq2x/fs_blit", + "fragment": "chains/misc/fs_blit", // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist. "uniforms": [ diff --git a/bgfx/effects/misc/deposterize-pass0.json b/bgfx/effects/misc/deposterize-pass0.json new file mode 100644 index 00000000000..73fac99de3c --- /dev/null +++ b/bgfx/effects/misc/deposterize-pass0.json @@ -0,0 +1,37 @@ +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's Deposterize Shader - Pass0 + + Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/misc/vs_deposterize-pass0", + "fragment": "chains/misc/fs_deposterize-pass0", + "uniforms": [ + { "name": "decal", "type": "int", "values": [ 1.0 ] }, + { "name": "EQ_THRESH1", "type": "vec4", "values": [ 0.01, 0.0, 0.0, 0.0 ] }, + { "name": "DIFF_THRESH1", "type": "vec4", "values": [ 0.06, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/misc/deposterize-pass1.json b/bgfx/effects/misc/deposterize-pass1.json new file mode 100644 index 00000000000..6a62aa36753 --- /dev/null +++ b/bgfx/effects/misc/deposterize-pass1.json @@ -0,0 +1,37 @@ +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's Deposterize Shader - Pass1 + + Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/misc/vs_deposterize-pass1", + "fragment": "chains/misc/fs_deposterize-pass1", + "uniforms": [ + { "name": "decal", "type": "int", "values": [ 1.0 ] }, + { "name": "EQ_THRESH2", "type": "vec4", "values": [ 0.01, 0.0, 0.0, 0.0 ] }, + { "name": "DIFF_THRESH2", "type": "vec4", "values": [ 0.06, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/pillarbox_left_vertical/saturation.json b/bgfx/effects/misc/saturation.json similarity index 85% rename from bgfx/effects/pillarbox_left_vertical/saturation.json rename to bgfx/effects/misc/saturation.json index c84b6d4a3a2..1708dcee6d4 100644 --- a/bgfx/effects/pillarbox_left_vertical/saturation.json +++ b/bgfx/effects/misc/saturation.json @@ -21,8 +21,8 @@ "rgb": true, "alpha": true }, - "vertex": "chains/pillarbox_left_vertical/vs_saturation", - "fragment": "chains/pillarbox_left_vertical/fs_saturation", + "vertex": "chains/misc/vs_saturation", + "fragment": "chains/misc/fs_saturation", "uniforms": [ { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] } diff --git a/bgfx/effects/pillarbox_left_horizontal/blit.json b/bgfx/effects/pillarbox_left_horizontal/blit.json deleted file mode 100644 index 085dd67ef93..00000000000 --- a/bgfx/effects/pillarbox_left_horizontal/blit.json +++ /dev/null @@ -1,121 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// blit.json: A simple texture-to-target copy. -// -//============================================================ -{ - // 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. - // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always" - // default: "always" - "function": "always", - - // writeenable (optional): Whether to store Z-buffer data. - // values: true, false - // default: false - "writeenable": false - }, - - // cull (required): The cull mode for this effect. - "cull": { - // mode (optional): What winding, if any, to cull. - // values: "none", "cw", "ccw" - // default: "ccw" - // - // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw" - "mode": "none" - }, - - // write (required): Write enable for color and alpha channels. - "write": { - // rgb (optional): Whether to store color data when drawing. - // values: true, false - // default: false - "rgb": true, - - // alpha (optional): Whether to store alpha data when drawing. - // values: true, false - // default: false - "alpha": true - }, - - // vertex (required): The vertex shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "vertex": "chains/pillarbox_left_horizontal/vs_blit", - - // pixel/fragment (required): The pixel or fragment shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "fragment": "chains/pillarbox_left_horizontal/fs_blit", - - // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist. - "uniforms": [ - { - // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader. - // value: A string containing the name of the uniform as described above. - // - // NOTE: Some names correspond to special values that will be automatically filled by the BGFX - // code if they are used by the shader. These names are: - // "u_screen_dims" - // The dimensions of the first texture input if present, otherwise the dimensions of the output window. - // Valid values: xy - // "u_inv_screen_dims" - // The reciprocal of u_screen_dims. - // Valid values: xy - // "u_source_dims" - // The size, in pixels, of the screen texture incoming to the chain. - // Valid values: xy - // "u_rotation_type" - // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270. - // Valid values: x - // "u_swap_xy" - // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false. - // Valid values: x - // "u_quad_dims" - // The dimensions, in pixels, occupied by this one screen primitive itself in the output window. - // Valid values: xy - // "u_tex_sizeN" - // The dimensions, in pixels, of the texture in input pair N. Starts at 0. - // valid values: xy - "name": "s_tex", - - // type (required): The type of the uniform. - // values: "int", "vec4", "mat3", "mat4" - // - // Note: "int" should only be used for samplers. - "type": "int", - - // values (required): The array of numbers with which to initialize the uniform. - // value: A JSON array containin the correct amount of numbers to initialize a uniform of the - // above-specified type. The following size rules should be followed: - // "int": 1 float - // "vec4": 4 floats - // "mat3": 9 floats - // "mat4": 16 floats - "values": [ 1.0 ] - } - ] -} \ No newline at end of file diff --git a/bgfx/effects/pillarbox_left_horizontal/saturation.json b/bgfx/effects/pillarbox_left_horizontal/saturation.json deleted file mode 100644 index 8fff15ddb9b..00000000000 --- a/bgfx/effects/pillarbox_left_horizontal/saturation.json +++ /dev/null @@ -1,30 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// saturation.json: Applies saturation to an image. -// -//============================================================ -{ - "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/pillarbox_left_horizontal/vs_saturation", - "fragment": "chains/pillarbox_left_horizontal/fs_saturation", - "uniforms": [ - { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, - { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] } - ] -} \ No newline at end of file diff --git a/bgfx/effects/pillarbox_left_vertical/blit.json b/bgfx/effects/pillarbox_left_vertical/blit.json deleted file mode 100644 index 9fb35a9fe19..00000000000 --- a/bgfx/effects/pillarbox_left_vertical/blit.json +++ /dev/null @@ -1,121 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// blit.json: A simple texture-to-target copy. -// -//============================================================ -{ - // 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. - // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always" - // default: "always" - "function": "always", - - // writeenable (optional): Whether to store Z-buffer data. - // values: true, false - // default: false - "writeenable": false - }, - - // cull (required): The cull mode for this effect. - "cull": { - // mode (optional): What winding, if any, to cull. - // values: "none", "cw", "ccw" - // default: "ccw" - // - // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw" - "mode": "none" - }, - - // write (required): Write enable for color and alpha channels. - "write": { - // rgb (optional): Whether to store color data when drawing. - // values: true, false - // default: false - "rgb": true, - - // alpha (optional): Whether to store alpha data when drawing. - // values: true, false - // default: false - "alpha": true - }, - - // vertex (required): The vertex shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "vertex": "chains/pillarbox_left_vertical/vs_blit", - - // pixel/fragment (required): The pixel or fragment shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "fragment": "chains/pillarbox_left_vertical/fs_blit", - - // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist. - "uniforms": [ - { - // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader. - // value: A string containing the name of the uniform as described above. - // - // NOTE: Some names correspond to special values that will be automatically filled by the BGFX - // code if they are used by the shader. These names are: - // "u_screen_dims" - // The dimensions of the first texture input if present, otherwise the dimensions of the output window. - // Valid values: xy - // "u_inv_screen_dims" - // The reciprocal of u_screen_dims. - // Valid values: xy - // "u_source_dims" - // The size, in pixels, of the screen texture incoming to the chain. - // Valid values: xy - // "u_rotation_type" - // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270. - // Valid values: x - // "u_swap_xy" - // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false. - // Valid values: x - // "u_quad_dims" - // The dimensions, in pixels, occupied by this one screen primitive itself in the output window. - // Valid values: xy - // "u_tex_sizeN" - // The dimensions, in pixels, of the texture in input pair N. Starts at 0. - // valid values: xy - "name": "s_tex", - - // type (required): The type of the uniform. - // values: "int", "vec4", "mat3", "mat4" - // - // Note: "int" should only be used for samplers. - "type": "int", - - // values (required): The array of numbers with which to initialize the uniform. - // value: A JSON array containin the correct amount of numbers to initialize a uniform of the - // above-specified type. The following size rules should be followed: - // "int": 1 float - // "vec4": 4 floats - // "mat3": 9 floats - // "mat4": 16 floats - "values": [ 1.0 ] - } - ] -} \ No newline at end of file diff --git a/bgfx/effects/pillarbox_right_horizontal/blit.json b/bgfx/effects/pillarbox_right_horizontal/blit.json deleted file mode 100644 index e982da2dbf3..00000000000 --- a/bgfx/effects/pillarbox_right_horizontal/blit.json +++ /dev/null @@ -1,121 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// blit.json: A simple texture-to-target copy. -// -//============================================================ -{ - // 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. - // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always" - // default: "always" - "function": "always", - - // writeenable (optional): Whether to store Z-buffer data. - // values: true, false - // default: false - "writeenable": false - }, - - // cull (required): The cull mode for this effect. - "cull": { - // mode (optional): What winding, if any, to cull. - // values: "none", "cw", "ccw" - // default: "ccw" - // - // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw" - "mode": "none" - }, - - // write (required): Write enable for color and alpha channels. - "write": { - // rgb (optional): Whether to store color data when drawing. - // values: true, false - // default: false - "rgb": true, - - // alpha (optional): Whether to store alpha data when drawing. - // values: true, false - // default: false - "alpha": true - }, - - // vertex (required): The vertex shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "vertex": "chains/pillarbox_right_horizontal/vs_blit", - - // pixel/fragment (required): The pixel or fragment shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "fragment": "chains/pillarbox_right_horizontal/fs_blit", - - // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist. - "uniforms": [ - { - // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader. - // value: A string containing the name of the uniform as described above. - // - // NOTE: Some names correspond to special values that will be automatically filled by the BGFX - // code if they are used by the shader. These names are: - // "u_screen_dims" - // The dimensions of the first texture input if present, otherwise the dimensions of the output window. - // Valid values: xy - // "u_inv_screen_dims" - // The reciprocal of u_screen_dims. - // Valid values: xy - // "u_source_dims" - // The size, in pixels, of the screen texture incoming to the chain. - // Valid values: xy - // "u_rotation_type" - // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270. - // Valid values: x - // "u_swap_xy" - // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false. - // Valid values: x - // "u_quad_dims" - // The dimensions, in pixels, occupied by this one screen primitive itself in the output window. - // Valid values: xy - // "u_tex_sizeN" - // The dimensions, in pixels, of the texture in input pair N. Starts at 0. - // valid values: xy - "name": "s_tex", - - // type (required): The type of the uniform. - // values: "int", "vec4", "mat3", "mat4" - // - // Note: "int" should only be used for samplers. - "type": "int", - - // values (required): The array of numbers with which to initialize the uniform. - // value: A JSON array containin the correct amount of numbers to initialize a uniform of the - // above-specified type. The following size rules should be followed: - // "int": 1 float - // "vec4": 4 floats - // "mat3": 9 floats - // "mat4": 16 floats - "values": [ 1.0 ] - } - ] -} \ No newline at end of file diff --git a/bgfx/effects/pillarbox_right_horizontal/saturation.json b/bgfx/effects/pillarbox_right_horizontal/saturation.json deleted file mode 100644 index 18a416ebd8e..00000000000 --- a/bgfx/effects/pillarbox_right_horizontal/saturation.json +++ /dev/null @@ -1,30 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// saturation.json: Applies saturation to an image. -// -//============================================================ -{ - "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/pillarbox_right_horizontal/vs_saturation", - "fragment": "chains/pillarbox_right_horizontal/fs_saturation", - "uniforms": [ - { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, - { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] } - ] -} \ No newline at end of file diff --git a/bgfx/effects/pillarbox_right_vertical/blit.json b/bgfx/effects/pillarbox_right_vertical/blit.json deleted file mode 100644 index 4237ba44b66..00000000000 --- a/bgfx/effects/pillarbox_right_vertical/blit.json +++ /dev/null @@ -1,121 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// blit.json: A simple texture-to-target copy. -// -//============================================================ -{ - // 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. - // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always" - // default: "always" - "function": "always", - - // writeenable (optional): Whether to store Z-buffer data. - // values: true, false - // default: false - "writeenable": false - }, - - // cull (required): The cull mode for this effect. - "cull": { - // mode (optional): What winding, if any, to cull. - // values: "none", "cw", "ccw" - // default: "ccw" - // - // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw" - "mode": "none" - }, - - // write (required): Write enable for color and alpha channels. - "write": { - // rgb (optional): Whether to store color data when drawing. - // values: true, false - // default: false - "rgb": true, - - // alpha (optional): Whether to store alpha data when drawing. - // values: true, false - // default: false - "alpha": true - }, - - // vertex (required): The vertex shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "vertex": "chains/pillarbox_right_vertical/vs_blit", - - // pixel/fragment (required): The pixel or fragment shader to use when drawing. - // value: A string containing the path and name of a shader file to use, minus the extension. - "fragment": "chains/pillarbox_right_vertical/fs_blit", - - // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist. - "uniforms": [ - { - // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader. - // value: A string containing the name of the uniform as described above. - // - // NOTE: Some names correspond to special values that will be automatically filled by the BGFX - // code if they are used by the shader. These names are: - // "u_screen_dims" - // The dimensions of the first texture input if present, otherwise the dimensions of the output window. - // Valid values: xy - // "u_inv_screen_dims" - // The reciprocal of u_screen_dims. - // Valid values: xy - // "u_source_dims" - // The size, in pixels, of the screen texture incoming to the chain. - // Valid values: xy - // "u_rotation_type" - // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270. - // Valid values: x - // "u_swap_xy" - // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false. - // Valid values: x - // "u_quad_dims" - // The dimensions, in pixels, occupied by this one screen primitive itself in the output window. - // Valid values: xy - // "u_tex_sizeN" - // The dimensions, in pixels, of the texture in input pair N. Starts at 0. - // valid values: xy - "name": "s_tex", - - // type (required): The type of the uniform. - // values: "int", "vec4", "mat3", "mat4" - // - // Note: "int" should only be used for samplers. - "type": "int", - - // values (required): The array of numbers with which to initialize the uniform. - // value: A JSON array containin the correct amount of numbers to initialize a uniform of the - // above-specified type. The following size rules should be followed: - // "int": 1 float - // "vec4": 4 floats - // "mat3": 9 floats - // "mat4": 16 floats - "values": [ 1.0 ] - } - ] -} \ No newline at end of file diff --git a/bgfx/effects/pillarbox_right_vertical/saturation.json b/bgfx/effects/pillarbox_right_vertical/saturation.json deleted file mode 100644 index f51e68f6134..00000000000 --- a/bgfx/effects/pillarbox_right_vertical/saturation.json +++ /dev/null @@ -1,30 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// saturation.json: Applies saturation to an image. -// -//============================================================ -{ - "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/pillarbox_right_vertical/vs_saturation", - "fragment": "chains/pillarbox_right_vertical/fs_saturation", - "uniforms": [ - { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, - { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] } - ] -} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json b/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json new file mode 100644 index 00000000000..decf8d322ab --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json @@ -0,0 +1,38 @@ +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader + + Copyright (C) 2011-2014 Hyllian/Jararaca - sergiogdb@gmail.com +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/super-xbr-2p/vs_custom-jinc2-sharper", + "fragment": "chains/super-xbr-2p/fs_custom-jinc2-sharper", + "uniforms": [ + { "name": "s_p", "type": "int", "values": [ 1.0 ] }, + { "name": "JINC2_WINDOW_SINC", "type": "vec4", "values": [ 0.42, 0.0, 0.0, 0.0 ] }, + { "name": "JINC2_SINC", "type": "vec4", "values": [ 0.92, 0.0, 0.0, 0.0 ] }, + { "name": "JINC2_AR_STRENGTH", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json new file mode 100644 index 00000000000..a0e77327bb0 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader, pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass0", + "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass0", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json new file mode 100644 index 00000000000..1e9669c91f9 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json @@ -0,0 +1,59 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader, pass1 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass1", + "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass1", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json new file mode 100644 index 00000000000..86dad8cd5bd --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json @@ -0,0 +1,59 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader, pass2 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass2", + "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass2", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json new file mode 100644 index 00000000000..fccbdaf32db --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass0", + "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass0", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json new file mode 100644 index 00000000000..1f0492ee3c3 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json @@ -0,0 +1,59 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass1", + "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass1", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json new file mode 100644 index 00000000000..665f455e662 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass2", + "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass2", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json new file mode 100644 index 00000000000..e33bc2ebb61 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json @@ -0,0 +1,59 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass3", + "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass3", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json new file mode 100644 index 00000000000..bd3d511cc98 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader, Fast (pass0) ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass0", + "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass0", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json new file mode 100644 index 00000000000..4b65ac60ba4 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader, Fast (pass1) ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass1", + "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass1", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json new file mode 100644 index 00000000000..f3ce83b4272 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader, Fast (pass2) ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass2", + "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass2", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-pass0.json b/bgfx/effects/xbr/super-xbr/super-xbr-pass0.json new file mode 100644 index 00000000000..c7d1db28110 --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-xbr-pass0.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass0", + "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass0", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-pass1.json b/bgfx/effects/xbr/super-xbr/super-xbr-pass1.json new file mode 100644 index 00000000000..13e8f8dbd9a --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-xbr-pass1.json @@ -0,0 +1,59 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass1", + "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass1", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-pass2.json b/bgfx/effects/xbr/super-xbr/super-xbr-pass2.json new file mode 100644 index 00000000000..bea988632cf --- /dev/null +++ b/bgfx/effects/xbr/super-xbr/super-xbr-pass2.json @@ -0,0 +1,58 @@ +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +{ + "blend": { + "equation": "add", + "srcColor": "1", + "dstColor": "0", + "srcAlpha": "1", + "dstAlpha": "0" + }, + "depth": { + "function": "always", + "writeenable": false + }, + "cull": { + "mode": "none" + }, + "write": { + "rgb": true, + "alpha": true + }, + "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass2", + "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass2", + "uniforms": [ + { "name": "s0", "type": "int", "values": [ 1.0 ] }, + { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/shaders/dx11/chains/hlsl/fs_blit.bin b/bgfx/shaders/dx11/chains/misc/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx11/chains/hlsl/fs_blit.bin rename to bgfx/shaders/dx11/chains/misc/fs_blit.bin diff --git a/bgfx/shaders/dx11/chains/misc/fs_bob-and-ghost-deinterlace.bin b/bgfx/shaders/dx11/chains/misc/fs_bob-and-ghost-deinterlace.bin new file mode 100644 index 0000000000000000000000000000000000000000..1d599087b331e3a04a39e2e552c850a1f7ddeef7 GIT binary patch literal 1451 zcmZ`(L2DCH5T4y^lG;dJ3k92tix&|@(;&rDvo*=K0qK?`4N-(hAyC1C&VrzJ-dAV}j_>S1WOje(m*)^-58Xo<8%&dkK>k_?wTv(Fmyx=3-3S+cg9B8w+=ek}6s z>)F_q)l+=eQ2H`*lDh{VkuS~aB;v)aixLzTGduFkvDJ*9i(L|_Fcy37$Jk`jaK**0 zgUh81Yx5E><^3$zAh2;t=k2Mz;d^;gw0!e=Lrj9+@YLS8IzP_ujfY$P16A_o{b!YyZ^7 h(~q&`^qvO3KdwCAYaf4YxMF%AW&e%Lcf;@s4{JL? zu&}c^uoJ8;tgWmp#Y&qL+WP(W?ZhR-2eUK#ec#NRdHXiW`b%m2dQh{q_{RRIKa8_} zYu(H$cCt4}l7CQBQ2oKd{kw zDElcJWZOG09xbaOdy+@t0S*uTG(hS2~=#4yjiDbUWXR)Vhj5@>Zcx1=NS-&^@CbBL3kL;F4NnS>Z zLNB-3`c5-{AD`Bkk3zh+XLhe?wP{liu?NykqrmA5s>{M+vlCMb*w<4*mplvaUeh)7 z{9|LWM%3zK)!}TCYRH$Lbo5T%ruKoSkL5|EXTZ@sS4^I3h+U(QdNa)xvz4Qw-;JW) zTH(vw*#f&+Vc;Kr%YBk<}*t3s|HOu}VPKAePp4 zV!hb=32a2Lu@OIlSZtxK=QlHV9YTT+?z}hWoO|E7@6ANna3Klb#tmzQx3)*aG|Yw< zR?MtsCkJs9{ewD!nvZrK-rqe}gZ{cO7+>#ydH> zsQ9UfvyIJHnnl^N;<18(9xbD-c$Tk<2RJy-xl&(JlC*x4gGr$;O-Ng9;inT%vFvaz~}+3 zV&1#=o5Zv75i;E;dw3ReM5DSSQ+GxH_Kyo1$LaeSjG&X@4KL`jZtnCDgRJPXE zf|a#}t^Xldq;w{iJ&6l@Z{NJxH?xoHIJK}{d8!*?UAfmi@1{BEUxY;@EQu?3=-s-P zy^*(LNM1rRGs@j!>FzUD_<7GpiksiBlm3Ah0()kNm{_-w6J!=(-8pWYqb43lHjx^{ z7^##<$1mq!;=C`0!u^LsLQLQ#`^0WZ({}3Zy4{d=rCYM?R#|N5-Gf8-)T1_o_XT>W zhXfa)daxlQ1+fyJ>#g`W?_dyTlJ9ifz=ZE9u=3*6%B>GH@zn<4p2Al3A%jXJg2Zg* zG@YLBS?5qwLu+cEp=X-$IXv^&gT2-{)Z{5nUzph-wvQ*6ir?E=_j^>I{W%d!&lLwO z(S?s{((eTnR}YFQpL%;3M?FEbvA2Y_M7j`o0&Hs+i=Q3tN2tgB-VGYI_>LP_u?!lB0-7w-Cp~~ zz3dFy8;0a0AQPj|Jjj3aM)ueFYqPa||J}-dE(gG#7$PRlb@(%U4PeDNtezq!9);K7 zYQ$*Cq)5XHr(fdi7eV0u!!bfk;CbuFvZZD@m3qahO1;?3Tb5lA3-j*4p?c2aY#RId z^APt4&P?Y)h71(MNqjnQ!Nb{uMx0K*({Ozeo+e+)i&HMx?Ir{`P z#xB%t>WsT9so_3w_Ju{b2Y2%K#2YY|CB+Qk Ilfpmz12;xqFaQ7m literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/pillarbox_left_vertical/vs_saturation.bin b/bgfx/shaders/dx11/chains/misc/vs_saturation.bin similarity index 100% rename from bgfx/shaders/dx11/chains/pillarbox_left_vertical/vs_saturation.bin rename to bgfx/shaders/dx11/chains/misc/vs_saturation.bin diff --git a/bgfx/shaders/dx11/chains/pillarbox_left_vertical/fs_saturation.bin b/bgfx/shaders/dx11/chains/pillarbox_left_vertical/fs_saturation.bin deleted file mode 100644 index eaec59b81d7e206ae62ad1d00702e2031c7fa82e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523 zcmYjLu}Z^G6un8)QbjO!C@w<4Q3vVZAXr<|qzy=4O;U*>#0mukvC=lsL8R#5<}NPc z+And}&Bf74$R;kHo0otW&U^RWbKbef_F9^97k{d>5QU@OI2!iG=Yz`<5h;`(h2#EY zL*f2IX#~6G>vujH{49BE`%l-=@5(ADFhn`r>%cSc1~^``eSw?jMW6$4v7TpKi@i#0mukvC=lsL8R#5<}NPc z+And}&Bf74$R;kHo0otW&U^RWbKbef_F9^97k{d>5QU@OI2!iG=Yz`<5h;`(h2#EY zL*f2IX#~6G>vujH{49BE`%l-=@5(ADFhn`r>%cSc1~^``eSw?jMW6$4v7TpKi@i#0mukvC=lsL8R#5<}NPc z+And}&Bf74$R;kHo0otW&U^RWbKbef_F9^97k{d>5QU@OI2!iG=Yz`<5h;`(h2#EY zL*f2IX#~6G>vujH{49BE`%l-=@5(ADFhn`r>%cSc1~^``eSw?jMW6$4v7TpKi@iQ&B*{{IRFWV$ySVy emCP6zSdA0}7?^<4ZUPY6jsYmm%nBp~fGPoU{|^)Z delta 126 zcmdnb@||k9o&j6TTdn)cJJDl#mKU=W<-owm;5FHb z@v)Z?0|UR2f&c>(P})rZLNhrqFwC4OX?OOFk3CQr4451k7|xzKV++C%5e5c32B0y_ KtUy8lXd(dWIU3mj diff --git a/bgfx/shaders/dx11/chains/xbr-lv2-deposterize/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-lv2-deposterize/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zQ&B*{{IRFWV$ySVy emCP6zSdA0}7?^<4ZUPY6jsYmm%nBp~fGPoU{|^)Z delta 126 zcmdnb@|U=W<-owm;5FHb z@v)Z?0|UR2f&c>(P})rZLNhrqFwC4OX?OOFk3CQr44521l!N`*GiPi;ED*3`02;&0 K3M2%8CISHQMj2rM diff --git a/bgfx/shaders/dx11/chains/xbr-lv2-fast/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-lv2-fast/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zQ&B*{{IRFWV$ySVy emCP6zSdA0}7?^<4ZUPY6jsYmm%nBp~fGPoU{|^)Z delta 126 zcmdnb@|6I;4snbH>U=W<-owm;5FHb z@v)Z?0|UR2f&c>(P})rZLNhrqFq}Q(V}JXutUXW|44521VrOi{1t;1;L>L%=3`PcK KRv;k&G!X!3`xun~ diff --git a/bgfx/shaders/dx11/chains/xbr-lv2-multipass/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-lv2-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr-lv2-noblend/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-lv2-noblend/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr-lv3-multipass/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-lv3-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr-lv3-noblend/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-lv3-noblend/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr-lv3/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-lv3/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr-mlv4-dilation/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-mlv4-dilation/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr-mlv4-multipass/fs_blit.bin b/bgfx/shaders/dx11/chains/xbr-mlv4-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..80d85fb110742d3ae2415a237aee617a3e0c7b8c GIT binary patch literal 396 zcmZ<@_F!Rb{`8QMfwefkB(=hTk%57cp@7jP!pV7G#q*_-JO!_PHm;EuYk4^xC+ix2P*_6+g#_hWGO_wf&62yu;Y_V*8RVOZ@Cv=ih8kQpF56@VB9knIGT5#ku+ z?i#|ddUddeOVAXcA_pK=1>z`>^AZGrECz-M2?iF10th=a6zC=a2Ifx!0$}q&Y$G5W zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/fs_xbr-lv1-noblend.bin b/bgfx/shaders/dx11/chains/xbr/fs_xbr-lv1-noblend.bin new file mode 100644 index 0000000000000000000000000000000000000000..1bb404e2c90e7bbec3d184cd450c9fb9d4cce8ab GIT binary patch literal 3680 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2-fast.bin b/bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..c7ba1220aa56c07216a23b7afa948a035c97c582 GIT binary patch literal 4949 zcma)DW$QrpXc?BSGtR*POrApj98DtT3VakSm<|qy~Tya?ioos zl1#t9@!sZ@jdw47xOuFdj)_yuz1>bF#Jq^J5DOwMgy>2;T@I0mL5M_r8ln%{>8lWl z_%1{u?gVkEoqiE9w%$&^Yu|fu^NrWuIyRO>f80KKetzNS$G>0t`}VDu|N88=yFcFf zq$`mmDUEACs_Rc(Pl~y?a_YiS$43w?B1hje`%RCR-o9R9ZzEAH?MUE?C) zqr-yFbw~#A(P6>cqsx4rS?qgt!CzV1INM)YTwUy+Nelg@{&HIFo?qzqmrtgfePJgT z;()!Q%gesNC?BhH%cr`l>E_Lq(Ghd3K07lL_@VEMCXQ)xF%AAr`MTe!?B7({2gU2A)Vi+;V%N0` z*#G+2@EU=i_|zZV!|>A&@@F50pZK;9oksrPCjKb=)Zg}@)3E2ABL7kGkJRkZb^V`G zZp_HO%p=CVJynm@pQ*YGoubq&4NlZA`{2F6FFua9s@*;;V=qeG8a_0KJ8&2e`gQ*| z#<%N$m)-iekCtrggFL}%AIQMZUX;2uFwW+8#n`Ox+~9Y!4m|ofsvq=IaU-7Xd449> z0pAlf9X;+Er&J%PCAs3WDRT~Bf1wuJH8O_X*2sOtFEe2O?3THH-jO}K%UP4^Br`cB z!gDH&gE>7@Kdq2Yi%|UF!*m`Z@9 z>Xu5~w=d=i|61YmfCy~t(=#Y`;BriG)oJV;7mUUZU6i`jVnP!ad(Tt$6y|w0VZ(O`-}E}>FP}I0jnVfbdK$Bp`NUk? zn{_iTo%yEmv$K~e|K_I?o_m?HB8U3C-kz>(C9A)i)%WFkXD}CL5>|WI$6Vxo-OKyI z&T!x8x^J$X_gvSJbwEC>4%Dhy2eEeKMm^j+kq^xc-C_7WN5(I;9rFsl=W^Vp%yU6+ zpqoABT{`92nis>cOHOte)!Nx}c*KII@qhg;~SdYUi3B z)_L@*Wav)SXgy9^=jj?>I-!gFk4#VK>`V={M=aOea%#?6(>xOgeRQ+}C$=~CRkne7 zyPmE2oU3u7Yn<+zb&M0fXx*!GqvghKnPSC%W%RaqB~Scbr%Bhjx4-gr?CQX36xGr(wf>u>PNtWV6h5SM3M?F zi>s{N=%y}87p?`N>uz){F0yeWU8qa{zccs$a{HJ`df~l$=6s+3IrqIcozqZM?I%d|_#=nWn{h9@fRHvl|QD#ZG5=VR`YABrQp% zKHvCk^UlWYn_q6uG}DYYjk!;nsSPnN;xfd7h#Mig(@eKQBw{N>BEAdJ7tQp2h(tUH zk%(V{xY)*!` zNs`jA_E&W+iSd=L<<$$9j%%M3Z(P@Zx>)F=%Q~iO1V&!)`3Zlr#&3u>ECu)$q0e

p7Q{Eg}Oy?#RF-|Epc%2?WU>MG&Pzg zXVcWXsn}0iy?7s~4M)XW6ckT1(X8E*(}82>>)vnYc{b~S!{}BE)xgAc;paKEfRn-M z9NpWoaSZz2QBCAhkAeNE!aj86r*8i!W75xl{u%ATrJw!XXR!bMh3S~te)hztU)0|( zfBHxM^sb*h@okSTe#-i>BR>7^XAl0ij~F$3?C9~J_@@f{h>`7OHtrcwPFr(gu*i>i zS|Mll&P?>=&LhjK8N+@%Ou{~B>=yHkL4(nt8KFjWi0!?^h~83T#IMb zr}%?rgdQJcPyV6PCq6yyXRov?40ndBJ_gq4TMj|(d9U!(@5+96WUmMIWqGz^!%t;z z{Ec7CU!VM`-?(`%@uzRpKggc?Z5KVR;cxr>X8a&~`aj72)HB5Aj14*?~bjD1(Z&T7C@BQWu z9ejH)`*v8eZx1+kwnG;`b$jCPckT|dCw}yHz})q-S1N%!xiIT_HUfY2wL%VUxt~#` z9E_)CIS&r^DD7I}aTz4N@H`%({_&U9lO^vrslCX+Pc*+6{C8-8Y|^copZ&Av&ziC z-`0-*(XE#5@)`G@51$|K_OqI~Rqv}=wGZp!*D*3LVnCNM?1R|$k?Dl4>WdjNkG;{> ztyZt~ay{|P=%?oy!nbOP^H-mtoNvV6&&Lt@p#SjRyx3P=X6(?d%ZweedR_o_>Kz$@qE8YSDeHn8iLKlWw*_1+Wfjf_cM zMvm?=biK!X@42=(2f6or$CkBWOOO2>*l3GUJ5Q5&){tmLkMQX;P96N#8nd6bG&9Vp zcaecn9j)*Y-~QP)zT>4=`hceY_L24Do8LaNUEm%6 zW#l8z$i%~J3s&J{JpW(Nj;?)VyYLauAo+mjTHyUSxtE9Iz}JdeN+0omqgD%YYGHM< zfA;)*C^3yZ>;v4K2Q-+nur;QokBn9L2zmZq#0Pk=z=PEh4#ovtt-U<*es literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..2b20345d32414b4e1185133a4c453bc1f75c07d8 GIT binary patch literal 5497 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..c46028580224e9b9fe45a2e1d58d7e755b2b7cb1 GIT binary patch literal 6949 zcmb7|&1)T17{*Vg?Y+ruv>^y;K)7^ST!i}3Qm~n%y*CX=BR8?OB1FZCf}qq7)P-KF zbSbDH{sGd36%oaas7M!Gxe)g*bm3aMaP9LubDp`!$>hUBXU;qC=ktD?xzh|c&K>-H z>8+PKVfNz6XlrnGb+EOuIhqe4Oobk-CkAV)=QiiVoEUR3md|glZH?B>uj=1?=!<>$ z^{v+~zq$45i*H|EoDYlQ6t6BWPT^v9eYCcU^tIQoTwa`-66?!_vlmy+{QdDW-+l4X zSKmMP@~?k9_xYvIq%BDZ2ejX>ON!w^U27Yw=YP>-SJ$+zuXVA|N0)U(*AJ1ZZt#)A zzge;39e$zffC%{Lu;6nYkpX;kSnv+&GM{G_`ypNCqr-yV(FK3w!q#K!8*7_u>*vFn z^+(r7VRLZt%=-H1Y`C$moXC;*kIm)L>R>b6xUq5W?C6zyLny_6Ng7w=IDuT=cUAD=uUe=|L1BSmA+I1xAUXdSqF)S*3c5L+2V<1_U z6=ev&etYTkrMpioefIk&k03+uXr_m4QEu1E@eKFCOl_Xu19QwdVFe#HU|HD*7WA%W zde|1_-k9mfPIWfsHXWJ8Iv>Kmf%&*#9~TzvI^(|X)yx)U2=D)N@N{?ZZLBl=qSP&f zr4YuaBciqJWtHNWktDto~&nl*tY5Am^mwLc&vjD`p~8$QN-L6VO*}Gu`sum6=geS-UE5Q zZF+Lk{WIxxW~z4xJGhup%P!nm`Epc49Cx#)M(7Hc_gE`z?o(@<@~Kh+E#TBD zUt*w}+vW1y-WZUlRr|*tIlkzBT6GRN?uC{d(8tGeGR%C`bv%~*T91Bc#TkTMQ&)7taDb z_ZS}UZ5DYZ{ra6pe9jfJwAa4GuHPrUabJ(snkqy1@x--6^XC58L zGtWD5wc_^;g!&wFgeI4%5^C}tfUmZE;k$PDmQL*_o2~d8Vk}Y%*K`(G=-|USm}i_k zKde9T@ZN@3;fiNu`ex#F?n=Gbd;;lcaSf-*E?08@m-X<)r%P8)1BEWu54x< zPc{)tQKCHg+eEHE$bKttC7k?Lf`h+Vv1@Yv^LH7}KvC)z#;YN`dqz9Gt>4+msS&u_ ze9b$KW^pH9|10-YPjYuXpI7`zt*RP&d4xtrI9_v$|I+7~(Rm3yp9I)_CmgGL?i z(X1U+O!PcY>^vg_4@=)&akq|oRm=D$Lf<;rx$f|&jeX{J*0)co)pJjcmD9B*>@jC8J2!jg zNlf}UQe5ck>9@To^-#ZOs`pJt^+m^hgwFd&T<}pVWUhicT)Go%?6( s=<)v?;($G_r>p&h-tSlX6|KMHMG^I2xh}CcNvG<~cu7Aha$AOf0b)oR3jhEB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..e6032b15b531d495433442783bb25b12c7e2b0d8 GIT binary patch literal 7662 zcmb`M&u?5;702&9+cWkgO^0crtp&o$vaks0k39Epe4M_xhgi zIp=%Mx%a+1lhMJo#m)AX5lj^4ig-qBmHzkmC}FkH|~@z#Y49ZY=mt*bY;uKaBOC;uJ2 z{LgnjD*yPGe?Rv3KS(4=2n*`JtLOK6{-$U5VCVYJ)ib}W=LJ19@XXO3)$?*3RUgbF zXa1FHDt3QQ39;BGvi2 zo=x#-@|LfbSVH7sR&!!56|Q3}??DOJF4#0LI7JOKK zpgGpn-R@wln4*02cr}N-&Tl3s|LDYgNuN6Yr=M!v$QQAGAq?xN+s(O#Qd6{&2Y%-h zF5}mO-;w|$)fXEl;RfE^x*E4}yBNaREWRv{QmR_1u58AuE%JY{ne$|?w()cL+K%c-{LozFJGPV(a}n;d~wwHyH0V#`mVrfl4!-_uaFV zA9H_9Qn;hnj9oS#sr_Z=Q&9>W?a|Z5>rK0lYxd8HYtybolXEY z(YvG7uk0Rk9#!werp<52=Dhk|RGd!;!#btW6Nldk$W~J>PRfBbf*v+LNcQt{+w1;(R7q1a~)U|4yDbxpj_M&)X@2uGz1nU`}`$OOU7~?PY4S$NbPkm{l zVi4GmMX8T4-U;ECSJZR20TFT0hH&h!qSQwVF1|m6V?Pw7K3Z_xE%3`4FG_v1;Nsmt zIM!8B>Z1j>BnkFd3q`4q8Mt8*=cat8&E%(?X(J-Lzm zAwAzyn|k2UBUh)0T1|T-`XUasngjCF=o8;*^jA}iaK{(D&hdC& zHvM)=3H6=BoHVZEa4rC7>|8`SdjuU~Qy=3@JY%j>9%8QYF?wndHP;w!bN@7j_cLb%j<>+s2EKfXRuAGNElILUe)Mmy)y}+tPd0Jcb+CE7=iPie{i(W^M^P=I2 z>iK1g@5Z^wn&@_>>q*SyA>W_Q!&cH~-QN+8My?pUrsor8HN&tsQd_nSd=LZro9cZA zSU>k6TTxv#U$Gp0>g#$Nqp8}5=Av!nn-qHkNkraw`_oK)kmJ!D__^>&C(~AS)9P?TpF*bW#`)*!L24f z$ZexPUPBZcHTlz}yU*!8T;B%@&FL^W=aO8l8rae^I7EcC)b-Ti{FKp*-I&&c+L)Gm;B^w8@Xdc z=J>&?MH}#uEZXq;V2=FYgRx@QXJtR(<60s==E&K$8Bx`}k)h+%@F8F3Vqag%7tOw? z0W#M@!7Jul?ouZOV)x2W>K9bPTc9+502+jV)}{Ys9~oDh7B_Kg+ysbRU!?giEaB dwQ5XUG;Gs|3l8x&w1nxDNX8rdA6y7!_#ZX0SU&&& literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..4adf8dd729c2c57bc9c1625f5a998edc0f9b6490 GIT binary patch literal 7661 zcmb7}&u<-9702%zJO1$!Qey%w5eO?nEGiZz1rjQejGfqy5sE9@4GBVWRVfvfx>rX=Kj&v)t#-QgTwvRl+q}TVSR6FcjwySYFZIv1;)np!`-9( z-RnF0x0=?(KKbs^o!dV-dgslb-d*7@Jtgnx7acXaWcL(X6ci+CfJ{pO2=ZjZw zZeIEQl`n6;^{xLt`qi7ioc!r;cfTWTNm82A_*Gqh(Dg4}y9Ybh-_i(wN!Kg7AoSru z&*}O>%$gf~6+8z;KtD_dk4FRyL;EumA&uo?We=7n^*Ss_OGVAZtoR!W+K|HVKK-*bwd$Jb4!7BN< zm1n)GMm)LHT+CCFuM;0-`NDkTPwcUI_f9vwsup)j4>WzC7>k?P_T@ajn8&XbvQga_ zTK1(hKj-;YO3Tiz&Esbo$7{_fz@yLV+7Q-mPVzjEXSysISI~@l)T)QBhEA7t&AF6y zmHZ?a=u=he*0jEv=|`zc%zf#y_7;xW)Ygyjn~M3ztXEl*j?vO%$?5C%>6MA<5I(oh zG`^#TlC$2nt=FlcVw|8?;C4UC{*8~zE}u{76nPS}s&z~C!{$m8{g}KlZhX0C#&ANy zAq+h}Yx&gG(2&msiHCejv`B5V^{7p6UD(Umhfb$162(5EM~WY{rAGf#e&p`FmNmx* zdfPodz%Z8V?!wfE`@=e5Kb@5P#`3YXBTi7Qd+quVqpEdF>0!Pm8mBeSv5f7Mgfp-$ z(#M=%^uL>1tgEck&CM}Bm1B_OkdF37)U8jaC%0PaTtRK`JGq6g0ca}s;kYgO~VXS;4(iI(hB_U)R( z2W!+mJ~P8d53XA3rg{h$7-!&GEO156T}_lY1M(&l_T}J~^Y_SIr=w zQJS{vmmWcmPYu{t#eNC7ZgKXz2E;+f`1CA^e!~MFz2zCrh)?gAsun}fxqMAD9@~SZ z&+wJ8bbZQh+V6aRiohp7tsBqIMm8yx8zu4`X>jN<&zB;?bu`z8hOI`i&Y$N0z3HF~bEYl6(YZhwrSIIChG zU<3J#EitTSJY5X{Wdec4fq`z~89_zTOb?foBS?ICGs#>=mJ@Rl|)<#w9)}seLhc7De$?apTXXSE|9aq#&p@rVQ2{*!RJ zmf(bJkDX=afd$fiT-KI%wW?0(AAi1e>DKcXE`Rv%-+o)H(A&&5^nmxKs_xfwoza_{ zp$8^hJ!eP{eAeT=V@MBt*5h4Z zNDqA0}4HL15wCNXkt11LcVN!t;5NClHtp9>_n{( z_#0w?A0LdO7K7w7?QLT}*i0cmc=(X*-;a4mihCZ1TVfXY2^3QGK-wERy+q;}4KLEjg_ z!icW(N2lux9Czm$d;J$o{B40A=M3v?RO==Z@0bjoMmD*O-MPFHeEyVn{j&HQaEZN? zYtx>S)TvzC>^tX%%(e7$4Ikiq$qeY-O2P=g^EIXZ{vb@BWtW8(`S?HbWHPsnS7{#gbO nUwR)5oeMm7*0R3xg76Ko{?2HO?@3u_R3n*O=Ksx7s?+}gW2aBy literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin new file mode 100644 index 0000000000000000000000000000000000000000..e2deb08ba1027b33aba0538e0e8a7ceb5276c047 GIT binary patch literal 6961 zcmbW5&1)T17{*T~?M-qUZ3v1Q5H4L77omPs1e;0Pn=~Me+{D_ti3k-17g9e^5xrLJ z(uIP!65Mptjp)XOige*d7vj!^8yEfo6B`{hfoZNK#V8cKO&^9<2?x!u9K$XU~k@yeEWO{A~rf zC}^u640M+;K1KMa=i$QwpG1buf(%@0A_0Q>;af#&KWECumQ`;Enq?K zN}-2sRUeF*e(Y6eWA4(CS*-J6>|2;m2=)nK!LBzR=rhf1Rfq8Iw}(zm4ZnXV zBLXb02{xW5X5X@^-aSv&Gd^s)^h(T}l`cHi!3TZl(vc`)?u#%k*U?y*Tg$4t8#B*= zGT$yextaPc>-A>RGlU&n%&2AOZ%@A5SNdpK*+*=_ZGHSR6XXkCZ9Qu)L&pe2Z`66G*zAPtad&Ii(2h~~h;qkLeynNaEcXW* z46ZLR&@Jssd1-G9$n$FaV~-qP^gpjAhZ6TfM-J%YV>ufZKAJin&wi~(KeXZuLP*}& zOUH8@?ZH*r74n&t>=%1-V4(|*omS&xp%sHOWqF?6hygx1Fo#-kRv=3IQeI#{t%>g( zk7bP58>8?>U41k;7@Ug2OG9D1DShUZ z?`i7Nen0g48MX4Ww#gc z?>Jpp_rv4&o)V9FIZmuQJm>894xYKjWgJJu|3pqUM z@L@Di?gMy79MUhj_F%l8JTM}L}|zU9~SzXY~bt&e8$zw!9gvV6Doq;h~Q z|67NpTZmCBMy>PGU^SLrftCDLl*>-tLy*mp6PZ`Z3x3iCt-6f|ai?}#Q|Lnf-cPw+ z&9**2S)%s{ws&Q{N z#g)yhGo{66F4dlMY|e#NdS`qytXoQJB`M;Nb#@b+o#^s0G& zBd12-?(#M7IGW47eEp}~b3Mu3^?X+GcWRYt1V)zYTjp+F7v3wkfY-jr`JmimUGkZ% zY8kZZc(-Qlm|~*md1B`t8F*NF2aCIP)T>6u`w{xq!OnGuM{Vr0w6nf_O0AiDYQ#Kv z{zb<5g(q2jCY5rZIdFi7n72Hi`P~2?S)P>{{?_+;0Y%C*+!^ znBQJAbv0v@YE!RQk0xx?4IiEnXn5rGf9K7$rQXN0uf2K#W&V>_x`X)f3KRjB~)bUCDaPJNnd`{M;LOoGo_ih~Cv3dWuddvz_~A?C9}7 o4{^XA*VAb~sptFUL8A4WUKCLemg^FGlXX&W#!LF*mfJe~13Z)*rT_o{ literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..e9f036afa78cf913a4888b399abf25a7c9bd1af3 GIT binary patch literal 7650 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin new file mode 100644 index 0000000000000000000000000000000000000000..c46028580224e9b9fe45a2e1d58d7e755b2b7cb1 GIT binary patch literal 6949 zcmb7|&1)T17{*Vg?Y+ruv>^y;K)7^ST!i}3Qm~n%y*CX=BR8?OB1FZCf}qq7)P-KF zbSbDH{sGd36%oaas7M!Gxe)g*bm3aMaP9LubDp`!$>hUBXU;qC=ktD?xzh|c&K>-H z>8+PKVfNz6XlrnGb+EOuIhqe4Oobk-CkAV)=QiiVoEUR3md|glZH?B>uj=1?=!<>$ z^{v+~zq$45i*H|EoDYlQ6t6BWPT^v9eYCcU^tIQoTwa`-66?!_vlmy+{QdDW-+l4X zSKmMP@~?k9_xYvIq%BDZ2ejX>ON!w^U27Yw=YP>-SJ$+zuXVA|N0)U(*AJ1ZZt#)A zzge;39e$zffC%{Lu;6nYkpX;kSnv+&GM{G_`ypNCqr-yV(FK3w!q#K!8*7_u>*vFn z^+(r7VRLZt%=-H1Y`C$moXC;*kIm)L>R>b6xUq5W?C6zyLny_6Ng7w=IDuT=cUAD=uUe=|L1BSmA+I1xAUXdSqF)S*3c5L+2V<1_U z6=ev&etYTkrMpioefIk&k03+uXr_m4QEu1E@eKFCOl_Xu19QwdVFe#HU|HD*7WA%W zde|1_-k9mfPIWfsHXWJ8Iv>Kmf%&*#9~TzvI^(|X)yx)U2=D)N@N{?ZZLBl=qSP&f zr4YuaBciqJWtHNWktDto~&nl*tY5Am^mwLc&vjD`p~8$QN-L6VO*}Gu`sum6=geS-UE5Q zZF+Lk{WIxxW~z4xJGhup%P!nm`Epc49Cx#)M(7Hc_gE`z?o(@<@~Kh+E#TBD zUt*w}+vW1y-WZUlRr|*tIlkzBT6GRN?uC{d(8tGeGR%C`bv%~*T91Bc#TkTMQ&)7taDb z_ZS}UZ5DYZ{ra6pe9jfJwAa4GuHPrUabJ(snkqy1@x--6^XC58L zGtWD5wc_^;g!&wFgeI4%5^C}tfUmZE;k$PDmQL*_o2~d8Vk}Y%*K`(G=-|USm}i_k zKde9T@ZN@3;fiNu`ex#F?n=Gbd;;lcaSf-*E?08@m-X<)r%P8)1BEWu54x< zPc{)tQKCHg+eEHE$bKttC7k?Lf`h+Vv1@Yv^LH7}KvC)z#;YN`dqz9Gt>4+msS&u_ ze9b$KW^pH9|10-YPjYuXpI7`zt*RP&d4xtrI9_v$|I+7~(Rm3yp9I)_CmgGL?i z(X1U+O!PcY>^vg_4@=)&akq|oRm=D$Lf<;rx$f|&jeX{J*0)co)pJjcmD9B*>@jC8J2!jg zNlf}UQe5ck>9@To^-#ZOs`pJt^+m^hgwFd&T<}pVWUhicT)Go%?6( s=<)v?;($G_r>p&h-tSlX6|KMHMG^I2xh}CcNvG<~cu7Aha$AOf0b)oR3jhEB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..5a92a7f25206460d9566e9b5a3d02e7fdcca0b88 GIT binary patch literal 4342 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 h%X*6|v8>7L literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..195330767b5086d63fb92a3cd442f13840a1fdbc GIT binary patch literal 4118 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass1.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..3624fe72f409748edb2b2790c80021a493cfdd52 GIT binary patch literal 5921 zcmb7|&2N-d6vpqov_ly{$BG{zF*YuZivlXdMEVx!lqQCnwjvml5)zCiE({;WxG+@= zOE+$aD_6v%OV@scrE%fHrNp@54`AWi=Xc)wOz*tRRJh@td*__zJm=${d*3O8^|Mo* zn-Bi!rUMsFt!*xySzg*)-&mVXDRoj0(Ys44%V#%cQ(uBUg2i(iE1PR8=a%(vHqA-A z|HkI^E1zv%`{?s4^RsDQlIq(0dhVx=E7`BpYIXwrG9+(8vYBXQwBY)?eo$u)Q zez~9a9PRfb?knPWFxOx|R4RvrIiV1bYI7Kaj2mpt#dl&ooYM4ApK%iRF6VW()7VzE zq|Nw66A#>bU&^?b^L#kZM+#l1292+V>%}y+$Lle;h29w4QcC-r+c1wW8a~%eUD=t0 zqh8>cwGEw2= zeK6C^M^ico1|Neb`df>^Y=3pFju}3KL(M)%j^3L z$9}t7lW%ahVuOQx_i9nr+W8UJI3HClgPl=pS>qQT`{f=e{g(Mkwb%KAVNky^?ugel zX~k_H`?6icFHGsfn4U2BFa}>fAM7`ApmQ8mtuIZzo0Yy0TbWyMWf}Wj`W1XHHQld; zd&u>4Ob0S2m`VL|5PQXKOzFe@5y@Jd>LwTvecn>m1sH!?9KAV*m?L303;4JGSc=VU%;l8$GLT6cf4-{GN ztDM82>L<=nRj2gFj~7o~eD3(d?R($8DG`Xk;Ts%1U)7UwmGt1IHCOdyT-*`D(cin_ z;@%OC9^VazKm5|SyWz+a9R0Z)F8W_MdUQ7&^?;B4-whY%SU5&iPp%7j!pGiM^<-T1 zhH&)yIGn^Y>@Rt~k(%?v9%>!;v-RX>nQ_!oV_#|ir3B_;jh#mLFb6d=2YG0eF+7$% z`8}q6yi@2G@?oEK?xJ_wad&Dd(^d@*oyJHWnIrhvU+by0^FxR|SdFMvuEUn=1C}** z8sVel;HRj>v4A*WQnak-A79cY<-bR^h|;UkX>Q%X&&R^pV#i=f`?D^169f<~n8G zk^L&qhHdg3{eq45BVx3kdX{^ETqE+dk8)3QUyjs)`nnG6xyB>cA@^#W3HL4jG{Q&r zJ+j~V42KWfQ>Su0h9i7%2eEhM*|6XLu^-v*^88M+cdcDV=1#4Td`DoX5qYv8t~^Jq z;5CMO(c78}0Uz-Ebo|z9>i6M$w31BR`nzK1ffJq+b2~hiX^y_&u5zr-Whd73YZG%_ z^EVoIH@bqO;m?2HkU=-c39hPTv~=v`&7Z%H_r65<>faU5I4pXGZK|4Y!$EE*iQ}rQ zpOV<`+&lWc2cNim)^+py2{|}=ml-?qHO{u^{GQC1iCpAnF2^&QWt?+!Iv#ZGc&IfT z=!A=SSlbpI=d-{>Jma|NcjL5-`uMkt=X^Fp#~M7bGUxYI=$_6p*COA)q2qo9@0s5x z&flEO|2{doAH;Bey7|4}{V3yd{>W^LAIE}Rn8<$|m*YXF5wUW{;qaW#?AZMC-5EOn z_M#@(m-$1E%)gWP{wVnqLpy)RMZKIqvNC_ig53FQ`4AT}=lX*3=bX|LoKx~>&amc| z4osulTCkl&!@H<$_ppw;Ce3h`az1f)`E1Tg+0G50j+Gg#MsTo@Y!|F?^5eUJhRf@#lITYn{WgpV~U&ClC5?lFq*$ zsI~91Jcs{$hNF)8ehRtoD!ARNmU;Gj9d6%Cc@B=!ciz8{doMX7s#~1TmVNZ0>x@6w zmohvF3S?(18 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..676ff1da0b5678ce10d8c26d2f608f4916df7984 GIT binary patch literal 4840 zcma)=yKfv-6vnS7j_utdY}C`eQkh&~MkqIQvrg70_de&eh0*x@KM_sn^I=iGB=#~JKwPCr`y z;GOAkes6WO-(TP8@9&I93n7H5&_(oWe`{lNyb$Ikm`AX(J>J?MZEbJp-$Lj~T)cnf z$`lTtFRbsau08(sn+N~A_ruy(A5Q&ST>9b_siX=E)4D9@8Dc%F%W`ZW&TAX$`g^h6MylDnibIbFMdii@uk-9cuD zZ&5xOGy8E;pN+ZAMsBgsXYp@fzAD&Pg$2KvNl*7`7K<{3Pkx@hHQRp>`;5FObqirR zgvqVQ>2{+Ln;g4mt9a6#dw4=@`#XnlbeRSE`uO7fWJPPNMR?t7VtXIqnZ34pZNqzl z*=w_rD)xjkM^A{yijS~#jK#H}vn_axm)ULN^*m!|Ebz=!%yYt7AwGE9Y@~{KJ7U1% zp5WtoV)m^o%H#87JLAK*%`V5xS!u)C2zZ8lOx%v~|YIELfmkFEVr%fp`9 zPV5|cyhp5G&Q|Av9=LC@-w8)i9`Bn>=ayv6?B5KPzgYO#6UXrxqmH6%k8>a&^oxx+ z_=-BtgZ^U)oD&{D=Ypqq%xO`!=VGtv+vP?sd_{Fl$`$i;Q%-!yV}J6{qoQoj17>{i zU(pJQk20~x^0+p9tcSmu{Fw*wv0n76DVFurj2=v)*fad8lRm*OW;`OtFh=&jiLoU{ zU4#9Nfms4W+P7HaY5w#GTjBB=dxg(4+S;ams+2;cT2IhTmi=x8i_Z#smF7I2bEzUW z>NR$;v36vlxdUN>ay_+qPMCw#uZTItvc8l1(|?FQ!#hV7BkG+?^+9v!A@2`77~EfS zV4M5p`rO|b&?l!bo5H%f@pY z{lS&{W%|x)ii%81t#~;^%(}t>in*8DPhFl z7=<_5>Q>ia+<6Sw;26}ok~|g9G3vc+V#L5_2_D=~^DH5Ayh=A&?hD(Y?3q`7r|C=c z`_SKK^vdtv8Tl}y{)R#KZMVXW9J?4(t9yLcd5X%8x^3q(jjdy&^ZOpTvGQBTH%=SY z)A0DaC&y!1$`kvJ%r*PFgLkfR8OJ%v_-;832mZ~z;74ufMDe#e$zpzTp+`nvzE8b& z{=r{FBpLyVR73t6)-wgamu)#G>mZ`q$I2Kx)~-ACQ5^om${ zPkgS@?8e@(5AH9%d4JtYY@QQlVmXFqjrqTpbe4H-)1|qH?{LSo%quyXI-hxLoX;|^ zS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc112796493e2e34c631591a7f7cdfb039bf7aba GIT binary patch literal 1093 zcmZ`&J#Q015FMXCWm}00prAk&H3f2kq7>M&ox?_v&+=I(r--h)d?^x95(h&Q3sFEr z<$@w@Dw>EIiO6+|C^fYF0C#k}ce`UOOBrcyXW!1ud$X$x{8s9B_1&Q(`C)jrAHD4! zzd1;WNJD_+%6|EofQT z{0Ly%f7RJTOgsng!qte;R#!y=6UJZS?3YClF5wRLN#G4{)9Xps^V|Kl*OC6lpy7GF zrg-4HVJ)0|S8y8p&G``jAZShbAVa1KVkI8)6%EcFG~#s4XAX@RZ%uLTXE1Mji zMXbSI;|gNtDNbz~Q?JJ9g_zp$whrsoaNRR8{ey?5uWBSmMI^81iUXF6)#|R8T0l9~ zshH+d(+iBOy4@$HhM4Mi(T{poL<&=@$Eg93adpu%AIk*e_k#9(#peFWo1RXMr*dtb zF)d4O>X>VLVEEYMJ9==|9XpFt!$!tG4R0J*nRk3I*Z*A3RJZ*SaUa$je!d6!$>myp u=HJ=;3})aNu@9DOxd-2Ic?RY`wLKo&I;6!j^R1UTU-Gv~rtvA^zy1fN-)VUO literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc112796493e2e34c631591a7f7cdfb039bf7aba GIT binary patch literal 1093 zcmZ`&J#Q015FMXCWm}00prAk&H3f2kq7>M&ox?_v&+=I(r--h)d?^x95(h&Q3sFEr z<$@w@Dw>EIiO6+|C^fYF0C#k}ce`UOOBrcyXW!1ud$X$x{8s9B_1&Q(`C)jrAHD4! zzd1;WNJD_+%6|EofQT z{0Ly%f7RJTOgsng!qte;R#!y=6UJZS?3YClF5wRLN#G4{)9Xps^V|Kl*OC6lpy7GF zrg-4HVJ)0|S8y8p&G``jAZShbAVa1KVkI8)6%EcFG~#s4XAX@RZ%uLTXE1Mji zMXbSI;|gNtDNbz~Q?JJ9g_zp$whrsoaNRR8{ey?5uWBSmMI^81iUXF6)#|R8T0l9~ zshH+d(+iBOy4@$HhM4Mi(T{poL<&=@$Eg93adpu%AIk*e_k#9(#peFWo1RXMr*dtb zF)d4O>X>VLVEEYMJ9==|9XpFt!$!tG4R0J*nRk3I*Z*A3RJZ*SaUa$je!d6!$>myp u=HJ=;3})aNu@9DOxd-2Ic?RY`wLKo&I;6!j^R1UTU-Gv~rtvA^zy1fN-)VUO literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc112796493e2e34c631591a7f7cdfb039bf7aba GIT binary patch literal 1093 zcmZ`&J#Q015FMXCWm}00prAk&H3f2kq7>M&ox?_v&+=I(r--h)d?^x95(h&Q3sFEr z<$@w@Dw>EIiO6+|C^fYF0C#k}ce`UOOBrcyXW!1ud$X$x{8s9B_1&Q(`C)jrAHD4! zzd1;WNJD_+%6|EofQT z{0Ly%f7RJTOgsng!qte;R#!y=6UJZS?3YClF5wRLN#G4{)9Xps^V|Kl*OC6lpy7GF zrg-4HVJ)0|S8y8p&G``jAZShbAVa1KVkI8)6%EcFG~#s4XAX@RZ%uLTXE1Mji zMXbSI;|gNtDNbz~Q?JJ9g_zp$whrsoaNRR8{ey?5uWBSmMI^81iUXF6)#|R8T0l9~ zshH+d(+iBOy4@$HhM4Mi(T{poL<&=@$Eg93adpu%AIk*e_k#9(#peFWo1RXMr*dtb zF)d4O>X>VLVEEYMJ9==|9XpFt!$!tG4R0J*nRk3I*Z*A3RJZ*SaUa$je!d6!$>myp u=HJ=;3})aNu@9DOxd-2Ic?RY`wLKo&I;6!j^R1UTU-Gv~rtvA^zy1fN-)VUO literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0bebf9da4c8f62f3a2c050041aa49355e4d94d9 GIT binary patch literal 575 zcmZ9I%}T>S6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass0.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..5e66024f1eba0a071f03e471679d650a5099f778 GIT binary patch literal 1053 zcmZ8gu}ULR6up^A#u!}_76mH_X>7JwQY?#w8B81vh!Zj)#A=!iyDkg6Mx(n{x*uR^ zqqU8VA0P|ra0FOzB5S0$zc%p zki?^QJlu@g+i*+g(Q2)UyAhuL3Ah^=6C4#$8C{%_J17*AHS02Jdexf#zN2SQG#q~G zvIlFe%c#jyoZhsiU#&B5YI?`rI_&$3;~t37Z_gNA^~f1zk(_>49I$xSYcOSc0cF*v zV#=qdFW9pB4(3b`G4&rnkA9{^CVJM7;{%X`%G>k~iv*MVg11R(QvZ0|XgWR?a&To* zxblN(qm8}h9-+;BoxS4&Fg=(hK6!W6gZGX{-6VYQEA;=->ZO3#7^5eiJS6oqdxsfHppAVNWqf-YTUAzeu^F*cx`kd#nS2nfX=go2h(lwD@`Wnd8-i3KMo5~;E6ub zr4+i#r@5ZU^k|l7U8bVpcgG&YUq7Bl#sxdMFv=!!*2ym|GMU`?t%+21voy2bOUt)v zoR&ObgfzmQGmI&F89;Gf<_)TiBJ+>;s2G}lPSfKGt?j_}ur@~@|DBGZ*@s#BWJ5f! z7298L+CJyWdMwg)b;p5a<<~n~w|jv?=j)j3=ll0XI_@6Xw%tSK?vvp>-s^xPR2`%U GGxz~&T{$TL literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass2.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc112796493e2e34c631591a7f7cdfb039bf7aba GIT binary patch literal 1093 zcmZ`&J#Q015FMXCWm}00prAk&H3f2kq7>M&ox?_v&+=I(r--h)d?^x95(h&Q3sFEr z<$@w@Dw>EIiO6+|C^fYF0C#k}ce`UOOBrcyXW!1ud$X$x{8s9B_1&Q(`C)jrAHD4! zzd1;WNJD_+%6|EofQT z{0Ly%f7RJTOgsng!qte;R#!y=6UJZS?3YClF5wRLN#G4{)9Xps^V|Kl*OC6lpy7GF zrg-4HVJ)0|S8y8p&G``jAZShbAVa1KVkI8)6%EcFG~#s4XAX@RZ%uLTXE1Mji zMXbSI;|gNtDNbz~Q?JJ9g_zp$whrsoaNRR8{ey?5uWBSmMI^81iUXF6)#|R8T0l9~ zshH+d(+iBOy4@$HhM4Mi(T{poL<&=@$Eg93adpu%AIk*e_k#9(#peFWo1RXMr*dtb zF)d4O>X>VLVEEYMJ9==|9XpFt!$!tG4R0J*nRk3I*Z*A3RJZ*SaUa$je!d6!$>myp u=HJ=;3})aNu@9DOxd-2Ic?RY`wLKo&I;6!j^R1UTU-Gv~rtvA^zy1fN-)VUO literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass3.bin b/bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass3.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc112796493e2e34c631591a7f7cdfb039bf7aba GIT binary patch literal 1093 zcmZ`&J#Q015FMXCWm}00prAk&H3f2kq7>M&ox?_v&+=I(r--h)d?^x95(h&Q3sFEr z<$@w@Dw>EIiO6+|C^fYF0C#k}ce`UOOBrcyXW!1ud$X$x{8s9B_1&Q(`C)jrAHD4! zzd1;WNJD_+%6|EofQT z{0Ly%f7RJTOgsng!qte;R#!y=6UJZS?3YClF5wRLN#G4{)9Xps^V|Kl*OC6lpy7GF zrg-4HVJ)0|S8y8p&G``jAZShbAVa1KVkI8)6%EcFG~#s4XAX@RZ%uLTXE1Mji zMXbSI;|gNtDNbz~Q?JJ9g_zp$whrsoaNRR8{ey?5uWBSmMI^81iUXF6)#|R8T0l9~ zshH+d(+iBOy4@$HhM4Mi(T{poL<&=@$Eg93adpu%AIk*e_k#9(#peFWo1RXMr*dtb zF)d4O>X>VLVEEYMJ9==|9XpFt!$!tG4R0J*nRk3I*Z*A3RJZ*SaUa$je!d6!$>myp u=HJ=;3})aNu@9DOxd-2Ic?RY`wLKo&I;6!j^R1UTU-Gv~rtvA^zy1fN-)VUO literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/vs_xbr-lv1-noblend.bin b/bgfx/shaders/dx11/chains/xbr/vs_xbr-lv1-noblend.bin new file mode 100644 index 0000000000000000000000000000000000000000..482a0ead8fda1aa1377b45d54965de6656fd8b38 GIT binary patch literal 729 zcmZ9Ku}{K46viJdAOQnibTWobVjN5da6FiW&!hR^ z)R3|yWMx#l*OlMWtWoP79~?Q;VgGyilR)*#5HT^IAU+W#K-a%%-XSN?AX*4L$T$iG zkwB% zncK*zp>t{v(X%e98m1g#E&wpu!M=;Yua4kEsR zkKqHj_y9gbpTKi^dpq=lFFE(z@7!~4l0==nYQOuol!obJKYI%9?{4xUl9yty5vE}~ zvZO9KSs$i@Y?MCq$JxFm0ho!^>NT39@2$VXUtc}D=O4H6+fNSKi6vs=y@&op?}GHB zlkPPzc^4g^O_5`5Zi*xt&Y$FYUJ)Q&;b9>*_@+8lp#&=OV_$V8Zugo>g)LF=n_`A{ zp&z|jJa6d-JRrF!x6W4(0VKBX~pqW+m4EHi>ur{~`%sIm|7w&9v{|KL8CR&?pYmM>e zeodrg_6-kOoJ9_=thJzAlfiIio_+@+1(V6!(He3ln}_q5u`IIoioDb~lPaG2KRHv4 Z3s^(vUM^;=I*64z=C8C1cvR#<{sAfNNVxz2 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2-fast.bin b/bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b037b2bfe84c87e9bc961391dfb4f721226ebfa GIT binary patch literal 909 zcmZ8gJxc>Y5S`p5myn32&{7E&Hl~miVx_^vGXe2JE`(TJb@U0H)MF$ppmC*K67Z~I5p+Dr}3GBllR-fK(x8TK>CAU zt2RH;gi}62?i$LuX9Xa09<#9f`Fyk|E&)@MV(M7OnSR0KFc$I*_KHiu%u}A)6jQt6 z6foYK#oRfJvM;7)d(6~QU94LY$!c7A(Bj1U++lMTR7SNar}@+|i)*S@cfy<@r n)fhDzG{%{^&fgeo?Zo$ajkiNo^}dL9{-OY8~t4o literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2.bin b/bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2.bin new file mode 100644 index 0000000000000000000000000000000000000000..f4fe0e66cca7526ad41f263ae8ec145a84748f90 GIT binary patch literal 1337 zcmZuxO-mb56unL+lQfEEp$id8a9LbPz#=Z}XyVjBaY9CdqA;tVb|d&zaTQ&3*X5CxcJjv(t~h zi1;#jnO+R8)AN&?!LlczOo)`*dz-D5L;v~T-?^(_jfKbg$J?L4aUxQ}V+sBh{sUkq zdB1avn0OW5g{u*x&CH1OZD@Xpvt9*3TEIQLmw>n84{=YranjlC#5=OPwbzQ{URz@H zn?-UBJofwJ@>wtIhuA0JO#5LBsTFY3Z_46&L_S^l3kjka>&0!QIEW(U%4yJ0Esk8rAFO zopBQ}HET?rN5~m9EQeTw=oi*BBY5CCji zWbzCc=kY@P$nag>quT~S^SwY%?aAc_)v=s=Lo&JYfVjeWIGfHJ%w{tLcdo`8sSh{6 zVQ-kp;qHq$dd9nm0;?}qubitlR*U!bzgo&)b93lZ`|xgydDQ;h@js7gr`}gin|#q5CJllG7B-RRws&$>lEzd76s(@~%7DRudKApjMGO;G#FM*jg5p5iT982Mdp(jmn z?$P9)e)ep%8f+czF>w+9EqgZA+F>Cxo0-J88UnZ6+C zCY_|yO_FZ6)4j8E_cqQS0b35O{M*;&9`L1Cw%gTy#C@*!4vTlYozFk-DR-T6w}6aa zvJmFh0&y#+PU0wY807@~Ovf`L#Tn0Y9SP@*h2_20A?Sg(yy`B)o^gD@4n=+?)Q>~H z<`?gEp5&6h%$Pe<-3vTV_rwp{=sC45bJcZd5`$5cTDAVpv;CmW@}F3{zu4z_`oP?; z4Dl-0y1}(8*V3YVgjLpHsD8Cp{T6j_TGEvnj)+Gk_QcB)$Hc{&uUgcYU)tasHojrw z8#aEecg4A^LVwV8%F`QIcqosPbu)Cu-+u84I%O($aGOB-U({bkUM K*!V@klYasJBEviY literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/misc/fs_deposterize-pass0.bin b/bgfx/shaders/dx9/chains/misc/fs_deposterize-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..de4521b235d5598f3143e8eea3ed89ade992bf23 GIT binary patch literal 897 zcmZ8fO-sW-6r4>`EFu&<3-+j&lAx$Jv9+ZIMKl(?74ZWLN<}?*jCl1>Zyr2EyxG5% zqxut!GaJ*^1YURN?b~@XZ`%sn-d^*i<6>^R(`xk&+Xv0C9n2d8gW2Z(BmpK$r)MX} zm%h<{+l8B^Kj}Iehg`R4|6=v`l;snwztyrvD-hn8Qc!e@2X1&%hmQyxKj-;j!(~S zs*S#&b9ljXoLKj5YJz7uf3$MY6r8=gV30t-S}>(H;Z8;E#E*ms5y=_+(XO>n zWL)&Qm=xqo?zzXnPd@a&ef|xVajG z|24t}iF%T!XSLBAwR}&sNegv}+iLTO$!oP_T7{)meN~_D>#&bM7--7xIFC8OtSamS=|hojw`qj5YJj7uf3$hXu=#;m=6*n)$5H=^Lc8 g(;MXHtG?NM=`Gb#6mMc@n!Y(`N%QDMNx~`q0?~J^;s5{u literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/pillarbox_left_horizontal/fs_saturation.bin b/bgfx/shaders/dx9/chains/misc/fs_saturation.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_left_horizontal/fs_saturation.bin rename to bgfx/shaders/dx9/chains/misc/fs_saturation.bin diff --git a/bgfx/shaders/dx9/chains/hlsl/vs_blit.bin b/bgfx/shaders/dx9/chains/misc/vs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/hlsl/vs_blit.bin rename to bgfx/shaders/dx9/chains/misc/vs_blit.bin diff --git a/bgfx/shaders/dx9/chains/hq2x/vs_blit.bin b/bgfx/shaders/dx9/chains/misc/vs_bob-and-ghost-deinterlace.bin similarity index 100% rename from bgfx/shaders/dx9/chains/hq2x/vs_blit.bin rename to bgfx/shaders/dx9/chains/misc/vs_bob-and-ghost-deinterlace.bin diff --git a/bgfx/shaders/dx9/chains/misc/vs_deposterize-pass0.bin b/bgfx/shaders/dx9/chains/misc/vs_deposterize-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..c8cf8f27b41c8cf6f83b622874acc88e215e4054 GIT binary patch literal 500 zcmYjN%Syvg5Ir|HanUaF1A=j=^3WdyuYNy#3tU5)P$&)kQ5d|mdeNh) z0299odY;X*9n>xlkJbTv5K=Q3B*!Q4&QK=|PH+q@Le32#I+N%Ua#nUytBJ+TqPN_R zv1ZR)>5ck+)pv0k-u0q>)EPKi7u!yw*={=Rhuiz0=hUL7=derSxfQqKxvu9`yuIrF zF2?78Wx-CrCV$oZ5r`)eH~72~5Ce81oTXS5+#)wt>eNh^dTMgM(CC7zShLQWrj|al zRN*S&xAWTEAvqF8`sSLcaLu~p2DHqQ&yu1aTc|TXNY?l^{->BmsrV_B>HouiC$+Gd R&&zJ{<6c7ad7fk$fPbo@T|@u? literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/misc/vs_deposterize-pass1.bin b/bgfx/shaders/dx9/chains/misc/vs_deposterize-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..9576d95be2424a64e3438f6129961a2472c14539 GIT binary patch literal 500 zcmYjMO-sW-5Ph57sMJI8E|{ZUYC=W4Y85I}thV(UMI%Nkk$$L%hk$<|9t4lM_eb>7 z-ynGFp}(W?P1-`2eaxFTZ)SF{8dY`-?UxVs zFt`A08^!c{_*>2&fp{o!i_a?nF;Gl|Q;OA`+vL`gPS1GZrzht#kDhZCYwFZAy__>i z6smxPY<@}8GztqMk S@0Z;&k9!I6=XsK4{MA3|L0;tm literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/pillarbox_left_vertical/vs_saturation.bin b/bgfx/shaders/dx9/chains/misc/vs_saturation.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_left_vertical/vs_saturation.bin rename to bgfx/shaders/dx9/chains/misc/vs_saturation.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_left_vertical/fs_saturation.bin b/bgfx/shaders/dx9/chains/pillarbox_left_vertical/fs_saturation.bin deleted file mode 100644 index 5fe87a15fb52ece4b2651e3427458ce2934cf97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmYjMJxjw-6g@9ZFhe2W&`B_(F7btmxTx5wWQc>tQ3ydR2C6AZ3LP9G9lF-hEx6|Q z_ydG2uKobyd8vr^ak%fCd$=EGfv1c4*M|lp3-i%T3P7Mc4YMeprcoXzkL#`E33Qs~ zyV=3;>UgjLU`{AaV^SP1z!TF6(IEsh_{=J<3FTuej0qL(JXDpAE_L-*@qaeU6$i7X z|J5g1*bgPnH;tX zta8zNJ$yUu9lg&!57g96u4e!RH(#nhr6o+O9JHrc)NAs(G|9QC;)Ot6(#TWSemS0X Wa8Yx`*`wr5^s%35($f@8L-hw=t4n(T diff --git a/bgfx/shaders/dx9/chains/pillarbox_right_horizontal/fs_saturation.bin b/bgfx/shaders/dx9/chains/pillarbox_right_horizontal/fs_saturation.bin deleted file mode 100644 index 5fe87a15fb52ece4b2651e3427458ce2934cf97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmYjMJxjw-6g@9ZFhe2W&`B_(F7btmxTx5wWQc>tQ3ydR2C6AZ3LP9G9lF-hEx6|Q z_ydG2uKobyd8vr^ak%fCd$=EGfv1c4*M|lp3-i%T3P7Mc4YMeprcoXzkL#`E33Qs~ zyV=3;>UgjLU`{AaV^SP1z!TF6(IEsh_{=J<3FTuej0qL(JXDpAE_L-*@qaeU6$i7X z|J5g1*bgPnH;tX zta8zNJ$yUu9lg&!57g96u4e!RH(#nhr6o+O9JHrc)NAs(G|9QC;)Ot6(#TWSemS0X Wa8Yx`*`wr5^s%35($f@8L-hw=t4n(T diff --git a/bgfx/shaders/dx9/chains/pillarbox_right_vertical/fs_saturation.bin b/bgfx/shaders/dx9/chains/pillarbox_right_vertical/fs_saturation.bin deleted file mode 100644 index 5fe87a15fb52ece4b2651e3427458ce2934cf97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmYjMJxjw-6g@9ZFhe2W&`B_(F7btmxTx5wWQc>tQ3ydR2C6AZ3LP9G9lF-hEx6|Q z_ydG2uKobyd8vr^ak%fCd$=EGfv1c4*M|lp3-i%T3P7Mc4YMeprcoXzkL#`E33Qs~ zyV=3;>UgjLU`{AaV^SP1z!TF6(IEsh_{=J<3FTuej0qL(JXDpAE_L-*@qaeU6$i7X z|J5g1*bgPnH;tX zta8zNJ$yUu9lg&!57g96u4e!RH(#nhr6o+O9JHrc)NAs(G|9QC;)Ot6(#TWSemS0X Wa8Yx`*`wr5^s%35($f@8L-hw=t4n(T diff --git a/bgfx/shaders/dx9/chains/hq2x/fs_blit.bin b/bgfx/shaders/dx9/chains/super-4xbr-3d-4p/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/hq2x/fs_blit.bin rename to bgfx/shaders/dx9/chains/super-4xbr-3d-4p/fs_blit.bin diff --git a/bgfx/shaders/dx9/chains/hq3x/vs_blit.bin b/bgfx/shaders/dx9/chains/super-4xbr-3d-4p/vs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/hq3x/vs_blit.bin rename to bgfx/shaders/dx9/chains/super-4xbr-3d-4p/vs_blit.bin diff --git a/bgfx/shaders/dx9/chains/hq3x/fs_blit.bin b/bgfx/shaders/dx9/chains/super-4xbr-3d-6p-smoother/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/hq3x/fs_blit.bin rename to bgfx/shaders/dx9/chains/super-4xbr-3d-6p-smoother/fs_blit.bin diff --git a/bgfx/shaders/dx9/chains/hq4x/vs_blit.bin b/bgfx/shaders/dx9/chains/super-4xbr-3d-6p-smoother/vs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/hq4x/vs_blit.bin rename to bgfx/shaders/dx9/chains/super-4xbr-3d-6p-smoother/vs_blit.bin diff --git a/bgfx/shaders/dx9/chains/hq4x/fs_blit.bin b/bgfx/shaders/dx9/chains/xbr-hybrid/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/hq4x/fs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-hybrid/fs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_left_horizontal/vs_blit.bin b/bgfx/shaders/dx9/chains/xbr-hybrid/vs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_left_horizontal/vs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-hybrid/vs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_left_horizontal/fs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv1-noblend/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_left_horizontal/fs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-lv1-noblend/fs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_left_vertical/vs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv1-noblend/vs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_left_vertical/vs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-lv1-noblend/vs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_left_vertical/fs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv2-3d/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_left_vertical/fs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-lv2-3d/fs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_right_horizontal/vs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv2-3d/vs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_right_horizontal/vs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-lv2-3d/vs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_right_horizontal/fs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv2-accuracy-multipass/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_right_horizontal/fs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-lv2-accuracy-multipass/fs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_right_vertical/vs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv2-accuracy-multipass/vs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_right_vertical/vs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-lv2-accuracy-multipass/vs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_right_vertical/fs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin similarity index 100% rename from bgfx/shaders/dx9/chains/pillarbox_right_vertical/fs_blit.bin rename to bgfx/shaders/dx9/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin diff --git a/bgfx/shaders/dx9/chains/pillarbox_right_horizontal/vs_saturation.bin b/bgfx/shaders/dx9/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin similarity index 51% rename from bgfx/shaders/dx9/chains/pillarbox_right_horizontal/vs_saturation.bin rename to bgfx/shaders/dx9/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin index e9bfb3062de7859c3a66c5b4937831688699b366..ea94c83e62deecbb1897164a60e4cbd4bd062aac 100644 GIT binary patch delta 44 xcmaFGbc$($G^5T$nW+;`*2pq4FfcJP@IPQ+crpRRW@2D|zyxIf|Ifg{001F(42b{$ delta 77 zcmV-T0J8te0_p;g8v#s_9F-VR000F901u#+R!SSB8MIc@^$K0{>9wzz+R!SSB8MIc@^$K0{>9wzzqW fh9?tP7@jO(VOX_*k%57Uk%9jK15oV$f1pADi!T=B diff --git a/bgfx/shaders/dx9/chains/xbr-lv2-multipass/fs_blit.bin b/bgfx/shaders/dx9/chains/xbr-lv2-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..ef8fa0730c3a16c8151d82c7394b35a81d1f1d40 GIT binary patch literal 241 zcmX9&OA3Ne6g@8$A_6xMB#mk!?_q?~48nmCWOIo!5(-5fGz{8+?V!0EY8tqL7SQWH zyO+Z`_uLP68TvZAf8Gp65tZ?kGl1a*Xi|RV2#f998vs}nlt*o-8V|rH;slMr(1A;= zqCJGV*3l+R!SSB8MIc@^$K0{>9wzzB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h+R!SSB8MIc@^$K0{>9wzzB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h+R!SSB8MIc@^$K0{>9wzzB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h+R!SSB8MIc@^$K0{>9wzzB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h+R!SSB8MIc@^$K0{>9wzzB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h+R!SSB8MIc@^$K0{>9wzzB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h+R!SSB8MIc@^$K0{>9wzzB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h%-6utAYyOT(Q!NSJGEwv%L!KjUb!0M791eS?lvmt-w$xrbE&T&_TklVBJm=pfP&U-L1p%tn-l41Jk^-Qb{4iINDKK>vzLE9J%MfRE+|!$j@LKePUOg>ej~0g!DI|OTH!^mjAD^d|CYAPi|`GdvGE&D z@uq;dOu)9-^CXNtNmPfPs6TWA=msW^ek0Udj93G8A&()i^f3$9h3udn68hkzHdj`9 z$gMgbIblcL6gkHc{g}h*=r@nN;0@a-l3)}wZ$)a9l^4G&v;ljdzK;4*$Ji=jy)2e? zOg5@Qrkxx-aak8!MP*DK{^1$w4A=|GutS%`><4q!GK|E-oY;b>R?6uhC*t#*MlNz@ za+WuY$(y|}y&GRR=tWUyth`MfKd(c3xi7{ZAgAGG?d+??=}TdE6?XufY0sBbxmRF^ zoO7pKfz5JfOjUi7Jce@hS`6eYE{shb_9Ijsdz$e_f6RW7f33vd?t-U#$o(4iIYV*^ zbe;t#Py8q-apr6|3(MI9K06!6)6O$s?c`|fmLK-9N8Xfc*Z2{8O?wi?bepbRV}3;{3{dxJZb_A3}%^hP8B4zmOF!5-y%@<|T372(CT{L4u$)<$XBRT@s2y*WIVbvaSF!IgeatSBJN-k{GFWX7 zkz0K-Ip0^4+t-~YM{{TTqcA*Rg7>%@zum1e}dP;}Q!9p*^RnFBkR^;mh6&$;#CxAieP z?mh2N6GxpZHRi%RM!;b1Vv#C1{X!4z{A_>9a)No9b4QNoK{ii|hcRi7K1FRaTVhaM Wz}lkco_mkG8mkomUlOM&EdKx&-Mk6_ literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-3d.bin b/bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..5d3c63a1179a2f03e226424bbabcc91a6279c923 GIT binary patch literal 5152 zcmb7|KWtoC6~@nd^Vb>2V~>%bK-!3EX(F2-z!Jo3j~x=p?20&sb%V9q4Z>oPqfL+! zsy7nFN>1U(NCc`EiOOz}pg|P71qCG~1$0xQh?WNP{m#Ajz2`B~YORcY&;Rdy_uTv5 zHl=Xe_Y?KXHY|7O2g-mn4kZGR9_;8dh_(DECU&!a0 zFXVGwi{*DW?;q^^;A;otced}`xi`MI{q}=Vmdnz^a({bwl(i(yA?=PgcD6^ENuEdE zKltJHz3<*tKqghTKgx#s+xg((`|o|Y;%)@i+{nmBR5_F{& zzjqxB1>GOD_>1cxE9m~J#ot{AZ$bADE&k;?C=9xPvk=DIU^D32lE2_Ohz+_gNq*CH zP-^yVt@+t;9mLkU2d;zMTK6N@!EUYlsq0`m)OaMh(5EF?n{FR#&Cg5sgY!Cel;sPDe5IImVss;|qkHR#sPUu72azx4v%Y-#6*xt(UsM zW^ZVuIuf*-Ct;lxnGJm{^NIC`rR>`3Rxg&Mw80i@cg*)k*7I>%CHPTNi@Y$Zbo1xA4)wRA-89 zf-aXIm?L)gBR1+@>96BzDK;0z%wE3$7je1wFg@9n+_s_Htv@Z1TasI{Bdbqw2ydbP zj%;u`v}rl#zHRsI$Un&RG?h=N9WjE*Ye#&@Rc+z&TEy!lRqvX|FEfQ)tqa zU?x{feY9)~zJ1S$BR8>d!=9%3f;&A~E@2JxSIf{jzXGU}F+(%p$ z_uNT+pQkm&tvScxZmBtzOA+p+!10{?k!wtSozJ>=b9)nW?*8fAV&|Oo?9?#@|9T$4 z#6Ftv^gVBydGA9U2bq25%pk`cF2f5mCXBj=18;hcMqj^Qb9msMfTK7w6YgYU;iKE& zd`__eN7$2VZl6~D&x!MEjw8(IKz5(Om~US4;8MP~ERXS5V#;oe8D5F$b6=}w zh{4{nxAn~1E8#PDe&^jM-OGB;&eYB1U*`xj>N#{a>Kx&mPhY^<)g0|A2Q}$Ue9_M& z`GYgf!=m;q)x@r6yfB8DB_6);=bphn+xJjhrM@|ri~JC=Kw9+?NudAfHSb5W+b7|E|W7kYy&MzOcq zSxR$pHKtv~fDit_C(f#S2>##*EUAYehjRorFtG>N2fBv_@=td?=L|XRslHjbobF)y zZT2x}>;d`65B`+DtNh$cDSwD>=I>XWZ+iS}{`&oa{JhW1=`0N5x#gbeNKSi#4>jhr zXK=$F;lrGOBk=-v;_6uXV`Ad@KZZZ#!0l-D8-p?0Vn z^5Vn2BaVH~mL)IQTJ`J*&SRZo2%i3Ja{x2*c?Wi3x#=B~!h^CQ`*tFt&^FY)JW zGsj5|b#JNv-+2GQK0RKJ{t@>v=Q+$Ly`9SctW209XY_oG4>Ek>!_Yjz zQc^47Vy)-SD{721yTNCwo-JRtYwFd6opnd+J;$UrqBQeQsK1%7F- zLT?}YUV#BW?0Qam{|oAic|e!)vSucz9ll%CeI*@za9?l+2C+9Vq9YG+;L{8^zL>}H z;RBZ7bKx<_e5V61pRkwy9jEdoPVb7Z@P!j(Vf8*b>VtZz{vgT$lU46I$n=ojr8rOY z0OoY}lY^eX$Nb@gOibz<4EPJrgtH#-4-4Mao3i4c>z?#|Y*|kj_n29KPXR~Ub!Yw_ zgdSaH3(mp3ok)KY_kmdRINpIYqq_5Y%)0l?`y9HC>(0Od_pYOcsV==FKd_i{{U7%Q zze$H(em<}IFEW?Khs$Oed5%@n?~@>(A$$KiGW2&WoY9VqeJ|QQeuBU6K|kOJ7o00D Nw?6L|R$g4l>wisW03rYY literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-fast.bin b/bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..97e82ad758435f63e41aed670f3af505365799f0 GIT binary patch literal 2842 zcmZuz&ue346g}^~r1{abX)}Twp#ywh{Lplg-XkGgjQU< zAc&BHmDwn|cy8N`s5=)k3qcnyT)NQRTaMyiU_9r3?_0 z?wy0W(Z)aMJlH$w9PfX)SFd>it#6bO^!xwzze9Vg*?JDZXFk7(P4P!MJ_kM}_6{TX zP@llN{5s+Z4O7cQ>|?{!{Sf=aFb%?CXB56ROfzvbz1MP}b)o<7vJ_-{v7MJu|We_g=bb1N5`FoP93lB-@Si$e0cA{?A2S(&#ta- zuFr11cV~C+{%rg3{iFQ@3iI{3`rLfIK0iMeaU_S6 zh@+BmbIcPHi$nP`HsvSg>+D758?^@`cJC>6m)rTP-cf%Ke+}XX$c@-@%r*N zij0$T$`&Uk=b^ZWilJ9`y+mg0zWIKRSYM!I5%%V(4_#E&!&=>^JFY%@p9 z{etgvPXP?RuD4%p7gUol*|{&)e~EWGoy1P#CU)B$J*S-UpfA!fk zo@&(oDvmg+kM9JlPdeWpR-ZVk#r4`ZAL+U~)vJ@9j zx)a*WZk7*%G^S+0`?G#J?-P?L|>F=wCnAC*O^{(jw=JsNbjMKcp`X AI{*Lx literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2.bin b/bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2.bin new file mode 100644 index 0000000000000000000000000000000000000000..53b70afd89eef8250cf9abc78d7f7acc109fbbe9 GIT binary patch literal 3354 zcmZuzzi%8>5T4z=pL=JYbwQ#4$u2`4;(@EE(B~gJdI$ zJs}~avxLz#AW>{uyFoxlkrWgZ6qFRuZ9x$t{sJ!FH*eqWo{g2~%zX3fn|ZUlUfEd9 z9WA`@-juklgSwLw2f}gPDXMT%cYF$MnDQ#XR8j$^3Wd&I-I-7UJ_QxvQ&s^!RS4Ja zv~Ty;-+8&$xwX8qvesE!?rzo{7nU+D8=cnra@`T=RqETlcbC`RScQuN$l0ztllVWs zvwQFEenZ_VpY$H=9`}y+KHY899S_#Gs^X1C|BZf-&StCqqKJIu;uo+f{6}5B7Wop` z`^ex5`xN;AzYcK%#n^I+eXbb0Pq8l);~)%n3gJ7&I1__~5WZK8<1yGz5PngNlQP(^ z5dKh%Lo?W)5S}Q;`5EkA3gGPuM`^Ge^yd`g5Jj#-=Ffs+9At{M72_mR?3QAjs>!zr zeFw*bjw_XY$o%-WJK%q!xnz67$+0 z;!_4^ze_RRoW_de;fz~6GqMvnQj29ba1+@JyhP3gxkSzf`9v-Rg+wj}#aKqIGbz== zwysJI{!gJtA@;+?1W->xaPUx_5o%v;5=wAX87Pu#Q7xiD#7k#>J?G1bjgnTNxwz(d)b~J%U??DDZfS5 z>}U8>AEfp!_%CWdF@Lp_Klyo?dAXQpwtg9QH^aXS{^bmRU+w9Al)>M>WY1;zmy!Rf zJ-rXSJrg_moBSiz)cz{Um+}brEcjQW|DYxka!=V)6<9vgQx!F<8BP~9L_2&3aL;7&<;^$Ix#`oH%{Z1THk;T&~IS=t24H?7P5vw3~`m7IiR~ch=+3YUk7(;HT z-M2Z&y(%|xo?^!Abz0-eojL4&F+R)1&v2n1@70$f_zC!(hs?#?rl)S4+v-uG+k2$H znOj$9Z*^a~oMqx~ca3&m`2LKzCui40Tyv^N>ez?P-mhl%G|P_dzk<0rTP=guKH( zXGc5g=-sl{)MrtBsN?&?UZF4Qe&D+Sy{kI=Gtaez%u~ZY*q#v^LO%sQU@iK^yNo`} zJ+VG#g+0<)7~Rau?kq9W`){G;NQ^R$&Zmmq!FNV6&dYpzjLzEB(S!Dx-6hVLI{8!( z$KJ@1n9W0ec<(De=D{~Y?~*>84>9tyI`5V`kG*T7r@Zi*Pe;K37(^&j@pnKe=%4`Q4ySJMWHmGlwGZE!2p>&0ww&J7-^t)6Y|kI~6HTET@=g z9Pv7^JTUCB`tV&(jDCWAtYQ6FLr|AIte>OUC?G%javlNDXx`@L(1Ju;_ vozc&!$MO6dVvDxePMvo4%={YPr$2j=5_$1Y|0poue!=yXun!WBMzA~sKP!9d literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..1bd16aff210768d3850ca98bc4a3fdb717cc68c7 GIT binary patch literal 4974 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..63dd59378634cfd7222ee1aad8716e74cd1a7b0e GIT binary patch literal 3722 zcmaKvJ!~9R6ov2X%cxisgLw&D$BA2*YaU-FNP}=l;C6lb6@d zX7^6Kf2C#9udc2vZ)|VAw|(RKW-m!Bu|pRYS2s?bUtif+T{*w3|7Vki%+r{c&MYr& ztgWxkCMHuC)9Xts%V*bT-L-o;q4LCQpE`PAun@v(-pLopD@%W$dx}9D>wfK~o z9TpN>OJA(*Q?o;|eU4ckiM8xY?E3pkpN9U!<$DbJ`&plcK6TrDx8Ymi{?v2oxQ6|u zZ~ig?8Xl#>)hl6pdwZEpizjg5bFeI666eS~Uc|&2xkIRqZT0LSzFLXw+SbO=jh?-7 z`K{|$x30duJ@@SDb8~0Ut(}`&d*{tdo7d+~Uw!x5os&ELgQksqUopf{?I)HiZrB%5swokEypz~?0H0!u zZ-2t4Ig*}=PkO{x-$!GeFPDFRr(r{V2mXeQclEprziKS|sK%e8)%AimYe)UA2fX+v z_*DAq_)Kf@@1)XS#WVSgJ)U|e`|lHf@U2?BRPo3U8~VU!HGJ~`zNNLecbW&{waR#! z3HT=Qz_)Ah+FGMk_#NVDR|F*R~ zJ~sT}Lwo1Hd|HS8be*s2FZgbaFBc#BumwJ5cZh#opVobP?(?N@H2Z#6{`8M}bFEB? zU*AQhYo=qZ!IZGM-7RwayU=+_!4s>a7_6r(bxh0l-G}_9G;h>6YQl#ZXD;CdgFpM= zq76TC!G>0HE6;|V_+ zFFBiWwsp@Bc#gd*_jh$@yw>b%HWfS6IKES6p6*=f4QGeh;x3?%nqBW3Yt5r_9jQj4-;IEA8@&Ysp1A?D zC?4*Bq&(9R0}p+UJj^6MvME1uZ%cca1=j3yPT+=SKthDZx79{eB2f>A(y}l z5BEh<-ro^}HtvTwhaJUcre$+&)j0^Wi&kbNoPl7Y4%lLjoNel_*(>V3FtbAMFuq6M z$kpsge7%oo!VfOtgzXmr6KvSQ&`bQaR$Yh1Y*`cbIaAcR>)at1`l>u9JtjZanRLhA zfe(3bH&y;{(F^d2@I2#Bj;UqJdFVN!Db@K>zPE$MP!swZ?*jbMD4TwB11I&QZeXHj z_VBCf80w(+FvS=Z!rlsVlR8fEipQm=VbfZl(TAC0Z{KINTBF^H`kFZOB-}4n5Hqu` za3N-9nPT#r8hXdQqC2A?N4?W2#t2Q?Cl)mV-}g_f5nSNWm)SE#YL}GT$9lG`DUQs3 zk?nzM@|$bNme{Xe>!5X7>uryR7PPdjoxn``mr3*@v&Z3#4~g z-p4*)H`UAA`mMTMulpnNe5CGxYijR1Ba%!RtdT=bSb*(Vp)iS9{hF5~&VuXTTto1Slmv(qoa?+@q4CN_BVWtP zHs(VAnB6mFEPAItC|B}l=E`2mw(mCmb4cIbbNPiklJ`jVtDG`ns{U~|`}~*v4R?Lj zzw&MuU)4X|2a|jbXz{qQkCnclg?C{_@Bm_f^V-y0U=v6=k~EQ;{G literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..2fc641bc90c471fc8002d5cdc26111704d605881 GIT binary patch literal 4235 zcmZ{nPmCPZ5yoqJdU|?hcD(l5X4fcEeB_U0%?bj!#DCUn)|LoTY>xt`6~eZ#l*ot$ z3317ch;msD8^M8NBl$FYLR=Hzz>$MbD2GHMVq%P9tSIs!Txh;uy?)beix^tdRrOWX zSM}=kd;8p_^J(jy|NgUM2VdN{xP9h@%NMpUUU*?k|F5(XYuOU&bDLY|wl7`2xY9DI z`lx<;?!wmj%PXyx6v@tL`t+q^$9kg~?{!nh&*~@1(er9H0 z>p|Di53>E)?C<)S=t=aS0@?d|_;*uJqNl0*$aSQxaevW!+i{6~reFTu(vwKr#64W1 z?eFim9FsZ@zh=EIgi38^Wc#Tt2^VsMZIo-T?QB1_J+fb4f93TXJ2$Sqas081j~_q( z{H5oQUwZZBD_37Xe)h)iU%UQ0y{wN;j83eNM(gV*)}MLmmrvXNZ_GNWEf?y-NrnBC z*m^&Oz9apuk6$|Z((1FPKKRFbzrun(3-~RwKb!^o*JuCq3-n#--}xjx***6$*i*zr zpF5uRoIV}x=zAf~X<^Uk(eLEc&(%7u&qQ6_<6Zha%a;r3)aLf2ZS%rxz87V^Pg1ku zuw$3xw>goMW6kbOu?HC&*m3cqnOvegD^e?qfJucZ^~@%ZTPoFTn%b<`P`s8c<1a4r z;tBJ)NYG(_QgZNbgCWO$BT3s*I8MTQ-(!kknyTKwe=h93 zDfUEIauUCz8WOuQ>DkjBCzY)u{`h9{P3^Agx~<AH-%K*`r9Q2xzf)f> z*@VTWrwCj+^1ZKkU#cf___pDf+BbUccnr;v-sh7TLzC??F~Ad3{guB>!Wy{zuKNF> zYVw|?mI-r9@o&kO9%Op|N;UqchE8xc*J@7lmrr!>8+9>EpKxUhtqt*xQwz z+1ik-y`tJ`d(XPgJC}}}iFz1vn)~DW%T&kA z{g>q5SL}iMN&Y3}UuxtZN*>r;`)Jeo9gsY%`YImnW$^=lKo9u`&gZsreO(NtBj!Q* z^edmpv1eD5|B7l2>vgDsA?}Le9+dwfw%}H+m^Enx+7UZsN7Mg`(Lzq?h)33;PP4S7hs)zcINfvkKOHAaU_WCjD=qdP2 z->Wsr=%NojglEJ=A8_cHFZ_Cv(cwoda^XiVWc;EJYmU$ILq6o9pTq?deZYnMZOz5) zf^Sls*EOHlKT7|3v1VZwj;R-G)x2zYe&o70k195DtUdC1R626;{bHZcyN>#coLTBM zAyZ@K`-r_fb9`5Fs5jtqYe^sc!RMA}y-Kh?kN9U+?&dbu6YQ*4%$F-4y@>g8;f0;% z$`|v?UpivopZmN=|E}`$orwNj&u{WCAMo#1`LVMPYkVsI@wDRH?kPU~iuS(qDb@GV z>*JKF`%?7&a&;yWwE(|bS+d{pBihWfMUG4^H*)-1-L_lpJsk0h5bA z40*U3AseWxto1V_HlL-ijFawa?H8$6>9JKyA{4xG+Z*AZ)I1J!$T5o=JzqW+=X z_gLtNMIX@!;f>E@4Eg{@cF6lzzMOYX7LW32tR(8zdN{- zkvp-T-Z`hPDK;FK^`73ZIUn-qZ!^8$ZRE)vTjyyhE_ur8uI;k&j6F}de{(-CrDOiW zebB70dhbZSspkPMiuEtwXYGe_hrerB-*C3FhPos3tz6{RTrBbsmprL`r5axq&u~v9 yuGx2un%Ez8T#X975RdU9Zs=X$Pfdw+6~lb(IX_#C`SO}`a&X3An@`G8=pO;nIb1pb literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..501d317cb1e23addc24ecc4b5fc71dc6453b1c48 GIT binary patch literal 4230 zcmai1J!~9R5T4!J+ui$d>^MJmek5EHkfO5^2u9SPB} zr$jVPaR>^^wUp{yLJOopqNJpuh&ZeiU?D_9!}5JI`))S|fs>Wr%$xb_Zijj@FbK+)Z^z%JU;%>gZe8{f2c#?R@zIzxflu zz}F~+UAYpnv$GRO6F7!NpZ#T_ji(ra#&b5VM(SYIk&Tx81FuvfxwFwZ(`m_Tx8AvX zd*k-{=G61cr=~7nS-CQ`a`WvQYj>wE-G2Yht@p5)Zk=wOo^G|Kr%zA6eCCz2vh#*W zHIUI%B$)w+Z^#2bv(#6i|Ne{XGuJ21&3^vlr{}preQ5R}Y0fJZJ+ADMnpL^gW43 zQ@8f8#y(nANh&f(MFu@5W1R#d=^^!N0%JY_fZB@eb-8cyDE4UE$*}^+8J>P}N&=Yl zyMgr6Irw^_w%{;GUl5%mpE~Zp2)P^^Gn(S@F@fOb);`wll%s@sW&Fg}zG8rH5Fi)h zHegO&?)wtxKJly4gx`%Ml(UKxV6O_k^sQj8CO1;<2l8O33#1MGW(vH7d7ziT-b*~> z5knSqN`N4WGVGqdF2X`O&g_0p}sbG$j7dQ?v=wFk= zX+6)sQNo~4QzFJq8u|VR_G!x)j)%h_?i_p$lrSids%$mtla>rXt&=t)|Kj(Ep`=jMQ%PUQ7F4m{2U7f zPC`da_Jll+K&H<5a6ULUw5iL1+^3fuk={^8zY~zjm*<^lhP|z#o|Hq#7T35%dZse; zH&gojF6dUSVHT|Nb!F+#WWvMSt#-A2?|In&Pt;{ap62 z*WRK%`%ZtX$sr99(_vWu3Jlh_zm3{!|;z+)>Qd zap`q=?kJDtvsTo?YE7AOj8|K8akb*Sn0v3be&k%#ru@T{Ng7x%eGPJW)Ji@`jt zr@TXUvA>JEd!X-}@;yr)vG!xob?3jK_m27`&WGDs&-2JayDlszUU zIkCUg^WDUrqQA*F9^TbW;k>oM&F+q-&D^%TgRH;3F7F%K=jT!F-PsiF$8ay<>_jrj z*jt=G%Di{D=0j}fi~gs$FVbgq8D^rL(vLaveZf18Hk6N{H%B2ePp6{|@0GHSc6jfq zj#wjBFU6x@BgbO>Xy*)JBzM&r}9(94di?zKM@plN;zm&d3`7LbUq82|! zybNc+?lpvf+=eV#Q$alJKSb}hac69^&biG)e#id{7vwV-a;eJte{f+g#)UO2=M&+Z zlJ(fnpWpk=hx~c2BfGaXCjM#wUjhFt=dUuj^4#}R00k+<+Xg^u6) zMXyADRW23OlHd5QH;hf0y)iEOHwW(BA~y8HIK&mHqh~i^e-k{dN5o|ehs*kwaVY~+ ud*t{dpCRs?)Koak4+H( literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b5fae14973e450847bfd77b3bdd3e0895280389 GIT binary patch literal 3742 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..df939770a6e7f1589d87ffe7ef2277e8a14daf5a GIT binary patch literal 2459 zcmZuyzi(Sr7(MU3Yx^a3666kDkjO|uifk2V7n;;fNFtR=B(Z2G3(+7Vfl}2)LQK!9 z)WwS{7#JTClRY6;e)Lbs9{>Zw3rhzkSa_UszjvM2s7`Ktzu)IO-@P~Q9qzg4@!x;c z@XFoZ!Qkedqy53b{+(U^wxbvkT2k+9@9qo^j}F=qs9Kil!=3%zy`y#%Q4tS29dBuV zF?e+R$02d`7vbHAUsPrP4@XZ+UZj4P(L>UXh4%x1I5`#A5XxN5&%uud`TVCK-GpVgLc zrCmH24z3P5c>m<%ho{5SPadtmesE=d@Al#C^}|m;x_|s|{nqK{4^BSgrrX)*Y;-%F zZg->m&eiL0VfFz~b6CsIe!O?%-sNkX-~RsfyFXuh^0xFf>RIX;u(kF07k7jEP3h~V z|CKU7*(U#Ny~dWwYeqIE+EX_{x|UN%dXg-`JO}2JOWu~yZ=TV~+qAC(`CY)t*W`X) z$22#eh`K%(vMX@PJ*uOh_vjp9jruuj&GR>CAm_1kvcE~0d1FqN^}&4Fr`-2*`6YRJI1W8K z;uYsFaz|C|zkMdl}e}(>_Vv~%#|rnW zTo-eMy77e^jxo9~x?jp6S?^1eOK+%T%|SZl)}1VS%a$ld9H6*4e_tK_JxAXOgYKtf z#*dWK{5{{f`YvZfAC$6qEx5w0bU!2)tf5*a3oFoG_?qnRl8?3i{fyLCUgJA$KIi#` zrOCOF_tKWKzo{_hir4$Dy>w01SA6I_rYxVt_ouUCoCTfi;#7LeB_0Z%Nz*BpVs$q! z=F&VvoP1>0*{JH2i)Y2_+QgxE(l|5SGIUoP9)oH~wp^OC$+9b_y+XzuDm{OLW>?EU}SROeH7Tef*t6qNo4af0KV literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..a63b9bd2aaa8943fcf966fe72854792a939b2264 GIT binary patch literal 2375 zcmZvdzi(Sr6vxkde*O{LjUzL#Ad!KAf)qU~Kv`&0HzA2sB9X+Roh$@FL;|I%i-ee- zg~Zau2nNQ7)XAO@D~SFH`2%1;yoDtLQ@Zf@eD8hFHc=g4`JQvW=l8iM?;h<%!Po!% zS+%u${lnqygX8_-;r_uc-)<0EU~RE?ws&`iN5_ZVz+g4S`e0{&ckj3x1Tex;96L$t zi{Yb_FNdSkuTJ7_P(hS6tdi&d=DT+1_;&v#Gy97pUX>rw_O03P{3M)^KMdLT9DSZ} zLe4VpC&!c91@0H_6^9G$DZl!hb3(YwxT`7JY&HuVCUQ9GE$8b9pQ(*vn?=?J=Y0#i zl&(D(4L66ey?6T2!?V%ZCy&-&J-oiYclYS-`q8H!ethz9{m$9v4^BVh(u+6Zjb0r0 zdKz|ZiLrLQ5N521LHzYbl44lTmBrMg$F!QI=X zYxtXj&7B{n!qLQ+%1&raXGbwnH)IF++MY;OvD#dQ7i?ZaUnYu)T7vsKQA`bJ;7OI- zs`e};U%qYbmQoLNwwH7+mUN=Ij{M7}@bWJo^aZ)ci>4pgLXOWCbi?XN4Z6l z7-UZ|QPZ(mKKHK}r7wAiz0fk`+Y`|%u74NeIs6Lpl>#sORq86b%u#rsqjWBwt5aLj zkq_BWJXOo-uSK$<-c*z)J?^_W7JjAE^m&fuTRN?U4zXu0_BOFnJC}=WT!U^GwNtHD zv2hLk21oJ+@)q~97A@q+#=?-3^V#GsjB?i;d6};*`v89z7jJKx+yf9&3+1GG__@+d)m=SS;RPrtu9`hby^n~P zoUI>K8)3;4+nNcFZxVN%Jy*um^!u}*_4ae;vy^)}$A`fx-=Xs9&avv7muVOK8Wy?W zYns-JJ?eSheyKy8$|F_0A@++qc?{G8_N&jA9>cRpG%<}eGpc{dlU%d8%o9$#%lAop z#P7b+mS|!8e)6`&lia`C1y4Bb0om)CMcSi2SI=t}u_^}bSJAR1-?CN8rLTEb+-9rT kP=6-S6Z)(->UIkJXLB9(PJ2Q#!T(KUnj!TwOY$7*Kd9)`@c;k- literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..9df5faa4beb9a3276098fb4f490f8c08559d31a7 GIT binary patch literal 2287 zcma)7zi%8x6n-;1d*0Z_4%g5i;Sw5aPXR)cgj`~5OCb`rPbAd|ff1HKj&cSe3bd<8 zG^RKN1?5Jfx~mW^p!^B`144mVDWXY1mxks0-rK!h86k1WXy^U<-h1D?8Nao^6WoKp zevjqio#Ed2`t5_=@!sz3ZT#;$FHTme-nzNHHQqni>pOvJnW}fUcDHv9`p!Y&Cuypd zl~2bfho6rpM_(MKeHX#>bs|w!{atO#jf3mM7e(X`Eb3x>D9bk@kMYT{JpKVlzQf}0 z2P}`()%~bCrfvOx#y(O%FOTr$?+nXB+x0u&qRi)Wr#?ab7}xDr1?yBMsmz0{!q0Nk zx6`iNn~X1wQ+fO7{rkt0;}1_ZUfz3UW9QcXt&RPU-uvM2{>F{tPwpLkjLjh3Og9H< zIv8vYUcdClt1^E_Bo4A(oc(n7>fIMEU;F;IZ?8P~HC&}WhMu|bd-IpeU%iIUBkFt5 z(+B!%U=K^=CA17)Gq5q`9;&G%>qSrZaR!d+y~lo3z#&5a@Go<$DY$|v$$+6YFYB;< znK`+cneQs(liWidA~u5E$@z}@zQH%RmEfMgZXfH#>Ctlg%!U3!0ioNwZz2RCd?Cb@z2fP#X@&C98!d^%D zx!%Fw?3DE^X}-1|`Y+Y>Fdw;PEc}&A)&snSTyqN^N2l~RyK=8`!#!h~eB_U_LYcGW z&-L5Q&so7afxl6Gc1bNuEj!4ZoyM**>aqS3;A0LueETe^`{S$;Xo*w@)x5qk=UVhR#Ud6Ppp6VXJYdJ-0JR|3sFMv&_3Q&il>##vCF&2TK0UoiKud%OSZ|{@@=Es}?|C#z3en2fV z#phfQA2q04&oyecH-&cFSLjQ8BU|s!GfwT~lQzmYvxl)%Skk;vwZ4^!*~Flx0yB#` zMu;_zSU-JOFYjuQs-Ug8w~S$YK!1D>c^7OxO~=^!{mE8pOncw#96aJEw{;i}&&lo$ z`=L*z+)_uJ7&>yzT$Gm}vsTL`C~2+cn=>#)-G;*&ZH`OTIgR7}r(9-z_(jl>Kl}S& a_~vKx!t<4cKF`#L+(?q(TxLa8A@U!K-n@+f literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass0.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..6df91a675423039e1e6d96349f356392a802eccf GIT binary patch literal 2705 zcmZXWy>A><6vgj+?9S|NBqKLaAmI`kYpnoDgY7sN+fs;x?G;I7AwEPTBS$e!x?M%0 zabrY7gEVw#O_vrB68}K{fpiuXqNZXwzx(FRj7^f&zIWfb=broV-sXdY-TdXo)8pJ; zd9byAbm#uz-qHTv{T=;VPEt$k2IlSecealX4)>Q6lWBb2V1T$_V%sWFZw#xC)HoM*;F6?oa>Y7)3yEJHiERcpR~># zm)g(z=FfHUc5!i$2$fjwz7Z2MafgtDosR7yw;RHRIA9;29^E_|+lP-neR6Vo^2OIH zZ|=XfvU~5~-paw3pM3WDla;$CUp;xUfWPkqrcR}CyHRA00S?|aU{7OIEtOHTc@2U7{}8VYGhJ2~T1bTk**!zsTR znoGyGJuY=#cJKqmKvP+3z`u}&LEV#q`?om{bUx_#7gl(DY~%zV`46u0X&-t#biQ^* zzz;iorTEZ?E%2rKp5tHF%=KwMVQv(UJJI%dU^)1v2b>RVu6!n5Q}WZ=YpOgw26Yw} zd3%hZG%!c>UGGjhl4k8IdNQy+wrXTArX%}DcFVw{S8;qlvP@_0>ps+Iq`9Y0F)w_$ zYupcb!Qjt1xM;(VdSD}8>VqHph#l*NFFxE6e7NWMMIYjjPsD)d99*>F$Gl^EP;*fi z_A!2Z6VzYlHr10iBHl5*xKq}#|C#DfKjL|fKhyi|{R6K%)68FH-al;Ki?rUy`KPUODj8kVM3 zzg^4?ZyWQ#U7#-PN1pGcVuiU$14f#|jDP`O|3)v#d#hmHg`id*Vf*r za0k%JT!gz6Y}5f;%#k;uumL<3y`dL{nJ`xMbryR=u4b>{d!@H<bbe!p!~y(m*Qk literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass1.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..2613ba728237308df29caab9e6cd379e76018604 GIT binary patch literal 3242 zcmZveJ#1T56vxl|uw%z=lG?4xfJ8+uNVtzH@847eyA?!qt_H!TBp&>w}H;D{K1iM6uLu)TiXKHt&VezcX~Z%Y2ATyuyg&3?OrEJggw=^q$vI^w(P>z`IVQ=?3j?~ z>iR;qugw;uyN6mHk=5-1dVRjv6YCF`Ur^}ttDaa-RrlEG@SWoR)O+G^u|3f@pHzU@ zMVaENov^*Vz0}&`@m%;k-xe^D<49e+fC)Wv4!%3K)3X=&DlM{`JA;#hp1pJZ!&^6Y zZhU-u@zssvirS67|8V-NH-!H=;Aff?4~XT3t6W`~5omv!_o2VL3K&s_aepW0d1E~3wg z*Hs^Q?~1EiuHO;i$v4D1TK4XUbZ{VdHUCE?!$A!#D~5+9qoX%qs%r=)_<+NYxxlY3 z86AG$@C&h!vEhpkYk<$(b3V)p>l-lO@dJmBp5RB%=G2#lVkOpaYgx0WIdUr5$9^j{`~-jasTCRj8Ohq$L*c9b z!gzn|)EWF6k~UlqLgJ-(*+oB;t}6Tjx^px%;Sy8Z}%?Bu8TuAZ8u>Q5nikn!JD zfBPfW7=OLX$MQtqfde1$9B|OzDd)2stYP5L+C5W;J_qc(We!&L8PY#6{yv%Ly|^FFZtjojd6(Fn zdOKDgV|Pyb^U$B|^oILF_+i-p+;#qrEAqg}S!sFc!LxL(4q z`qUpV6P^~ybcnSaj literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass2.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..7fa43cddf5d52bdb90a83a3d04c1747f5f34119e GIT binary patch literal 2533 zcmZXVzi%8>5XWbC-`(w=BN@4Y0tuJUSa%8#n%Iehu`Pv2*gla|C&UjC$;eSmL$@a+ z8aGBz&>$@x^3kOQgv39Pe;}Pjg;Gx&3V1E1F(f<5k|K6_t*OJr{yM}t_-QAt};nBfbVp5G!eYmr~yLYsfBvPcOlZm%{ zUszVx|JGY}=jitKt7i769&}DGWc$|aSG|t)r23Pam3sJ`>q+(Wbw7F?K|0*eT4x@Y z+An(ZxthE!m&-(`#GLnym{^H-2sPO0#Foyk2^ZpkeRMj%KA+h84?liBjW!>+ig2%MZ*3nXOh&pFG%n z@bZnVAD(@8^S2w{yoKILFZw^sZr%F&cegp(d2$o|K>8@lzNKn6(GNYol-zw@(>4t( zDa}^T!#XXKcAb@JyLP4W@ECcYTfSOt`>k6Q{x8XwRqo|nT$jRLdb_x^?(B)>!Uwzh zlc{UM*NepJ5O0KGXUPe(eqMd;EDh z==qzCeE#SnUh!Leru_SOCt3W9O!;^5OgYs)p7vbv{%-xj4}0-4#iKrS!~>u8@PjM( zp=5C{23O(@n|LGnr@ef^k9zS&lF3#01@Ur^@A{L=p7-#D`a^GW;i(V*kzy6ieiq)p ztFMr~==qOSAMw%Q4gNr)+s0AIlQX78cN32*YzW6Yk_;9}Pi$27mo`?aD9bDAm$DE>}vp|hYj`Ej9L^-*9&5H+KPj)a?4cA!{C0>!tQ6^g9h0 zucNnMz&CfQzeBhKthsX|1|Iqxd6-Fjq*Hy=K2q*s7Lc(shj4F8=AO{3_5TTtt)4TG*VeaKFE$KHVtb#OOz{&3L?@QLuO@ux=49Pz1qeFNij&O=W45yNtRv#hFXGy4yua{vzj literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..ea94c83e62deecbb1897164a60e4cbd4bd062aac GIT binary patch literal 330 zcmYjLOG*P#5Ulrclg(T}aKMd$FuX@ZvdAW8lf?*B@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hq0uvN*TZ~}DU@*LV#6^uiQ2(H7`3U_8 zwbW{)$Zp?z59nwm%y>}cHXgV$H_Z~ zg`)#Z&VW=3*?=D3fLCOEiQf*_%P;}5zF?L-mEaVyUaM0xUFxZcaI7&2R-ReawP&rc z@#vjsEH6#WKErwRngt3CpYMlvmU~DJpC`Q|%~Y^qJss_*IJXfB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hq0uvN*TZ~}DU@*LV#6^uiQ2(H7`3U_8 zwbW{)$Zp?z59nwm%y>}cHXgV$H_Z~ zg`)#Z&VW=3*?=D3fLCOEiQf*_%P;}5zF?L-mEaVyUaM0xUFxZcaI7&2R-ReawP&rc z@#vjsEH6#WKErwRngt3CpYMlvmU~DJpC`Q|%~Y^qJss_*IJXfB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hq0uvN*TZ~}DU@*LV#6^uiQ2(H7`3U_8 zwbW{)$Zp?z59nwm%y>}cHXgV$H_Z~ zg`)#Z&VW=3*?=D3fLCOEiQf*_%P;}5zF?L-mEaVyUaM0xUFxZcaI7&2R-ReawP&rc z@#vjsEH6#WKErwRngt3CpYMlvmU~DJpC`Q|%~Y^qJss_*IJXfB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hB@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e h?VxgYc(eiFl_537OLDvcFTAP@#SXTi!I0Bth|Vy&3^^;F)M`f3lW+@n zOf@;P!i@)B$#Zbrx$O4_z3X9N>vX$Nt2gU~=FP>G-!D{pclVtxf$J2VqU$)WTXgqI z`@5K)0Je?%1PDIpb0A*C?iFU@2NDwu#kBotoJ~Pfd&yjZU!@=w)36W{Gt` z?^I)g3^DsO=h5qXVxblC|M1Im56KborgyBF3D&G<;{6QgVj}$(Z0g@R`!nVg*2%R} zF3bLiTzevOWG{NLRt=?BVJ(o{#$T)la?F32|HgXRSEYLCm$xK4RYUHlRP3GXDDP32 S#j}Nze?x7m(=sQFA^`vL?Q}N) literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass1.bin b/bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..ea94c83e62deecbb1897164a60e4cbd4bd062aac GIT binary patch literal 330 zcmYjLOG*P#5Ulrclg(T}aKMd$FuX@ZvdAW8lf?*B@f#J+T_9W)hw4FNKWKTst&0l8W#jqI;;v^1}*T?5k5%%-( zBzq_EE^?7~&ilw;wL6zsp7E;&umFNmIPDhdz)#5azdkk9pPrf>-)l_8Y&hrc>PO+e hq0uvN*TZ~}DU@*LV#6^uiQ2(H7`3U_8 zwbW{)$Zp?z59nwm%y>}cHXgV$H_Z~ zg`)#Z&VW=3*?=D3fLCOEiQf*_%P;}5zF?L-mEaVyUaM0xUFxZcaI7&2R-ReawP&rc z@#vjsEH6#WKErwRngt3CpYMlvmU~DJpC`Q|%~Y^qJss_*IJXfq0uvN*TZ~}DU@*LV#6^uiQ2(H7`3U_8 zwbW{)$Zp?z59nwm%y>}cHXgV$H_Z~ zg`)#Z&VW=3*?=D3fLCOEiQf*_%P;}5zF?L-mEaVyUaM0xUFxZcaI7&2R-ReawP&rc z@#vjsEH6#WKErwRngt3CpYMlvmU~DJpC`Q|%~Y^qJss_*IJXf`%hrwKIsGtO6{46wD%9 zWV>iy9Ug50_#{NrO!CGTFl9O>G&|Ua4k2+vh|dyzLZY;jUPCN?p?;&#MA4P)mff7OR3+$aP7lXTI{&lk=s=6kNrIIyFNt=lrG$y@dbHuf`qnM#9Xw uxo0liP+!Y;tJtC^9&Mmm!^gjlLbtgt9=U=2iEs@w*9A9NmmAV7S7@XZrtJXtaKrlzWl!Qw0YD=L)MQyC~7DXdQl$8D{;vq+m@z$HU_ho#9 z9DI((*)+v08NS)ceDi(mwc9n$JBw3=tzoP0^*gQ<1_X9z-qe5dCc(RJOHrXxn|brV zf4vxoPlf;t{0OL3w#u4lU!An}0DKc#Q!M(9FJQqkBqTf7h8sek5h0<2|Fw@?)7ii$ zp--_DeTrCTXuY%_`DQaL6@5m@H=lS7&&FABHx4J^!_+$HA6ng>+q2xq+k1a(wZoTD z@J!;^b-V7^w&T>DX5;t>%S)hAg_-Di<+IP#Yd{2;vF7|2iGo+iWl5(e-T3Lr`P!oj zE+R#p8lTN%&Tk?xi1`NmOwQ1E#H`HCJ*no3dNrRdBK8)1n|zSyEQOui#}M5w^=$UV RnoFou7F?m4GAGG00Dt+_TXO&a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-fast.bin b/bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..de5213e137f9ec5027d8222e9ade7e7484b3addc GIT binary patch literal 576 zcmYjP%Syvg5Iwm`wbVuZ0KqI3q$X6voz=SNqC&OSZ4^y0Qi=4Xh>M6n5SQX6OR*o} z(%;CUh+oloCTUAAnar7)GjoQ^J#W^GpRJE~g_VKRcORXe_vBhiGoYa`aE6}y(CGTN zh6Wf|RnRBNB-uvw?BH+>z$;C1icVs@0nc#K@*-q>(JyZXp*bbvYxCq zQ^!bW%~+@ndrsN0aO_=m{hr_Mn;WN_X06_=o6VccYqx7w{kwawLttAat7Kc2ZI|rb z^4<wg|8=fcU;q?D!BWtsI7h4&^5n!bJ~=7QIQkT8fj-Zxz?fq_ zpmt2I&KaCPjx@AF-U+`VwIxPKPrZ~A3)Y!mN_Wb0R!cZaL!SKPMe@8i<`KzU-XrIJ zQD+><4B3M^oL5P8WETx>)<0RVgxN03?D=KxFYS>XvmGj7rj^Di<|Bv|#$l2G_y_u& BX-xnC literal 0 HcmV?d00001 diff --git a/bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2.bin b/bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2.bin new file mode 100644 index 0000000000000000000000000000000000000000..73a4c5231fd00f9f27797547fefe97ff533f32fb GIT binary patch literal 780 zcmYjPJx?1!5PiFQXFH~FMMb2zgvPlO5u(Ec3JM~b7}8K&qF|ImAS0WPD5AJ1f8g>D zE^YiH!jC|yC|p=b^l8KKX7}#olSlhz=FPmBkw5fzyz%xGZ4WDhAW(CX8qsjM?COnUJ zN|SF+lUze{H7-}GV`7-|=5kl#Xf+D(F8(|kj)%t=?dA6??Va8JZoB{G)6rnm-Wr~r z$EO5g&f zvDk4;fmLFvxK6wZn}pg0$4hDz_LF*rYe}QR_2dOHdmCzUo>``Fkn)E7wK%KzNcnO; z%b5x`jMwZA4Qd}`Qm@b;Kc_xyj<;qGMb5DIZ{{8|=_9jKi#@w3`)loLze^vDI=K(z z{noK0 i9cy6ZUasf9otJ-J*1Ma?{oF2P&T@;rjLe?qIe=#{#gB;q literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/hlsl/fs_blit.bin b/bgfx/shaders/gles/chains/misc/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/hlsl/fs_blit.bin rename to bgfx/shaders/gles/chains/misc/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/misc/fs_bob-and-ghost-deinterlace.bin b/bgfx/shaders/gles/chains/misc/fs_bob-and-ghost-deinterlace.bin new file mode 100644 index 0000000000000000000000000000000000000000..b2433cfdb67738778a278d315046e8cf29e8bbbb GIT binary patch literal 1315 zcmah}O;f@!5Uq@-`X~07AjVi*kU_oZINtpMoel)(OiP#+km_*qm--jHd2^F~B@9C8 zFzI%)@9oRmzP!DjpMCv&cbrbnoihjTi*>jX+c1wm1n=m`@44e_qO6D)GnmJ-`4To_ z?7>Fmjit;ceB`bd@l<9hNH5?4mhv44GFz=Pfiy_YdnQ$iPh#v7k9j??{wP&t z;wcbfkYoisg3meQl)@(_fFg!Cdr4grgcZ70-H(=Ql`c`l&{rS;^%L7-DJ)(_8=bs5 zA+XW|g?q#JwFSN{O6o?{0uw8UfE8tpV*(N5FyXS^>eEwd9qO=eQSRFvR;2nUE4IQ} z0Nol5iT-+(?z;QGH literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/misc/fs_deposterize-pass0.bin b/bgfx/shaders/gles/chains/misc/fs_deposterize-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..a7ef07b90c7e04ac6c7fddff6d5b90c20a6689ab GIT binary patch literal 1533 zcma)+&2ri>6ouWU*?9U8cWJk&2ZJHWWV&i#$g0yOdqx4pct#*9^J9|XJ@Pbtw(81~ zC8bUR!vafJ=R5aYg2Q9L7+cj_% zZh0|-1u2#g#o<#3!1zuZST9!6)?YOzu@##+2eNmuk2Ut5b7rLbC{R2=M3(y~7nH22xSJCh7r8GZ zxd#xLaL@&OGbb~AjAcc926iM#RaJ2u!;?Ddk_Je!EJn)`LBl^A!W^3Asjgdiis(++ zXEwte$ULyC*GZO@`n@SM_J*I9{_0i^Kv_w3s~#5njymd}0&u9S-7L;+7CPL4iLB8% zm-dxTYIJ;@t9McB9h2_SJ-?N3WAfsNj4ko?iN2Y$jL>i0!+TjbX*VSpqs~~Tr01a* z`*vSV#X~tY4n_%>H$ZcDFL4HVlguGAQT===K~X2^!4Y%v$P-_G@Oyke`ZKs2C12#i*PGkn&|Ug> z>UkT&cljcNS)R?7u%VL_HsckoCPl%g@wLBR2Lhu$nK0t+Aj3=-==Igsat>Q(+;H9?os2QMC)P{*6jvsU)AP zJUJ>|&F@+&T~w(pCIb7^icPHp>F3z3#6A=S)6zW@$R8mfi(Qa$N>-HL&xnYNJd}ah z0|<0D=mNg$lPNxiq9Qy8Gm@yPsxS=USst}XeIywcqh*Pp!QVAu7R~Tv*DX9rw5RMc zn_>1v9@y3UB*Ti`-Xt1(!%s_pbt`+ItfZ<{2aA0N9T_&jzOJ^jxG-6$aQiy4M(0A< zmpZZ5adEcZWvzEex(E0CQNoSM%L6ht#P=uqVa_5#w{-{aWZk6Qlwgc1W0jJchg$5J zeK{2eWz|?1DWKl~&E37i8Q@LQhxA0%^OXPvou~(AO-cQ)`=@c5E%}~s rY@~WC?w}7<7k8qqI2A{)7V#oCV$yiV#zRiBp9L$p*+Q|s?|c6NNE*S` literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/pillarbox_left_horizontal/fs_saturation.bin b/bgfx/shaders/gles/chains/misc/fs_saturation.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_left_horizontal/fs_saturation.bin rename to bgfx/shaders/gles/chains/misc/fs_saturation.bin diff --git a/bgfx/shaders/gles/chains/hlsl/vs_blit.bin b/bgfx/shaders/gles/chains/misc/vs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/hlsl/vs_blit.bin rename to bgfx/shaders/gles/chains/misc/vs_blit.bin diff --git a/bgfx/shaders/gles/chains/hq2x/vs_blit.bin b/bgfx/shaders/gles/chains/misc/vs_bob-and-ghost-deinterlace.bin similarity index 100% rename from bgfx/shaders/gles/chains/hq2x/vs_blit.bin rename to bgfx/shaders/gles/chains/misc/vs_bob-and-ghost-deinterlace.bin diff --git a/bgfx/shaders/gles/chains/misc/vs_deposterize-pass0.bin b/bgfx/shaders/gles/chains/misc/vs_deposterize-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..b39bc67dfb41db6a7df7762aabb57f49ebb52779 GIT binary patch literal 745 zcmah{%TB{E5Ok}a%unnwrPMf1B@PuwBsftCiEEU$p*3paDs@t)i2vYE_&qjHyHJT! z9MA5|?5tm39!Jj)Ur$3q^RSTdagnL_(SVQvxynNwoA4k{F(1}9-$OzotuwjIbqrg% z+3ul;S2KvhmD;I{&*=p?KzOeXQcIOyED%_LN-L$ZHBuB&R?2ka@)te-A5cK?Z*xcP z&uN~@H{*9!-BZ^*{SHKTFC2PNHKXJ$GW4rNiE-WQFR@asOBYNt$mcAl#(AqgYR?z literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/misc/vs_deposterize-pass1.bin b/bgfx/shaders/gles/chains/misc/vs_deposterize-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..893fee943b133ff66ca89698347406fa8651c507 GIT binary patch literal 745 zcmah{-A;or6z-N?)t5MzOkFL7#EZpC6TNbYiMIqd+-e3TtT34IJ$w^i&r=4p( zj89MSxut2?8bjE#4&id3Zh3|~5dFDu=!IEE$s1%Ct`a4t?XJ_CnRD&{ zu8x-dWXAa|x^ADxtwAyD6$3{xVD$mXY+y|71`e3XJM+4J1Zz%F)0V{yv32Pim-drm WkfuSa-F(o6I{t|`Yk$g5O34pJC+~Ow literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/pillarbox_left_vertical/vs_saturation.bin b/bgfx/shaders/gles/chains/misc/vs_saturation.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_left_vertical/vs_saturation.bin rename to bgfx/shaders/gles/chains/misc/vs_saturation.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_left_vertical/fs_saturation.bin b/bgfx/shaders/gles/chains/pillarbox_left_vertical/fs_saturation.bin deleted file mode 100644 index 2f6160fe747706bb8929a0d33df22613167097ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmY+AT~35B6op};FO7@1kDy}%1v4`tK4~Vty8zMv!!!X(O8FU$Pwv9qxdm6?Ee-=F zO?%sW`kmA6Utg~5&!6v=b<@TT*RA4O$ZBOAs}@kGPnb0+W2Gh{*uIn+kbyUhd+mNnt=A^jpwJ+-q_?tyjMJb Ol7&=r6BB$8V*LUwB9PMn diff --git a/bgfx/shaders/gles/chains/pillarbox_right_horizontal/fs_saturation.bin b/bgfx/shaders/gles/chains/pillarbox_right_horizontal/fs_saturation.bin deleted file mode 100644 index 2f6160fe747706bb8929a0d33df22613167097ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmY+AT~35B6op};FO7@1kDy}%1v4`tK4~Vty8zMv!!!X(O8FU$Pwv9qxdm6?Ee-=F zO?%sW`kmA6Utg~5&!6v=b<@TT*RA4O$ZBOAs}@kGPnb0+W2Gh{*uIn+kbyUhd+mNnt=A^jpwJ+-q_?tyjMJb Ol7&=r6BB$8V*LUwB9PMn diff --git a/bgfx/shaders/gles/chains/pillarbox_right_vertical/fs_saturation.bin b/bgfx/shaders/gles/chains/pillarbox_right_vertical/fs_saturation.bin deleted file mode 100644 index 2f6160fe747706bb8929a0d33df22613167097ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmY+AT~35B6op};FO7@1kDy}%1v4`tK4~Vty8zMv!!!X(O8FU$Pwv9qxdm6?Ee-=F zO?%sW`kmA6Utg~5&!6v=b<@TT*RA4O$ZBOAs}@kGPnb0+W2Gh{*uIn+kbyUhd+mNnt=A^jpwJ+-q_?tyjMJb Ol7&=r6BB$8V*LUwB9PMn diff --git a/bgfx/shaders/gles/chains/hq2x/fs_blit.bin b/bgfx/shaders/gles/chains/super-4xbr-3d-4p/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/hq2x/fs_blit.bin rename to bgfx/shaders/gles/chains/super-4xbr-3d-4p/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/hq3x/vs_blit.bin b/bgfx/shaders/gles/chains/super-4xbr-3d-4p/vs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/hq3x/vs_blit.bin rename to bgfx/shaders/gles/chains/super-4xbr-3d-4p/vs_blit.bin diff --git a/bgfx/shaders/gles/chains/hq3x/fs_blit.bin b/bgfx/shaders/gles/chains/super-4xbr-3d-6p-smoother/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/hq3x/fs_blit.bin rename to bgfx/shaders/gles/chains/super-4xbr-3d-6p-smoother/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/hq4x/vs_blit.bin b/bgfx/shaders/gles/chains/super-4xbr-3d-6p-smoother/vs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/hq4x/vs_blit.bin rename to bgfx/shaders/gles/chains/super-4xbr-3d-6p-smoother/vs_blit.bin diff --git a/bgfx/shaders/gles/chains/hq4x/fs_blit.bin b/bgfx/shaders/gles/chains/xbr-hybrid/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/hq4x/fs_blit.bin rename to bgfx/shaders/gles/chains/xbr-hybrid/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_left_horizontal/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-hybrid/vs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_left_horizontal/vs_blit.bin rename to bgfx/shaders/gles/chains/xbr-hybrid/vs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_left_horizontal/fs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv1-noblend/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_left_horizontal/fs_blit.bin rename to bgfx/shaders/gles/chains/xbr-lv1-noblend/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_left_vertical/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv1-noblend/vs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_left_vertical/vs_blit.bin rename to bgfx/shaders/gles/chains/xbr-lv1-noblend/vs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_left_vertical/fs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-3d/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_left_vertical/fs_blit.bin rename to bgfx/shaders/gles/chains/xbr-lv2-3d/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_right_horizontal/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-3d/vs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_right_horizontal/vs_blit.bin rename to bgfx/shaders/gles/chains/xbr-lv2-3d/vs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_right_horizontal/fs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-accuracy-multipass/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_right_horizontal/fs_blit.bin rename to bgfx/shaders/gles/chains/xbr-lv2-accuracy-multipass/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_right_vertical/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-accuracy-multipass/vs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_right_vertical/vs_blit.bin rename to bgfx/shaders/gles/chains/xbr-lv2-accuracy-multipass/vs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_right_vertical/fs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin similarity index 100% rename from bgfx/shaders/gles/chains/pillarbox_right_vertical/fs_blit.bin rename to bgfx/shaders/gles/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin diff --git a/bgfx/shaders/gles/chains/pillarbox_left_horizontal/vs_saturation.bin b/bgfx/shaders/gles/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin similarity index 73% rename from bgfx/shaders/gles/chains/pillarbox_left_horizontal/vs_saturation.bin rename to bgfx/shaders/gles/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin index 42326d4324e4480ca182dd083d4e3c5fee14d233..9dd618de8a02bb855e0ba2f88983419191ff7d0b 100644 GIT binary patch delta 28 jcmX@byqI}{G-LBdnRrI-#Q2ibisbzKq7;M4YZ+w$iZuz5 delta 92 zcmZ3?e2RI3G~=p`GVzT58XAf5C8-t3`T0dD1`1jVWvR(V8U}iXraB4+dKQ|R3fgcX hkcgqCrZty>LRoxreolUofr70RfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/pillarbox_right_horizontal/vs_saturation.bin b/bgfx/shaders/gles/chains/xbr-lv2-deposterize/vs_blit.bin similarity index 73% rename from bgfx/shaders/gles/chains/pillarbox_right_horizontal/vs_saturation.bin rename to bgfx/shaders/gles/chains/xbr-lv2-deposterize/vs_blit.bin index 1e806909f59c41fb3f06aeba6b5886321f8eeb3b..9dd618de8a02bb855e0ba2f88983419191ff7d0b 100644 GIT binary patch delta 28 jcmX@jyqI}{G-LBdnRrI-#Q2ibisbzKq7;M4>lkGLic|@c delta 93 zcmZ3?e42TJG~?=xGVzQ78XAf5C8-t3`T0dD1`1jVWvR(V8U}iXraB4+dKQ|R3feFs ibFh%1rlvKQfRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/pillarbox_right_vertical/vs_saturation.bin b/bgfx/shaders/gles/chains/xbr-lv2-fast/vs_blit.bin similarity index 72% rename from bgfx/shaders/gles/chains/pillarbox_right_vertical/vs_saturation.bin rename to bgfx/shaders/gles/chains/xbr-lv2-fast/vs_blit.bin index c0f4dfa5a88401f4056362539fa1b6fed642c8d9..9dd618de8a02bb855e0ba2f88983419191ff7d0b 100644 GIT binary patch delta 28 jcmcc0yqI}{G-LBdnRrI-#Q2ibisbzKq7;M4I~ZjFi;4-S delta 103 zcmZ3?e3f~EG~?EdGVzR28XAf5C8-t3`T0dD1`1jVWvR(V8U}h6Itm7QW`<@!V5+I9 ppbZl@1c@727y|)N+?q>4p)5W*KPSJ)K*3fa5z4gYs^#Kh007X08yf%s diff --git a/bgfx/shaders/gles/chains/xbr-lv2-multipass/fs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..22e2f0c23d0e0e483f849e0e47fd609d34302edd GIT binary patch literal 238 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYMRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr-lv2-multipass/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-multipass/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr-lv2-noblend/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv2-noblend/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr-lv3-multipass/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv3-multipass/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr-lv3-noblend/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv3-noblend/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr-lv3/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-lv3/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr-mlv4-dilation/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-mlv4-dilation/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNRfbykznQ8e&xeCRJxdl0?MMf?PVAFvb^D|QvauYN26f`us zs<{*ta`MZerkCUv0F8||v<8a8*b24^KvPRfi&B9`Xn@VoLAFT~q&Ph%-mNGx-5KOI Spau=NW-Yjjf$D0xxEKI9`Arc3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr-mlv4-multipass/vs_blit.bin b/bgfx/shaders/gles/chains/xbr-mlv4-multipass/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNY}F5LJrwqV~{3e*kj{c2iqelB*9Rb`EWvIzWM-Nr1K|L6K!efb2CS*;X9* zH{_b1+nM2#9PTcqO^hIxmcyAhAMcUtSMSaqzd8N-`f=yye}8{F{%`!x>FYnw-v98Z z(|OeS1s|RMJ$`@o_VnG^o4;O~$3NYSH?!?{y||xc=E;xev*~0BJK*1!Upt-K$?DVM zYA!x5<{z)c?QE*VE$*2X#p*nJ-mR_YY+XL@-drs%iq)mxp9_vIYQV8J8ZqR4eLcCn zUd~qPrJytbUa>eAmy^YnNYd`-uJAaN*j!!%`Z0hM?z1=%$;E0i-6RQ1Q#=zaTyOg+ zO~oM-GSy}4PtOSm%oYPDq&%PPC%c6DT6sMv>Dt<@M zMD;QtnIF!U)2a9YqjpiR(koC8A;PFSg@<_dcogj@qPT!46p&a2I7JR?;oDMDaUD>* zbYNFJXmDeZKNQ8%mOydxD?07?Sb_pt)l0<-I;l~X0}n*&#f3-`d(r~ApSUwi4pQ;- zsXK+kwGluRpQ%-WPhz=~e}z0xCLh*5!oYV?O7L+^_ac7n>1|15D`1KFLLl5H7OomN z5I!WTLOdiWx_EICkNF^G%k`|xEOd%_Cg#`|;sL8!fk--GAeOaPLt7;83I&8*$uiAK z$e^608W_krMCAyx8?l1I;Or`Bh*y(3p!2Y(N35tWutxQW2OjPzD-dr}jg#!dSBg(UfsS34n(n+YvM8L~ z#t>!_(GedVP5OXOEB)2z$S~KemZPOfL!#lcy&Z1ovCj>iSGvslT!Bu)WWeEQI)Kf% z@j?>x6L;3etrDWtsjvcdwPNJL%jCWWRDzV6lFFG z@3u8Lzhmb0Q-b5ep+7zmfyVH4yi}l?)n00IQg*B%{LsPcK8UzGC-5nclF(bUO#nR%9gyWDR(*@E^Qt%D0D&`cbce`Xe<4m4eYo|ClQ=C!* zf&p$cG=H3MVpl@TnbhPIJn+D6M9TRqK(2dtKyBFzSfcUe#jBf{?)h^3 TYBibvQ7nrUTLW(o-EQZ9k8}_K literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/fs_xbr-lv2-3d.bin b/bgfx/shaders/gles/chains/xbr/fs_xbr-lv2-3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..9643a2657141e85fb1645d2bba1fe0f666169a0c GIT binary patch literal 9638 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 RGMY?5&-j8nJv5t*e*yUp6(s-w literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/fs_xbr-lv2.bin b/bgfx/shaders/gles/chains/xbr/fs_xbr-lv2.bin new file mode 100644 index 0000000000000000000000000000000000000000..c5dcd1032440153cccf4cd04fafcf2fcd25e7ae0 GIT binary patch literal 6336 zcmb_gTW=dx5OxuL!0^Tk5-;a*mn54#XMI%#5`=_Csz9Pu0Y%7Kl1*aCj)U#Qm#Y7r znK_r8vsYK5s+?WVede1vbA0jk_2;Y6w^uJaU;O#g?~}J@KfXEt>_w;ZqVpBL|26sJ z{PLIA@AOw+<5zFqtI64K=NA{3XP4){8p@YXlXbS8tfu=c*1Ruovg>pPdf@;2Z#tdl zbh(>8+==_?-Tk9@&aRbsMw#oyVtEt4>Xzs|Mwcyg)k05N=)D$tzlA<%p$}hmpB|>S zi{(6zzb9P6YpFKUC$q( zJQJvb5cXMoF9I3Gr-6$i+QPpuL?&0{p5=!MIa!6WfPh{QNBv^~T8@Q%3dL!j7p>7# zsH{RLsZ*GM!rNtfy$%9~De;|Pp-0=D_HDM<5dNHNP<*GU2buts>!)P~sR<}I#|(%n z+HEMpk`{o7)6#Fzl0@4YEdV5^Wzedn&KH22(=u$;vaj)F#I%fBwDi2Z%+s~Y?wDyA zU&Vi;A`K^=_wkiv6rRiRm0}d`)A%Z36pFc26$z823XamlvIM6H$F|=Hcz_=RQYF;@ zAv%#_y&usuvj4V#Hxn0x@q(IH`)A#Kf%4hnPcRc3TZm?b-{JquxKJ7vi8 zsV&DG@}m;uD-L^_x+Y>pV^N>?bkv`)Pk0P-g-Nsv#gW+!h>NkJn8#~&jgs?<&vr$# zo#yz%VtxMaQ##Ar7nToOmN?pMcl!_x9KyT@?yzQ`P<*Z{T6Tf}P9Y(J^q*DWhDTqV zIP(cuJ`(k0XcjVvYK{ac^OzHIpD7%NA#hox+PaOk%pC1NKM7F&dr=H|Km)#DOl~kM zCTnP^E*X6KE1Le5$*53GKG_Id)*PezW|#v=O7H{Ys7#Xf7TkBDgMugqV(L(g9O1zu zZ_k!jUk$IOMDc@8;U216W|pm1@9xtFAG)}I*#1K7xMf4JWdniixcDKa@DRJ6!4*IR zrWyo#Ys)35U-3ELq>Pt!-tzMb~&#iLf z^P^Vb`s_tzGFXN+FBC)caYYCCtkjfEHRXq*!cBahZbd*JCUG|ZqS9AdN(*;9yPLW= zpeU|j(qTMrcIzebg`tkhb%1Lp$8S3bON|AGf4WeO^D{9M3WO->W#*Xb?_evf1hp%) zT@I{1z8nS)Gb4=AtaiLZkB}V`lEc2P0z}Bn9e6&`jaA{@^@JWz;F(1McRXzpXOV4H zM0TN7v@qN$po>pM07_UUuv|dWm`9);+lDLP=5Cp#>ukveg?BvEp#t?){HD_eF+^0} z*)q{3q(i_weiC$=PF;wdBa;BhvaCJO(@mMYMI6@J+MkANYpIH+jYuuv)i6YaK} zy+e)BfRLks3CgNaqlJplfpNu*%wWjESH z-#kpd6SxWH*n&5@Yve?hPv0?G=gW@q#Wumkw#l)P@0h+6SliI~%rSEb%8A-BcgxCC zLmT7t77j1V9E%^^&ufVS^nalCvSi#UVfZEZ!>#$<6`m+%A4N7>Wp(^?2H6kIU%7!L ye9KJw(FP2H1zr;Z3w+H1q(*sHjNN0>BTIL)$;C3gJ6p^aOOUg%fTfS!Zs$K*?p!kf literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..f9c7ad41d1da7e1321e64f8c1b833633b9fbc8c4 GIT binary patch literal 7321 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..02aba5a0cba5ab33ad204238ca986124cb1997db GIT binary patch literal 8621 zcmd5>%WfMt6m^1j<95+cU^ju}hcYCGBME5>w9RvqMG~L|g2GT7IT0XRf$TW8ldSrs z{e^x(&%GRSF6SYsN*4tTS>jyY$GJ~(9zK8k)vZ7O{_E?V+vnNNtsVS*`};4?jvm~9 z^x)|Ei)XiaX_uCMd+_AZ;}?G6J6ibp>5C^v&z?Megg?Lh&HJN^>DAHs>}HzzmB-)j z>|9Qk*R!)X>h0{!+jr`6dTi7s(H$=q%h%bx-S=m+lg08>olj2R&8JIqU!9B9xGPsu zv1(h5z^mE$SSsC0Buu!sd%2jsR;QEMndj@Lpo)TOKSJ!=YSLK7O->1E^69w|XVQ{5>P}#us)u&IYTD>k;`+Y@fC^cVvU@Y?> z+Yqm)iGe17_~QL?3Osw~*@48IhN^oMQ7CG5t&*5oHtT zEG?INEVjc4*5G6gzitWu?bzp-=)vd%w!9C#2pxb_gRNbWTqu$cuAxdcKmbMMa$pMe zz_QMfacElR#Ae5vQ-+R(v@pD8h7H#gf?q*Er;bTuWR~f?$stil*xJEP z=9qRZ>=J&$K)AbvrPD7m-*j8T32QfCCzDKXkY%NMoCE7rmFcD1@+(!fk-#13%AC?0 zBvn+ikxYoFb{R${lUbKc8|SEzNo6)jsuU8$MCH-0Y%rW$oFu1{i>ialBr*17_D5S- zhMsJt9D*$y7?&2;#$u>UCESpqzf{IyU2s!|`4=)8?5Myt7Mn8cm&#a+71h9iy|Dlq zgJj+-oU_FM(~WVC{%QI^x9$pBu3}Bk%W7oY2A=0hr{Qv}ayv>xA&E)+5d99a)%~R1OJ_K)+~DvqJ+>6?+7y&uL+uRb+0d9y#TL;Q zy**>u-3)cNgfTp|rN&maG)pZlVQjZ&ESs98rj{^<$G6p3j)|5^WWpGSmu(r#UTA4x zOc)p2GnR9trPNIr54UG5Yq+I}GGRR4p0O+smdb-Kj5GtX?Fc~)kgZDihP zdnjb)S;{<7DJQSa{RM!E)dM*cCwDXAa>osF4XHIHDK%4~4b>g-68YI7Ceu~VM|e(^ zb-%2y{_LBuvx1%WaKP8As# zdPlN&#xq8TK!-G~2ZuDo2177ucut+H$lrBVG7bsC`g0))e(Hn*g|&hLbPNTSR@f*w zTZC*~uw)pW)nTJxMR8JRCDEi@sy~;aFa&hDJIPre6(DY(MRM+wJf0^rN-o=6PHpaZ zj>}@;M1fTfPIgQ;hCO*njG1j;>FHsX!AU%?@CiXq;5l{UzyhrIYCkM)%)+Re-kx!h zDou%Zi19F)a|8A3sV%Yr<~+Mrx9d=N4`&!NF04(o#Owh*4`U_7#=8o`S$WVYA;_)2 znT+;CD&Rnu%Hrq&T8xN*Fzj7T`(c&%7W26qx0x@yY0krT!~CJkiczAgzlDYQQQIQe zkN@zCkEmcuc|qGv&2X3$4_D&RDWZK-2~6iMwxe<4%w_M-hvkXWU%<=mjYs}~SiWpX z&>Oz=2fFfE5?I5R{s88mu{2hK2Kg}h=ZPem6QUJ#zz%2*`!q1bjFnd=xf}@cabiZI z>Nqt+PM6r0n2{hePRw9w4Kti<5{{chP+gia?l!~8`P^x5M!-TFIKE`4laK)=J10_# zJ0V@j00t%77%6kXb6BHf$3@DKpd44hB>m`Qd35rkBo{YQPOkt!I>eP%Ur_}uRLBx# z%L}YXDa}d>7o!QyvurLQsH z{=~16(E2{|j8HysbhzL<2EJ`dJ{XX}U_*97i>$Y~`o3E7jwV zki4UVkaiA;MewN@p_xlkx{L_V^Xh8>vR(@yP?uMOAR7Hac}lN&+0p#1e5!3^sB;=} z4*Yo{p~0m{Am_21hNTd|Kxr>*fr+sxji5%@RM0!mumNvZ;u8#o&@4PDst4L8Tg2#% zQ7&rZ_&m|)xF-uIP{3PA--7fm3nfj{LX4>;ga3<#9TCS}gEFX8*8uG_q4^Do@05e}!yGMK+)z0eM0jN+qy}IL30okhN@oBTw8u@9ysW0~~~{ AhyVZp literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..d645bdf002ccc7cd8bc14618533dd2eb78245bab GIT binary patch literal 8678 zcmd5>-EJC36n3hr7ql0Bgy~JR)Hd0fon1gtBehN9_$HN{NUc;=h&b3m0uupoY)853 zllB$*1pUt0o!K+{1DM=YvM|h?{m%c-%szkh;_C;0|NGB32Vbq?g9iur`|h{1)05G9 zaW71a>+$k-dUdJZO)uZQSJ#tsqppeWe6d)*jURVDTum<)%eh*O=kI5e zrFp7WjjK}B@+psMl@z>{AXlSxTPoE^BvgFdxn4})s`+?&rJ`=%klX-im<9wB+R9LR6>H@&25)R9x2<4yIpn6=8fWBdZh5t z?Go(tLPb&JzIo?6*-y-Cw)n_CvW~_QgqO`iwjx^Kr)U))NnbKMr7mZq z=gaZsuZ!7YN%Xmj1<-PWP`e_~&-CHlXB=Hh%f&M(nWC`5#SHO+9~+I~EI~3KR*eD0 z$xNWBn6O!pObC+oZXpT`6|CKmc%~Ou5!nuP&HCcuKKxJx>@$-Fz*`2axn>~n20*Jg zCa~18iV_IwU7vOH;HZHP1?cdep#3&bE$yb`EwG0bS=(Vb!HQVX`kt_@CeWOu4%Rfl zR!vJWAWe%zEFOpKWYC(Kwaj>(Z0AwnWt8L`BA#Enc{t^q9u27*CQ}s`_CXG9(?h1K zrhMHTgFnyoo0_1M{yM&_j1nv+%Bo$|%VoHPwN zDcT!*^b#`z;@0)=40Q(8Cf~w@A-4Krt5$Ce=P57G$7|o+jm$Tb{Tcri=7^lRj>H&| zB0oqnst_1AObXuoJ6M2xMMo&|3LNy8b3mbTESor(dvg$gq!X9eO&pRh=OD~h*MY|# zZ!(w`L$i&tG)=M|CN7hv^iR_V&u-0`&$X}aaapd+;9ef5sj9R+nF=d)k5g>0Qeu<< zr~7!mg_Cd;Gic$odjuS-FXOa(B(!p>Mna=b)Vf>=FoWG9;>}_)bM4#6u41UGxUsrC z8km%3Qa`WbCr$?sAC`Qv5bob0RYHQhklJA5)$$3JBMVpNBs;^VS`PDZl2`#{~ z^CeV_1K?zTVA<{xY5)PS-5*%?xP*FK0E`gW*A%j`CDhmg;B0?jIbkML8UtX2(!LVQ z-j~p<82}IV2bNQ3La7@75BCR_wL76vQvw^kKd>wh36+Ncc>g%IGV^RT^UVI4XJzKu zYUY`EZ&O&Ad6q{ncMTJb->k}ul%yP56O1`1+pXKUh^g)O%f~IQU${;l=4CR#k#u0= z8ZIs}&;_`v2IN@@o7kM3$C=_LDOAA<;z3XXShs; zohUbop~K>^@<>JUk{I*Oq0*D%IEKHu*Yi}(&E7ploy>%muhab3vPjIDpc`z zf&SoSx%uSlp)Rs{Sf2aJ+jqXa)xCZiXM;dWv{%S^?5h(Ve5ABL95`k2Ys>~J*n#eg z#lUVe8n0kN_pC>3r2V*weS`Yk$(q!coyhW_T2tQ)vm^;*MX%2JdufMGfBdKOa)lg& zER_nUTa}tsG@(5Pg+1>1P+^$Xr&zGsDJ_+KGmVQ=T7HopT&7|#KUWodazemfeiAD7 zOZ%1W$2MM5Bel&f7NPwxa_xvJ6x{VS7|E2D{@n4w2f8JBNYdpC?zOV&&los5c3(ah)58x`?~ zGqXPOp_`On`QV0j9+2XNsC%kkejS1=YA^`IJnRL)bx+? zxjdj5c&2*Dg8^dJ1u(2sjPfk9Z%cSl=I_Pzpetq%yczL3m@nyOwh(4eZs;_4WGHqp zuX%aWK|ZMDC#GmVhLv+2>Dx9PB~4vNjH(5||3}A`sN+UOSyTvYhLxnw_@zVMF7p^| x%3?`n_?m{YmS1(dNcS^fCfib$^k`H-uFwO{YJBp>vir?aHospdw9lQ+!G8ojw^RTC literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin new file mode 100644 index 0000000000000000000000000000000000000000..1914c61410f7fb20e1e02f33da933b203c448d2b GIT binary patch literal 8083 zcmd5>OK%%D5O#~A2epUZd+445$q!}uT1g1nqHPk#mlSXUv_Mb@ilaCJq$rS__z~o% z_P_KSa>*U;F4vBbLjglxEr%axhTl9$J%0A&n}2`3UVgjx^)}!8Y7c+k|9N_HJiVA- zUA*7S%U6H@emZ^h@c7a6+4Iw{tyGU*{q^YN_{nqk;s<*1+tcSK)6+$rTfJM(H}YY&g;veC+*Q?huu5m#aY+H^#^f+}YO4@)F-%)8US+G< z;%(L+^gi}7?&FKqJ9u^q2WFXn&VJ7N{XSk~+3O|Tk1uR1vi*#q53jBV+5Jop^TB{- z9N4Yv=RI1NIkHj7paZjpX*>{L)h4zHm~K7^myyDL%;kafgCJ0P|;Ojbjh z90Mx5NDJV#1zfH#EgQ905L5_w8faxyfDip`e#kjVt|8$Dgkcb-8{#GbQ80+28{+D+ zU5gQe7~#36`gF=!=z6*T}3Bfp-IXo zoUo#kvCt#|A~|DaCu8&W;FXrHHnXf|7a=)GPCzMN z4e5Sij4FmGG13_NC+GvU%$Vi(;nhfEILF&(92x?hY-xo<$znvYROvw$nlcjmA z`Z-MLSha26I##_qV~(;fx9Z)Q)46IJYm&B7)d&pIcVp1Y^?KtwY~^;jZvj;(CE$26s1Wa3kt)LFw%zONFt*oaCsGz zRK+;%WOrO%*d!G;jw`77+EHO%>?9St2)Ni8Sn&d=r~pR5quqgd8>c9dM!?iz?B)u^ zE32Z`E&|@26pFWdiUKzR-klYSXL>~~U<7P-cLh%lijqSFjI^+;k9pjwdfbV8cVHfP zsvdZPdhs1u!6Q#mCk?p2Z!%Cp9LSpCRphcLj3XD^FJa9=e zDTiesW}6$EO(Q{30ZJ#>idR%(s>HK^?s6cu5n)^@shc*iVM#XBZIsn?IqtBL$tm0~ zByB|Ej`T_R4EeGWEAdhZT=9IUC?AIHj=alFZSHoon^-Zmn-OW?F>9$KhTTwK;E|0g z3koa7H;HQ&LBh%PJz$E{ey22xRs>&@nsMH0r&*#lYFiPSwOI3nt|_6PEpY<}$CF*Y zzZ}#3QlH}P)&8mLjZce_C?{2$+u(@&*3G+R-?HXoA}}QF zRt3oslbqBrt;Io7F-b?*h64;wkA`0yXgcWjIY50jSbJJhM#&P^JOr*95l4$;T`Vt*w-ef(%E zt#>0e(e^IJ-n~R0*5*&ye7T*cCLv{)g~&g-Nfcf|ugWwVxRG9ylwOoe?RoT$Dg}A3 zh}EmEO;o!Kk6S~%c^`|RK2i$jKSvF(EKZZDJmVP3IAtMUEv~Y@{qUhXI`qWVlkjNl z*$t(fiyBdltLo7}tl#1gsB7Q)g-|<4az($4*^RbO<*2~9-an40;2*k%JCYe!G85kh z`JjN8_Wcx?7)lcBOA!H(@e>e5p^-yhNEftT(`rBz(G+&DK*JWaF=e;qPB#733<@|4 z>B*awvXIL(EyS%`3GjchFu^!mp(uh%by4+eu}LR3Z;Rz;YXmbXX%C?kv7bU!q>K-hZI$IP?Gj literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..ce19da70ec38fec6b756b08b0e54cede6d5d9717 GIT binary patch literal 8621 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin new file mode 100644 index 0000000000000000000000000000000000000000..a98de1025c78e686ce3640bd440fbbc82b7e87ef GIT binary patch literal 8083 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 F@i&hM%9a2C literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..b2fec3f1fb6df4060754c572e01eccfb5e257a80 GIT binary patch literal 4707 zcmd5=&2HO95LSZrqV~|f!5){DM01zaAB+ZQ8^`e_2gg7Q1ckuLv?4$<4N7(-7e4h# z`wD%4qBFBxa+VY$$?c(lAo@P;e(~auzyAEP^>P)oUbNun>tBAnoSeNr zKbyS2x_n7XZCv{K?Be|Gm09=(7k+qmbuqcTcy|szX8Ei8$vW9gR`bUsFe`t5+iE?; z*>-+A6CdZZk9XoBnQHNXa?>=;u7lI|{q6iF&6Z*nFYgvfreBK{TP;pSf)gu`RRj#p z#%)e|rw~)&wEd9Iuf;N+-wNrqe{Tz}!+LoKnoZOxEZgtmdm(SKc)FGnR)vsEQSqH% z*#2hgp~#8Qe&BhcM~0Ds-|q_e@H~W_-v}wC1@|`qQT(y>#4C`*vq(&cMf!=X8(A5R z5Cu04+`#DT`z!$q%T>_jUZCrQm@Ou6vUv7Wx=1sWH!9{pSptV|5%dW^3cG777vge$ zCiJ%e0Q{V_4H`)K!HINCVYICSM(l6|>Q@0Hx}*-cHGnmX^ch|s^>gjvc&jI5=m(|6 zL$3jJz(5B_f<{fCLk2qB1KO!DZ3G=L(9w~gjp~mX=y(rkuZWHYTPhwdDmWAlG)5LR ze=8?B)gHKxW!DHtiC{BuM?yIPRKS7h3U)V(G+x_#6i*lx0=?^WEo{Dzp+r1Fk|xs- z%7RvUfR$mW`Wk-+L#-QedETg~f~$h(1M>t@m_eMdQqKqGNu)4~9AN!?V4g?{GYJYR zgbI{q8UMB_i)#oKnASypb)_^ou4Qoy$0StnvQA+39YB}vg4*2?{|yZ&0{?;U zyiF$^ihVGdtql+aAV6(>ceq8zgj?07P*BRd;Hm>mn=4ukx1(rOBmMa_YT<^qJ2>2S z@hDs#Q3#1cZ1S0KYvR)oZf;nCUC7*E>^vS0^U?kg!y;uvY>YosG*^0-o7=q@96@DdOpMsK?RHH!Sq{V z@(qt#Tvx!T$k;(EEQeca?K||=yh&?p(xkU}7SIT-{9!*B7#(tJYG_@gp``-{PXu&I z7_ZrU17bMU7G0y10%PLT?#ezMA^Yib*VACLjMt_1d~(p?hu~K@p6kLp9&9PL<;+8{ zr}>`ayYNHE_NY78N$@d4M-B--D8Lpc!3RdzayU4?iyRIV&UV5Jt+Lv=2q%)|e8U{1 z%Eqk2yeJet=9>|(7=;A(b>|OCY;kLAxGnogD)2d`|4xb-!uh1 z`IcUVwhRo#D|!_b&p;c|IO|}-;2o4m-Wq`G za#RcmyN>lIzd|XGxffm=#SYX~AZCxS#y)mV=<>t}Pgt#nCJ;?QvX{U|CL{%ZhH@zid&{sB&qGadi{ literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..9409cfb2a6141948f4f0c24294c8d74e19473027 GIT binary patch literal 4786 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 AI{*Lx literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-pass1.bin b/bgfx/shaders/gles/chains/xbr/super-xbr/vs_super-xbr-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..9dd618de8a02bb855e0ba2f88983419191ff7d0b GIT binary patch literal 419 zcmZvY!EVAZ42DyQQ=Y=df~KnNxS`!SA|Y|DLfaKjq^`0wv>;AA>0V(^Fw+6eG%it; z&;H`yoAq)MT)w{oA=}Jhc~}|xm;^!u;=-r0*5J0aCG4=;HQ>s84l2uOPbOZ-C-{|d zL!W4o>Zb)M7ud4PiA=!?r%aD^<@?>k{|~0%{N}dCcQX3ctd*U^n1bDe1!#pegj0Ev z;D2Iu!}cs$@bmp19S`t!&6tL96u&?c#nV5$>zR-FqOQNw_aVFyTb^*SzL>xu0Xj{Eh-V;?264{U3#^}3`e#8#(woJl zc&|acjI$f@{*CxxZ0^>4F5*=IzY3B8(Y~IBm3PQxkQaPLRsmlV%Qk;Zf=x(P8<^gQ zAqXj->0wV^0QcFYqJaX^mi1%of0)+ttou{?#2 z2CG4PXDiT7%X7KnwATPVLeQhrzY_3cxY6-oG@S}+1bKj05JpA%@jD5*`jh!w_aVFyTb^*SzL>xu0Xj{Eh-V;?264{U3#^}3`e#8#(woJl zc&|acjI$f@{*CxxZ0^>4F5*=IzY3B8(Y~IBm3PQxkQaPLRsmlV%Qk;Zf=x(P8<^gQ zAqXj->0wV^0QcFYqJaX^mi1%of0)+ttou{?#2 z2CG4PXDiT7%X7KnwATPVLeQhrzY_3cxY6-oG@S}+1bKj05JpA%@jD5*`jh!ToQ5QUv6EB6w!gsOGHu#38^)UFz-Qn!c_N?Zkuh#`=w_voE^sSXxDCPd24 z@|*eIo3Y>Do>#9=zb{Kd%b*hRaZ|{z)q;=(xhVq`*TF%YVrQvu{+5Jjw34Kdf$AIoSuBZeu80V?wwc(3)e+t~vdrxJDxz@0+;c&08|&c|iQ|&ggGz z@bI`puV?gntj2DfXmZz%a&L8`bJm7tBF8A&L literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/vs_xbr-lv2-3d.bin b/bgfx/shaders/gles/chains/xbr/vs_xbr-lv2-3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..185547625c49dc5c5072ca49d8e6f02d51c9a2ab GIT binary patch literal 745 zcmaiy(N4lJ6ow0unADdzmtagC9e2bV6B50WKw`LSCQPVdD;eGBFusSc;9GiDx3wsV zcWb|%|D6Bdd7eM?o+h7<7lh`bknv%fskdH-kPf+A+|R^pGVj{cRW5XF#9kib;OFM6 zOGu=3CSP(L!$z(*J1FAi2qLjmTa^W4dIpDxcWN)SRO#6V93Nn(rBc}nC5k93WxDqD zi&p;+@>W0VDQi z<4qCwdh<%THqMNJTMVh)1)Rg`d;h<-6nYXNE03t+?4d{BUdRmMx{xz-Qd$MmBJ0|j R89HYBHM@b=ZVf*uCExAU@Pq&W literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/vs_xbr-lv2-fast.bin b/bgfx/shaders/gles/chains/xbr/vs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..2d62e84953e1a9df7f5136c3de137a25368ff72e GIT binary patch literal 1178 zcmai!O>ToQ5QRyVm3s*jHC*b6?VNyJlX56Bmxcu1LSV7d@OQmVh% zen($w#;)x!XGllP8Fcir0^RUsWmU_|bvSK^gKV3G^r5v@K8T(2(Ij9ED4VN`08pFF zt(_syGuT7f;hjMLfigZkj>TF;QWpcgws;K1&5SN9JIy>Tc<8>z>Nx>H=d6UYC)@a7 zG#=ZV9=Nr~YNV*FIwCOw*+wstl_gMqY-6GM)PkG-K8ohEs=GHxj>GxvT6F&;x>=K= xemR_fAzXmM1!q_WR|5qnftr~E#j;(1dV3~oz2qw(gNFOz*8z9UU*ww*>mNfrepLVf literal 0 HcmV?d00001 diff --git a/bgfx/shaders/gles/chains/xbr/vs_xbr-lv2.bin b/bgfx/shaders/gles/chains/xbr/vs_xbr-lv2.bin new file mode 100644 index 0000000000000000000000000000000000000000..dd851ddde0a2858404cd9ac3ff76a0a5f3cd063a GIT binary patch literal 2087 zcmai#OK+nv6oqM3X(Z++bmJxI!-JjhQq}z|D~&XpSsw`^_=D{dH~Gr?_D0=S#+a-&|SNmG$)$=V=)q**SHu<&%G3EGxSYCWgZm<&AMU_7+dIfeZfa&R5a_bpHIwi(>(nwQYr zoRQ*EZPsf5JG+LJ-XPDY#lM*Z_IB$%EQA5gde2ID_UNdMbuB%7R(t5I9u^)rj}*H~ zK8mXg0f|_oT_jwVV9tGeOizw2f_F+L*rg0E8$S5^xP5l^UOVgWj-L=m|Qz{J3k3 z0wFuY>^I+h`!V}??{&Wae!EsT<5tJQ=Vt5Y;m*&ZuaI|D=BH;_MUa-!dId!|cc73J zb0N|NpW54Xv=nIqS&(evFm>J_)3R9af`&M?3lS|K38FO+YVU1;Wh{amN`ExPK-JGh zEK=WT<220tdl{((Ji|tO0znS>HVv^M$@owwMKQv@#9_`5j2ER6CRzd^8Yx!73%Hy! zPATlM03;pkb5hjTo3K)0DasDy$p$6zT?r3u#C8aRuvJ!RR~LFlp(lHd7{48 zOlW7+3U(Z^HUB~CR{bos<_|K{tfl(uD@nux2pU*=A02(Pd|Ub?UHK@l*6^2Hq!GM2 nx1_X+{aG5UUgd9mJfy0_0P4|BgyhWi)ICIM7ngFNgKb;?a4}5y literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/misc/fs_deposterize-pass0.bin b/bgfx/shaders/glsl/chains/misc/fs_deposterize-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..c7188eec8395be08463aa6a2dae703c14e5f48dd GIT binary patch literal 1485 zcma)+%TB^T6o%_<)A$f)*?MUx6x0}33c;08*pm@PY*MIB0Sks#aP8wdXF6Ac3SmKK z&ivnh{?nn;>mEL|zwZycqY)jF%-i$$*Ka=#`rW5?uN&`+h2y*XPRCvPI`X^)Vas$n zh6Noauo%o}Im~l5im(0oG=0h01PU^F%P6bgfsi*F;)ua)Y}mMKf03snn2>Y|LFj+_ zQ1NDyH_jh$7=Zc>H^5EI=8SS;AdqLav8enAv0l*Sp}Hkd|5sqC1saOlumlxkJW=`1?fv%$Y~%w(j7ataaMD1Y?vL%ar6iWv$tH#0z0eFwC_ zmQ1X&*#wq+l)`d2=hdhv#5lh47qjfK5K}1G^eN{exdxIq8+62Awl-|smA@>qF-%!D zgCO)@eW-c!>67FSB@96ShTkAf%ol=7VnE1K+gMbsLaZmcI+R!f$@cl3$*^)>mI&%SFIaBT438S#!6TwQQJ2|FuPgJwu0AIj zR_yjhXzUF?JNm0z*#OT=u3B}l*muyPumLu8wVlPe$wGzO)sZzi=h8mu#9GJ2*?JeX z-ahH>-SbxoHzqIk$k-4+pXir4%Lv`p9lVoulXg>rF{+GJN@^Zzv19gWDh|r3u`nbc zuY7Z3FEM_+M7mxNQ$1fwM$n2n@T)1Q|8OVTT78*l(7OzvfYPG3gLaVW)wqQgR7u>5 gUgUu|+FHcx+vt$zNj~fgHu+QJg)mzvw())M1L~Qt$^ZZW literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_horizontal/fs_saturation.bin b/bgfx/shaders/glsl/chains/misc/fs_saturation.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_left_horizontal/fs_saturation.bin rename to bgfx/shaders/glsl/chains/misc/fs_saturation.bin diff --git a/bgfx/shaders/glsl/chains/hlsl/vs_blit.bin b/bgfx/shaders/glsl/chains/misc/vs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/hlsl/vs_blit.bin rename to bgfx/shaders/glsl/chains/misc/vs_blit.bin diff --git a/bgfx/shaders/glsl/chains/hq2x/vs_blit.bin b/bgfx/shaders/glsl/chains/misc/vs_bob-and-ghost-deinterlace.bin similarity index 100% rename from bgfx/shaders/glsl/chains/hq2x/vs_blit.bin rename to bgfx/shaders/glsl/chains/misc/vs_bob-and-ghost-deinterlace.bin diff --git a/bgfx/shaders/glsl/chains/misc/vs_deposterize-pass0.bin b/bgfx/shaders/glsl/chains/misc/vs_deposterize-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..e6cfefbd74f969bef0740a4914f645cf35e37a5f GIT binary patch literal 679 zcmaKqO>ToQ5QQC-m3xUzgb2>^B9xH%9~2-$-$csdfU+tsYLOp1w`z2o90ySSBN(jwEiH5LA&U&M zSZ%BiE&_L*z6v)<8`39*QxAgOx3Q0IB)yx zRp#dUVBw@!$m)4WOgar2GL2oT|UqWI?V#99~fz0@gGX|jP> zBmRV z^#)uT2eghSsc^cId+e7vcs~82(Am)03Fixx1Q^b&xxj;kLyt3l3jyQ)46hC1E;Xx- zg%3xu>-T`L=Ul<{DBbE<<)IQzghNZiVRy(KuLH&Xj^#FE`zD)(o6c;It~tL)zwNhY z*_-QwMUz<(s~ePYAu;JRWW;R7wbxTaX6C5fki)F7ySc#nbH5xT7=tDU8-1MaHDRxN ISl^VAU(ayYCIA2c literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_vertical/vs_saturation.bin b/bgfx/shaders/glsl/chains/misc/vs_saturation.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_left_vertical/vs_saturation.bin rename to bgfx/shaders/glsl/chains/misc/vs_saturation.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_vertical/fs_saturation.bin b/bgfx/shaders/glsl/chains/pillarbox_left_vertical/fs_saturation.bin deleted file mode 100644 index 4a3f80b56b9f050001428a84ea80e51513868350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmY+A(N2Rf6o$*9H;oT*Em|hO?&03Pl4KP*n;YZ=q%&D+ zVHA29hZ_j}A#vgDUlS2r|N9wiI?BD5?d@czf!W@cshfPGMg622rOzRD@Ifj01*CR{ AvH$=8 diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_horizontal/fs_saturation.bin b/bgfx/shaders/glsl/chains/pillarbox_right_horizontal/fs_saturation.bin deleted file mode 100644 index 4a3f80b56b9f050001428a84ea80e51513868350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmY+A(N2Rf6o$*9H;oT*Em|hO?&03Pl4KP*n;YZ=q%&D+ zVHA29hZ_j}A#vgDUlS2r|N9wiI?BD5?d@czf!W@cshfPGMg622rOzRD@Ifj01*CR{ AvH$=8 diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_vertical/fs_saturation.bin b/bgfx/shaders/glsl/chains/pillarbox_right_vertical/fs_saturation.bin deleted file mode 100644 index 4a3f80b56b9f050001428a84ea80e51513868350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmY+A(N2Rf6o$*9H;oT*Em|hO?&03Pl4KP*n;YZ=q%&D+ zVHA29hZ_j}A#vgDUlS2r|N9wiI?BD5?d@czf!W@cshfPGMg622rOzRD@Ifj01*CR{ AvH$=8 diff --git a/bgfx/shaders/glsl/chains/hq2x/fs_blit.bin b/bgfx/shaders/glsl/chains/super-4xbr-3d-4p/fs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/hq2x/fs_blit.bin rename to bgfx/shaders/glsl/chains/super-4xbr-3d-4p/fs_blit.bin diff --git a/bgfx/shaders/glsl/chains/hq3x/vs_blit.bin b/bgfx/shaders/glsl/chains/super-4xbr-3d-4p/vs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/hq3x/vs_blit.bin rename to bgfx/shaders/glsl/chains/super-4xbr-3d-4p/vs_blit.bin diff --git a/bgfx/shaders/glsl/chains/hq3x/fs_blit.bin b/bgfx/shaders/glsl/chains/super-4xbr-3d-6p-smoother/fs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/hq3x/fs_blit.bin rename to bgfx/shaders/glsl/chains/super-4xbr-3d-6p-smoother/fs_blit.bin diff --git a/bgfx/shaders/glsl/chains/hq4x/vs_blit.bin b/bgfx/shaders/glsl/chains/super-4xbr-3d-6p-smoother/vs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/hq4x/vs_blit.bin rename to bgfx/shaders/glsl/chains/super-4xbr-3d-6p-smoother/vs_blit.bin diff --git a/bgfx/shaders/glsl/chains/hq4x/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-hybrid/fs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/hq4x/fs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-hybrid/fs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_horizontal/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-hybrid/vs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_left_horizontal/vs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-hybrid/vs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_horizontal/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv1-noblend/fs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_left_horizontal/fs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-lv1-noblend/fs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_vertical/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv1-noblend/vs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_left_vertical/vs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-lv1-noblend/vs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_vertical/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-3d/fs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_left_vertical/fs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-3d/fs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_horizontal/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-3d/vs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_right_horizontal/vs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-3d/vs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_horizontal/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-accuracy-multipass/fs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_right_horizontal/fs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-accuracy-multipass/fs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_vertical/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-accuracy-multipass/vs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_right_vertical/vs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-accuracy-multipass/vs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_vertical/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin similarity index 100% rename from bgfx/shaders/glsl/chains/pillarbox_right_vertical/fs_blit.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin diff --git a/bgfx/shaders/glsl/chains/pillarbox_left_horizontal/vs_saturation.bin b/bgfx/shaders/glsl/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin similarity index 72% rename from bgfx/shaders/glsl/chains/pillarbox_left_horizontal/vs_saturation.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin index 061d861b6ed843c4995da7f9d487c6366bb34791..af6c9349f410fcc16eaa87e32ee35a9d92bb026b 100644 GIT binary patch delta 53 zcmZ3${F7;dG-KpO8B<1$#Q2ibisbzKq7(ybE(L|M_~iVY{2~JdTZKd@)0(T6i;DpO D&&v=p delta 67 zcmey#w19bnG-Ja?8B<0h4UNS3lGKXi{QRO60|hOGveaZF4Ff$xQym2ZJqt}u1#P$x NNW@T6b8-x$EC7-r5pDng diff --git a/bgfx/shaders/glsl/chains/xbr-lv2-deposterize/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-deposterize/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_horizontal/vs_saturation.bin b/bgfx/shaders/glsl/chains/xbr-lv2-deposterize/vs_blit.bin similarity index 72% rename from bgfx/shaders/glsl/chains/pillarbox_right_horizontal/vs_saturation.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-deposterize/vs_blit.bin index c25635af5a854fa9d7204d9c67802a7ddae966d5..af6c9349f410fcc16eaa87e32ee35a9d92bb026b 100644 GIT binary patch delta 53 zcmZ3;{F7;dG-KpO8B<1$#Q2ibisbzKq7(ybE(L|M_~iVY{2~JdTZKd@)0(T6i;DpO D&;SrK delta 68 zcmey#w2*m%G-KmN8B<1M4UNS3lGKXi{QRO60|hOGveaZF4Ff$xQym2ZJqt}u1#Os+ OIatV0Q*&|*qbvZV))A}# diff --git a/bgfx/shaders/glsl/chains/xbr-lv2-fast/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-fast/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/pillarbox_right_vertical/vs_saturation.bin b/bgfx/shaders/glsl/chains/xbr-lv2-fast/vs_blit.bin similarity index 70% rename from bgfx/shaders/glsl/chains/pillarbox_right_vertical/vs_saturation.bin rename to bgfx/shaders/glsl/chains/xbr-lv2-fast/vs_blit.bin index 3b5a651f2e78fc6d93dc0bd446117ee39c5f6b3f..af6c9349f410fcc16eaa87e32ee35a9d92bb026b 100644 GIT binary patch delta 28 jcmZ3@{F7;dG-KpO8B<2?#Q2ibisbzKq7;M4eT=dIh_MM& delta 78 zcmey#w3>N>G-LNh8B<1E4UNS3lGKXi{QRO60|hOGveaZF4Ff$39R&kDGea{VFxAvl V(1wW{g2at1jDY|sJ~@U_7650*6W0I$ diff --git a/bgfx/shaders/glsl/chains/xbr-lv2-multipass/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv2-multipass/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-multipass/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv2-noblend/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-noblend/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv2-noblend/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv2-noblend/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv3-multipass/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv3-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv3-multipass/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv3-multipass/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv3-noblend/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv3-noblend/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv3-noblend/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv3-noblend/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv3/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv3/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-lv3/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-lv3/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-mlv4-dilation/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-mlv4-dilation/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-mlv4-dilation/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-mlv4-dilation/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-mlv4-multipass/fs_blit.bin b/bgfx/shaders/glsl/chains/xbr-mlv4-multipass/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..db0fe2b487b6c8f1624a7136f8c83734c2b7dcd1 GIT binary patch literal 181 zcmZ<@_F!Rb{`8QMfwefkB(;KpkpYNiF)%QcB^Fg?=A|o?r6!vwl*K3K=j0a|SaTr> z8v%uZT9Whgi&B6xrFofY`9--3#fiBEIjKcPE(%~1fm-r2QxtL&GxHQQG`Xs|6co~P r;@yf8)15&^D%dJ$01YWAElLII&;V=EK{i-ZK?`oZrZrbB7Z(Enmi{^a literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr-mlv4-multipass/vs_blit.bin b/bgfx/shaders/glsl/chains/xbr-mlv4-multipass/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/fs_xbr-lv1-noblend.bin b/bgfx/shaders/glsl/chains/xbr/fs_xbr-lv1-noblend.bin new file mode 100644 index 0000000000000000000000000000000000000000..e4fa0a459fd10dea18ca78520b800628e0b39042 GIT binary patch literal 5185 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 Lf~EJ{+gtwwaM{&% literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2-fast.bin b/bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..a7b48e65fc81d725b7a40fe99e90a0e8ee37bd78 GIT binary patch literal 5100 zcmb_f+iu%N5LJrip=#gq1N%rOGRmR>n-wX^E-Dx_$(@-!GjnEkc>4bB=l`_+{_APui=V&!Vf6mwn|H&{o-`Uy z8eie_FQcD^XK&tq(6651t9L)D(aHD2)6=t)v*CAU<;$DVvRI84lTDFo*{2u9IG=(Y z`1|u&qj8&;>&f+%xGly?+@kb&J})oQmrb_PW-D^%irTr7y=>lGPcG->4EJdZ=Tgmk z>srmymWx{w%vHa#$Y&p?MX6p3@*5D&Cl_LtPp(B2H$OFn2DF@g1b0W^n-KP1d@UlG zq{op%o2=j$$0$T@7)kKkX(`mg#VAcWEdly1Veevb>^;}Ej45R|g+Mt|8JM~(^YJo@ zSYE_)!5mFi>nff$GtvelkkjQ&SwIXT3POu#Gg;qN9O^IwodX6`vZ@;BG6UU%25J!W zn1S9w1Dh&>J~PliU?8(GnB~j1&BTBi7@ViSq76+F9^S#ZWGg&wgLB1JIGn+G##YEv z&L#<^7xGI6w3L8^C}|6Ym;|&itW#2Tk#jxSQTRXYDg9p)#j-m^Gv;9c+V;I9Ht(m=*aHXsUeHxWhb%jY-FU`9~#aD*$!yJ zYXFuwPqvmgQMQ&iQ)nq*3g?@|LUpj)71)7dunQI_v>5DJ)UJ-$6>ej13JN6_FHCCpxyPz)GShJj-K zcp#w_O-hRf;p_-2D;lfwKxtqgco@@pK~qbWk&2%}3QwT`g~>*h_nbbAqpg|}2}M0S zD+7w+N0P#sYnHD>L>E)hy0KX58FVI#bbM|NllBxv2OJGGUREi5oxhso0*k&%7^J(yVW@qd?d*AD(DPx1wDL zCw@?daO_v7hr`EXh2!x)I4~Nq&tpY{yn_SLVQ~5(oW6k*go0+>$)%tFR7bpW-`lDO z%>G2xVV%Nx7%k`z7JGycrh8FL7sW1lI9<$)gXawTaE}+Pahs})Pq7(H0I(PA!2E@m mP!I5$Gel*c@oj%QpiQo(qti0KI+;)BCFmJ9aHsobv+*xV_sMwx literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2.bin b/bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2.bin new file mode 100644 index 0000000000000000000000000000000000000000..b1e84120d4dec29ef96be265b93124308dc5aad2 GIT binary patch literal 6083 zcmb_g-EZSW5YHj*fxsINJn*uQHf>$++WFE6Bq%Lc=>!sY0!|f*OzZX{CC!nfZIaXd z@6618c-EgeiK=pJ&(8O6W@mlz`sL^A@wZpcdtdzZ)9=&QXFt9=|Lj?>_pJ97KEIv* zd4BoJ%QyPf*ZAtyA8LB`+xf-C<=N%=uZHsF!*r8xr|a21kM-K;H~Doo2RZQn_M2Ys zFmpHWgqk&P79NJ$zgX(MIONEtR#Mlbpg_p{sOYJvWw z!iBEpy$xXvsT9i63Kr6Wvd$Lo=lM$gEGWKU;c|8(7TN4x1Y!R}Uuc6ii}w)LDa23+ zdoR8hfsEqQz*!q@;V%qv5xHSjLVO*ULM|i*aWpsjKbqK zxl)Y6&6!*!j6$ArG)X9NA79dgr36a|lD1F?NdOCjIwjQ*F*lL}g}?Dg>0b>Li|!c3 zn1=~)+xL>tz#}0!zNIp;XvLICh?S{Klv;TVj0zqdzZRaFw86A})J?ze?j7lgN znu=)2&Jg<Dh#>oC9k|9Y5GPJ^0!oiWGZ{*PbfK6dLBhPn30ckr zPQnmYS)p3Hb+fuS+JSsxps1%&3?V=TK4VN~FfArvsHr9nyp=0z<+X9BkxJ%R<6Xeq zLic7=AVx|s0bQt#k2Vx6cdWw_EBatkP<9$Y!JY07l$Tl!s)iWxT}$DFsLNxXuh(zh zW%oW-aeA<|gotsYg3_acS9yF#Qn({s&tU);fyn^@+^TV5DQUn+a3%0yAVKU!VcNT} zh?9a@&Y;Ssgq6N!pt;=Vq8g-d(afY*lm{`z_f3U^t>=)5TNT1QGYq}QHE8#jQUNw3 zk?(K{XXHh;6#-pLxNOw*G#S{q8#8H!ES;$ADCt~)RJb%rhv%ZEt%0~M47EcJ?XGm( zdRr}+U`#Xo>GZUA$iy@vV4`?e7sr%!hf`@es5GI(3OEh$;V?*;eqfa5jSU=%g7g@d z9O88rz(c0)z|DtFj0(?=CvcWiAUo=XLync)ZkWqT?D5W*sX=>n2Q zI%4eDmRSimcdI*BhquG9i1+HIfq4mCysLXO%b2&+SlW-3Dmo^|7~ zU>rawD4s<%SW;YIRyyqxKbC0w=~}NHcH1gutz10vlvL7V(ZFC7bmbxqm|V@&={LkU zQbhHyHPNZs=LVF-LQV0xUE!yR#SHs4UW_Yv3feNa z!Ii9M-dwD*|Z99~$==WvB{_#qbiHu@%j(w(OipSZ=ojlT21{Nyp~v(fE* znQd$k68jCsIg#+uJi*bNH!+HM(RCCIvg{O^=p%#)Z~{lT0!Q#fhlYZv1L&JW!#T8u z!W=%PCOD?HnKSmy(bK)v2(``3F=v>9Sj}fbf1uK_WE>IE zdi)$}zG=c8h3KQm=j*&_J?$^{qSu#as)Ub>$sl?HT_Bu?pU?oWIYQL9K>WnrCMhYo Yn@=xR+1=T4zFYyHbpteg?Du>B0l@wKEC2ui literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..26a3506b7cb913ec6a14bd87c27a4f28a351e7f0 GIT binary patch literal 7003 zcmb`MOK%%D5Xa>{F6yb*p7ywk6=nI*!!UX%lBP)yE)WOEp(qxDExQ6N%avqDcHmP# zX+J@MeuB;nUqgzL*NFkckd`yU;eW{=ht%uiH{b02{og;|w!Z)M?a@nFe|UTJ>bDQ| zF?{)IuhrUXwaxSJz#9Jau0DSM?&qUl-oG)1-(AU?+>lk z&3JJ;y*w{&CMUAELEDr0d~sSGwy!UzXY<7jTXeCJMz$T($u_XGl6IC}XjzVDR~M6o zd{scMhwYpB^t70brlV;T4W!d*b_KfC1GIFX!MbGn70(Jb zwBGu5!+XfQhvsw7D}=+8}3&@8cu2~>(JV1rBd@|!83 zohE{2oeM5|YY4ymYq2U%=c~fK%2C&uk2<7bu)odOA9(wN)c!7KFJOMUkX7pOG3z0M zhcF&6`^GCDhSraZiA$s`HxK}WeO9QR(4v2!I`G+=AO+$!H*tb&v>IJ}O|rRfQP;YM z3T zz|@PE$B6B0;NHFT?}LL+5c#Yv2HNh%IVKFqyk8Cx+aqyoiG*7@9;A`{G?tuOvZ86c zvHHazthGV3I>95m{>3nO3{#Ih0Rmz~%oyk+Pk;a!VJQ<4KyqqIL(QiofaKtm2Ao#s zxNFG?kTx*_q)m(fril|k5@a|5B?p1art=!;1L=TfE--P zc9%#9AQ%CRLYx4SGh1pRfa7Nl0d^%dt0W`=$EAmSWq5g9Bn~QRK!w9F^&OURP(|5} zhC8bp$w4IvR3$~CVxd8#zzNPSIm&ZFYQO5Gj#vFC&j|^Ip_eT6$Z|pk7RiJ~qdX^M zV3D*eiaEhyDh*7Zk`sy}RvE;)G4rmWiB$?RY2utnnm8w@iE}~`1tU(t&eNO|iWTN& zBsoryRh|>0FXjY`(2Nu4;1srdNx})qIAIjxoKT$X3QtkI-rhWM@YM|~3yQ5BRe<8v zp)!T3Tg>5f1oiO4kvPtj!CBx0x;N#7;_Om}U4at~B6&_I&Mq~`b3#eK>XnREJ$Pj6 z38jLENj@sA5huvOrEK?-gcFK$f)uj% zEoK|_2YNWCWbR7vN(bRVOUYLed0V^-LR*{9FmFZoLDod`eMMLH^fOtnt``%ycPioH zsf#rT27XTWM93w~DOy0_X{x5w(>Z1w3_eo_)7AdYu8g4DJWD_gOas)IAR3ajH(sbv zbl&rz*Hs6usP1spMk4V;fEHUsazmwlF@%#?nw=|KmYyG5{x48x&Kk6;Qoe~nHwx4OW2NWi$` zCug#)3$!5@XZT{3ZU%6WTD^eY@TIAJv-7AOHXW literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..c7894d1d0e8a340ccbc43eb1d3d5033d71e379ab GIT binary patch literal 8237 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..c8900a657ead337a5e8c494591eb93c1403c3a60 GIT binary patch literal 7741 zcmd5>TZ`L96yAo?2e%LX0|h+=c`uIUCfkIzv`wo2Ya)(ke}C| z(f`u#%xFeuq>-AKJQNmN)|}gS=GYIZ*yW-%h1N?pW`}x`F>|$|! z@qW9gUj6y&`Rw6?(}%OC&(7~yssX+F-l%SJ`^Le4FLN!G}TS zymhgD2OrJgkSz1h*^gPC=XjB2uUBv+elVwIhZ&PQy1p4^_cA#uhC|{wvSRaMWR5d@ z42K}6MbI?3NTc1bN-aDeOpv1+7*UMiL-y{P41=(ytYK3Wwkoix5wXRhlog*4b>l^8 z?+om15Tzlg3S?|>zAKJ-NRcNhLjt#9+@_!Vw#{8K?y{fz`l_XS%(%z>+_!D+3FDsh zamy6$DdV2@b0=^MzU`vu=T9IPQ8bHw{seZxLs7^+eneM$-vp08q5An#_<7KY-l&8A z_TC8|cA_`#)F_3Y2cGDSJe|bPLr?U^o*t#}^WYP`(Fgqr{5NILo)*??M zpNlW2?WAc!TbtZVTT8G6w${tGHudGS{ii3XjQE|A65BvcJ1>n<Plr^U^S&1U5{O!8um{I6%Tx>86%Lk@-$H_YKDhO)bNYrS|8 zuiqlUVuIV4;L442pmFZ^qU|_UYr-VuqK*r*;}xfAYD3rI+SCZzC@L{+&MyKA-i0J} zp;w!W0BM5RixLnuQOJ^VZY+$nxi^;XJ0+8MCP|%%%be~flXojg-HOW;uw@@Zc?*-& z!XlvnyoXT5`Ls%Y9^FW`w8V4r6{BPaWv28FLq%- zLSCGNYB9FsP}i~&7>rP(`8q-%u&Wa5ROyafz3Zfd8j#uP#1_VgP}BmYBTULGYcf^I zvjW|bJI07Kt&P-e3~X5vh9*W?v&%^jMn~!Qlvf5eJ?ws1z`KXy{UZpiv>6a^9Rl(ha#?OWmx~9qbMHJ?Wqf9JLiUR(!-PO*x ze1_E2NW2J$K5YC@xUli#6kXng1B@070M#C!%i31|*nVESwVkQz8$%d*h{;<{OQj;q za5n+lPC~%|EnT7!gx*3%1h%(1$=d#3jfr zc{MUVvSJb$&u0cbsg7Wkff2AtY&@@);N!+yQzPReVq03h!QA*s(s;usMN>HAJ$T%R zh2x~qJo-RsHzH7$j53N-P}*$?lw(FYZOF7Z1Epe=E-pE2!wa3^hjvYeugV3cNWSmgyy9uCH-=K(v3NRMc-8JHBPg-~nu!!mnK5X=WQIGZ5U7S%N5fB?5oj4e^U`B% zG%jD)MGYg@Pxi_j{p^G7jNWZD-x6V9m3-n{QSnU>FOenln3-M2miBc!pLz{__ zMbj>es4fz3Y*Du{f!>>7EvoH^O0eO{XlP_6HRxtki246rM%PwC1cDb2L&c-&xa;M0 zmfH`Xk2rYwM;t31u++Zw(s3=sB?flJeo7HB^)*$WUU~up+ DI`OQn literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..82be16250c1d7340d246a7c63ab32f48648fdd83 GIT binary patch literal 8237 zcmd5>$!;4*5S5MOqU4Z2NS_Q+3q8FJNjM3R#OuWe+du*sfk4ZYAwUuhN|q(rKIP}~ z8~KHNL0(l)_f*de7t=WeAjn~N^{b_8>z;?tAAfc0&wu{@dh7Oiv2|+;pKpKv<=Mf5 z`;Q(RJb&@*HVH~cb1Myk?sE+27!;4<8CzMb- zO5hEyuKVh)a)YAZr?tmN3gi)CaHW1w#lZK~$B(KWy{<<4eMJH&_2%T@;e7Ju*V)Nz z4z4iR#k=_w*6E!Wd(wi;L#g=`^Jm2G6MeCrE1rf1;xn)y4YN2p!4|Bm39Z;=*dCPc;!SmtkimX0iiwVCH+9l zu+yfEB!JqBWx#0LUc5-THj<1N?K+S$sAO{XnaZWR%r9d{cLk47500?}Nd}BwBVsD3 zRRYRT(Ot2U3)qUowk2hJ=rsZ)>D&qoxJw&eMuuJ$8ta6bks)H%2$9?d*!6njIvm_^ zsGLqNQa&}(<&Ak+{L$rZvFI6zP9`b_#^>@$+*qKdVF56b|rOz3)qSb?ry(jV)fQ_J3dfcf3~l!BSpbKCnj;>8f@if%l za9j4KEi%22hEkh<6iQ`Rd(^(w=}&TJs3EK-JwREB9b!L+hWSt?T*CieC7<+QSm zvy}NVOq?4wz?9X^QbU(v`i(GUpJyo|Gt6=$OqrD}b$l7-Xd_G+>y~0&Vw#Qo)5sBN0#C!9-#3%d37ER(<&tZghlG2&5)B7m$wz9R#&7{3W+x6 zX1GPdvn4vmW%EPKQ(oMyvST=1W^hKpq0EOYiHgYSG^5ltB@~gk8ChAA*+3Rro`BeG zB*b~Gl&dta6k|bZdrDGMR-`Q>2(8Sh!$@M@`jtkKduXX!hfLhYwTy)PFBMs2B;?ybVbq+Ltn?BcWw@f1T(HxQ zt6tVuI9aqD6|KV)T#CXv6mC_YV@Gt|){|GFXt8#cp6(X~Ov+6LxAC%Jc2rg)1fX{s ze=IJcVrQ9MNIA|*(6)KK;kX*+^2=i8xV^0Jj3ML>4i{!zBA!Gm@6aWp95KbSkJTHR(hC$tv#3>I@j#eOZh# z6^?Axt$Jp-@?|(;Rdbmil`q4QD9kZ8>aAll?lLA+@ssRy#*H>C`&9bLNiyMOX?LSc z_)Nf2F1+jnu`Cllv&SeCp1Ebh%XIHJ-A93?@S{%Qz3iKP5rmJ*YmNP_u(Xrj2TI#~My*vEw3jhMJ%t8E^*XIe|Q_VVF3$Se&lbJm(&Ml~kDr zo#;>e8U>Z=1DEt@H){E5ZIADAvM*NjlbW8KPZuph=B;W-de0z5*OvF+!$<%pRVyM^$o9kFQjZzbdP` z;a+r1H%^b9Pm(CQlGN*Z-qw#EWW5e6KvEu!jHo9EYikj2H12UOY-7(^Rc@EKdMWC5FRoM`4z4b2*uOd+Z literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..bf6c4a886f6a301119d7b899467a8e3d605f4a6e GIT binary patch literal 8276 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 A$p8QV literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin new file mode 100644 index 0000000000000000000000000000000000000000..d855fb47c25e99775e1e989bbb28093539e767bf GIT binary patch literal 7729 zcmd5>+iF`!6m>)CgW8AwK;b-vBVUv=w^)IjY&P4M#r*->(QHR_?#Rv^)w!eZ58l05zS?Zp z*>1jmyIO4JgKP)w%~kGfIgFC6V&71|}H_MmVdcJ&<<-@_pLFT-5 zxqb^D&ESwM3*WOJvpmnSkY%q{a3uaZ5X%d=e}ujmyEmY=f3*T&^>0{<9_a&CijGKPx`oJ z8}2FNp7wLM;1>MYMbXdSf?OogEc*FdunQiFLiX_^x|-)Ec>D>~&)u$Jp4p&{6T+{U-I~qz42Ex z(oWjoThA|J5s*BbqvkC_$c`--+SF>4FDWsqw2g8XQ=I|$mvb%RHy;w;1 zZ;)Uq!A(l=!HsjEaqbVI?Ko9w!X)LQjtjHn6{o3dL)YQj)Ck%rDlu)&FCz-xg(P*M zmz&E7X@bUcgZXQ5p{OnjSyJAOg^@P@#u6o@DUvrPNsWn%obDx(_bN%fii;F99o^nc z-oGUEuS90Kk4(jTnxdYT$Q?Wc+-%Wr;}mx9)ysI30DD zWr;?FYNus9WVN%b+1j+N?@0sIygX|v&lf8^Pr==UCd`8qdYZ}k;}d3yqf9JLiUR(! z-PF#td~Vd#K!ON}KCJzr@JJIzD0;AomliD;06rdTTlZ7@dD+%>j;dY>VdNpEZ85IXV1V&nhC1g*at~X(7p4{}V5fI0HY9@<;|kmsc%#Ht+7Er|6UerOq>y&H_jtR)p1TFOJ?n28B12En2{HAyXggi{LI{*Y zYI5Y&#Q4ODNn$*o7xctmyS#x3ut{n>ua@BB##>Vp;}c?AT7$vd_(`krhEIs5aK;Dl zcm<1BNTGT3fzlpCq%0X_5~rZF#}X;WjB;9&X>mqM#VB1|a@d9!I>RsOnl4=41*T|+ z%?D27UuS~iX{9%X;@?#Q9Ui$V_ml|~Sp&^Pin`1cv|uvhJ5vl)!>gm=x6A~zjG%ex zF*X{Pud1Skk?SY>Opbo`(RRk*HkxgTH@9ya$%h5{DO;>|i!LS<>^RXL+6PigyGYwNp2z)r`Ft7k(>?v$wM3jRjFd$RnoQ1KC-aCV()rKe&7B=!@ zo{H8OKMc9+M!ufI0Edvi1z24OIZYEGp0m7w{|mxqu-Rrq8RIQQ$F5}|U84dF8=9@T z%BZBh4^nP^@(CJWu?_DnW;&wIj>I6cpu%3HnM!Nm>(%VhcK-Ue&1$n{dyw{NFgW-Z DZEm%R literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..66054016ff4c003c44c143e003060d5a6110390a GIT binary patch literal 4866 zcmd5=OKuxS5T%V|!(R;8Zw;$ep@#4>a{{FJ^a;hsYD){;Ommkl2CvQ$q zdLJ&%U;3k}9Q}N9cKYrj9DE}OKfJ#<>z$vyKgCZt{_3tb%jUi5;4#zTJM&Jl2$)eRj_h4`UtCg<`@UXw|cFvC;iJ=l8_JTKoMMh{*b03Gq_es zk`$8lx%y7&dNWm@KdZ&*Lw=g3N)#(~Gwi*c^lyF|562T|L!f4NlMGQwrn<(F^E#B8 zWT4-Qz9;$Rah906ew9QH1p67vk(h%k%TUh4uR`Ua@Ttlz zX%JLn)x$WlN2UF#D!*N6U!x#53ADKj^iU!68Ld#Mn>6m1p#Gk=EqeL>+0? zAZ;=VvC31P!(I=^{aJBlxL=F~?$vmPR*gF_!Y-2yJoNn|8Z^6fiLP5?TQ#&>+cd5G ztJ@a2l9*bRHdg=dL<)+|{!$M;grGsSM4DKzs}R>2alA9eNlWv@~9{v+a%^<0`MxZvI;JTc&gCd9+iHi3b<6gD(f3&5h3*#fttd7+iT(5 zk@fRFx*J#?*H*^0cQ8D5;NAg%Y`5i{2P=%l0`(4+9(7?4_66ci7dhJr_w`jSL`@zk zG4G=&e=Jq60b=>-U!QwnE@|hZ=pVsFaW>TV{^5wB_sJWS z6P&CHkri~`Ad6of_eo{LX|_oS)t$Fi@fC!mh$D-5WVmKsN)-yJ)^UhiJdX1gFYLn| zJ{ifM2fWq(D<^eoMMk?ascK=FFo%J0IkPc-nxV&v+#se0g@~lTIOjpGQ%WXnxMqrp zQcBR&?680_NLQ{OnJ#T{jWAim6(bq-p+0ygU)#MSjy2w)z;f~bhj+dhmjA30o*NDo J@l>r={sqC1YGD8X literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..43fc6074d13a5168ee860dd6ac6d11e1cba21be6 GIT binary patch literal 4476 zcmd5=&2HO95LSZZqUMmEa@`{tN%Zbg5+xW3&@_(YOAd~K7AOjVm1#qOWCfJ$N-lir zllB$*1f7}PC1)wxrraJ12r{+1^X)hPLx1}E`Ngw8|NiS`>-kEyp0(if>gNxqlcSHv zN0YB-r_X7rjY~frog9BYGYhYA;fF70CzI2YFURmP%imp3*4bvVn%!p7ti1WY)w)UZ z?d=!uB6+VOXvg-+=W*9m0Zp7VkuGk*Cvj5WuPs0aHc16$~}nY(qS9 zAao?dQ1l2ikkOzk;42Ifc6K3xAaLN(1|W(b+fclRlPHUngt(kfKIQ4v8@P-U;_y}I7!mkc5VR*@& zcy;=Y7~bd+yq+^U0HGKqlZ}Wm!x=Zl0R^i#iiebvk05m%qdFun2~|@htJ}qVnXVnW z;<2wZK%Fnw!sXxy()JdTDVxTSs#@tGW^1Ab8vn{f*Fy3fP;muv{3J-83ks8gvsCg) zm^>d8CWMEno`lJBLSa%sJ%ez9${3`-t;*V_p#ajlu($fvE2t#5t4&xp11O+nqGKX8 zU`lsE>FkLAh6d#Gzo4-%=FCi2ZuWQInZ9Uey21~vi9;n|LHglCug_!wVS z`W)k9_!h3Max>JL_=~8KdVTUXNqQ9fU@{vP3W5L*P*<%Fw|Jj$tJ)NDyu1spYG7Kc zXf@pSqEU_Xr_jaI51{xICs15>0IKK)Bt<=bmu$!wT#|<_2TicxdLM$3qN@ zlnXJK&?v;HtN9&-_icrZJKzH<%s?HXvYwPfCYzmKW^$saMZ0H^?77CH5_Z^e;Eh;e zC!Wq>NaiEs5EwhS5N6F1j&Fq2yt)GBxt%7hsY!bZYTj)%c3V==jM+4#swf%A;fTO2 zSq(jj6mk?m@IXMPf&rGz6L1X2&7v`sr@(4B7yD;#_c;6eL)S0TbunjZJ_2a{i~JQN zts1(#=d#xBRm>wXOKVMXJx zg0Bz|)YX^HXhXt$e%0hedbe_!G!*aY#iV$da#4#T3(6uoB}n;2xOXC(uQK}vwj%`5 zZBxrV8KLSVta-`MNra&a7xGw7(9*DMQ`}wE?}}i7FQ#Nhda_%iuJh;^D^=GRnx9ZW z&K_2Zsu|>%a}?Or`o_55tz$)TLNa8|9G4qV8-bRSV2ydi1(Yf!5|nT{4NYaWp|waM k`iyq?^ssj9M2&V3VD66pg?1DS)z^0OUj>YayLP+v58|NU{Qv*} literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..2652cdee73e8c702bf3c119389d939a76a3fd23c GIT binary patch literal 4572 zcmd5<%We}%6g3DoW)|=VwX7yiQx88CfiyFOkPV9v38WFSOwx%g*)g)6#0g@>m+}kq z1#@mySNH9Q9n`Bq5$RObJ@r2a{Hpyx|uBRrdOBZ zCOI?WhEAL<7Rz&W(7wK!UM!Y#v6{@k&61^gD^_e3=evR%lM7^9-l&=lZd_@b8F|pY zSxnExd@{WfGHQQs3vcCm{tZ@-^#K;bcYG&a3l+mawzk2V)UkRc8EU+VB0A+9PQ?uq zGck!3p^SsCLfuuNEQ7M7pT$({*O>#5U{E*s(`6`Kpdc;l>t%u*$d&2{DO1BOAVUbE z{M%F!dknF+6LC*S6D#pD2i}d`XUP4X$lTVl7MNU#!hj(Ub|RP2bQFp5TAhX=(=e=R z2vM$BHezz4s$8C)Jr+fhalH{TR;X6>TQD`5)rCgTH88d2AU>%bDdxp&FrzA^*rsm6wtC4cv znVMRY`=eDOOy0Gc+O~kHn_wE=!-jhJfgrKKR2T~7)To{eX8=PC@SqW(B2nUb6Je2M zu3>Q-&K%}p=BT6TMw#FYVzx3!*2HDKjf2n0!w`8$DSde5+TL8**Sx}ZTFEI4|^yGbusJadIO%HMhbVL;k0dtwk02cF*oiBo$M>sck_am zP0lY9H8zf(!#5=N18tffI~+KZGp`}$J)2<&r@{&+$l?GOiC4Ip{pA6(*hb`T+>XEu zTp3}EW7wjDoFEMmq;t@Z@o?`YfXt|Gtpf`habG!yG80Cy2MmpPvnk08{R~|_g{Z06 zMN$yEi>v21A-1^o!sv%RuHMxU4Pn7U%Zb?%G0&$P7UW?*@>`YOLsRf~5|2fC6_}^;!3~yPQv;-Wx(+yS-y4YP>^%{ja=p#c(+rzgtc& T|6a@%OXN2gh>G~pZnypejGY(h literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..f2b5b97387a082e650ab75fd0508d711b76a2d51 GIT binary patch literal 6026 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 U-5<;Oaz*NLA(9@y_4~bl0kY|PM*si- literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..289f01ddd34c6750da746b8a4a455d7893b0a13c GIT binary patch literal 1301 zcmaKs&2EA~6os*IMPFi;(AFuA{3WL8wo8*H-4d#3ra{KwfMC-{?W!-*JHyWm8r&Gd zx%b@fo*DUgf1Cck*6E#L7Ewu)(<*0Q(}`hBjQb+uNfjOGIdSgfo4=`H#GL2!v)~CT zleLTDXw6cVJ4H0BjuE37ZL#peAkTS8)z%zyr$W%aVvW_?KMH=jfT!@er44u zWK>yS=~7+x#|BvlQPSV4Da45$c}t`Gj7C zOe_aGPiT%Ed!Sb}=qf{8)k5B-(W*@qWJ^(@hu&KHXo*RmE(-`;QjxA4!s)4q@C1@) zFouTaun4*xAW>8_b1^`>j4%?0K6ce!lcc!iZNIMp`f?&1-r!vYmNQGG zp)>keZY0*ww!rnUW*k=@&p57sg&SySfy`lu8(@KJT>@1)P#~eTl?J%MRqQHVaV>77 r8(iUr8g6*`2LW;&D{QWZ;%eOb?}WH$H-?98dGqapTJ;(GF-_wiSvQ|6 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.bin new file mode 100644 index 0000000000000000000000000000000000000000..289f01ddd34c6750da746b8a4a455d7893b0a13c GIT binary patch literal 1301 zcmaKs&2EA~6os*IMPFi;(AFuA{3WL8wo8*H-4d#3ra{KwfMC-{?W!-*JHyWm8r&Gd zx%b@fo*DUgf1Cck*6E#L7Ewu)(<*0Q(}`hBjQb+uNfjOGIdSgfo4=`H#GL2!v)~CT zleLTDXw6cVJ4H0BjuE37ZL#peAkTS8)z%zyr$W%aVvW_?KMH=jfT!@er44u zWK>yS=~7+x#|BvlQPSV4Da45$c}t`Gj7C zOe_aGPiT%Ed!Sb}=qf{8)k5B-(W*@qWJ^(@hu&KHXo*RmE(-`;QjxA4!s)4q@C1@) zFouTaun4*xAW>8_b1^`>j4%?0K6ce!lcc!iZNIMp`f?&1-r!vYmNQGG zp)>keZY0*ww!rnUW*k=@&p57sg&SySfy`lu8(@KJT>@1)P#~eTl?J%MRqQHVaV>77 r8(iUr8g6*`2LW;&D{QWZ;%eOb?}WH$H-?98dGqapTJ;(GF-_wiSvQ|6 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.bin new file mode 100644 index 0000000000000000000000000000000000000000..289f01ddd34c6750da746b8a4a455d7893b0a13c GIT binary patch literal 1301 zcmaKs&2EA~6os*IMPFi;(AFuA{3WL8wo8*H-4d#3ra{KwfMC-{?W!-*JHyWm8r&Gd zx%b@fo*DUgf1Cck*6E#L7Ewu)(<*0Q(}`hBjQb+uNfjOGIdSgfo4=`H#GL2!v)~CT zleLTDXw6cVJ4H0BjuE37ZL#peAkTS8)z%zyr$W%aVvW_?KMH=jfT!@er44u zWK>yS=~7+x#|BvlQPSV4Da45$c}t`Gj7C zOe_aGPiT%Ed!Sb}=qf{8)k5B-(W*@qWJ^(@hu&KHXo*RmE(-`;QjxA4!s)4q@C1@) zFouTaun4*xAW>8_b1^`>j4%?0K6ce!lcc!iZNIMp`f?&1-r!vYmNQGG zp)>keZY0*ww!rnUW*k=@&p57sg&SySfy`lu8(@KJT>@1)P#~eTl?J%MRqQHVaV>77 r8(iUr8g6*`2LW;&D{QWZ;%eOb?}WH$H-?98dGqapTJ;(GF-_wiSvQ|6 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass0.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..061a6627b32a334373e4bc6fcff7605b1a55607f GIT binary patch literal 1322 zcma)+&2EA~6ot{aqAxK^?9UXDzr-}%c4^Y2TS67hG{_hP1e-o;-=oXk8D^M4BkfK& z_n!ORGb3-WFO%=*CLJ4Q8C4`XE_3=Z85zdNxGAF|siOlqCH9!V`I#6-TogHZFN*|K z$;w4>w4y1^?So>sEDc+G__@0}aw@c3~wI z=c+Qls<;cY%*cl3JG6@n7pZKN!1vcO0y9e1P){;sP0ddewM!MdJ!}&JAVTstJ{{2$ zlO4;(_C1zyq*1w<)G_n9QvOaCVH&7Y(BMkmdIpEx4A%4*6;<0NnkZo{58)~#+ kd;IDT0^qzs%nGk184eJ!+c!WIwnX9+1hwkh_GOyJFYx826951J literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass1.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..af6c9349f410fcc16eaa87e32ee35a9d92bb026b GIT binary patch literal 377 zcmZ9I%?g4*6h=pIHBWJu8X;!xqQmVFNLw=uk H=bXI(ZC875 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass2.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..289f01ddd34c6750da746b8a4a455d7893b0a13c GIT binary patch literal 1301 zcmaKs&2EA~6os*IMPFi;(AFuA{3WL8wo8*H-4d#3ra{KwfMC-{?W!-*JHyWm8r&Gd zx%b@fo*DUgf1Cck*6E#L7Ewu)(<*0Q(}`hBjQb+uNfjOGIdSgfo4=`H#GL2!v)~CT zleLTDXw6cVJ4H0BjuE37ZL#peAkTS8)z%zyr$W%aVvW_?KMH=jfT!@er44u zWK>yS=~7+x#|BvlQPSV4Da45$c}t`Gj7C zOe_aGPiT%Ed!Sb}=qf{8)k5B-(W*@qWJ^(@hu&KHXo*RmE(-`;QjxA4!s)4q@C1@) zFouTaun4*xAW>8_b1^`>j4%?0K6ce!lcc!iZNIMp`f?&1-r!vYmNQGG zp)>keZY0*ww!rnUW*k=@&p57sg&SySfy`lu8(@KJT>@1)P#~eTl?J%MRqQHVaV>77 r8(iUr8g6*`2LW;&D{QWZ;%eOb?}WH$H-?98dGqapTJ;(GF-_wiSvQ|6 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass3.bin b/bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass3.bin new file mode 100644 index 0000000000000000000000000000000000000000..289f01ddd34c6750da746b8a4a455d7893b0a13c GIT binary patch literal 1301 zcmaKs&2EA~6os*IMPFi;(AFuA{3WL8wo8*H-4d#3ra{KwfMC-{?W!-*JHyWm8r&Gd zx%b@fo*DUgf1Cck*6E#L7Ewu)(<*0Q(}`hBjQb+uNfjOGIdSgfo4=`H#GL2!v)~CT zleLTDXw6cVJ4H0BjuE37ZL#peAkTS8)z%zyr$W%aVvW_?KMH=jfT!@er44u zWK>yS=~7+x#|BvlQPSV4Da45$c}t`Gj7C zOe_aGPiT%Ed!Sb}=qf{8)k5B-(W*@qWJ^(@hu&KHXo*RmE(-`;QjxA4!s)4q@C1@) zFouTaun4*xAW>8_b1^`>j4%?0K6ce!lcc!iZNIMp`f?&1-r!vYmNQGG zp)>keZY0*ww!rnUW*k=@&p57sg&SySfy`lu8(@KJT>@1)P#~eTl?J%MRqQHVaV>77 r8(iUr8g6*`2LW;&D{QWZ;%eOb?}WH$H-?98dGqapTJ;(GF-_wiSvQ|6 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/vs_xbr-lv1-noblend.bin b/bgfx/shaders/glsl/chains/xbr/vs_xbr-lv1-noblend.bin new file mode 100644 index 0000000000000000000000000000000000000000..93b681dd926b8212d29a698a89a3487d54d11e42 GIT binary patch literal 693 zcmaKq!A^uQ5Qe*CPxU2w1fvxSw~a>=J-LaA*9KYK)GTzP5Xh)7p{dl^JRO8E~j%g_~NuOI497 z*BP18OoDanrGo8JY@lD%B#iJUCTAPE+QWVhNJ88x#K{=51w$2~O?+JpL=#9G#J1)=j0}R7yLT zgA}uxv40y5aT)C|TqS^ojzPCLa|~C=JXS_c=bWF}ogTmY!?y<>_!j401Hh(d_JuL} E1?CamW&i*H literal 0 HcmV?d00001 diff --git a/bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2-3d.bin b/bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2-3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..d0293824b944a900ebc6cff0bfa5ff3239c1a8c4 GIT binary patch literal 673 zcmaKqO>V+45QPmzs^nf`mQYo0aM+=4Dj~J2B9JO}RthO{MPg)};867*J#Ht?j}sQ% zCG%z8yf>5g^~>mO@%ws1XeM$QpO;#FjRu4a$nEBNC02{|(7oMd!o*gbDDy4VWmPfjf>Aq6STeVJ^L;g=g zBQ>4VER~;1Cy+#D20ohy&T*abs@lnlo|N37icDcVq2ClLb0#^WD}jRmnrC)7!&8a* zIAFm8Oj$7Laa$nwyI{5`@%|u|^>z@Cy;rzzrJYVExzlOV;^Leu-h9qGQ+cUb$7I&R zBQB%8Bs!>+%j?xK!cKF@iVODpNSLb|DP$IL-N>2kwU*0hkxS|WOg(e+np+C23QaIEGEseV36cb&F_1BUcHIh#`=w2dR3XUaMn+u?Y=3 zG=Jv%&9`}dd7k{ve!jkqO4r3yFXPzH8324U83WRSpo|RU} zRb{bs^OU{wY>)P_pvWX(1hu7=1ekHQfqs@EZ|Z)!s74q2129K`fsp>j=M#F8GVy%u z&(IwE(~e$Npqr#{SxI@ji&jl`AbW-i-L=-r$I3N6UgvYeKxqm5F(jShKm1V)6 z4rPw2e7!C|Sc34*_pD@mcOp@cpzoUV;u*G8S<$fFYul|Fx@pT4RhA8X zD`K?j6*{XdXO-2g63i;$tP2(9Tnh35NA-`_Yhi*n7dx{GE8d}Rfn*Xv- z?<|Z@QqjH~tRASS=m{i$pfPM{a|9rt8fH$MH8rE(-b(rp1fRC!X&KF?ewRcOguWX{YIWdZeA}#2+u3-o_ z{ndiDT)d#}d`QoL8&2Sc*oGU<;f4}dyX7gU9Me2#Xn;bP2ha#NtYO6y{>4_5*g)yV5=;NOFEV_JQRL6U7#oa<#+XbnCRWB|jxlK?c_xv8 zoi;IOiT+xMFHavoAy^clG#*2(X8?-C<1-@Ic?zJamYn*eeT6hKruDOe5>PFl#cH%7Rbd20I)Mzmm*kQ5i{3N`RHe?@KOLOJ;ONw~ zx2LMNgKG$V-}7CUga-u_i}d@RX+f;+yd8DdUQpB7M77+apLknLieq?DXxX`og1~`qU-jHVyX(jB@#U&CaYqwBO?X!yh!_8Q?CjkdXM zY@$dc6`eRMR^Z_NP#Xvr3Xw;Pr*pniTVSUC+J$3ZNqZSEwGB?1IYMipYWeS5oNRhB u!-@d?8hHEfXeX!6e~xb%y$UZ2>3iXXej_B}#bdMe@s-O>1Ne3ihl9UeUVxA2z$Q~yq5&x0T?YwRC zQl+r4@XWpEoO|xv@pv}*^e}p#b~^8$JDswK(lw+wA;ktS2_%H#_}VIHUM?wAF{bx4 zo;~3e$*1Y2r0`||gmH$c56=N5)iTTSm3M9Jjwd~oRA)WmIP_s12jd*Ce`Il%pUnE3 zMq!pGO|sFi;LqguXf|P7M#0bNcw8?t2_b_{NV=z7iBQ$t<0u7mq_iNRaS*}dV?ptn z1W`JlcVU^O>~$Ye3H$;gr(`*cG7L$MTzfue`nmwX%%NpYdaE1Z*Bz|L62~l5ZHU+| z6gb($Bo|0UvI%sQS{G5a#cgj%Ry7I!j9Vh@rODr^kcZ69#-_=@7_eVAk0Hw+Knk`Zit^h^+%4Z8_Hm-*uMHUu_m)!<{-YPJN!8s;Zd3;;;iW*@m3$ z9AC}YJHf~~Z*Dbdb6(oCrjtWv-0|Yh6e!qvf&AAb+^1g(=G7zdaOH^u zU{lReo4#Dsz9_?o+CGDJ!Rn~dJcHJzZlYdF)boDVj(cs#Pg-!!bEEe1tm`%D={EnL z^UTh+0WAf!U&ejozX{~VD%X``szYjVQ16RAwFnzA2V??<-(qI^uXsoJwCOb6W%Yi= zs1V{Qw(AVws|l37`KEQs`4czTF*O`UA&UFP2=Vo@=W-<~#&ew)mceO}=ePp4-r|FA d;6wrPigubGzB)o8=Y)MJQaPpUGT&KN=N~f{U8(>8 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/misc/fs_deposterize-pass1.bin b/bgfx/shaders/metal/chains/misc/fs_deposterize-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..a724de4ed3e161ec2bf77de99474d44dad74ce1f GIT binary patch literal 1959 zcmbtV%Wm306lGDVlE31vs&Pv#8w^QAl1&SOMHIEPs|Z;GjEN;bkUdVEMEplSxAV5m zOO?XH!ZY`tbMCow$CLT=)BX5;*6F-|?sUo`N;i<=gcMu6B9IV@AD#kAs#TWdYj0%jjwjuhRA)WnIP_r?2a_Cceq?c$pUnE3 zMq!pGO|tQ?;Lr5;cs}ioY6U-MlS#eIB!mn)A?coSB|=qmhocnGkFWXjGl!Nr>8-DYU$?L(D;%>>wIO1= zP~c=6lUyJb$u`hYYF$Lx7Pq}6S=A)?Gj55rmnPdMoCmBSOn~|iH*ymRXh#Ago@w~H zfP~1NE!Km`X*AcVUToVw;1G>a9KDZoyf!%cT6@1yN1t(MIwtA$K#<=E_CGG@SqWNZ zS*(c%oFWPV;q(O|=~>^#%L1`=0HiJF`ry0H^7*UHB5b%-C&sDIvr|y`nuPmR%7S)4;)1AxTg<$ABp$9j zaR6+pIcn3Fi`o}u_)yzt&@NaVHJWG8+SEQmCOzHe z|8t(%**2i1p!UnSZ~Qlb+*swha!hqdEe`5^(We$+Bj$ii!0=nlO#c<{2%k2crn{`( zuNW0VJjHgM0em%qvNzwfPC0+#20NyP!ze^?-xwjjUiMtBM8$Zn^UN|hE%F>!z}8!Q f@C}?OKwi;K^TSt1NaUQbFGVV+lwIaK%j*0CTb^CB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/pillarbox_left_horizontal/fs_saturation.bin b/bgfx/shaders/metal/chains/misc/fs_saturation.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_left_horizontal/fs_saturation.bin rename to bgfx/shaders/metal/chains/misc/fs_saturation.bin diff --git a/bgfx/shaders/metal/chains/hlsl/vs_blit.bin b/bgfx/shaders/metal/chains/misc/vs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/hlsl/vs_blit.bin rename to bgfx/shaders/metal/chains/misc/vs_blit.bin diff --git a/bgfx/shaders/metal/chains/hq2x/vs_blit.bin b/bgfx/shaders/metal/chains/misc/vs_bob-and-ghost-deinterlace.bin similarity index 100% rename from bgfx/shaders/metal/chains/hq2x/vs_blit.bin rename to bgfx/shaders/metal/chains/misc/vs_bob-and-ghost-deinterlace.bin diff --git a/bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.bin b/bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..45cb2ff444d9d1526792c4d2b49cbb4a06b7d024 GIT binary patch literal 1062 zcmZ`&O>d(x5arMlf1uYntw=w-1|sbt>ao)HP_co}Za9TD(}p6S`QhR|6(T%uY4J2qkBzG(=^HGQ2I7 z(y#MjnS=fPT+f3wCxW(B@i?&!#DShA?7ikuVuq!We5`iBp_;DZFBJTeVxx2&c+xJx z7JI?pAGLZ5rrB;<(TF3bZrYw}EX@7&_wkIfB64y#wFSKiZOKWCl-G%G&PY2yJ>uzf q7C1F&PDjm(OjSzS79GDFy7T#k{jVAX(pNeL&5hO4M}qqq$I*XpsboL^ literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.bin b/bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..abf0c3febb1c6efe01e1829e2a4e7cdcf096d7e5 GIT binary patch literal 1062 zcmZ`&!EU245arMlKhW!(R%Ewz4T;o4)MKUXp=zaS_fkd3rB2or*pabQNY($?&)vZo zFj4muGQ64h=Dp$f)6cVq+rM{Fbbb~^wia>+l2yFkvw}m#4J+4iZL}>6G$k|lrhNLt zUb()Ldu!k$2H2L0nH8|SP^Hooo}Za9TD(}p6S~-J)&pjVn7yin5lYTbX^6@YWq4C4 zrC;a6G6(zoTF-+uCxUim{y4D>#DSg_9K7aHVuq!We5`iBp_;Da|0wt+#a8Jm@T6IR z%@2aVKWgPi#SNLR*%kbLBGe%^7LuZ#!3~ qcY#xr=5*Ao$W*1cWZR|EUIn^p%c5b7Qsik>GvCar6&y>10Fz literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/pillarbox_left_vertical/vs_saturation.bin b/bgfx/shaders/metal/chains/misc/vs_saturation.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_left_vertical/vs_saturation.bin rename to bgfx/shaders/metal/chains/misc/vs_saturation.bin diff --git a/bgfx/shaders/metal/chains/hq2x/fs_blit.bin b/bgfx/shaders/metal/chains/super-4xbr-3d-4p/fs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/hq2x/fs_blit.bin rename to bgfx/shaders/metal/chains/super-4xbr-3d-4p/fs_blit.bin diff --git a/bgfx/shaders/metal/chains/hq3x/vs_blit.bin b/bgfx/shaders/metal/chains/super-4xbr-3d-4p/vs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/hq3x/vs_blit.bin rename to bgfx/shaders/metal/chains/super-4xbr-3d-4p/vs_blit.bin diff --git a/bgfx/shaders/metal/chains/hq3x/fs_blit.bin b/bgfx/shaders/metal/chains/super-4xbr-3d-6p-smoother/fs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/hq3x/fs_blit.bin rename to bgfx/shaders/metal/chains/super-4xbr-3d-6p-smoother/fs_blit.bin diff --git a/bgfx/shaders/metal/chains/hq4x/vs_blit.bin b/bgfx/shaders/metal/chains/super-4xbr-3d-6p-smoother/vs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/hq4x/vs_blit.bin rename to bgfx/shaders/metal/chains/super-4xbr-3d-6p-smoother/vs_blit.bin diff --git a/bgfx/shaders/metal/chains/hq4x/fs_blit.bin b/bgfx/shaders/metal/chains/xbr-hybrid/fs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/hq4x/fs_blit.bin rename to bgfx/shaders/metal/chains/xbr-hybrid/fs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_left_horizontal/vs_blit.bin b/bgfx/shaders/metal/chains/xbr-hybrid/vs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_left_horizontal/vs_blit.bin rename to bgfx/shaders/metal/chains/xbr-hybrid/vs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_left_horizontal/fs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv1-noblend/fs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_left_horizontal/fs_blit.bin rename to bgfx/shaders/metal/chains/xbr-lv1-noblend/fs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_left_vertical/vs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv1-noblend/vs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_left_vertical/vs_blit.bin rename to bgfx/shaders/metal/chains/xbr-lv1-noblend/vs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_left_vertical/fs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv2-3d/fs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_left_vertical/fs_blit.bin rename to bgfx/shaders/metal/chains/xbr-lv2-3d/fs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_right_horizontal/vs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv2-3d/vs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_right_horizontal/vs_blit.bin rename to bgfx/shaders/metal/chains/xbr-lv2-3d/vs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_right_horizontal/fs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv2-accuracy-multipass/fs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_right_horizontal/fs_blit.bin rename to bgfx/shaders/metal/chains/xbr-lv2-accuracy-multipass/fs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_right_vertical/vs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv2-accuracy-multipass/vs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_right_vertical/vs_blit.bin rename to bgfx/shaders/metal/chains/xbr-lv2-accuracy-multipass/vs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_right_vertical/fs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin similarity index 100% rename from bgfx/shaders/metal/chains/pillarbox_right_vertical/fs_blit.bin rename to bgfx/shaders/metal/chains/xbr-lv2-accuracy-smart-blur/fs_blit.bin diff --git a/bgfx/shaders/metal/chains/pillarbox_left_horizontal/vs_saturation.bin b/bgfx/shaders/metal/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin similarity index 84% rename from bgfx/shaders/metal/chains/pillarbox_left_horizontal/vs_saturation.bin rename to bgfx/shaders/metal/chains/xbr-lv2-accuracy-smart-blur/vs_blit.bin index 79234729f368f653ff98a1902560c89d83f83f2a..122b7dee5c387c772067b0ca196a2f12b636ec8d 100644 GIT binary patch delta 44 zcmZ3$_LY?R3>35!(sJ?> gON=xO^bAdP6b$q%G&L2pkpw|vhMJm_cQV-k0F4Y7;Q#;t diff --git a/bgfx/shaders/metal/chains/pillarbox_left_vertical/fs_saturation.bin b/bgfx/shaders/metal/chains/xbr-lv2-deposterize/fs_blit.bin similarity index 60% rename from bgfx/shaders/metal/chains/pillarbox_left_vertical/fs_saturation.bin rename to bgfx/shaders/metal/chains/xbr-lv2-deposterize/fs_blit.bin index de6ec5972af75113b6aa2a7b25ec9c3d8881f2ea..6a3da392480084ed1b98155d1951154fce2cb223 100644 GIT binary patch delta 130 zcmX@W_KStbE!cyFvH8=2C#O6>Jq!@=FvnpmK(K6_r&w3K}5w#+qQ`j5Q4Oj4Um6 z6b$rCEzCibp`nSUCdd$wDifGd#z@8*gNy+h4Kp^yNI_dc18S;<2E<%Vm@L>*1zngy zMw$v*3h}umIq{`>$Uf1l(1chEb*r&nInWBY!^l18Ypz-@ GE(QQoM`POn diff --git a/bgfx/shaders/metal/chains/pillarbox_right_horizontal/vs_saturation.bin b/bgfx/shaders/metal/chains/xbr-lv2-deposterize/vs_blit.bin similarity index 84% rename from bgfx/shaders/metal/chains/pillarbox_right_horizontal/vs_saturation.bin rename to bgfx/shaders/metal/chains/xbr-lv2-deposterize/vs_blit.bin index efd3de320035079d041ad93a500f59859750847a..122b7dee5c387c772067b0ca196a2f12b636ec8d 100644 GIT binary patch delta 44 zcmZ3;_LY?@+mub4zmKGxZYVOHwP6^Ye>R3>35!(sJ?> gON=xO^bAdP6b$q%G&L2p5rXDmK|@W=$vc^B0H)#@9{>OV diff --git a/bgfx/shaders/metal/chains/pillarbox_right_horizontal/fs_saturation.bin b/bgfx/shaders/metal/chains/xbr-lv2-fast/fs_blit.bin similarity index 60% rename from bgfx/shaders/metal/chains/pillarbox_right_horizontal/fs_saturation.bin rename to bgfx/shaders/metal/chains/xbr-lv2-fast/fs_blit.bin index de6ec5972af75113b6aa2a7b25ec9c3d8881f2ea..6a3da392480084ed1b98155d1951154fce2cb223 100644 GIT binary patch delta 130 zcmX@W_KStbE!cyFvH8=2C#O6>Jq!@=FvnpmK(K6_r&w3K}5w#+qQ`j5Q4Oj4Um6 z6b$rCEzCibp`nSUCdd$wDifGd#z@8*gNy+h4Kp^yNI_dc18S;<2E<%Vm@L>*1zngy zMw$v*3h}umIq{`>$Uf1l(1chEb*r&nInWBY!^l18Ypz-@ GE(QQoM`POn diff --git a/bgfx/shaders/metal/chains/pillarbox_right_vertical/vs_saturation.bin b/bgfx/shaders/metal/chains/xbr-lv2-fast/vs_blit.bin similarity index 83% rename from bgfx/shaders/metal/chains/pillarbox_right_vertical/vs_saturation.bin rename to bgfx/shaders/metal/chains/xbr-lv2-fast/vs_blit.bin index 5fdb790c1914657fbd314cbdb65f1d44132c15a4..122b7dee5c387c772067b0ca196a2f12b636ec8d 100644 GIT binary patch delta 44 zcmZ3@_LY?R3>35!(sJ?> nON=xO^el7~4D`$l&49pEQ&T}3A!7)VF|sfQ0-(&~olG_WuK^oM diff --git a/bgfx/shaders/metal/chains/pillarbox_right_vertical/fs_saturation.bin b/bgfx/shaders/metal/chains/xbr-lv2-multipass/fs_blit.bin similarity index 60% rename from bgfx/shaders/metal/chains/pillarbox_right_vertical/fs_saturation.bin rename to bgfx/shaders/metal/chains/xbr-lv2-multipass/fs_blit.bin index de6ec5972af75113b6aa2a7b25ec9c3d8881f2ea..6a3da392480084ed1b98155d1951154fce2cb223 100644 GIT binary patch delta 130 zcmX@W_KStbE!cyFvH8=2C#O6>Jq!@=FvnpmK(K6_r&w3K}5w#+qQ`j5Q4Oj4Um6 z6b$rCEzCibp`nSUCdd$wDifGd#z@8*gNy+h4Kp^yNI_dc18S;<2E<%Vm@L>*1zngy zMw$v*3h}umIq{`>$Uf1l(1chEb*r&nInWBY!^l18Ypz-@ GE(QQoM`POn diff --git a/bgfx/shaders/metal/chains/xbr-lv2-multipass/vs_blit.bin b/bgfx/shaders/metal/chains/xbr-lv2-multipass/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..122b7dee5c387c772067b0ca196a2f12b636ec8d GIT binary patch literal 757 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/fs_xbr-lv2-fast.bin b/bgfx/shaders/metal/chains/xbr/fs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..c773ee30579e30da0ba42f10a5e589a6f9cdccbc GIT binary patch literal 6167 zcmbtY+iu%N5cNYJ3V%T#w=V^m$h3BsmMqu_&>D7QAZdWQR~UxC$dn^M7ek_ANrpe9 z=m+(;Ix~CWEJeviqz8)R&h^Y?hkJ4L?wkJ_|NgVL_w9Fkd-K^~d?&`)D4*SDyvz1?};kje*~d{$<`;*KVf(k zqx&z}v`YbZ_u`F+WYRp0jJ1h}KUu&pj@Q{KGc3D8c5)$&n#oZ^fT)IWcdG!i={EuB5OEGf1W;-jxMTca!pdV!>7U|N;aD+9$?y}S#$4Tl;bbRFO3lvFKja&38}@W0ts z=HIjjmlxP^BKM#{Ktu+`?$r_XR(i)^;HQXhDo%j3X@$`bdXvc!F;Eb&OwQs@D10TO$F_uzPw2Vq_)4w=IGj@%|k``ZD# z!fgyvZBTWxjKyoeB@!JYM#g~JZm@ym z(ADi=ijR7WuA)N4fATwmZCQ8(0gTtqR~h5dfvXFN+du962XuuC80D9niK6xJ3KWMT zQc1IfPzF_`%8t|jHGD2*g< zVHm=YmzD0oQ&h}0?Z7yyI{fFLe_hfM`T%J|m_QuBeKqMYaz2oXg^6XXjUrgT79$nL zsGLbk_uJcJL}gpLPbCZPQ?*7m=f2K;@|5aZ#CMqn(WgotUB3-ZFRAPBz1d72Wt;I%{py|k+q48IuiAeSW~5~ zGo@7pwyU6)n(WoQMQLhLQH@Y$36ocAb($=}#ejkO6&U~=(RTX-r%glLWICUBG=0B> zZ4-iU>TuT3jG!~wV7mSbJ^7UY@z56GM>nF{dyT*1E$h=U^-JM+U%=9~EEK>^dMGov z9zybYWmP_tV@@Ng3~_;-)Z=0k5>n$CGN8aXz=stIi(yuBxAkpN^C?l|4rGm3&n_Nv zo?WMJo+%2G>!vc+8?)x4l*YzB$`&G`i|b3)CL0lxnyLL}oYSXn2W!%~U>vhb^lz$;=rjEA&7GP|tx59KB15PHz zJdzL(d#}v&A)&&PDrBxW;-!IOsXS+Lhxn9>vHJ_^X&!4ojA0_IhX&HOt^J<_mrwKwQa+Xt zdK&+E?9EB}9FpQ3vdtWr?AbAkHdC9`m^QgN@Wjo5M`I3+ex-JrCkB1kP@Uavws-0d zRL>)|0H*|J4kH6kFYUP_?kQ;3lgNj&d@~1aL+)ZYkd11~VU+SYAyvr(C`1BO$DM~I zY+W`9o%JyMyIVLapr)nWhkq)G-<-}S{Fof1IR8ldG>1dtu{rL9bKIx>{k{JI;W;st literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/fs_xbr-lv2.bin b/bgfx/shaders/metal/chains/xbr/fs_xbr-lv2.bin new file mode 100644 index 0000000000000000000000000000000000000000..17ed3b98257940bec8abad29f684fcea3d4c194f GIT binary patch literal 8213 zcmbtZS#R4$5cWgS2mgh>Y+nkpu^Dl>)PWp8YuJr}qyd_qFbqMlX-9w#Lq{wr$baw5 z?7brUOhl_)Q@72Mxtn&F=SiD(`-hCKcSF`iU-EyHm9V&G*nhq9Pee5r))zx%5yKX)6qlS&<(NP^8 zEuy0)I$B0Y+tJa^v%}AEcit`+-k%SH(T!2JqyE`!aC{>Km|T zTurvZ;Ousxc{3PJR1%3(f4ms=hw9>Dz8KtA{o&;D@C%NEO7rLUh;@L#Iy>S{28rEY@O9;x|Yd^f6QBxydr>-$x1oK~fW zpFpTE+4)5Jrwp&f`0nFi)~7`B&+3Ir@~rhVvDRh*{%i$*X}Y_eGR|$+xSd=uNh>Rl z6o@)f{wY;Y9SGZEgH)}YB+6L-3{oLlSBu12HOv?{)X!cf3vjktTT^ZBIXRT?{uyM_ zWI`Zj7DAFAkUes~=yX?ao~`cFhz??p(@{3ov5x8>E;=3U#yU1p9l&fzOPe5_hC1{f zth!7`x3P{mRz0Sp*H}j!tDFk711oPe)Kct0D;GS?8*7QVw~`~X{==rVx01MQ_h=xh;h>AO<7;=LyXftZ_4{J+k+S*K4^*7e9gJ9n{vOi4>8Vt-IV*FC5{;9zHZ8W z&>|398Gklv&VF59v@W5{xTAolIZWkjN*oz5r}>;Py}T&+9EC_`AaBi`X3cr5k;lBB z^Q|+rbkIMAhE3gHk`#scFK15@>VHC!)PIC!$Sr!iz#I z$4cP6C|Zy8g44Xv!VArF59YWR`~-q2;RMGP=7bZpkDREpq2RGA3SmReGX>_j4WdNB z95+IkUI-g({oJ-eY%tOWo_B?jHVE5|uz^hAazWsnB^q>qh2k1Q&I9Zvd828Krx0M8gGk+Oj}hUe|1!^nj|Y8EDz zu`Y_ONQ|^Nx=h{F)b1A#yH8c3cAqE`e?l6%JU88tX+AK?*KMbRkpP32j%aZT-M4>4KH_UE z^2F;bc`sVlWj)!+Y!MrG2BRuO`Adt5pJZ3W0^W+2cxH_UE0xfP$I!*V*$&5rgN0v5 zwqDu$TZyZwX)qBY6*7A_Q+u|SfUWokiRay8$&KFBQN!wF697}dZM619wmD%zF{2LjIr|wJM!L4v}XFy>rnKB3?Q|<#wf6 zy~I_}5dbf-DfYz8FJjM+vN`}Jg$P(i z_*&6p@o8av`~==Y-E+|e<2~gIKU(sOTZygAc!-3<54SOg-zC-?P|3&O{V0z4CGa|) zeJxwr3aoIGCG1Cw+4injp2Kpvdn0ylB4+dZQi*Njq15U(Dps|6I>?7N%qxTC!i#JJML!Y0 z{RkfRR)#!J3H;Bh8qKTyJLo|4A9jalNO&7p@?M~X?hzDX2vHqv@s{*3i(!(d48HU7 r^Kd7iqF4BrT4k5^+uu+#{$n;s@w-U-tb(6%C-z54__g)(;o-smOu58~ literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_custom-jinc2-sharper.bin new file mode 100644 index 0000000000000000000000000000000000000000..999ab79ad370cc1f545bba9143d0f38277437868 GIT binary patch literal 9524 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..f2e63cf659f110f9f8ad77fcc9d097a933832613 GIT binary patch literal 11091 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b35b08f29d3f19a8f05443d59d0c77260ed43d2 GIT binary patch literal 9868 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.bin new file mode 100644 index 0000000000000000000000000000000000000000..f896d5e76a4cfc734dfb80a1ebedb54e81e0d8cc GIT binary patch literal 9856 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 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..0d231ef85fad8968f889dd87fe2324d60e35d304 GIT binary patch literal 10804 zcmd5?+m0JI5}g41G+)7&HPmxa)J^t9a5lhR9LEny4BJ5#7z_k?tZ@dAMgv`v87Fz# zFWq0*FW9Q$t*V=?NYOqlV2q_ESv*xdr&wg`tG8eO>9c?R=ietMe?B`o*{<*IKdSrb zVzz#m-ptfuwwcbKpRPBn?af9#&ZnDiHuJYXPCv|6ukIhV8}-YnQn&NvbW^CGCY#yg z&2qW=FnWIaTYAuU+l?Rf<8*#&)W`YctJU=5-n|N8B_SCcodzI_S*Sko3UPu6#zW)|};U|G!WTdq3P z&i!wuclT7g- z%Mgn~Z59tdO;?i~ANkMfFA73(vl$Eq*1I8FWp(D@4_O$8k58HUTouDnmZ7D)TLpu? zz2T$!LXC!HrhffZ#ivj1X_nC%D`m;yMipo$U@8C;H4oOKp>>t8S@$p0z|t{G0M0BV zWnnLeoP1zaPPdvt^zU(M;Bp|j>!b0J{|rOHMZySkFIRsoSUCRNX=wlg|Xwd|8Ik9>hr+ZPn5txL;-^bkQ2O92#8YiDqTJPK6PzBsBR z4$?!!LBs?cNUdaW*eXE|Nd^a{wJ)e935xU(Kxty>>xo8!rh`M9Am0}_gHTm_;?Yn* zbr(xZCTquJO-xP$3W4b)TA%|1rw^dFPSRUTdTU2-P4w<6wSz|{etiJ5b&}ayGFv-l zYhrdfSaS6MP-K=!c=`ak>m=Q^q`P)>*OuM&Lv>6msvVM)??D3O{2q+*g%F;XhVNyXTm z-~gl@O0AN-L$(N~g54t+btpQ{3%|ae08^ z%B12-QXFl*k0w+Lq&vSunyb+@Y|!qjP0+C|=WVoLv8`ZjHVMTx&D#isZ=+L^|6(Ak z4+vgH<%StlWvQ#-=t31`iT~yJ2hQDzvY;f9ww)uXdi#}d&Z;`Lap$alVw-SII9^?G z=PW1uI67VVFV%t0yh%>>>hfQ(Z7+r_(KJD4cp_r{4!faTI;R*)7DR22{F?oGh zZh}WST;n`_g6l3EqAg`KRtI@eAxrAKEQl>N9z{B~#WG?x5VoshY*+jwS78bhwwt4D zQ`&JcsW2yS+r{W8+myq+ZA@gsc7Bv?uKNmgFKh#Q|M*%~Jcm_SKnUBw*CT9GUhy$O zNekQcQMP${s<52kw)JuG<~gInoFQx<7Za|_s;x_X+*)#7R&8At<747ob6wW1w6M8t zFqpny+nfp&oL}yoT{?{^8B!(pJ6$X7x?+KceS^I++N-b(+SQJCM2PL&WnW5j8Qxi+ zNu!1t#eE+JQTa}eiRpFhS%P_HU36<=x5{?2=Yg>0r2H?~pvw90+#?_?s;q0-xUQX0 zaIdibYKMxqS&ygO6mX_(ipLby)o$lg;Wau2)2UA^I**v;26V>yf~r!HamF4v+XwSjT%;8!Y=i z8$xvkCxBvHX)WN|*KwC2&BFN4RUVEB9*}!O7kml5UHOeV zqv16|V`~HgnRyHB^06LgSdaL#g^9=NhUfey7mjeQLzD1B%${EfKX^q49CYMTQ>GyQAVJKjN+EH(Y+DiCxE7GMWBipa&bQnJ!J&AUn1W^PZ@za z+LTg+o+1Kp2Opy9lA`2*pqjm}?2kYhA|P{CL&T$>v3L!P)R&ME&=l??u$BHom4}Zd z9yhFw0bSXMKeSN4so8uz>mNqDllWtYq14E7TxHU*K$q`Ehbh+Dkm&k>u@Sp41upR{ z*5DZiCxYFQ<#qmZtl?vqyknjT#+ZlPR=>D=R0I0sqYeAG{|FZzv?|(XtA-A!u<45t zCXRrslGca@O9b~U876RqSmt$DW3dEd7Wk_$;sJefn2HFm$gw84um>8^2Y&10yVq1V z0Iw|ullf^NkWh(OT2XCgeG1zW{FWoUEC$)IvISmShZZPJ(LFa?6&ngDlwze*)UhRx zRg;Nvb>)pak1nRLD%N-WwAK^wDqANT@=c?l^@1<26By- z=c#nSd)a#}6hHkGje-*_@QrR<46*LO4yZXo=VvN#t=P~5@ literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.bin new file mode 100644 index 0000000000000000000000000000000000000000..57c6d656e1d8d110f1e04bf72ee0f026473b568d GIT binary patch literal 11035 zcmd5?+in{<67>T6Wb8-qDd-;Cikj>zvJ+r0nT#K1CP=c_1p-4*9NA+)vJ72jYzOnS zU%J1rU$9lhOINkn8VUWffMKbdWbst-)P3Xx;UT@Une7gBzGym}O^vi5@dH=B8sIR9=-OQKMjaI)*HnYd; z<#P39{Oa_#_@JM*8$asj>HH>FxAVz&tLg3EmhMLSup{`J@QlQ(~V z`)2atwH`x1_m(=ItMzp8FrTeR%zE)Kp)T&_URgiAzkG|j;|xq{ z2Gj3K?R56?v2%Kg3=qa})*{W8!PZ*c>Pf~Qvx#Ppo5jN~)78Y_EB{@6s}fj|>rIlt zTcr|f;Spn+`o@`X#FldO_>|&+mr9SuX{s(9MU(NUI9Kp5O>vsL8$$C7p#v!D3LC!%3a*#9vKeb4dRbn~f?f_EdbgLPx z);&%Q-WA-=^(pX`|Bi-pHiNmBD|k4o3)Olu?;W}J={8(+cNb!ApGPp`};D^sj$&5*yFH24G`h%92f3zeAB zxTQ>K1v+#!j5>%CFoENMfRd4UoW}1a895Gq9*CwAXtMF)aI!3lhr24^AUDO&9z16q z>vZtwBk-6g9`eA}KE!^&Qyhp#u2y!i2jdh`JVfyp53v(ESBR&FKHx-xJ`konw<$ci zhparpSYT%wE6F5@ojGP_MC~{@H+PA#GZ8>LD|rObvnbQGWV&`t*TnQVI0*=r5~5Vh za{36`>nQEDq`h{u*L}1PD_HUs)JM==N9nF5-L<2;?xTCaQ3)JJ&|F7pt|iU2qq*Kg z^Oi{v6ZSAkA3<{+rMZ?g*N*18FM{`w<_JdXD5H&Jv~i3!eX%>>5Tr3jkk>@XYb1G% zBd;Oy#ypDw`5m`6M=;t%8Eqt^jbpSSM#sTP_MqFxX>N|7xrx%;NSYf*bJI(6Zn^z5 zH%HLiL}_j$&5fhE>5b-HK>Y#J9Kn4P<$lh~y8K`Y@77l?kKMv10aK`tBChtt(hRo~ ztf^v6BKzfh)A4SSlULv;rDiX=fETJ%}M^dlhyNqxTO%oJSFp`?iS5e*iI(J%*S8M4MBU z(Tf;E!Vtv3_uZN(C!cN+lT!g=^nim9Gn(w!7~{kc#B~%gIeI``kf*(y6zF6UG49)1 z2B3lA%`T6T@d%x5q;d=*1CST6U*5HKAw95g9$4&pU=MOe7qWE(c`?uvi>N0S(i02k ziAC2FFVq0!13j{cdSoFzvTz<*bUm^cd6(ZYn-BENBI=n1c_xwYG52+SLH_BoKv91h zUjb3wqYdzFTgKaH0oyjs+sH(1o8fH)!naZ0_YXB>hJ@gy|tvu!UVcBmu&{EWyQl&h2@5jJ;>e_j~Nxl3?X}v zO)Bn}Ro5>eVh`}kiu+~N^-D8|-xc@E%9R>6wk6Zg>kv!9t-=PlgiSVN=-y`BNp{vMfR^TTh)L+gpt==aLYl`xROP#i9H~gzcCPTorK1RI zE)i(AozI2EP@f{KUj_TP!xZ60hAl5CvJ<8&9_}i8hOuj)UZqPA+*OLti~9kO7L^0z z3uAKwMTo!`5KoHsO|_2*+iSH&Ja2=q)W8e*@eTof#IR}*H4 z3Xh$-?R+Y92{h*KQ630Mn$n_E#pe@$#S>9Qm9@JOFj&LMMId~d zRj&nj`CK>B0$JT+$fO0Djs=)ru$$u^)<_G$?M~23OItM^3$WQun?ZsF8Xi|0dl=Yn zfhJf$2CasI7X2W``#`Q=>mQ$GzD5=s$E zE9|4JP9ZO48i4tk>Xg+jI&WJtU@Pk9jn}q-Q?fDOgh5&c)uc0Q-Wt{wIBuu7n8LDH zRQS!~=u@8e*;O9vX6vV3(EqXW5$;m*Lzi@BD6?*az-^Fgv`mls9qX0TF$KCm{l1N? v6D06d*OVhHJ+K3M9ij6x(YBt=OgPCY`+i;5kZAkkI`=y~_$BJ;>B;{9p7N70 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.bin new file mode 100644 index 0000000000000000000000000000000000000000..8085924f05aa65179056f61eaeb4d75a297600db GIT binary patch literal 9856 zcmd5?+in{-5cNZ!{1tpMw27=Nm*lR5v?+Q?96#g&Cq)YchM?GTB0v{ck`viMKDGbS znc-!JdodDi9|{<#NO&Ba#i=9BGnr?y1c&GiZ6#kT+LULZ6-dAx6|FlYPG&hANx_w zMrGq@);OvfNA=^wugzdy-E2LYkCXY879Zy0XY0v_-&XV0x^>kb%h}axy(o>);;&!N z#!r7gc{+ac_Kab`;Xj|Ao;-hB8T{qt+tcyc>B|%NV^cTii}7Z5Hw9k+<}1Lmm@X?W zbf}$MUrc68(QEMWc(I+2XX4$v&35u(I-V`h&->zHwS1BtEUw2S;s)>4_3G^O1Z~G1 zm{tkf*R@uJy?zu<4!;20$QjOCWZ5eCIuqN)^{2^tOyT9d{ovSr`uwERn zC>0N!n+EK-2D{rtJQCR;O%h!H(1mv|9hkm=mn4C8I1N(P%hly|Y!u`UTQ;}_bm@Rd z62^9j7__!1P3k&{B5u7J;QCmnqJ7$R-jYts7N-XI1>s@csX-x4_BQFjo(#FrMnhlp zEbEiHUnROQscSb(yXm0)u2Fl=wC5eP?>;wSFPQeCgZ8^d?L(%0xVQGK#qT4gebhmF zv)?6;W0`i)-|TrA@mhA!-|TzIxhb=~^#cVP<5F^-O4UJsi~l)k<^HS%{Ee|GIc??s zyj6o1|8wHX{h6!V{LiT?_vfx2wD_NsSMJYVz~AhDPG7k{e*u4^{*3cC+n>KsF6${j zD|^07ydG!7HT(}WfRgM=jf5iW-ew8Bhf6g#FMD8_^SK1A0Xqdp%Z2uNXbGsI`EH(Prc& zQxvhy$A6g@_Oe1XvRB3IRgS%?&fa^hs2vLUzr_mGk;ST!#VTg8ax7L=79WfM$cm0^ zR*h^{F`JcRv#PTBUMrfo&~_FbS*;pbt%%iht=MUw-xaT*YWOZa2bTE2=G`C6Nj}Fr zE11jp9Pe6SPVqV35h&!pFGOkxRi{Vr5+bke<;JLdkoHAp4E~e&0vD}@VyB4o72`B7 zuR4v5Tdjk6J5&T->xoVYoKX~7$()9*Cy{c1J$=b-sHXyhrRG0T@w z##Mp0&~S9{5pL2)M*#p1#PfHM3Sxn~SO7W}+yrFoUcs(-rxEM~0TWO+ z3&3u8Rl*YtcJteT#>98I+6Ie;&~x5FBY`WFjTnWwTxK~2Ng+)}!BSv4x~~fSa>kBkLpGczxL4Cp?2` zY*8ZJ-NGbF5=iJscc(ZpJUJO`P9oi=i%$&C7zQ&&q#GX+?d@;FS!t@QlxZj3oR+3a zONrO~{c&?%8rOi>%+{N{--JvGv^owM$o5OE(*^XOP{X77QMue;PlQ`Mv?;Vz4z{5b z3jG=(iUf;Np|*le`rsr2Y~%FN^}$z)NN3K3p`2E2VAC3HsLl_|#OH>!;_@JBpJ$On-9>hRU7#^0`^u+JY2w6bdEM8=qN)6zI+_O>+-hL*R~ zFvROaPS@2o+Y6KCLk={D%49bWW@X-Z_)p&pF}pw<+Dr@=?}Vx}`67#)0gJ3NzH^cD zO6#f+@4CEQ<-DHdD!PDhKEV{fe@M;?nB(^k$y+IyPU!p3kAy93J? z<`CrtrOpVQxgQ;-SF5Agu&Iyb{wW0^-wSbGQ7Ij@GaQApR=xVzP20%u|&;XA)?o8?@lZaLg%$oo3+ivF*b zH$*MfJS3y{u&m|=yj!@*f?~We6)>rcZpTP`_*s&D*cIByf|s}=A7HFAG~vy=n5) zKk1+K7y1RA8ImF?(;K^fDiEwCayUFZJTpTvPhLO!`l~sD=6N%D{l2=Y7w5B^Rm1)`W^6Q>SB+pF%BEgl&gYA( z{NeHE_@JLxjUDyAnv4{?o|I1()%B0_$$YVO)GxE~Xug=b$rStThgap0^ruV?2^pS|fce*faldHL%6#Z&m_b*&I{xg3A2HRcgunbxz;QVnXe{O8qp#*zpZ z<+PcUWA^s#vZ=1?ay+}Z=&{TB3|_k)&5FKdG-d^3-mONXdXePm#RV*<#~1@-&1zAL zt4BoeW46q}&a{$Yk1ea|&7@wCo8|PTBoos}Ch0NmPyp7fhGw3(TnN@oZ$4Cul4Fy7 zX5TTO&pZ~h^=+D>hw+FdNn-tEYxaocS&_0&pO|aCHLYn%d&`&> zg&8H#Pm4tW7V1uxd8U_0p!BkPEYUJdBS=#XiD|s^%oiPa4X0bw!1@fQ1`W63HZ~HQ z>~nStgYyiO{zpqObDAV{?@OM%jgDZnEhW6z)x7;!r$ z7{Q}BC_Wqx5+>k4X?-#2wV(o7ik&MC&JzVi@!&v_O2HVVbtgF?4veN<$tj{ZC>|UR z5+>k4X+_Ct386e^HYo&!p|vZhK@=3lg9Ak>1yCr^I5`_t!B-GQ)vkDkF+4IIR-L@yk7wEu+eop|Yh>wj^c8$qIK5 z00BrtV36?S9&(qy+*@y?cIz5-dNps{p;N*U^&=b?Q7keg{mCTH1Q-1toaP3+5cr!9 z1e847L^N!DQ|MUV7(apU;vnA?5Y{*9Iq*F=$hThuB!*bvdw7U%02l);@7%*CV-|{fNDUdBE7|nt2 z!#MHdQg!1}9=4Z$T&iwdiqnJm_Ty6Nua*Sz0>cm7>fKU5!C zxG}Z1)*r~notyEbX?#WdvDD&>C(Izk?3L=zDFo0C5}s5100DFS%F>GoEV;9U<@nwM zv%WJ^+KfKilDnvaY~hxs%=+V0`KGdOOgE_TRweN;+@;FvS6DlCp$gKa1BumeD^=3x z04kj4-KR>PdJX{v`qQO`s*$ZV%Fo%#9g9|(fB6L$1}BWy_w&3@)k?dludeI7EGRSE zX9(u|?e-5hN?YNl+5%JUTZ_|cT;i$5Ub9^;u9_TlK_9l{DoFhqgn0LDLH9AE@zH88sc zvo=ti74VEVSfR_0d)WSd*YwD-TD!&jNxo2T^9vYkxb}4cUEJ#uongZ7^XoK>lU^UC z&n^VN78FGQq0{9<2tGGqSOCE<0nq0|&=($vLE42DfjL%;>3D4gsZv8nA>36_p;D9T zNwjgB!r0JUZlgK4X|;hb7``wYnxzshq#!%$m*94)fCIaZV5i}B0e)F3=yMCS4vy%^ zu2t*bOlNE7!%2ba58bD_V0#P_C19jqb9-tD!5T$*K;f-n52C^QLo{%K`jtuwohWIu@ zIUA}8nDF%`skGh80dB13gHp0pk(tO#??R=X2;f$tP5e;N0BP&eb?{*@#H#=tgkdtA z)8VPnic#sb0zK=cIiB6ISvjqi z_vKB+rd3@|j(3;!Vs%rq^`xv{*OQC)U}vGDRwt0UM|YJU*?nfqO;ZSv+-!Yn6{lM_UF&%#mTRyC&k6(`LWfY zKmT!ZcKYgae>3>agetX?fDar*-W z_yt?0P|tj&iUYPRr}vX;L1vcI`+};Nk5nbz#S!wv8gHoQc@qo4>goN5a#3*nWS`lO zEP|Na)KLUq8H==!i8I#hd*ejn1T$Gb#Mt0~i6o6xRDvp+EqTMH@IwS+|fe?)Y@?))pX(#513nWAbtHbW&&dNc2KC;zHHMQX>4Da<@*}2&n8{@9D5t%G_-xu#)K90) z2W``fT;?c$TO8sW{GhVH*zU7PCTTk?QX4etGHA6`*r5XxXHQD*Nf~M>!!4yKPfEVM zlwnB9ktc=IxVTF)>A+P=6qK55jp6 zaqctD4dk3C4~z2!!BDcjaO8S0&x6o&pL$`a7hTjhBPhKQ?18%o;x2sLg~45P;oj&_ zt`5-ya}mT`_?QcWxp)HemLy0CPmm;fU@n4~3mymO-MWPqZ{dOCmZf&Zh^beHe4u19KU~ zT>6+xgSqU)+>PARn9ClR%OK{`$6OlBWoI_u6x5wCWe@hH%f3y&lF+wP9tpmk*R0vU z9>K2n5jLB+l*^b_O9>lZ!Nno&d2^l#{7rMrKDgh&ij8fWN7gn@CfBy$&$3NZ#o9)= zJ=@uHY%6z*t8nspw)1D%cF!UTxrfsN#0}0NQTcA!oE&5hbA`S$uXovS_HyKe+lxGEbCiT64HYPD zg$HRE9wgZdZ4=0iILZ#&yjM7l?ae_VFI}j4FQ~f*=`+K!7q8n65>5^?_Z2KwG)R zy2qfZb?dylu&Mkiy@tj{lDl?55qFC8mefkmuY_CXOn)D2A8MY2&?oyo5J{VXBL;8}DCbD}EnygzJ4GI~J z8(qv@yXGbs{x@QGcjrH2Ia?e6 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..3699abfcb157f6928601e558e15ebf6fc7bd4c4e GIT binary patch literal 6329 zcmd5>+m72d5ZwZO+AruMp9(AMDB?xFAZ>tNHpxCD4U!Zs5G({`SKb)#Wns(dZi+nh zZ~9mLg?>S2hNL)@<-mqt8U(Q|4$mA8&kRS*(>Kq*{_3xP|2aAN`b}Vmtlq3D zb^RR$_=#9&VCSBaVPCAv`R%M)5zKmiTabx+NG8cC?odS5t%f`=n^-7O&u>4Lt3u)< z|2@4I--|4T;IL`~9MPgxYxyCm7hRBXOVaej=c$j?s9`z}n)Ff}r=;ZK<;xs&t^>0 z1MDsqgNVh@vKYoJ&O}e8nRpP$>|!(6pUtp~%_w3swrs{R8y=H3GiBrKVl&#G&A5w= zBrUp<^Qw>}SNx0#wMob%5$$I&F`4bpOak1tcqGX@P$Pu`HB#rcd?Lw6b%1x>={?r2 zbmEmQ^_~U6>`<>X2TrN8cqf^Gca#hZM6-B_Iq$Y1rh-YaFO@+j71DH|LYf0A zC^sI6ts>2op)eozWijex5$jSrU24)Lr_lsqs|Z3RW2-ST%{&=hzmD zxD@LHbgDabs$-pMr&CQj<$;O!2e5)-qOzn95U=Lq_4?DKT^|6{-}SO?q#~g!y8i^7 z0m?xqq$}OaQYF=(56#k0<_bTvp>m-@!v>oY!DC}KMA+siY!bT1M#VlcY<(0q@52pdWQ3g`h0XhMgV_>c z9~W;*U$>VAbC_f6<6^?|(zNqZAGeo0FHJiy)$piz^Sm_n<)8;$hk%o?e7_FI;V86u z8jdokZ@Y#K7WCFQsHExb4K{n|;!KbujuY8|8!*845z8nt%mN_t*@c$}Gvn|Guyc)L zW(>`7YYmzWYg|KX9I~ugqsEqU7bj+CpvLc9qvqs+&kj6241PVHJ&mdU`|56Zl{C~~ zxc6>;2?B4`XF^sFvur>Ix`n8&Z>p>?R15ugNS}xP2sERn$Mf!TUfgmlZdWt7WdK>x z;gt03+bewH5!C$j*@eXnj;RF^O3|Ib_pD6{wv%m1n#CG6grCL5ievpwH7QS z_5uh3@<7N`jR#uu7AJ?4rV#iT!2Cx-0*$B>0<(KCYw{>qL7cNRZ$W-K!1j+Xxu<^c zE-apx)m*>JE@85ZHP;0UNj7BrbY}-+ij7HrGQyZ@)b53FI5_C;15h+ z@P=lIhC3H1YxYNU0h5D%up+=8Y^b9Y&iO%*)9VUo9e|i>`3)u9qBR&n3RLl@lb}f` z`%gfkM2z%HH>Ay*XO5==@i2I`)`x6h|B#2zqMEI%-P0&Jqkrr)WQT48xk!wo6g7?p z=$NMXO`@g_23=9{k8`L2bG%ojVAD4@Bu9O(13AVB_w9yo8>Jf?mD{=umpyLlo4p+1 z#@cvLN%ksoj@Ut|biza++4%uS5is?T2DY%F$)_lG0!R>st8hVwL#Gv|(s>DbwoAuv z4Q8{fcCh(8gBC;tIN CG(xrj literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass0.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..27effe92acfbf5b6e264ed20aef9bbd5e7b5709f GIT binary patch literal 7191 zcmd5>OK;mo5cZ*m!oQ)1Jr!gkGu($L329R_t&{kW6i8CEfME!XO*sPeFeEBb9OS3= zzjS7nyPTy-rx7m&44LB2emnEclhm^}FTVTdmrskMqwjw>I@)dLt81~!m&NubzbwSE zDD%bR<88UwU6x|M$jg`I;?4W~s@R;ZZg!>kd@RIlvCc~)K1|DEf4N?7uH@skyQ=lB zZoO+BAAe~-_K#iZ&V8RRW=32urq4F{^>6FNdegb<&((ak-YmJge?NUaJ^lUp>GaLp z*Gvbz{nzQ)^A~R$H-CNg_H6q4?A3GlqjP3(>atihXsPt8sCt>tS0ZZRZMrNM)44c5 z-gp$Q#uKqk zL9V(>f&;P5mp6-ILonOr&6Gr{n$ZG2NWb6BaGW{!<*schD(bDslD-X|G(7&}RNS?Uz z@XQ7MIle1nl4q{O)V*4lBC3kq5J$Brz556QtzR8 z+Dgn@4xROa<~b`dX*u+y547U>sxV(Uw8S(&m=VQuRbj3M*cifxWAi*!n5O}@?1jy9 zRAG(=*uA1e@%&Vnp8qhSqFYk| zazq8(`l_W2UqSdbkLR%7WgV6>D2$mV6e9xT`p!B(3Z?~$%qsf=-*CokY=AI2oyHIE zb>2!fwo>~Dx=Z*QfMgF^%HkwVv%7Ia4Ks)&-sUv6xyuDSU3-!v`?MRQx~_&zV)3Zf zDUPdQDTblQUCJb-!>cVCd$ZdQr#xtUv7xJ>5}mZvCI_NfHV`q!Ye5Y)B#ZY!jeU@l zW#5YcRS$$r)Fjh7P#2~W*l^=Hl9LRMVpG&qRgYX%jE563ZH-OY^%_o@lhwu?W+Yy0u zjGYz+qR?HBV;o0Zy=Qh9Uh+*E*um=pECqJ({D!r_4nEGo8n=T?L^Zt~COCzv52dYX zv%{pFcJP_qC~JrF=mdhLVnRwDF(61*IYD@6t|f!m0!gybOByC=D`Is5NRq`~GG&s= z$5Kr|KqZz++j46Hvf7bGbrQg%$C!|StX3hk$~5ffRt2>S5JUSJq-Q1#|TFUa=m}i61o@cq#EQ>RO1i@dzScH1ceD*RT{|pFllgB7}#MVkO3{6 zct-OCM7_&ncMR|h6N-&Gn%S&Pb)yHp9LO+6S@(?(a-^wWVOw;tC979p8m&0;HN{vZ zW6CGAJO`gx%kj#c+hsYIxobJj(#Wrg9nk;Patc%X+fBlMCWBzDD6m1kDd5MWl}!%# KmFLUx@zK9RwN{M) literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass1.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass1.bin new file mode 100644 index 0000000000000000000000000000000000000000..5a8c8ade8181fbb82310a5e4c59a54e8154f35af GIT binary patch literal 9229 zcmd5?S#R4$5O#q+`ByAZpdb@l5qG(yg|q>B_JFa*VsQv*5-9jTolPyMC+ z3;h8_XJ!x1P)j+E`p_V-WpZ}ro8y~VF7@culdr$}^Y6d*_Wt>1Z*RT4n7vc8(R94L z9G#8Tbi5i(?(Z*Gi}l$`T}?)-r>n`U-$!r9i{shldZj+@D|J4Zk5*c}AFjq%XY={u zZU6rMr}U!d>s46w`)G1rs&|v&qs8dmPxHxq(YflE*~R&MF>Q>M>bDzDTf26y?_hsTefyl!3m;o0ls;mhM^kKsSNwMNXt<;91w!+Z`{rsG-5Rgc=c|8#UQ zQ&}Pw!|7@=yig}6%hl-Jcz7{8Jv~ro^BMfv*62O@R?(U@ta-COKOZl$etvoi?i?tk z0NHB280)v+QGg$)Wgq1HRT4Z<%hB|5GG36H<@9n$BL3o5UC&=0KStlt0@GT6`Aw}Y z;h-Od^L?xU5ey$K@@yVst<`FJ`F^w*7I-OqR^KZK`PnMVT=06Vh}0b)ogT|l@9H|w zHmF#31{+?8c&wv zG^(F8Ds;ow9g+d*tPU$|?2BtKK!Z2w7}h zy@IP)3+i67x~R5d?rald(k>z_t=Ga%4OOyfy(UcE)~`FQllDZAj&2*Ifq*$k!W`TV z=1~(Q(!M1~h0I3LPbLX2-zrNCfHOdW5~M7s>-dbl7#7qo@HbXNqV*iA%=G$AQ}A8G z*H%%$GRJAokk4cfn)S?<7^!nK7>O$&j8y#`j7P3p1dJwPyrJ))i6kCkV1tJk0K!!V zp1ZA>weTR9KC2I+i6kB(L4${CAA~Xesra<G~FsRbr|~k5g7;x9Ynx4CRD@h+61R13A87HCK9B`tv z8KFHRG%+F#Sc1eMeK#3ReG7W%Bt5jGhxYW)UG#`qwLGi3p~V-Kp-xgoOR8v372QRZ zh)qp7)cT1DPp?jM7p?4!-g9J zXOfj~WaS%Q`KD_YL>!{HOjG1v7Ncb08(H|q7rvpwPqC7LyP=Jk9ob-#Y%r1y#tZL}M5&+~Ng#BaopcjFgKi|L&~10pP0R|qkqbgMJO%9#Z=z|?ja(JF zcgrP_F6c&@aNTC7Tv}qV*KLu;LibL&w8Xuj8`&as?-XxKL=L)<&0Kf6TTD1FZJU>7 zr(9ajOWWq9*{QxQ=cPqn!l4lzU1Ztl%`zS!l~pqzN*J23>Fm6XQ=oMpsw9pVYv4Yb zxU0wz*CXV>3<#jAj2c>A(sRVdqH@qEFKf4mw)06x>PFZW8$e5TyF{QZM}#ft^IeW` zISak^^BiG8wlJD-(Po>ryxm#1C)o^;%pUU!6}O#YcFTctio#BzZWRJkl_&&}KpbG( zOl>Iy5kHWlP(bFOI&oz2Qjnf1K;u?VR1;DP2jja z203#lw>i2U+9o_G-)k`Cx!-K$u&D?i3piNDy+v3;yU_5*0FIoZGWx?M6c3{gT|@9G z7LP`D&<;!)^j9>FM6fD8MJk*kJXr4a354p7Dtfi;SK^tla%XdgvGu|FdkRkMpj?<& zAa+gN(mU2jK?d;fT*`j9h3p?7+i9NsY<#DYCVl6VsKQCq>AN0O#t5MJo`8&p6oCTo zJp6`?$QZzz1oEp>nqr}4Fm%rarGhp<(ddzp8|ew}KoxZ$qHdY=r0Vp9?|Q2v=Sj#a99qSvKRpnodF1?x zlD3gFMN5+M6(wsXDa-xngnSN?@Ngcjn>rR$lS|$&E9{r9RW%XN&4D^}m5yB2eE(ec zTM;N4426gQNK%akv~YM8(MpPeq=*2Vl0-=vE07csfalXj(peWZQ1eo&sj;?dfJLD0 z#|X%-Ra4jEZ@ysX`2eDcws4ZbF#Sjq*%xPxn{}rngXwYreVhHDM2UAYiDfjO#1FR& zxkj2}mTMxhKv!)?hfUV$km$OBu@&1eg(gz-K33Ba8AJf)CB4{jTLAw4zjqajH}=As zH=^41u%BYQ5i&`KpwaUL-1K{a>BW`G=tt-j@Rm7ztm9cjSPc{8`UC6=#EL;&Q5PF4 z4DKN)_3^|)rWgFAA`FFZaW@5PruZ!dDiiwT5$Fbo;KI)c17SorBC@0m=(d)!!KjLSSI`agS5<+}Cz0+iu%N5cNZ!{0V*9r-F23hISg&iZpTpRG4b?(W~ezMH=I{nd-< z`}23q2Yme3i?dg+&l?Yad3$~~eRuZu75vdUGgx(5tQxdb{#8`H$>%E(weU7wmW%0J zTwH9+{HB=BSC^LqakXB-zfHu-_a6k!*}*>39+1)%iB-+W=i|)K8v61 zV6;sWiyGlHyV5{J~0@6}s+$zW?0jJLE5H zie<_4K)-86A2Rge!RV@k_l%)uJD|iZY5KI4}u#&p&JpY9ss@zSuoZ7qo2d$q09#{}%y{@P1~x1)h9(EPo-QYk#K`Pa_DGCS**)h9{ORBf zN@;CY;XN$unwLn8CDLznz$*_D2y4d3_XpPM@+n9c;0j!KP_*YhtvDAWGUMA5c*Zjj z=xut&9LJsR^o*|vncC?Yk924~ql*zWR3`<^n}f#YU@uj>gx_hCJvb|i(=^Te-O3|S z3&39OpYX!1v2b54;J%3ag=TSN?{6`Z!gE4#+Z&dIVjeW2<@$V5#ttpj(V&%%UL zUyxw_QvtOvwW;o+GRYUj^?`XS*nu<|HX!f5!S?fG%Tt_n?9^t$*m--<*d97#9}UxN z95@R7)GqGB8oA)%9d;z-Ageg&v?eZ~qOePj&Js(;H%_Wp>6}Gt&^HzPnjYTI^!OsZ zgy`G`a-YT*k`2iqea07xkMRQuKx#JT1*ZKXyy@g-JAgf&nqcV;7c~n8|0>m(W1}U4ELHy%-?NLkgTo8upX=D3&^u|XY7Ar$3H=or- z6OMt;fk{j?Y#`8TzfuQqn}p|PixELn89=#aFXZOEC>GnIdm6Q+;Kfcukr8se!&Eo9 zcW`!j)H|%L79;eo+c7rdF`t|a3@={>kK?!yv`PD=Fm-W{mLYKwIy>ItaHH z;-nhnB&zYW4|A6I?K-6ieX2Z=^WyT5QV)cy3i@OD&#g{Wm&ci7(ut~B4~i1-2{ffIJC<`77dDWWCuM^4%NGK zI3gt~R^d(HjOXW@_lC*O`>*f*emUl&(d+xss47LVB?a5@a?jSB?6_w6GAOmG)|%8g z)3-Xm|HYoT`c~{KO*Ho0UvAuLE#)Hx6 zU^H0<|JmV3AvRL&JXPz2RM|oB=Q|~Td)+F-la=DcBkXqI3IctHtRmL6TP6w;4p^A& zbe;+DqttB6Gf}KoS7a><__cWBx#jynu%?2V$7-|T3T++-FJN?UfF;0e>Cx-m{=ig* zQo7Id^h|D=TZ+SoMptA)qp>M!GwLH`G`O_8Bw8O$Rx^b9rr(gT0i~UWm9k*yP)P#WhxtrJ819)ScgwMoP<7L?DDO9^gv~DN47@SM1LE@+4 z+V=6;`k9wIgUN;qGve?%Hkz8B<4%Lv7kEZbU3(vJMvXOg1mc{jHZhYhD!`gnHb4M~ zPp)>>36Z$i+(Vut0hr&5)zJGo>=g2u=M;A|Yk6DIV?XC2J{oute?EYpdZ;Pt)W=V$ z!AJFdz}g2)aS3n59)5ae%bEJ-f-b9{4&X05{Kfebgk5~lMRQUeDSml|W3Kcv&Z1vz Y|9N;1yone<#dW0$`^4ezT@Z}^0pkNWwEzGB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..122b7dee5c387c772067b0ca196a2f12b636ec8d GIT binary patch literal 757 zcmZ{iy-ve06oms~%2V74rKpP1kge(tLq(+umMV(e)G0=Z9XZ!&3S#0(S$F`R0Oz+( zRkqkV_nyz^WyT5QV)cy3i@OD&#g{Wm&ci7(ut~B4~i1-2{ffIJC<`77dDWWCuM^4%NGK zI3gt~R^d(HjOXW@_lC*O`>*f*emUl&(d+xss47LVB?a5@a?jSB?6_w6GAOmG)|%8g z)3-Xm|HYoT`c~{KO*Ho0UvAuLE#)Hx6 zU^H0<|JmV3AvRL&JXPz2RM|oB=Q|~Td)+F-la=DcBkXqI3IctHtRmL6TP6w;4p^A& zbe;+DqttB6Gf}KoS7a><__cWBx#jynu%?2V$7-|T3T++-FJN?UfF;0e>Cx-m{=ig* zQo7Id^h|D=TZ+SoMptA)qp>M!GwLH`G`O_8Bw8O$Rx^b9rr(gT0i~UWm9k*yP)P#WhxtrJ819)ScgwMoP<7L?DDO9^gv~DN47@SM1LE@+4 z+V=6;`k9wIgUN;qGve?%Hkz8B<4%Lv7kEZbU3(vJMvXOg1mc{jHZhYhD!`gnHb4M~ zPp)>>36Z$i+(Vut0hr&5)zJGo>=g2u=M;A|Yk6DIV?XC2J{oute?EYpdZ;Pt)W=V$ z!AJFdz}g2)aS3n59)5ae%bEJ-f-b9{4&X05{Kfebgk5~lMRQUeDSml|W3Kcv&Z1vz Y|9N;1yone<#dW0$`^4ezT@Z}^0pkNWwEzGB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.bin new file mode 100644 index 0000000000000000000000000000000000000000..122b7dee5c387c772067b0ca196a2f12b636ec8d GIT binary patch literal 757 zcmZ{iy-ve06oms~%2V74rKpP1kge(tLq(+umMV(e)G0=Z9XZ!&3S#0(S$F`R0Oz+( zRkqkV_nyz^WyT5QV)cy3i@OD&#g{Wm&ci7(ut~B4~i1-2{ffIJC<`77dDWWCuM^4%NGK zI3gt~R^d(HjOXW@_lC*O`>*f*emUl&(d+xss47LVB?a5@a?jSB?6_w6GAOmG)|%8g z)3-Xm|HYoT`c~{KO*Ho0UvAuLE#)Hx6 zU^H0<|JmV3AvRL&JXPz2RM|oB=Q|~Td)+F-la=DcBkXqI3IctHtRmL6TP6w;4p^A& zbe;+DqttB6Gf}KoS7a><__cWBx#jynu%?2V$7-|T3T++-FJN?UfF;0e>Cx-m{=ig* zQo7Id^h|D=TZ+SoMptA)qp>M!GwLH`G`O_8Bw8O$Rx^b9rr(gT0i~UWm9k*yP)P#WhxtrJ819)ScgwMoP<7L?DDO9^gv~DN47@SM1LE@+4 z+V=6;`k9wIgUN;qGve?%Hkz8B<4%Lv7kEZbU3(vJMvXOg1mc{jHZhYhD!`gnHb4M~ zPp)>>36Z$i+(Vut0hr&5)zJGo>=g2u=M;A|Yk6DIV?XC2J{oute?EYpdZ;Pt)W=V$ z!AJFdz}g2)aS3n59)5ae%bEJ-f-b9{4&X05{Kfebgk5~lMRQUeDSml|W3Kcv&Z1vz Y|9N;1yone<#dW0$`^4ezT@Z}^0pkNWwEzGB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.bin new file mode 100644 index 0000000000000000000000000000000000000000..122b7dee5c387c772067b0ca196a2f12b636ec8d GIT binary patch literal 757 zcmZ{iy-ve06oms~%2V74rKpP1kge(tLq(+umMV(e)G0=Z9XZ!&3S#0(S$F`R0Oz+( zRkqkV_nyz^$Jh& z(CuMNhb8Mfk4(C9T%$#h69Dd~p`Wz}@Mfx$dL|}YU53tHK(;A_JKM>`;9TquVppoh z){jr;FCFa?I)nUUU~0R|T;h{tj&L|EB*NWTA`Lm09H+N7mr`quT^k?(#0N9Va#%!c zVu^#C;1245`J>o)3fvRup%OKR{^Bk*!T&+8{JTh>OwgweX^JK3m_Ah#4IYeFoL+Vz zRdeV8)hYaQvGRT{?>?QN&m8)!KNodR`T@cyDoJWyT5QV)cy3i@OD&#g{Wm&ci7(ut~B4~i1-2{ffIJC<`77dDWWCuM^4%NGK zI3gt~R^d(HjOXW@_lC*O`>*f*emUl&(d+xss47LVB?a5@a?jSB?6_w6GAOmG)|%8g z)3-Xm|HYoT`c~{KO*Ho0UvAuLE#)Hx6 zU^H0<|JmV3AvRL&JXPz2RM|oB=Q|~Td)+F-la=DcBkXqI3IctHtRmL6TP6w;4p^A& zbe;+DqttB6Gf}KoS7a><__cWBx#jynu%?2V$7-|T3T++-FJN?UfF;0e>Cx-m{=ig* zQo7Id^h|D=TZ+SoMptA)qp>M!GwLH`G`O_8Bw8O$Rx^b9rr(gT0i~UWm9k*yP)P#WhxtrJ819)ScgwMoP<7L?DDO9^gv~DN47@SM1LE@+4 z+V=6;`k9wIgUN;qGve?%Hkz8B<4%Lv7kEZbU3(vJMvXOg1mc{jHZhYhD!`gnHb4M~ zPp)>>36Z$i+(Vut0hr&5)zJGo>=g2u=M;A|Yk6DIV?XC2J{oute?EYpdZ;Pt)W=V$ z!AJFdz}g2)aS3n59)5ae%bEJ-f-b9{4&X05{Kfebgk5~lMRQUeDSml|W3Kcv&Z1vz Y|9N;1yone<#dW0$`^4ezT@Z}^0pkNWwEzGB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass3.bin b/bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass3.bin new file mode 100644 index 0000000000000000000000000000000000000000..733645f988d65730fa58c833342ba98a6e965eea GIT binary patch literal 1720 zcmai#O>WyT5QV)cy3i@OD&#g{Wm&ci7(ut~B4~i1-2{ffIJC<`77dDWWCuM^4%NGK zI3gt~R^d(HjOXW@_lC*O`>*f*emUl&(d+xss47LVB?a5@a?jSB?6_w6GAOmG)|%8g z)3-Xm|HYoT`c~{KO*Ho0UvAuLE#)Hx6 zU^H0<|JmV3AvRL&JXPz2RM|oB=Q|~Td)+F-la=DcBkXqI3IctHtRmL6TP6w;4p^A& zbe;+DqttB6Gf}KoS7a><__cWBx#jynu%?2V$7-|T3T++-FJN?UfF;0e>Cx-m{=ig* zQo7Id^h|D=TZ+SoMptA)qp>M!GwLH`G`O_8Bw8O$Rx^b9rr(gT0i~UWm9k*yP)P#WhxtrJ819)ScgwMoP<7L?DDO9^gv~DN47@SM1LE@+4 z+V=6;`k9wIgUN;qGve?%Hkz8B<4%Lv7kEZbU3(vJMvXOg1mc{jHZhYhD!`gnHb4M~ zPp)>>36Z$i+(Vut0hr&5)zJGo>=g2u=M;A|Yk6DIV?XC2J{oute?EYpdZ;Pt)W=V$ z!AJFdz}g2)aS3n59)5ae%bEJ-f-b9{4&X05{Kfebgk5~lMRQUeDSml|W3Kcv&Z1vz Y|9N;1yone<#dW0$`^4ezT@Z}^0pkNWwEzGB literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/vs_xbr-lv1-noblend.bin b/bgfx/shaders/metal/chains/xbr/vs_xbr-lv1-noblend.bin new file mode 100644 index 0000000000000000000000000000000000000000..da9289ef36526646f308bdb2c6c5fd631574d779 GIT binary patch literal 1074 zcmZ`&!A|2a6wHBBzT!zpt8@h>O>?U_BEbQHgmy2eicE03Mu}ZH&m{%zf9&V(i{m5? zD!1lo-pqLB_4m{5*~87hyC^z8iz3@dwFAX#(d>CCpccrhb=;t_B|=+qyvOS44}TTr zPVFtiXAH2dG{+oxQR+&Y6rP_sqLD8aMUpNyoArQM5oWI&iBhW>Y8j$3LZN6&tH&CCAZqtK_+buwm3-f z{%G`Dz-BwPqLCjWb!-P=XfV&$zsF~O&!vLoL;*#ORUs+O2Ki1DQf)RDP-;b=>PutZ z-w$v*mUdq3b}Ni4X%T-?O)~-Sz@c^E9_#&qn}UJ>7=E*lcew5^Axl!0Uci#2iy5Ll z5~8=uraNHmu|xGDEUfGrlHMqrGK8O_q9gZfQ#)y>F;qq&`zy_c^(?TK(N02kuO_{* z9yj{XD8=xM3| literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-3d.bin b/bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..ac61b8453f06288f5bd9c79ec0285f479059a385 GIT binary patch literal 1036 zcmZ`&!D{0$5H)O1{)#y*$x^hAlUvATp|CxamWC~b5QOR|sfsNHSxS|Z{g3`^p<`RN z<j(VKZs?~NXoe=lyY-mjzR<3|+PQpg=hR`7DqG7bedET6}v(Ka*Sa%OH!zI44B{();O3?273^eNmhAz}1IB(yL&73gni*p5>n z*Xv8jl*C_omZ4Yt6Y3s|Jx_MK<+_e-9KT_30|Kw0Myo)*DfS1ZDOv;2ev{KHESlX& zM+r$TVM3De0O5{^XylT9Gl)A@sD^}uAueFl2qnF%@T+62hx@iZuO#GXLqwDP-llDP z8c0jAr={{)5$E8y_X+8{v`}r$>mPx?{WKUhCCAg56KF^1#FRJ$_|}xTL38C|cN99) eUvbhyYU0iV{~!aCn@UBXxv^S$n{nsjIQj$`0bck3 literal 0 HcmV?d00001 diff --git a/bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-fast.bin b/bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-fast.bin new file mode 100644 index 0000000000000000000000000000000000000000..4bd75b9814008936bc65bfe40a2e0f1fa1f8154e GIT binary patch literal 1487 zcmah}!H&}~5bXgj`3j#<3dN*pl1sIBIILJ{1(#J7d9!XYO6 z7tXdqR-S)Nf^>dh^!ZMT@7^@sGUqir(a20YPzi-`7It@=&n;mbg%e@rl`3-v&ew|U zXwLX%vp|L5@Ry&ZYxTWBrbk21quy?*G=a{87l?F3U=h2V9%)5K<#}v z%te#EqCK}gth&;wy+jdWvrbAyAOe$xUG0CbZEP^X zA-N^P*z?Rg?}Yq${PCd-KCNc6?;mHgs!XyS$l^UN5Agx;%9cK2zWC9*rs_*91usFJk1LWtX450MeuO}AdG)m}1OA_yJlw|Am4cO!v{hFP)M(}+G{7gm9JXPB*F1S(V#v8TDpnxFY z*||bb_J?C!M0^W~V+)-0`+hTpib8bWV88W%3l8S~dtZD4l?8~VNyYRKYUnO)Qn~iyEL#x-% zhK*i9#B#eabrQn5rUU#c+j4tR92w*LBG^0)zBh^Qox}GyzS8v>a6ZP1;GPDYu5{;9 zA2z2>rbAG5_9xr$M{SHe${cf9VP69pD4>Bx;b0Oi7@>(_1zchAg&TIn%&dEvInXeN z3UjDo4kwwzbIf6D>gzo1UPT{j=#jdA$l^4^rKCZ&m812lRnO2Qw$39H3(e_cX1d7< zc;|X(8f7n0Yt`ZJ3L5-WBV7}yZQ?}EVGn4!2Xwgy|GFL!m#*`m_-muQJlY5|R)I-X NWa9Nf-=&5z`w!ry3qAk< literal 0 HcmV?d00001 diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index 458a45d449c..80934ed073a 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -48,7 +48,7 @@ chain_manager::chain_manager(running_machine& machine, osd_options& options, tex , m_slider_notifier(slider_notifier) , m_screen_count(0) { - find_available_chains(options.bgfx_path()); + refresh_available_chains(); parse_chain_selections(options.bgfx_screen_chains()); } @@ -57,12 +57,41 @@ chain_manager::~chain_manager() destroy_chains(); } -void chain_manager::find_available_chains(std::string path) +void chain_manager::refresh_available_chains() { m_available_chains.clear(); m_available_chains.push_back("none"); - osd_directory *directory = osd_opendir((path + "/chains").c_str()); + find_available_chains(std::string(m_options.bgfx_path()) + "/chains"); + + destroy_unloaded_chains(); +} + +void chain_manager::destroy_unloaded_chains() +{ + // O(shaders*available_chains), but we don't care because asset reloading happens rarely + for (int i = 0; i < m_chain_names.size(); i++) + { + std::string name = m_chain_names[i]; + if (name.length() > 0) + { + for (std::string available_name : m_available_chains) + { + if (available_name == name) + { + delete m_screen_chains[i]; + m_chain_names[i] = ""; + m_current_chain[i] = CHAIN_NONE; + break; + } + } + } + } +} + +void chain_manager::find_available_chains(std::string path) +{ + osd_directory *directory = osd_opendir(path.c_str()); if (directory != nullptr) { for (const osd_directory_entry *entry = osd_readdir(directory); entry != nullptr; entry = osd_readdir(directory)) @@ -85,6 +114,14 @@ void chain_manager::find_available_chains(std::string path) } } } + else if (entry->type == ENTTYPE_DIR) + { + std::string name = entry->name; + if (!(name == "." || name == "..")) + { + find_available_chains(path + PATH_SEPARATOR + name); + } + } } osd_closedir(directory); @@ -144,6 +181,7 @@ void chain_manager::parse_chain_selections(std::string chain_str) while (m_current_chain.size() != chain_names.size()) { m_screen_chains.push_back(nullptr); + m_chain_names.push_back(""); m_current_chain.push_back(CHAIN_NONE); } @@ -161,10 +199,12 @@ void chain_manager::parse_chain_selections(std::string chain_str) if (chain_index < m_available_chains.size()) { m_current_chain[index] = chain_index; + m_chain_names[index] = m_available_chains[chain_index]; } else { m_current_chain[index] = CHAIN_NONE; + m_chain_names[index] = ""; } } } @@ -201,7 +241,8 @@ void chain_manager::load_chains() { if (m_current_chain[chain] != CHAIN_NONE) { - m_screen_chains[chain] = load_chain(m_available_chains[m_current_chain[chain]], uint32_t(chain)); + m_chain_names[chain] = m_available_chains[m_current_chain[chain]]; + m_screen_chains[chain] = load_chain(m_chain_names[chain], uint32_t(chain)); } } } @@ -245,7 +286,7 @@ void chain_manager::process_screen_quad(uint32_t view, uint32_t screen, render_p tex_width, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base); std::string full_name = "screen" + std::to_string(screen); - bgfx_texture *texture = new bgfx_texture(full_name, bgfx::TextureFormat::RGBA8, tex_width, tex_height, mem, BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT); + bgfx_texture *texture = new bgfx_texture(full_name, bgfx::TextureFormat::RGBA8, tex_width, tex_height, mem, BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP | BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT); m_textures.add_provider(full_name, texture); m_targets.update_target_sizes(screen, tex_width, tex_height, TARGET_STYLE_GUEST); @@ -293,6 +334,7 @@ void chain_manager::update_screen_count(uint32_t screen_count) while (m_screen_chains.size() < m_screen_count) { m_screen_chains.push_back(nullptr); + m_chain_names.push_back(""); m_current_chain.push_back(CHAIN_NONE); } diff --git a/src/osd/modules/render/bgfx/chainmanager.h b/src/osd/modules/render/bgfx/chainmanager.h index 7d8d0c16eb3..022dbecfa14 100644 --- a/src/osd/modules/render/bgfx/chainmanager.h +++ b/src/osd/modules/render/bgfx/chainmanager.h @@ -15,6 +15,7 @@ #define __DRAWBGFX_CHAIN_MANAGER__ #include +#include #include #include "texturemanager.h" @@ -48,6 +49,8 @@ private: void destroy_chains(); void reload_chains(); + void refresh_available_chains(); + void destroy_unloaded_chains(); void find_available_chains(std::string path); void parse_chain_selections(std::string chain_str); std::vector split_option_string(std::string chain_str) const; @@ -69,6 +72,7 @@ private: uint32_t m_screen_count; std::vector m_available_chains; std::vector m_screen_chains; + std::vector m_chain_names; std::vector m_selection_sliders; std::vector m_current_chain; diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_bob-and-ghost-deinterlace.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_bob-and-ghost-deinterlace.sc new file mode 100644 index 00000000000..45d38a0e020 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_bob-and-ghost-deinterlace.sc @@ -0,0 +1,55 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +/* + Bob-and-ghost Deinterlacing + Author: hunterk + License: Public domain + + Note: This shader is designed to work with the typical interlaced output from an emulator, which displays both even and odd fields twice. + As such, it is inappropriate for general video use unless the video has already been similarly woven beforehand. +*/ + +#include "common.sh" + +// Samplers +SAMPLER2D(s0, 0); + +uniform vec4 u_tex_size0; + +#define one_pixel vec2(1.0 / u_tex_size0.xy) + +void main() +{ + vec4 exponent = vec4(2.2, 2.2, 2.2, 2.2); + vec4 inv_exponent = 1.0 / exponent; + vec4 res = vec4(pow(texture2D(s0, v_texcoord0), exponent)); + vec4 color; + float y; + + // assume anything with a vertical resolution greater than 400 lines is interlaced + if (u_tex_size0.y > 400.0) + { + y = u_tex_size0.y * v_texcoord0.y;// FIXME + IN.frame_count; + res = pow(vec4(texture2D(s0, v_texcoord0 + vec2(0.0, one_pixel.y))), exponent); + color = pow((vec4(texture2D(s0, v_texcoord0 - vec2(0.0, 0.5 * one_pixel.y))) + vec4(texture2D(s0, v_texcoord0 + vec2(0.0, 0.5 * one_pixel.y)))) / 2.0, exponent); + } + else + { + y = 2.0 * u_tex_size0.y * v_texcoord0.y; + color = res; + } + + if (mod(y, 2.0) > 0.99999) + { + res = res; + } + else + { + res = vec4(pow(texture2D(s0, v_texcoord0), exponent)); + } + + gl_FragColor = vec4(pow((res + color) / 2.0, inv_exponent)); +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass0.sc new file mode 100644 index 00000000000..cbff9f450e8 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass0.sc @@ -0,0 +1,45 @@ +$input v_color0, v_texcoord0, v_texcoord1 + +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's Deposterize Shader - Pass0 + + Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com + +*/ + +#include "common.sh" + +// Samplers +SAMPLER2D(decal, 0); + +uniform vec4 EQ_THRESH1; +uniform vec4 DIFF_THRESH1; + +vec3 df3(vec3 c1, vec3 c2) +{ + return abs(c1 - c2); +} + +bvec3 le3(vec3 A, vec3 B, vec3 param) +{ + return lessThanEqual(df3(A, B), param); +} + +bvec3 gt3(vec3 A, vec3 B, vec3 param) +{ + return greaterThan(df3(A, B), param); +} + +void main() +{ + vec3 D = texture2D(decal, v_texcoord1.xw).rgb; + vec3 E = texture2D(decal, v_texcoord1.yw).rgb; + vec3 F = texture2D(decal, v_texcoord1.zw).rgb; + + vec3 res = (any(gt3(D, F, EQ_THRESH1.xxx)) && (any(le3(E, F, DIFF_THRESH1.xxx)) && any(le3(D, E, EQ_THRESH1.xxx)) || any(le3(D, E, DIFF_THRESH1.xxx)) && any(le3(E, F, EQ_THRESH1.xxx)))) ? 0.5 * (D + F) : E; + + gl_FragColor = vec4(res, 1.0); +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass1.sc new file mode 100644 index 00000000000..c6e0e87b018 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass1.sc @@ -0,0 +1,45 @@ +$input v_color0, v_texcoord0, v_texcoord1 + +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's Deposterize Shader - Pass1 + + Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com + +*/ + +#include "common.sh" + +// Samplers +SAMPLER2D(decal, 0); + +uniform vec4 EQ_THRESH2; +uniform vec4 DIFF_THRESH2; + +vec3 df3(vec3 c1, vec3 c2) +{ + return abs(c1 - c2); +} + +bvec3 le3(vec3 A, vec3 B, vec3 param) +{ + return lessThanEqual(df3(A, B), param); +} + +bvec3 gt3(vec3 A, vec3 B, vec3 param) +{ + return greaterThan(df3(A, B), param); +} + +void main() +{ + vec3 B = texture2D(decal, v_texcoord1.xy).rgb; + vec3 E = texture2D(decal, v_texcoord1.xz).rgb; + vec3 H = texture2D(decal, v_texcoord1.xw).rgb; + + vec3 res = (any(gt3(B, H, EQ_THRESH2.xxx)) && (any(le3(E, H, DIFF_THRESH2.xxx)) && any(le3(B, E, EQ_THRESH2.xxx)) || any(le3(B, E, DIFF_THRESH2.xxx)) && any(le3(E, H, EQ_THRESH2.xxx)))) ? 0.5 * (B + H) : E; + + gl_FragColor = vec4(res, 1.0); +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/fs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_saturation.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/fs_saturation.sc rename to src/osd/modules/render/bgfx/shaders/chains/misc/fs_saturation.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/varying.def.sc new file mode 100644 index 00000000000..8404fc635e1 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/varying.def.sc @@ -0,0 +1,7 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/vs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/misc/vs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/hq2x/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/vs_bob-and-ghost-deinterlace.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hq2x/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/misc/vs_bob-and-ghost-deinterlace.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass0.sc new file mode 100644 index 00000000000..1c3b3ee592f --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass0.sc @@ -0,0 +1,30 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_color0 + +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's Deposterize Shader - Pass0 vertex shader + + Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com + +*/ + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + + vec2 ps = vec2(1.0 / u_tex_size0.xy); + float dx = ps.x; + float dy = ps.y; + + // This line fixes a bug in ATI cards. + v_texcoord0 = a_texcoord0 + vec2(0.0000001, 0.0000001); + v_texcoord1 = v_texcoord0.xxxy + vec4(-dx, 0, dx, 0); // D E F + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass1.sc new file mode 100644 index 00000000000..7af87394655 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass1.sc @@ -0,0 +1,30 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_color0 + +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's Deposterize Shader - Pass1 vertex shader + + Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com + +*/ + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + + vec2 ps = vec2(1.0 / u_tex_size0.xy); + float dx = ps.x; + float dy = ps.y; + + // This line fixes a bug in ATI cards. + v_texcoord0 = a_texcoord0 + vec2(0.0000001, 0.0000001); + v_texcoord1 = v_texcoord0.xyyy + vec4(0, -dy, 0, dy); // D E F + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/vs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/vs_saturation.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/vs_saturation.sc rename to src/osd/modules/render/bgfx/shaders/chains/misc/vs_saturation.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_saturation.sc deleted file mode 100644 index c14f61601c8..00000000000 --- a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_saturation.sc +++ /dev/null @@ -1,25 +0,0 @@ -$input v_color0, v_texcoord0 - -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "common.sh" - -// User-supplied -uniform vec4 u_saturation; - -// Samplers -SAMPLER2D(s_tex, 0); - -void main() -{ - vec4 base = texture2D(s_tex, v_texcoord0); - vec3 rgb = base.rgb; - - vec3 gray = vec3(0.299, 0.587, 0.114); - float luma = dot(rgb, gray); - vec3 chroma = rgb - luma; - vec3 saturated = luma + chroma * u_saturation.x; - - gl_FragColor = vec4(saturated, base.a); -} diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_saturation.sc deleted file mode 100644 index c14f61601c8..00000000000 --- a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_saturation.sc +++ /dev/null @@ -1,25 +0,0 @@ -$input v_color0, v_texcoord0 - -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "common.sh" - -// User-supplied -uniform vec4 u_saturation; - -// Samplers -SAMPLER2D(s_tex, 0); - -void main() -{ - vec4 base = texture2D(s_tex, v_texcoord0); - vec3 rgb = base.rgb; - - vec3 gray = vec3(0.299, 0.587, 0.114); - float luma = dot(rgb, gray); - vec3 chroma = rgb - luma; - vec3 saturated = luma + chroma * u_saturation.x; - - gl_FragColor = vec4(saturated, base.a); -} diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_saturation.sc deleted file mode 100644 index c14f61601c8..00000000000 --- a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_saturation.sc +++ /dev/null @@ -1,25 +0,0 @@ -$input v_color0, v_texcoord0 - -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "common.sh" - -// User-supplied -uniform vec4 u_saturation; - -// Samplers -SAMPLER2D(s_tex, 0); - -void main() -{ - vec4 base = texture2D(s_tex, v_texcoord0); - vec3 rgb = base.rgb; - - vec3 gray = vec3(0.299, 0.587, 0.114); - float luma = dot(rgb, gray); - vec3 chroma = rgb - luma; - vec3 saturated = luma + chroma * u_saturation.x; - - gl_FragColor = vec4(saturated, base.a); -} diff --git a/src/osd/modules/render/bgfx/shaders/chains/hq2x/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hq2x/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/hq3x/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/vs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hq3x/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-4p/vs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/hq3x/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hq3x/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/hq4x/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/vs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hq4x/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/super-4xbr-3d-6p-smoother/vs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/hq4x/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/hq4x/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/vs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-hybrid/vs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/vs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv1-noblend/vs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/vs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-3d/vs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/vs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/vs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-multipass/vs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/fs_blit.sc similarity index 100% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_blit.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/fs_blit.sc diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/vs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/vs_blit.sc similarity index 75% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/vs_saturation.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/vs_blit.sc index 57be1439a8b..405ef8feb3b 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/vs_saturation.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-accuracy-smart-blur/vs_blit.sc @@ -9,6 +9,6 @@ $output v_texcoord0, v_color0 void main() { gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); - v_texcoord0 = a_texcoord0 * vec2(0.16666666 * 0.9, 1.0 * 0.8) + vec2(0.1, 0.1); + v_texcoord0 = a_texcoord0; v_color0 = a_color0; } diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/vs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/vs_blit.sc similarity index 72% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/vs_saturation.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/vs_blit.sc index ef86b6a0a43..405ef8feb3b 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/vs_saturation.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-deposterize/vs_blit.sc @@ -9,6 +9,6 @@ $output v_texcoord0, v_color0 void main() { gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); - v_texcoord0 = a_texcoord0 * vec2(1.0 * 0.8, 0.685185 * 0.9) + vec2(0.1, 0.9 - 0.685185 * 0.9); + v_texcoord0 = a_texcoord0; v_color0 = a_color0; } diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/vs_saturation.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/vs_blit.sc similarity index 71% rename from src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/vs_saturation.sc rename to src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/vs_blit.sc index c0f9321abc1..405ef8feb3b 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/vs_saturation.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-fast/vs_blit.sc @@ -9,6 +9,6 @@ $output v_texcoord0, v_color0 void main() { gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); - v_texcoord0 = a_texcoord0 * vec2(0.16666666 * 0.9, 1.0 * 0.8) + vec2(0.9 - 0.16666666 * 0.9, 0.1); + v_texcoord0 = a_texcoord0; v_color0 = a_color0; } diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/vs_blit.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-multipass/vs_blit.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/vs_blit.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv2-noblend/vs_blit.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/vs_blit.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-multipass/vs_blit.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/vs_blit.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3-noblend/vs_blit.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/vs_blit.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-lv3/vs_blit.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/vs_blit.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-dilation/vs_blit.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/fs_blit.sc new file mode 100644 index 00000000000..9af7bcf0ee6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/vs_blit.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr-mlv4-multipass/vs_blit.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv1-noblend.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv1-noblend.sc new file mode 100644 index 00000000000..72212fa74a7 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv1-noblend.sc @@ -0,0 +1,132 @@ +$input v_texcoord0, v_texcoord1, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + Hyllian's xBR-lv1-noblend Shader + + Copyright (C) 2011-2014 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +uniform vec4 XBR_Y_WEIGHT; +uniform vec4 XBR_EQ_THRESHOLD; + +uniform vec4 u_tex_size0; + +SAMPLER2D(decal, 0); + +// Uncomment just one of the three params below to choose the corner detection +//#define CORNER_A +//#define CORNER_B +#define CORNER_C + +float RGBtoYUV(vec3 color) +{ + return dot(color, XBR_Y_WEIGHT.xxx * vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < XBR_EQ_THRESHOLD.x); +} + +float weighted_distance(float a, float b, float c, float d, float e, float f, float g, float h) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h)); +} + +/* + xBR LVL1 works over the pixels below: + + |B |C | + |D |E |F |F4| + |G |H |I |I4| + |H5|I5| + + Consider E as the central pixel. xBR LVL1 needs only to look at 12 texture pixels. +*/ + +void main() +{ + vec2 pos = fract(v_texcoord0 * u_tex_size0.xy) - vec2(0.5, 0.5); // pos = pixel position + vec2 dir = sign(pos); // dir = pixel direction + + vec2 g1 = dir * v_texcoord1.xy; + vec2 g2 = dir * v_texcoord1.zw; + + vec3 B = texture2D(decal, v_texcoord0 +g1 ).xyz; + vec3 C = texture2D(decal, v_texcoord0 +g1-g2).xyz; + vec3 D = texture2D(decal, v_texcoord0 +g2).xyz; + vec3 E = texture2D(decal, v_texcoord0 ).xyz; + vec3 F = texture2D(decal, v_texcoord0 -g2).xyz; + vec3 G = texture2D(decal, v_texcoord0 -g1+g2).xyz; + vec3 H = texture2D(decal, v_texcoord0 -g1 ).xyz; + vec3 I = texture2D(decal, v_texcoord0 -g1-g2).xyz; + + vec3 F4 = texture2D(decal,v_texcoord0 -2.0*g2 ).xyz; + vec3 I4 = texture2D(decal,v_texcoord0 -g1-2.0*g2 ).xyz; + vec3 H5 = texture2D(decal,v_texcoord0 -2.0*g1 ).xyz; + vec3 I5 = texture2D(decal,v_texcoord0 -2.0*g1-g2 ).xyz; + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); + float i5 = RGBtoYUV( I5 ); + float h5 = RGBtoYUV( H5 ); + float f4 = RGBtoYUV( F4 ); + + bool fx = (dot(dir,pos) > 0.5); // inequations of straight lines. + +// It uses CORNER_C if none of the others are defined. +#ifdef CORNER_A + bool interp_restriction_lv1 = ((e!=f) && (e!=h)); +#elif CORNER_B + bool interp_restriction_lv1 = ((e!=f) && (e!=h) && ( !eq(f,b) && !eq(h,d) || eq(e,i) && !eq(f,i4) && !eq(h,i5) || eq(e,g) || eq(e,c) ) ); +#else + bool interp_restriction_lv1 = ((e!=f) && (e!=h) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); +#endif + bool edr = (weighted_distance(e, c, g, i, h5, f4, h, f) < weighted_distance(h, d, i5, f, i4, b, e, i)) && interp_restriction_lv1; // edr = edge detection rule + + bool nc = (edr && fx); // new_color + + bool px = (df(e,f) <= df(e,h)); // px = pixel + + vec3 res = nc ? px ? F : H : E; + + // final sum and weight normalization + gl_FragColor = vec4(res, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-3d.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-3d.sc new file mode 100644 index 00000000000..1febb8f5ee3 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-3d.sc @@ -0,0 +1,260 @@ +$input v_texcoord0, v_texcoord1, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + Hyllian's xBR-lv2-3d Shader + + Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +#include "common.sh" + +uniform vec4 XBR_SCALE; +uniform vec4 XBR_Y_WEIGHT; +uniform vec4 XBR_EQ_THRESHOLD; +uniform vec4 XBR_LV2_COEFFICIENT; +uniform vec4 XBR_RES; + +uniform vec4 u_tex_size0; + +SAMPLER2D(decal, 0); + +// Uncomment just one of the three params below to choose the corner detection +//#define CORNER_A +//#define CORNER_B +#define CORNER_C +//#define CORNER_D + +#ifndef CORNER_A + #define SMOOTH_TIPS +#endif + +const vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 ); +const vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 ); +const vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 ); +const vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 ); +const vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 ); +const vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 ); +const vec4 Ci = vec4(0.25, 0.25, 0.25, 0.25); + +const vec4 Y = vec4(0.2126, 0.7152, 0.0722, 0.0); + +vec4 df(vec4 A, vec4 B) +{ + return abs(A - B); +} + +float c_df(vec3 c1, vec3 c2) +{ + vec3 df = abs(c1 - c2); + return df.r + df.g + df.b; +} + +vec4 ge(vec4 A, vec4 B) +{ + return vec4(greaterThanEqual(A, B)); +} + +vec4 le(vec4 A, vec4 B) +{ + return vec4(lessThanEqual(A, B)); +} + +vec4 lt(vec4 A, vec4 B) +{ + return vec4(lessThan(A, B)); +} + +vec4 eq(vec4 A, vec4 B) +{ + return vec4(equal(A, B)); +} + +vec4 ne(vec4 A, vec4 B) +{ + return vec4(notEqual(A, B)); +} + +vec4 abslt(vec4 A, vec4 B) +{ + return lt(df(A, B), XBR_EQ_THRESHOLD.xxxx); +} + +vec4 absge(vec4 A, vec4 B) +{ + return ge(df(A, B), XBR_EQ_THRESHOLD.xxxx); +} + +vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h)); +} + +void main() +{ + vec4 delta = 1.0 / XBR_SCALE.xxxx; + vec4 deltaL = vec4(0.5, 1.0, 0.5, 1.0) / XBR_SCALE.xxxx; + vec4 deltaU = deltaL.yxwz; + + vec2 fp = fract(v_texcoord0 * u_tex_size0.xy / XBR_RES.xx); + + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES.xx) + vec2(0.5, 0.5)) * XBR_RES.xx / u_tex_size0.xy; + + vec2 dx = v_texcoord1.xy; + vec2 dy = v_texcoord1.zw; + + vec4 A = texture2D(decal, v_texcoord0 -dx -dy); + vec4 B = texture2D(decal, v_texcoord0 -dy); + vec4 C = texture2D(decal, v_texcoord0 +dx -dy); + vec4 D = texture2D(decal, v_texcoord0 -dx ); + vec4 E = texture2D(decal, v_texcoord0 ); + vec4 F = texture2D(decal, v_texcoord0 +dx ); + vec4 G = texture2D(decal, v_texcoord0 -dx +dy); + vec4 H = texture2D(decal, v_texcoord0 +dy); + vec4 I = texture2D(decal, v_texcoord0 +dx +dy); + + vec4 A1 = texture2D(decal, v_texcoord0 -dx -2.0*dy); + vec4 B1 = texture2D(decal, v_texcoord0 -2.0*dy); + vec4 C1 = texture2D(decal, v_texcoord0 +dx -2.0*dy); + vec4 G5 = texture2D(decal, v_texcoord0 -dx +2.0*dy); + vec4 H5 = texture2D(decal, v_texcoord0 +2.0*dy); + vec4 I5 = texture2D(decal, v_texcoord0 +dx +2.0*dy); + vec4 A0 = texture2D(decal, v_texcoord0 -2.0*dx -dy); + vec4 D0 = texture2D(decal, v_texcoord0 -2.0*dx ); + vec4 G0 = texture2D(decal, v_texcoord0 -2.0*dx +dy); + vec4 C4 = texture2D(decal, v_texcoord0 +2.0*dx -dy); + vec4 F4 = texture2D(decal, v_texcoord0 +2.0*dx ); + vec4 I4 = texture2D(decal, v_texcoord0 +2.0*dx +dy); + + vec4 F6 = texture2D(decal, tex +dx+0.25*dx+0.25*dy); + vec4 F7 = texture2D(decal, tex +dx+0.25*dx-0.25*dy); + vec4 F8 = texture2D(decal, tex +dx-0.25*dx-0.25*dy); + vec4 F9 = texture2D(decal, tex +dx-0.25*dx+0.25*dy); + + vec4 B6 = texture2D(decal, tex +0.25*dx+0.25*dy-dy); + vec4 B7 = texture2D(decal, tex +0.25*dx-0.25*dy-dy); + vec4 B8 = texture2D(decal, tex -0.25*dx-0.25*dy-dy); + vec4 B9 = texture2D(decal, tex -0.25*dx+0.25*dy-dy); + + vec4 D6 = texture2D(decal, tex -dx+0.25*dx+0.25*dy); + vec4 D7 = texture2D(decal, tex -dx+0.25*dx-0.25*dy); + vec4 D8 = texture2D(decal, tex -dx-0.25*dx-0.25*dy); + vec4 D9 = texture2D(decal, tex -dx-0.25*dx+0.25*dy); + + vec4 H6 = texture2D(decal, tex +0.25*dx+0.25*dy+dy); + vec4 H7 = texture2D(decal, tex +0.25*dx-0.25*dy+dy); + vec4 H8 = texture2D(decal, tex -0.25*dx-0.25*dy+dy); + vec4 H9 = texture2D(decal, tex -0.25*dx+0.25*dy+dy); + + vec4 b = mul(mat4(B, D, H, F), XBR_Y_WEIGHT.xxxx * Y); + vec4 c = mul(mat4(C, A, G, I), XBR_Y_WEIGHT.xxxx * Y); + vec4 e = mul(mat4(E, E, E, E), XBR_Y_WEIGHT.xxxx * Y); + vec4 d = b.yzwx; + vec4 f = b.wxyz; + vec4 g = c.zwxy; + vec4 h = b.zwxy; + vec4 i = c.wxyz; + + vec4 i4 = mul(mat4(I4, C1, A0, G5), XBR_Y_WEIGHT.xxxx * Y); + vec4 i5 = mul(mat4(I5, C4, A1, G0), XBR_Y_WEIGHT.xxxx * Y); + vec4 h5 = mul(mat4(H5, F4, B1, D0), XBR_Y_WEIGHT.xxxx * Y); + vec4 f4 = h5.yzwx; + + vec4 f0 = mul(mat4(F6, B6, D6, H6), XBR_Y_WEIGHT.xxxx * Y); + vec4 f1 = mul(mat4(F7, B7, D7, H7), XBR_Y_WEIGHT.xxxx * Y); + vec4 f2 = mul(mat4(F8, B8, D8, H8), XBR_Y_WEIGHT.xxxx * Y); + vec4 f3 = mul(mat4(F9, B9, D9, H9), XBR_Y_WEIGHT.xxxx * Y); + + vec4 h0 = f0.wxyz; + vec4 h1 = f1.wxyz; + vec4 h2 = f2.wxyz; + vec4 h3 = f3.wxyz; + + // These inequations define the line below which interpolation occurs. + vec4 fx = (Ao*fp.y+Bo*fp.x); + vec4 fx_left = (Ax*fp.y+Bx*fp.x); + vec4 fx_up = (Ay*fp.y+By*fp.x); + + vec4 block_3d = (eq(f0,f1) * eq(f1,f2) * eq(f2,f3) * eq(h0,h1) * eq(h1,h2) * eq(h2,h3)); + vec4 interp_restriction_lv0 = (ne(e,f) * ne(e,h) * block_3d); + vec4 interp_restriction_lv1 = interp_restriction_lv0; + +#ifdef CORNER_B + interp_restriction_lv1 = (interp_restriction_lv0 * (ge(f,b) * ge(h,d) + eq(e,i) * ge(f,i4) * ge(h,i5) + eq(e,g) + eq(e,c))); +#endif +#ifdef CORNER_D + vec4 c1 = i4.yzwx; + vec4 g0 = i5.wxyz; + interp_restriction_lv1 = (interp_restriction_lv0 * (ge(f,b) * ge(h,d) + eq(e,i) * ge(f,i4) * ge(h,i5) + eq(e,g) + eq(e,c) ) * (ne(f,f4) * ne(f,i) + ne(h,h5) * ne(h,i) + ne(h,g) + ne(f,c) + eq(b,c1) * eq(d,g0))); +#endif +#ifdef CORNER_C + interp_restriction_lv1 = (interp_restriction_lv0 * (ge(f,b) * ge(f,c) + ge(h,d) * ge(h,g) + eq(e,i) * (ge(f,f4) * ge(f,i4) + ge(h,h5) * ge(h,i5)) + eq(e,g) + eq(e,c))); +#endif + + vec4 interp_restriction_lv2_left = (ne(e,g) * ne(d,g)); + vec4 interp_restriction_lv2_up = (ne(e,c) * ne(b,c)); + + vec4 fx45i = saturate((fx + delta -Co - Ci) / (2.0 * delta )); + vec4 fx45 = saturate((fx + delta -Co ) / (2.0 * delta )); + vec4 fx30 = saturate((fx_left + deltaL -Cx ) / (2.0 * deltaL)); + vec4 fx60 = saturate((fx_up + deltaU -Cy ) / (2.0 * deltaU)); + + vec4 wd1 = weighted_distance( e, c, g, i, h5, f4, h, f); + vec4 wd2 = weighted_distance( h, d, i5, f, i4, b, e, i); + + vec4 edri = le(wd1,wd2) * interp_restriction_lv0; + vec4 edr = lt(wd1,wd2) * interp_restriction_lv1; + vec4 edr_left = le(XBR_LV2_COEFFICIENT.xxxx * df(f,g), df(h,c)) * interp_restriction_lv2_left * edr; + vec4 edr_up = ge(df(f,g), XBR_LV2_COEFFICIENT.xxxx * df(h,c)) * interp_restriction_lv2_up * edr; + + fx45 = edr * fx45; + fx30 = edr_left * fx30; + fx60 = edr_up * fx60; + fx45i = edri * fx45i; + + vec4 px = le(df(e,f3), df(e,h1)); + +#ifdef SMOOTH_TIPS + vec4 maximos = max(max(fx30, fx60), max(fx45, fx45i)); +#else + vec4 maximos = max(max(fx30, fx60), fx45); +#endif + + vec3 res1 = E.xyz; + res1 = mix(res1, mix(H.xyz, F.xyz, px.x), maximos.x); + res1 = mix(res1, mix(B.xyz, D.xyz, px.z), maximos.z); + + vec3 res2 = E.xyz; + res2 = mix(res2, mix(F.xyz, B.xyz, px.y), maximos.y); + res2 = mix(res2, mix(D.xyz, H.xyz, px.w), maximos.w); + + vec3 E_mix = (c_df(E.xyz, res2) >= c_df(E.xyz, res1)) ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 res = mix(res1, res2, E_mix); + + gl_FragColor = vec4(res, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-fast.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-fast.sc new file mode 100644 index 00000000000..0525a1bd297 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-fast.sc @@ -0,0 +1,201 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + Hyllian's xBR-lv2-lq Shader + + Copyright (C) 2011/2015 Hyllian/Jararaca - sergiogdb@gmail.com + + Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +#include "common.sh" + +uniform vec4 XBR_SCALE; +uniform vec4 XBR_Y_WEIGHT; +uniform vec4 XBR_EQ_THRESHOLD; +uniform vec4 XBR_LV2_COEFFICIENT; + +uniform vec4 u_tex_size0; + +SAMPLER2D(decal, 0); + +// Uncomment just one of the three params below to choose the corner detection +//#define CORNER_A +#define CORNER_C + +#ifdef CORNER_C + #define SMOOTH_TIPS +#endif + +const vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 ); +const vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 ); +const vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 ); +const vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 ); +const vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 ); +const vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 ); +const vec4 Ci = vec4(0.25, 0.25, 0.25, 0.25); + +const vec4 Y = vec4(0.2126, 0.7152, 0.0722, 0.0); + +vec4 df(vec4 A, vec4 B) +{ + return abs(A - B); +} + +float c_df(vec3 c1, vec3 c2) +{ + vec3 df = abs(c1 - c2); + return df.r + df.g + df.b; +} + +vec4 ge(vec4 A, vec4 B) +{ + return vec4(greaterThanEqual(A, B)); +} + +vec4 le(vec4 A, vec4 B) +{ + return vec4(lessThanEqual(A, B)); +} + +vec4 lt(vec4 A, vec4 B) +{ + return vec4(lessThan(A, B)); +} + +vec4 eq(vec4 A, vec4 B) +{ + return vec4(equal(A, B)); +} + +vec4 ne(vec4 A, vec4 B) +{ + return vec4(notEqual(A, B)); +} + +vec4 abslt(vec4 A, vec4 B) +{ + return lt(df(A, B), XBR_EQ_THRESHOLD.xxxx); +} + +vec4 absge(vec4 A, vec4 B) +{ + return ge(df(A, B), XBR_EQ_THRESHOLD.xxxx); +} + +vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h) +{ + return (df(c,d) + df(e,f) + 3.0*df(g,h)); +// return (1.0*df(a,b) + 2.0*df(c,d) + 2.0*df(e,f) + 4.0*df(g,h)); +} + +void main() +{ + vec4 delta = 1.0 / XBR_SCALE.xxxx; + vec4 deltaL = vec4(0.5, 1.0, 0.5, 1.0) / XBR_SCALE.xxxx; + vec4 deltaU = deltaL.yxwz; + + vec2 fp = fract(v_texcoord0 * u_tex_size0.xy); + + vec4 A = texture2D(decal, v_texcoord1.xw); + vec4 B = texture2D(decal, v_texcoord1.yw); + vec4 C = texture2D(decal, v_texcoord1.zw); + + vec4 D = texture2D(decal, v_texcoord2.xw); + vec4 E = texture2D(decal, v_texcoord2.yw); + vec4 F = texture2D(decal, v_texcoord2.zw); + + vec4 G = texture2D(decal, v_texcoord3.xw); + vec4 H = texture2D(decal, v_texcoord3.yw); + vec4 I = texture2D(decal, v_texcoord3.zw); + + vec4 b = mul(mat4(B, D, H, F), XBR_Y_WEIGHT.xxxx * Y); + vec4 c = mul(mat4(C, A, G, I), XBR_Y_WEIGHT.xxxx * Y); + vec4 e = mul(mat4(E, E, E, E), XBR_Y_WEIGHT.xxxx * Y); + vec4 a = c.yzwx; + vec4 d = b.yzwx; + vec4 f = b.wxyz; + vec4 g = c.zwxy; + vec4 h = b.zwxy; + vec4 i = c.wxyz; + + // These inequations define the line below which interpolation occurs. + vec4 fx = (Ao*fp.y+Bo*fp.x); + vec4 fx_left = (Ax*fp.y+Bx*fp.x); + vec4 fx_up = (Ay*fp.y+By*fp.x); + + vec4 interp_restriction_lv0 = (ne(e,f) * ne(e,h)); + vec4 interp_restriction_lv1 = interp_restriction_lv0; + +#ifndef CORNER_A + interp_restriction_lv1 = clamp(interp_restriction_lv0 * (ge(f,b) * ge(f,c) + ge(h,d) * ge(h,g) + lt(e,g) + lt(e,c)), 0.0, 1.0); +#endif + + vec4 interp_restriction_lv2_left = (ne(e,g) * ne(d,g)); + vec4 interp_restriction_lv2_up = (ne(e,c) * ne(b,c)); + + vec4 fx45i = saturate((fx + delta -Co - Ci) / (2.0 * delta )); + vec4 fx45 = saturate((fx + delta -Co ) / (2.0 * delta )); + vec4 fx30 = saturate((fx_left + deltaL -Cx ) / (2.0 * deltaL)); + vec4 fx60 = saturate((fx_up + deltaU -Cy ) / (2.0 * deltaU)); + + vec4 wd1 = weighted_distance( d, b, g, e, e, c, h, f); + vec4 wd2 = weighted_distance( a, e, b, f, d, h, e, i); + + vec4 edri = le(wd1, wd2) * interp_restriction_lv0; + vec4 edr = lt(wd1, wd2) * interp_restriction_lv1; + vec4 edr_left = le(XBR_LV2_COEFFICIENT.xxxx * df(f,g), df(h,c)) * interp_restriction_lv2_left * edr; + vec4 edr_up = ge(df(f,g), XBR_LV2_COEFFICIENT.xxxx * df(h,c)) * interp_restriction_lv2_up * edr; + + fx45 = edr * fx45; + fx30 = edr_left * fx30; + fx60 = edr_up * fx60; + fx45i = edri * fx45i; + + vec4 px = le(df(e,f), df(e,h)); + +#ifdef SMOOTH_TIPS + vec4 maximos = max(max(fx30, fx60), max(fx45, fx45i)); +#else + vec4 maximos = max(max(fx30, fx60), fx45); +#endif + + vec3 res1 = E.xyz; + res1 = mix(res1, mix(H.xyz, F.xyz, px.x), maximos.x); + res1 = mix(res1, mix(B.xyz, D.xyz, px.z), maximos.z); + + vec3 res2 = E.xyz; + res2 = mix(res2, mix(F.xyz, B.xyz, px.y), maximos.y); + res2 = mix(res2, mix(D.xyz, H.xyz, px.w), maximos.w); + + vec3 E_mix = (c_df(E.xyz, res2) >= c_df(E.xyz, res1)) ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 res = mix(res1, res2, E_mix); + + gl_FragColor = vec4(res, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2.sc new file mode 100644 index 00000000000..421cf1efb9d --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2.sc @@ -0,0 +1,229 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_texcoord5, v_texcoord6, v_texcoord7, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + Hyllian's xBR-lv2 Shader + + Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +#include "common.sh" + +uniform vec4 XBR_SCALE; +uniform vec4 XBR_Y_WEIGHT; +uniform vec4 XBR_EQ_THRESHOLD; +uniform vec4 XBR_LV2_COEFFICIENT; + +uniform vec4 u_tex_size0; + +SAMPLER2D(decal, 0); + +// Uncomment just one of the three params below to choose the corner detection +#define CORNER_A +//#define CORNER_B +//#define CORNER_C +//#define CORNER_D + +const vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 ); +const vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 ); +const vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 ); +const vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 ); +const vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 ); +const vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 ); +const vec4 Ci = vec4(0.25, 0.25, 0.25, 0.25); + +const vec4 Y = vec4(0.2126, 0.7152, 0.0722, 0.0); + +vec4 df(vec4 A, vec4 B) +{ + return abs(A - B); +} + +float c_df(vec3 c1, vec3 c2) +{ + vec3 df = abs(c1 - c2); + return df.r + df.g + df.b; +} + +vec4 ge(vec4 A, vec4 B) +{ + return vec4(greaterThanEqual(A, B)); +} + +vec4 le(vec4 A, vec4 B) +{ + return vec4(lessThanEqual(A, B)); +} + +vec4 lt(vec4 A, vec4 B) +{ + return vec4(lessThan(A, B)); +} + +vec4 eq(vec4 A, vec4 B) +{ + return vec4(equal(A, B)); +} + +vec4 ne(vec4 A, vec4 B) +{ + return vec4(notEqual(A, B)); +} + +vec4 abslt(vec4 A, vec4 B) +{ + return lt(df(A, B), XBR_EQ_THRESHOLD.xxxx); +} + +vec4 absge(vec4 A, vec4 B) +{ + return ge(df(A, B), XBR_EQ_THRESHOLD.xxxx); +} + +vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h)); +} + +void main() +{ + vec4 delta = 1.0 / XBR_SCALE.xxxx; + vec4 deltaL = vec4(0.5, 1.0, 0.5, 1.0) / XBR_SCALE.xxxx; + vec4 deltaU = deltaL.yxwz; + + vec2 fp = fract(v_texcoord0 * u_tex_size0.xy); + + vec4 A1 = texture2D(decal, v_texcoord1.xw); + vec4 B1 = texture2D(decal, v_texcoord1.yw); + vec4 C1 = texture2D(decal, v_texcoord1.zw); + + vec4 A = texture2D(decal, v_texcoord2.xw); + vec4 B = texture2D(decal, v_texcoord2.yw); + vec4 C = texture2D(decal, v_texcoord2.zw); + + vec4 D = texture2D(decal, v_texcoord3.xw); + vec4 E = texture2D(decal, v_texcoord3.yw); + vec4 F = texture2D(decal, v_texcoord3.zw); + + vec4 G = texture2D(decal, v_texcoord4.xw); + vec4 H = texture2D(decal, v_texcoord4.yw); + vec4 I = texture2D(decal, v_texcoord4.zw); + + vec4 G5 = texture2D(decal, v_texcoord5.xw); + vec4 H5 = texture2D(decal, v_texcoord5.yw); + vec4 I5 = texture2D(decal, v_texcoord5.zw); + + vec4 A0 = texture2D(decal, v_texcoord6.xy); + vec4 D0 = texture2D(decal, v_texcoord6.xz); + vec4 G0 = texture2D(decal, v_texcoord6.xw); + + vec4 C4 = texture2D(decal, v_texcoord7.xy); + vec4 F4 = texture2D(decal, v_texcoord7.xz); + vec4 I4 = texture2D(decal, v_texcoord7.xw); + + vec4 b = mul(mat4(B, D, H, F), XBR_Y_WEIGHT.xxxx * Y); + vec4 c = mul(mat4(C, A, G, I), XBR_Y_WEIGHT.xxxx * Y); + vec4 e = mul(mat4(E, E, E, E), XBR_Y_WEIGHT.xxxx * Y); + vec4 d = b.yzwx; + vec4 f = b.wxyz; + vec4 g = c.zwxy; + vec4 h = b.zwxy; + vec4 i = c.wxyz; + + vec4 i4 = mul(mat4(I4, C1, A0, G5), XBR_Y_WEIGHT.xxxx * Y); + vec4 i5 = mul(mat4(I5, C4, A1, G0), XBR_Y_WEIGHT.xxxx * Y); + vec4 h5 = mul(mat4(H5, F4, B1, D0), XBR_Y_WEIGHT.xxxx * Y); + vec4 f4 = h5.yzwx; + + // These inequations define the line below which interpolation occurs. + vec4 fx = (Ao*fp.y+Bo*fp.x); + vec4 fx_left = (Ax*fp.y+Bx*fp.x); + vec4 fx_up = (Ay*fp.y+By*fp.x); + + vec4 interp_restriction_lv0 = (ne(e,f) * ne(e,h)); + vec4 interp_restriction_lv1 = interp_restriction_lv0; + +#ifdef CORNER_B + interp_restriction_lv1 = (interp_restriction_lv0 * ( ge(f,b) * ge(h,d) + lt(e,i) * ge(f,i4) * ge(h,i5) + lt(e,g) + lt(e,c) ) ); +#endif +#ifdef CORNER_D + vec4 c1 = i4.yzwx; + vec4 g0 = i5.wxyz; + interp_restriction_lv1 = (interp_restriction_lv0 * ( ge(f,b) * ge(h,d) + lt(e,i) * ge(f,i4) * ge(h,i5) + lt(e,g) + lt(e,c) ) * (ne(f,f4) * ne(f,i) + ne(h,h5) * ne(h,i) + ne(h,g) + ne(f,c) + lt(b,c1) * lt(d,g0))); +#endif +#ifdef CORNER_C + interp_restriction_lv1 = (interp_restriction_lv0 * ( ge(f,b) * ge(f,c) + ge(h,d) * ge(h,g) + lt(e,i) * (ge(f,f4) * ge(f,i4) + ge(h,h5) * ge(h,i5)) + lt(e,g) + lt(e,c)) ); +#endif + + vec4 interp_restriction_lv2_left = (ne(e,g) * ne(d,g)); + vec4 interp_restriction_lv2_up = (ne(e,c) * ne(b,c)); + + vec4 fx45i = saturate((fx + delta -Co - Ci) / (2.0 * delta )); + vec4 fx45 = saturate((fx + delta -Co ) / (2.0 * delta )); + vec4 fx30 = saturate((fx_left + deltaL -Cx ) / (2.0 * deltaL)); + vec4 fx60 = saturate((fx_up + deltaU -Cy ) / (2.0 * deltaU)); + + vec4 wd1 = weighted_distance( e, c, g, i, h5, f4, h, f); + vec4 wd2 = weighted_distance( h, d, i5, f, i4, b, e, i); + + vec4 one = vec4(1.0, 1.0, 1.0, 1.0); + vec4 zero = vec4(0.0, 0.0, 0.0, 0.0); + vec4 edri = le(wd1,wd2) * interp_restriction_lv0; + vec4 edr = lt(wd1,wd2) * interp_restriction_lv1; +#ifdef CORNER_A + edr = clamp(edr * ((one - edri.yzwx) + (one - edri.wxyz)), 0.0, 1.0); + vec4 edr_left = le(XBR_LV2_COEFFICIENT.xxxx * df(f,g), df(h,c)) * interp_restriction_lv2_left * edr * (one - edri.yzwx) * eq(e,c); + vec4 edr_up = ge(df(f,g), XBR_LV2_COEFFICIENT.xxxx * df(h,c)) * interp_restriction_lv2_up * edr * (one - edri.wxyz) * eq(e,g); +#endif +#ifndef CORNER_A + vec4 edr_left = le(XBR_LV2_COEFFICIENT.xxxx * df(f,g), df(h,c)) * interp_restriction_lv2_left * edr; + vec4 edr_up = ge(df(f,g), XBR_LV2_COEFFICIENT.xxxx * df(h,c)) * interp_restriction_lv2_up * edr; +#endif + + fx45 = edr * fx45; + fx30 = edr_left * fx30; + fx60 = edr_up * fx60; + fx45i = edri * fx45i; + + vec4 px = le(df(e,f), df(e,h)); + + vec4 maximos = max(max(fx30, fx60), max(fx45, fx45i)); + + vec3 res1 = E.xyz; + res1 = mix(res1, mix(H.xyz, F.xyz, px.x), maximos.x); + res1 = mix(res1, mix(B.xyz, D.xyz, px.z), maximos.z); + + vec3 res2 = E.xyz; + res2 = mix(res2, mix(F.xyz, B.xyz, px.y), maximos.y); + res2 = mix(res2, mix(D.xyz, H.xyz, px.w), maximos.w); + + vec3 E_mix = (c_df(E.xyz, res2) >= c_df(E.xyz, res1)) ? one.xyz : zero.xyz; + vec3 res = mix(res1, res2, E_mix); + + gl_FragColor = vec4(res, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_custom-jinc2-sharper.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_custom-jinc2-sharper.sc new file mode 100644 index 00000000000..0abd7ff41c9 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_custom-jinc2-sharper.sc @@ -0,0 +1,134 @@ +$input v_texcoord0, v_color0 + +// license:GPL-2.0+ +// copyright-holders:Hyllian + +/* + Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader + + Copyright (C) 2011-2014 Hyllian/Jararaca - sergiogdb@gmail.com +*/ + +#include "common.sh" + +uniform vec4 JINC2_WINDOW_SINC; +uniform vec4 JINC2_SINC; +uniform vec4 JINC2_AR_STRENGTH; +uniform vec4 u_tex_size0; + +SAMPLER2D(s_p, 0); + + /* + This is an approximation of Jinc(x)*Jinc(x*r1/r2) for x < 2.5, + where r1 and r2 are the first two zeros of jinc function. + For a jinc 2-lobe best approximation, use A=0.5 and B=0.825. + */ + +// A=0.5, B=0.825 is the best jinc approximation for x<2.5. if B=1.0, it's a lanczos filter. +// Increase A to get more blur. Decrease it to get a sharper picture. +// B = 0.825 to get rid of dithering. Increase B to get a fine sharpness, though dithering returns. + +#define halfpi 1.5707963267948966192313216916398 +#define pi 3.1415926535897932384626433832795 +#define wa (JINC2_WINDOW_SINC.x * pi) +#define wb (JINC2_SINC.x * pi) + +float df(float A, float B) +{ + return abs(A-B); +} + +// Calculates the distance between two points +float d(vec2 pt1, vec2 pt2) +{ + vec2 v = pt2 - pt1; + return sqrt(dot(v,v)); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +vec4 resampler(vec4 x) +{ + float wawb = wa*wb; + vec4 wawb4 = vec4(wawb, wawb, wawb, wawb); + return (x == vec4(0.0, 0.0, 0.0, 0.0)) ? wawb4 : sin(x*wa) * sin(x*wb) / (x*x); +} + +void main() +{ + vec3 color; + mat4 weights; + + vec2 dx = vec2(1.0, 0.0); + vec2 dy = vec2(0.0, 1.0); + + vec2 pc = v_texcoord0 * u_tex_size0.xy; + + vec2 tc = (floor(pc - vec2(0.5,0.5)) + vec2(0.5,0.5)); + + weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy))); + weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx ))); + weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy))); + weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy))); + + //weights[0][0] = weights[0][3] = weights[3][0] = weights[3][3] = 0.0; + + dx = dx / u_tex_size0.xy; + dy = dy / u_tex_size0.xy; + tc = tc / u_tex_size0.xy; + + // reading the texels + + vec4 c00 = texture2D(s_p, tc -dx -dy); + vec4 c10 = texture2D(s_p, tc -dy); + vec4 c20 = texture2D(s_p, tc +dx -dy); + vec4 c30 = texture2D(s_p, tc+2.0*dx -dy); + vec4 c01 = texture2D(s_p, tc -dx ); + vec4 c11 = texture2D(s_p, tc ); + vec4 c21 = texture2D(s_p, tc +dx ); + vec4 c31 = texture2D(s_p, tc+2.0*dx ); + vec4 c02 = texture2D(s_p, tc -dx +dy); + vec4 c12 = texture2D(s_p, tc +dy); + vec4 c22 = texture2D(s_p, tc +dx +dy); + vec4 c32 = texture2D(s_p, tc+2.0*dx +dy); + vec4 c03 = texture2D(s_p, tc -dx+2.0*dy); + vec4 c13 = texture2D(s_p, tc +2.0*dy); + vec4 c23 = texture2D(s_p, tc +dx+2.0*dy); + vec4 c33 = texture2D(s_p, tc+2.0*dx+2.0*dy); + + color = mul(weights[0], mat4(c00, c10, c20, c30)).xyz; + color+= mul(weights[1], mat4(c01, c11, c21, c31)).xyz; + color+= mul(weights[2], mat4(c02, c12, c22, c32)).xyz; + color+= mul(weights[3], mat4(c03, c13, c23, c33)).xyz; + color = color / (dot(mul(weights, vec4(1.0, 1.0, 1.0, 1.0)), vec4(1.0, 1.0, 1.0, 1.0))); + + // Anti-ringing + // Get min/max samples + pc = v_texcoord0; + c00 = texture2D(s_p, pc ); + c11 = texture2D(s_p, pc +dx ); + c21 = texture2D(s_p, pc -dx ); + c12 = texture2D(s_p, pc +dy); + c22 = texture2D(s_p, pc -dy); + + vec4 min_sample = min4(c11, c21, c12, c22); + vec4 max_sample = max4(c11, c21, c12, c22); + min_sample = min(min_sample, c00); + max_sample = max(max_sample, c00); + + vec3 aux = color; + + color = clamp(color, min_sample.xyz, max_sample.xyz); + color = mix(aux, color, JINC2_AR_STRENGTH.xxx); + + // final sum and weight normalization + gl_FragColor = vec4(color, 1); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.sc new file mode 100644 index 00000000000..8fa47570af5 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.sc @@ -0,0 +1,227 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader - pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define XBR_RES 2.0 + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 2.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 fraction = fract(v_texcoord0 * u_tex_size0.xy / XBR_RES); + if (fraction.x < 0.5 || fraction.y < 0.5) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES) + vec2(0.5, 0.5)) * XBR_RES / u_tex_size0.xy; + + vec2 g1 = vec2(XBR_RES / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, XBR_RES / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -g1 -g2); + vec4 P1 = texture2D(s0, v_texcoord0 +2.0*g1 -g2); + vec4 P2 = texture2D(s0, v_texcoord0 -g1+2.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +2.0*g1+2.0*g2); + + vec4 B = texture2D(s0, v_texcoord0 -g2); + vec4 C = texture2D(s0, v_texcoord0 +g1-g2); + vec4 D = texture2D(s0, v_texcoord0 -g1 ); + vec4 E = texture2D(s0, v_texcoord0 ); + vec4 F = texture2D(s0, v_texcoord0 +g1 ); + vec4 G = texture2D(s0, v_texcoord0 -g1+g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1+g2); + + vec4 F4 = texture2D(s0, v_texcoord0 +2.0*g1 ); + vec4 I4 = texture2D(s0, v_texcoord0 +g2+2.0*g1 ); + vec4 H5 = texture2D(s0, v_texcoord0 +2.0*g2 ); + vec4 I5 = texture2D(s0, v_texcoord0 +2.0*g2+g1 ); + + vec4 F6 = texture2D(s0, tex + g1 + 0.25 * g1 + 0.25 * g2); + vec4 F7 = texture2D(s0, tex + g1 + 0.25 * g1 - 0.25 * g2); + vec4 F8 = texture2D(s0, tex + g1 - 0.25 * g1 - 0.25 * g2); + vec4 F9 = texture2D(s0, tex + g1 - 0.25 * g1 + 0.25 * g2); + + vec4 H6 = texture2D(s0, tex + 0.25 * g1 + 0.25 * g2 + g2); + vec4 H7 = texture2D(s0, tex + 0.25 * g1 - 0.25 * g2 + g2); + vec4 H8 = texture2D(s0, tex - 0.25 * g1 - 0.25 * g2 + g2); + vec4 H9 = texture2D(s0, tex - 0.25 * g1 + 0.25 * g2 + g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1)).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3)).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4( E, F, H, I ) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4( E, F, H, I ) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : E.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.sc new file mode 100644 index 00000000000..72009ad3335 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.sc @@ -0,0 +1,211 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader - pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define XBR_RES 2.0 + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 4.0 +#define wp5 0.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.75068 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.29633 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + +float RGBtoYUV(vec4 color) +{ + return dot(color, vec4(0.2126, 0.7152, 0.0722, 0.0)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + // Skip pixels on wrong grid + vec2 dir = fract(v_texcoord0 * u_tex_size0.xy / XBR_RES) - vec2(0.5, 0.5); + if ((dir.x * dir.y) > 0.0) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES) + vec2(0.5, 0.5)) * XBR_RES / u_tex_size0.xy; + + vec2 g1 = vec2((XBR_RES / 2.0) / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, (XBR_RES / 2.0) / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -3.0*g1 ); + vec4 P1 = texture2D(s0, v_texcoord0 -3.0*g2); + vec4 P2 = texture2D(s0, v_texcoord0 +3.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +3.0*g1 ); + + vec4 B = texture2D(s0, v_texcoord0 -2.0*g1 -g2); + vec4 C = texture2D(s0, v_texcoord0 -g1 -2.0*g2); + vec4 D = texture2D(s0, v_texcoord0 -2.0*g1 +g2); + vec4 E = texture2D(s0, v_texcoord0 -g1 ); + vec4 F = texture2D(s0, v_texcoord0 -g2); + vec4 G = texture2D(s0, v_texcoord0 -g1 +2.0*g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1 ); + + vec4 F4 = texture2D(s0,v_texcoord0 +g1 -2.0*g2); + vec4 I4 = texture2D(s0,v_texcoord0 +2.0*g1 -g2); + vec4 H5 = texture2D(s0,v_texcoord0 +g1 +2.0*g2); + vec4 I5 = texture2D(s0,v_texcoord0 +2.0*g1 +g2); + + vec3 A = texture2D(s0, v_texcoord0).xyz; + + g1 *= 2.0; + g2 *= 2.0; + + vec4 F6 = texture2D(ORIG_texture, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(ORIG_texture, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(ORIG_texture, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(ORIG_texture, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(ORIG_texture, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(ORIG_texture, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(ORIG_texture, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(ORIG_texture, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1)).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3)).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4( E, F, H, I ) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4( E, F, H, I ) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : A; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.sc new file mode 100644 index 00000000000..c2656424ed6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.sc @@ -0,0 +1,213 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader - pass2 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define XBR_RES 2.0 + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 0.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + + +float RGBtoYUV(vec4 color) +{ + return dot(color, vec4(0.2126, 0.7152, 0.0722, 0.0)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES) + vec2(0.5, 0.5)) * XBR_RES / u_tex_size0.xy; + + vec2 g1 = vec2(XBR_RES / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, XBR_RES / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord1.xy); + vec4 P1 = texture2D(s0, v_texcoord1.zy); + vec4 P2 = texture2D(s0, v_texcoord1.xw); + vec4 P3 = texture2D(s0, v_texcoord1.zw); + + vec4 B = texture2D(s0, v_texcoord2.xy); + vec4 C = texture2D(s0, v_texcoord2.zy); + vec4 H5 = texture2D(s0, v_texcoord2.xw); + vec4 I5 = texture2D(s0, v_texcoord2.zw); + + vec4 D = texture2D(s0, v_texcoord3.xy); + vec4 F4 = texture2D(s0, v_texcoord3.zy); + vec4 G = texture2D(s0, v_texcoord3.xw); + vec4 I4 = texture2D(s0, v_texcoord3.zw); + + vec4 E = texture2D(s0, v_texcoord4.xy); + vec4 F = texture2D(s0, v_texcoord4.zy); + vec4 H = texture2D(s0, v_texcoord4.xw); + vec4 I = texture2D(s0, v_texcoord4.zw); + + vec4 A = texture2D(s0, v_texcoord0); + + vec4 F6 = texture2D(ORIG_texture, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(ORIG_texture, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(ORIG_texture, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(ORIG_texture, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(ORIG_texture, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(ORIG_texture, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(ORIG_texture, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(ORIG_texture, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV(B); + float c = RGBtoYUV(C); + float d = RGBtoYUV(D); + float e = RGBtoYUV(E); + float f = RGBtoYUV(F); + float g = RGBtoYUV(G); + float h = RGBtoYUV(H); + float i = RGBtoYUV(I); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1)).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3)).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4( E, F, H, I ) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4( E, F, H, I ) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : A.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.sc new file mode 100644 index 00000000000..8a56a3899a6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.sc @@ -0,0 +1,217 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass0 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 2.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define XBR_RES 4.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 fraction = fract(v_texcoord0 * u_tex_size0.xy / XBR_RES); + if (fraction.x < 0.5 || fraction.y < 0.5) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES) + vec2(0.5, 0.5)) * XBR_RES / u_tex_size0.xy; + + vec2 g1 = vec2(XBR_RES / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, XBR_RES / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -g1 -g2); + vec4 P1 = texture2D(s0, v_texcoord0 +2.0*g1 -g2); + vec4 P2 = texture2D(s0, v_texcoord0 -g1+2.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +2.0*g1+2.0*g2); + + vec4 B = texture2D(s0, v_texcoord0 -g2); + vec4 C = texture2D(s0, v_texcoord0 +g1-g2); + vec4 D = texture2D(s0, v_texcoord0 -g1 ); + vec4 E = texture2D(s0, v_texcoord0 ); + vec4 F = texture2D(s0, v_texcoord0 +g1 ); + vec4 G = texture2D(s0, v_texcoord0 -g1+g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1+g2); + + vec4 F4 = texture2D(s0,v_texcoord0 +2.0*g1 ); + vec4 I4 = texture2D(s0,v_texcoord0 +g2+2.0*g1 ); + vec4 H5 = texture2D(s0,v_texcoord0 +2.0*g2 ); + vec4 I5 = texture2D(s0,v_texcoord0 +2.0*g2+g1 ); + + vec4 F6 = texture2D(s0, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(s0, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(s0, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(s0, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(s0, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(s0, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(s0, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(s0, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : E.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.sc new file mode 100644 index 00000000000..10288b45f5a --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.sc @@ -0,0 +1,210 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass1 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 4.0 +#define wp5 0.0 +#define wp6 0.0 + +#define XBR_RES 4.0 + +#define weight1 (XBR_WEIGHT.x * 1.75068 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.29633 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 dir = fract(v_texcoord0 * u_tex_size0.xy / XBR_RES) - vec2(0.5, 0.5); + if ((dir.x * dir.y) > 0.0) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 tex = (floor(v_texcoord0*u_tex_size0.xy / XBR_RES) + vec2(0.5, 0.5)) * XBR_RES / u_tex_size0.xy; + + vec2 g1 = vec2((XBR_RES/2.0)/u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, (XBR_RES/2.0)/u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -3.0*g1 ); + vec4 P1 = texture2D(s0, v_texcoord0 -3.0*g2); + vec4 P2 = texture2D(s0, v_texcoord0 +3.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +3.0*g1 ); + + vec4 B = texture2D(s0, v_texcoord0 -2.0*g1 -g2); + vec4 C = texture2D(s0, v_texcoord0 -g1 -2.0*g2); + vec4 D = texture2D(s0, v_texcoord0 -2.0*g1 +g2); + vec4 E = texture2D(s0, v_texcoord0 -g1 ); + vec4 F = texture2D(s0, v_texcoord0 -g2); + vec4 G = texture2D(s0, v_texcoord0 -g1 +2.0*g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1 ); + + vec4 F4 = texture2D(s0,v_texcoord0 +g1 -2.0*g2); + vec4 I4 = texture2D(s0,v_texcoord0 +2.0*g1 -g2); + vec4 H5 = texture2D(s0,v_texcoord0 +g1 +2.0*g2); + vec4 I5 = texture2D(s0,v_texcoord0 +2.0*g1 +g2); + + vec4 A = texture2D(s0, v_texcoord0); + + g1 *= 2.0; + g2 *= 2.0; + + vec4 F6 = texture2D(ORIG_texture, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(ORIG_texture, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(ORIG_texture, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(ORIG_texture, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(ORIG_texture, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(ORIG_texture, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(ORIG_texture, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(ORIG_texture, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : A.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.sc new file mode 100644 index 00000000000..51f2c6ea887 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.sc @@ -0,0 +1,211 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass1 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define XBR_RES 4.0 + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 0.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES) + vec2(0.5, 0.5)) * XBR_RES / u_tex_size0.xy; + + vec2 g1 = vec2(XBR_RES / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, XBR_RES / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord1.xy); + vec4 P1 = texture2D(s0, v_texcoord1.zy); + vec4 P2 = texture2D(s0, v_texcoord1.xw); + vec4 P3 = texture2D(s0, v_texcoord1.zw); + + vec4 B = texture2D(s0, v_texcoord2.xy); + vec4 C = texture2D(s0, v_texcoord2.zy); + vec4 H5 = texture2D(s0, v_texcoord2.xw); + vec4 I5 = texture2D(s0, v_texcoord2.zw); + + vec4 D = texture2D(s0, v_texcoord3.xy); + vec4 F4 = texture2D(s0, v_texcoord3.zy); + vec4 G = texture2D(s0, v_texcoord3.xw); + vec4 I4 = texture2D(s0, v_texcoord3.zw); + + vec4 E = texture2D(s0, v_texcoord4.xy); + vec4 F = texture2D(s0, v_texcoord4.zy); + vec4 H = texture2D(s0, v_texcoord4.xw); + vec4 I = texture2D(s0, v_texcoord4.zw); + + vec4 A = texture2D(s0, v_texcoord0); + + vec4 F6 = texture2D(ORIG_texture, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(ORIG_texture, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(ORIG_texture, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(ORIG_texture, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(ORIG_texture, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(ORIG_texture, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(ORIG_texture, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(ORIG_texture, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : A.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.sc new file mode 100644 index 00000000000..f1566381325 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.sc @@ -0,0 +1,226 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass2 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 2.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define XBR_RES2 2.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 fraction = fract(v_texcoord0 * u_tex_size0.xy / XBR_RES2); + if (fraction.x < 0.5 || fraction.y < 0.5) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES2) + vec2(0.5, 0.5)) * XBR_RES2 / u_tex_size0.xy; + + vec2 g1 = vec2(XBR_RES2 / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, XBR_RES2 / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -g1 -g2); + vec4 P1 = texture2D(s0, v_texcoord0 +2.0*g1 -g2); + vec4 P2 = texture2D(s0, v_texcoord0 -g1+2.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +2.0*g1+2.0*g2); + + vec4 B = texture2D(s0, v_texcoord0 -g2); + vec4 C = texture2D(s0, v_texcoord0 +g1-g2); + vec4 D = texture2D(s0, v_texcoord0 -g1 ); + vec4 E = texture2D(s0, v_texcoord0 ); + vec4 F = texture2D(s0, v_texcoord0 +g1 ); + vec4 G = texture2D(s0, v_texcoord0 -g1+g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1+g2); + + vec4 F4 = texture2D(s0,v_texcoord0 +2.0*g1 ); + vec4 I4 = texture2D(s0,v_texcoord0 +g2+2.0*g1 ); + vec4 H5 = texture2D(s0,v_texcoord0 +2.0*g2 ); + vec4 I5 = texture2D(s0,v_texcoord0 +2.0*g2+g1 ); + + vec4 F6 = texture2D(s0, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(s0, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(s0, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(s0, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(s0, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(s0, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(s0, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(s0, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : E.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.sc new file mode 100644 index 00000000000..3aa921a0e37 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.sc @@ -0,0 +1,210 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass3 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 4.0 +#define wp5 0.0 +#define wp6 0.0 + +#define XBR_RES2 2.0 + +#define weight1 (XBR_WEIGHT.x * 1.75068 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.29633 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 dir = fract(v_texcoord0 * u_tex_size0.xy / XBR_RES2) - vec2(0.5, 0.5); + if ((dir.x * dir.y) > 0.0) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES2) + vec2(0.5, 0.5)) * XBR_RES2 / u_tex_size0.xy; + + vec2 g1 = vec2((XBR_RES2 / 2.0) / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, (XBR_RES2 / 2.0) / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -3.0*g1 ); + vec4 P1 = texture2D(s0, v_texcoord0 -3.0*g2); + vec4 P2 = texture2D(s0, v_texcoord0 +3.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +3.0*g1 ); + + vec4 B = texture2D(s0, v_texcoord0 -2.0*g1 -g2); + vec4 C = texture2D(s0, v_texcoord0 -g1 -2.0*g2); + vec4 D = texture2D(s0, v_texcoord0 -2.0*g1 +g2); + vec4 E = texture2D(s0, v_texcoord0 -g1 ); + vec4 F = texture2D(s0, v_texcoord0 -g2); + vec4 G = texture2D(s0, v_texcoord0 -g1 +2.0*g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1 ); + + vec4 F4 = texture2D(s0,v_texcoord0 +g1 -2.0*g2); + vec4 I4 = texture2D(s0,v_texcoord0 +2.0*g1 -g2); + vec4 H5 = texture2D(s0,v_texcoord0 +g1 +2.0*g2); + vec4 I5 = texture2D(s0,v_texcoord0 +2.0*g1 +g2); + + vec4 A = texture2D(s0, v_texcoord0); + + g1 *= 2.0; + g2 *= 2.0; + + vec4 F6 = texture2D(ORIG_texture, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(ORIG_texture, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(ORIG_texture, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(ORIG_texture, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(ORIG_texture, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(ORIG_texture, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(ORIG_texture, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(ORIG_texture, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : A.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.sc new file mode 100644 index 00000000000..b417613a657 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.sc @@ -0,0 +1,211 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super 4XBR 3D Shader - pass3 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define XBR_RES 2.0 + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 0.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +vec4 reduce4(vec4 A, vec4 B, vec4 C, vec4 D) +{ + return mul(mat4(A, B, C, D), vec4(65536.0, 255.0, 1.0, 0.0)); +} + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +bool eq(float A, float B) +{ + return (df(A, B) < 15.0); +} + + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + vec2 tex = (floor(v_texcoord0 * u_tex_size0.xy / XBR_RES) + vec2(0.5, 0.5)) * XBR_RES / u_tex_size0.xy; + + vec2 g1 = vec2(XBR_RES / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, XBR_RES / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord1.xy); + vec4 P1 = texture2D(s0, v_texcoord1.zy); + vec4 P2 = texture2D(s0, v_texcoord1.xw); + vec4 P3 = texture2D(s0, v_texcoord1.zw); + + vec4 B = texture2D(s0, v_texcoord2.xy); + vec4 C = texture2D(s0, v_texcoord2.zy); + vec4 H5 = texture2D(s0, v_texcoord2.xw); + vec4 I5 = texture2D(s0, v_texcoord2.zw); + + vec4 D = texture2D(s0, v_texcoord3.xy); + vec4 F4 = texture2D(s0, v_texcoord3.zy); + vec4 G = texture2D(s0, v_texcoord3.xw); + vec4 I4 = texture2D(s0, v_texcoord3.zw); + + vec4 E = texture2D(s0, v_texcoord4.xy); + vec4 F = texture2D(s0, v_texcoord4.zy); + vec4 H = texture2D(s0, v_texcoord4.xw); + vec4 I = texture2D(s0, v_texcoord4.zw); + + vec4 A = texture2D(s0, v_texcoord0); + + vec4 F6 = texture2D(ORIG_texture, tex +g1+0.25*g1+0.25*g2); + vec4 F7 = texture2D(ORIG_texture, tex +g1+0.25*g1-0.25*g2); + vec4 F8 = texture2D(ORIG_texture, tex +g1-0.25*g1-0.25*g2); + vec4 F9 = texture2D(ORIG_texture, tex +g1-0.25*g1+0.25*g2); + + vec4 H6 = texture2D(ORIG_texture, tex +0.25*g1+0.25*g2+g2); + vec4 H7 = texture2D(ORIG_texture, tex +0.25*g1-0.25*g2+g2); + vec4 H8 = texture2D(ORIG_texture, tex -0.25*g1-0.25*g2+g2); + vec4 H9 = texture2D(ORIG_texture, tex -0.25*g1+0.25*g2+g2); + + vec4 f0 = reduce4(F6, F7, F8, F9); + vec4 h0 = reduce4(H6, H7, H8, H9); + + bool block_3d = (f0.x == f0.y && f0.y == f0.z && f0.z == f0.w && h0.x == h0.y && h0.y == h0.z && h0.z == h0.w); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + bool ir_lv1 = (((e!=f) && (e!=h)) && ( !eq(f,b) && !eq(f,c) || !eq(h,d) && !eq(h,g) || eq(e,i) && (!eq(f,f4) && !eq(f,i4) || !eq(h,h5) && !eq(h,i5)) || eq(e,g) || eq(e,c)) ); + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); + + color = block_3d ? color : A.xyz; + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.sc new file mode 100644 index 00000000000..84fc371a0a7 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.sc @@ -0,0 +1,169 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass0 ******* + + Copyright (c) 2015 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 2.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight (XBR_WEIGHT.x * 1.29633 / 10.0) + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 pix_frac = fract(v_texcoord0 * u_tex_size0.xy); + if (pix_frac.x < 0.5 || pix_frac.y < 0.5) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 g1 = vec2(1.0 / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, 1.0 / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -g1 -g2); + vec4 P1 = texture2D(s0, v_texcoord0 +2.0*g1 -g2); + vec4 P2 = texture2D(s0, v_texcoord0 -g1+2.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +2.0*g1+2.0*g2); + + vec4 B = texture2D(s0, v_texcoord0 -g2); + vec4 C = texture2D(s0, v_texcoord0 +g1-g2); + vec4 D = texture2D(s0, v_texcoord0 -g1 ); + vec4 E = texture2D(s0, v_texcoord0 ); + vec4 F = texture2D(s0, v_texcoord0 +g1 ); + vec4 G = texture2D(s0, v_texcoord0 -g1+g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1+g2); + + vec4 F4 = texture2D(s0,v_texcoord0 +2.0*g1 ); + vec4 I4 = texture2D(s0,v_texcoord0 +g2+2.0*g1 ); + vec4 H5 = texture2D(s0,v_texcoord0 +2.0*g2 ); + vec4 I5 = texture2D(s0,v_texcoord0 +2.0*g2+g1 ); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(-limits, limits, d_edge); + + /* Filter weights. Two taps only. */ + vec4 w = vec4(-weight, weight+0.5, weight+0.5, -weight); + + /* Filtering and normalization in two directions generating two colors. */ + vec3 c1 = mul(w, mat4(P2, H, F, P1)).xyz; + vec3 c2 = mul(w, mat4(P0, E, I, P3)).xyz; + + /* Smoothly blends the two directions according to edge strength. */ + vec3 color = mix(c1, c2, vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); +// color = mix(aux, color, 1-2.0*abs(edge_strength-0.5)); + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.sc new file mode 100644 index 00000000000..d67c215de66 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.sc @@ -0,0 +1,159 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass1 ******* + + Copyright (c) 2015 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 4.0 +#define wp5 0.0 +#define wp6 0.0 + +#define weight (XBR_WEIGHT.x * 1.75068 / 10.0) + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 dir = fract(v_texcoord0 * u_tex_size0.xy / 2.0) - vec2(0.5, 0.5); + if ((dir.x * dir.y) > 0.0) + { + gl_FragColor = texture2D(s0, v_texcoord0); + return; + } + + vec2 g1 = vec2(1.0 / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, 1.0 / u_tex_size0.y); + + vec4 P0 = texture2D(s0, v_texcoord0 -3.0*g1 ); + vec4 P1 = texture2D(s0, v_texcoord0 -3.0*g2); + vec4 P2 = texture2D(s0, v_texcoord0 +3.0*g2); + vec4 P3 = texture2D(s0, v_texcoord0 +3.0*g1 ); + + vec4 B = texture2D(s0, v_texcoord0 -2.0*g1 -g2); + vec4 C = texture2D(s0, v_texcoord0 -g1 -2.0*g2); + vec4 D = texture2D(s0, v_texcoord0 -2.0*g1 +g2); + vec4 E = texture2D(s0, v_texcoord0 -g1 ); + vec4 F = texture2D(s0, v_texcoord0 -g2); + vec4 G = texture2D(s0, v_texcoord0 -g1 +2.0*g2); + vec4 H = texture2D(s0, v_texcoord0 +g2); + vec4 I = texture2D(s0, v_texcoord0 +g1 ); + + vec4 F4 = texture2D(s0,v_texcoord0 +g1 -2.0*g2); + vec4 I4 = texture2D(s0,v_texcoord0 +2.0*g1 -g2); + vec4 H5 = texture2D(s0,v_texcoord0 +g1 +2.0*g2); + vec4 I5 = texture2D(s0,v_texcoord0 +2.0*g1 +g2); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(-limits, limits, d_edge); + + /* Filter weights. Two taps only. */ + vec4 w = vec4(-weight, weight+0.5, weight+0.5, -weight); + + /* Filtering and normalization in two directions generating two colors. */ + vec3 c1 = mul(w, mat4(P2, H, F, P1)).xyz; + vec3 c2 = mul(w, mat4(P0, E, I, P3)).xyz; + + /* Smoothly blends the two directions according to edge strength. */ + vec3 color = mix(c1, c2, vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec4 min_sample = min4( E, F, H, I ) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4( E, F, H, I ) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); +// color = mix(aux, color, 1-2.0*abs(edge_strength-0.5)); + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.sc new file mode 100644 index 00000000000..89e82d00a31 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.sc @@ -0,0 +1,162 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass1 ******* + + Copyright (c) 2015 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 0.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight (XBR_WEIGHT.x * 1.29633 / 10.0) + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + vec2 g1 = vec2(1.0 / u_tex_size0.x, 0.0); + vec2 g2 = vec2(0.0, 1.0 / u_tex_size0.y); + vec2 texcoord = v_texcoord0 - 1.0 / u_tex_size0.xy; + + vec4 P0 = texture2D(s0, texcoord -g1 -g2); + vec4 P1 = texture2D(s0, texcoord +2.0*g1 -g2); + vec4 P2 = texture2D(s0, texcoord -g1+2.0*g2); + vec4 P3 = texture2D(s0, texcoord +2.0*g1+2.0*g2); + + vec4 B = texture2D(s0, texcoord -g2); + vec4 C = texture2D(s0, texcoord +g1-g2); + vec4 D = texture2D(s0, texcoord -g1 ); + vec4 E = texture2D(s0, texcoord ); + vec4 F = texture2D(s0, texcoord +g1 ); + vec4 G = texture2D(s0, texcoord -g1+g2); + vec4 H = texture2D(s0, texcoord +g2); + vec4 I = texture2D(s0, texcoord +g1+g2); + + vec4 F4 = texture2D(s0,texcoord +2.0*g1 ); + vec4 I4 = texture2D(s0,texcoord +g2+2.0*g1 ); + vec4 H5 = texture2D(s0,texcoord +2.0*g2 ); + vec4 I5 = texture2D(s0,texcoord +2.0*g2+g1 ); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(-limits, limits, d_edge); + + /* Filter weights. Two taps only. */ + vec4 w = vec4(-weight, weight+0.5, weight+0.5, -weight); + + /* Filtering and normalization in two directions generating two colors. */ + vec3 c1 = mul(w, mat4(P2, H, F, P1)).xyz; + vec3 c2 = mul(w, mat4(P0, E, I, P3)).xyz; + + /* Smoothly blends the two directions according to edge strength. */ + vec3 color = mix(c1, c2, vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec4 min_sample = min4( E, F, H, I ) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4( E, F, H, I ) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + + color = clamp(color, min_sample.xyz, max_sample.xyz); +// color = mix(aux, color, 1-2.0*abs(edge_strength-0.5)); + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass0.sc new file mode 100644 index 00000000000..a1158ebecca --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass0.sc @@ -0,0 +1,160 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass0 ******* + + Copyright (c) 2015 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 2.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + vec4 P0 = texture2D(s0, v_texcoord1.xy); + vec4 P1 = texture2D(s0, v_texcoord1.zy); + vec4 P2 = texture2D(s0, v_texcoord1.xw); + vec4 P3 = texture2D(s0, v_texcoord1.zw); + + vec4 B = texture2D(s0, v_texcoord2.xy); + vec4 C = texture2D(s0, v_texcoord2.zy); + vec4 H5 = texture2D(s0, v_texcoord2.xw); + vec4 I5 = texture2D(s0, v_texcoord2.zw); + + vec4 D = texture2D(s0, v_texcoord3.xy); + vec4 F4 = texture2D(s0, v_texcoord3.zy); + vec4 G = texture2D(s0, v_texcoord3.xw); + vec4 I4 = texture2D(s0, v_texcoord3.zw); + + vec4 E = texture2D(s0, v_texcoord4.xy); + vec4 F = texture2D(s0, v_texcoord4.zy); + vec4 H = texture2D(s0, v_texcoord4.xw); + vec4 I = texture2D(s0, v_texcoord4.zw); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + color = clamp(color, min_sample.xyz, max_sample.xyz); + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass1.sc new file mode 100644 index 00000000000..421fc78b58c --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass1.sc @@ -0,0 +1,178 @@ +$input v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass1 ******* + + Copyright (c) 2015 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); +SAMPLER2D(ORIG_texture, 1); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 4.0 +#define wp5 0.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.75068 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.29633 / 10.0 / 2.0) + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + //Skip pixels on wrong grid + vec2 fp = fract(v_texcoord0 * u_tex_size0.xy); + vec2 dir = fp - vec2(0.5,0.5); + if ((dir.x * dir.y) > 0.0) + { + if (fp.x > 0.5) + { + gl_FragColor = texture2D(s0, v_texcoord0); + } + else + { + gl_FragColor = texture2D(ORIG_texture, v_texcoord0); + } + return; + } + + vec2 g1 = (fp.x > 0.5) ? vec2(0.5 / u_tex_size0.x, 0.0) : vec2(0.0, 0.5 / u_tex_size0.y); + vec2 g2 = (fp.x > 0.5) ? vec2(0.0, 0.5 / u_tex_size0.y) : vec2(0.5 / u_tex_size0.x, 0.0); + + vec4 P0 = texture2D(ORIG_texture, v_texcoord0 -3.0*g1 ); + vec4 P1 = texture2D( s0, v_texcoord0 -3.0*g2); + vec4 P2 = texture2D( s0, v_texcoord0 +3.0*g2); + vec4 P3 = texture2D(ORIG_texture, v_texcoord0 +3.0*g1 ); + + vec4 B = texture2D( s0, v_texcoord0 -2.0*g1 -g2); + vec4 C = texture2D(ORIG_texture, v_texcoord0 -g1 -2.0*g2); + vec4 D = texture2D( s0, v_texcoord0 -2.0*g1 +g2); + vec4 E = texture2D(ORIG_texture, v_texcoord0 -g1 ); + vec4 F = texture2D( s0, v_texcoord0 -g2); + vec4 G = texture2D(ORIG_texture, v_texcoord0 -g1 +2.0*g2); + vec4 H = texture2D( s0, v_texcoord0 +g2); + vec4 I = texture2D(ORIG_texture, v_texcoord0 +g1 ); + + vec4 F4 = texture2D(ORIG_texture, v_texcoord0 +g1 -2.0*g2); + vec4 I4 = texture2D( s0, v_texcoord0 +2.0*g1 -g2); + vec4 H5 = texture2D(ORIG_texture, v_texcoord0 +g1 +2.0*g2); + vec4 I5 = texture2D( s0, v_texcoord0 +2.0*g1 +g2); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + color = clamp(color, min_sample.xyz, max_sample.xyz); + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass2.sc new file mode 100644 index 00000000000..c343dc155a2 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass2.sc @@ -0,0 +1,170 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass1 ******* + + Copyright (c) 2015 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +SAMPLER2D(s0, 0); + +uniform vec4 XBR_EDGE_STR; +uniform vec4 XBR_WEIGHT; +uniform vec4 XBR_ANTI_RINGING; +uniform vec4 u_tex_size0; + +#define wp1 1.0 +#define wp2 0.0 +#define wp3 0.0 +#define wp4 0.0 +#define wp5 -1.0 +#define wp6 0.0 + +#define weight1 (XBR_WEIGHT.x * 1.29633 / 10.0) +#define weight2 (XBR_WEIGHT.x * 1.75068 / 10.0 / 2.0) + +float RGBtoYUV(vec4 color) +{ + return dot(color.xyz, vec3(0.2126, 0.7152, 0.0722)); +} + +float df(float A, float B) +{ + return abs(A-B); +} + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + +float d_wd(float b0, float b1, float c0, float c1, float c2, float d0, float d1, float d2, float d3, float e1, float e2, float e3, float f2, float f3) +{ + return (wp1*(df(c1,c2) + df(c1,c0) + df(e2,e1) + df(e2,e3)) + wp2*(df(d2,d3) + df(d0,d1)) + wp3*(df(d1,d3) + df(d0,d2)) + wp4*df(d1,d2) + wp5*(df(c0,c2) + df(e1,e3)) + wp6*(df(b0,b1) + df(f2,f3))); +} + +float hv_wd(float i1, float i2, float i3, float i4, float e1, float e2, float e3, float e4) +{ + return ( wp4*(df(i1,i2)+df(i3,i4)) + wp1*(df(i1,e1)+df(i2,e2)+df(i3,e3)+df(i4,e4)) + wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); +} + +vec4 min4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return min(a, min(b, min(c, d))); +} + +vec4 max4(vec4 a, vec4 b, vec4 c, vec4 d) +{ + return max(a, max(b, max(c, d))); +} + +void main() +{ + vec4 P0 = texture2D(s0, v_texcoord1.xy); + vec4 P1 = texture2D(s0, v_texcoord1.zy); + vec4 P2 = texture2D(s0, v_texcoord1.xw); + vec4 P3 = texture2D(s0, v_texcoord1.zw); + + vec4 B = texture2D(s0, v_texcoord2.xy); + vec4 C = texture2D(s0, v_texcoord2.zy); + vec4 H5 = texture2D(s0, v_texcoord2.xw); + vec4 I5 = texture2D(s0, v_texcoord2.zw); + + vec4 D = texture2D(s0, v_texcoord3.xy); + vec4 F4 = texture2D(s0, v_texcoord3.zy); + vec4 G = texture2D(s0, v_texcoord3.xw); + vec4 I4 = texture2D(s0, v_texcoord3.zw); + + vec4 E = texture2D(s0, v_texcoord4.xy); + vec4 F = texture2D(s0, v_texcoord4.zy); + vec4 H = texture2D(s0, v_texcoord4.xw); + vec4 I = texture2D(s0, v_texcoord4.zw); + + float b = RGBtoYUV( B ); + float c = RGBtoYUV( C ); + float d = RGBtoYUV( D ); + float e = RGBtoYUV( E ); + float f = RGBtoYUV( F ); + float g = RGBtoYUV( G ); + float h = RGBtoYUV( H ); + float i = RGBtoYUV( I ); + + float i4 = RGBtoYUV( I4 ); float p0 = RGBtoYUV( P0 ); + float i5 = RGBtoYUV( I5 ); float p1 = RGBtoYUV( P1 ); + float h5 = RGBtoYUV( H5 ); float p2 = RGBtoYUV( P2 ); + float f4 = RGBtoYUV( F4 ); float p3 = RGBtoYUV( P3 ); + +/* + P1 + |P0|B |C |P1| C F4 |a0|b1|c2|d3| + |D |E |F |F4| B F I4 |b0|c1|d2|e3| |e1|i1|i2|e2| + |G |H |I |I4| P0 E A I P3 |c0|d1|e2|f3| |e3|i3|i4|e4| + |P2|H5|I5|P3| D H I5 |d0|e1|f2|g3| + G H5 + P2 +*/ + + + /* Calc edgeness in diagonal directions. */ + float d_edge = (d_wd( d, b, g, e, c, p2, h, f, p1, h5, i, f4, i5, i4 ) - d_wd( c, f4, b, f, i4, p0, e, i, p3, d, h, i5, g, h5 )); + + /* Calc edgeness in horizontal/vertical directions. */ + float hv_edge = (hv_wd(f, i, e, h, c, i5, b, h5) - hv_wd(e, f, h, i, d, f4, g, i4)); + + float limits = XBR_EDGE_STR.x + 0.000001; + float edge_strength = smoothstep(0.0, limits, abs(d_edge)); + + /* Filter weights. Two taps only. */ + vec4 w1 = vec4(-weight1, weight1+0.5, weight1+0.5, -weight1); + vec4 w2 = vec4(-weight2, weight2+0.25, weight2+0.25, -weight2); + + /* Filtering and normalization in four direction generating four colors. */ + vec3 c1 = mul(w1, mat4( P2, H, F, P1 )).xyz; + vec3 c2 = mul(w1, mat4( P0, E, I, P3 )).xyz; + vec3 c3 = mul(w2, mat4(D+G, E+H, F+I, F4+I4)).xyz; + vec3 c4 = mul(w2, mat4(C+B, F+E, I+H, I5+H5)).xyz; + + /* Smoothly blends the two strongest directions (one in diagonal and the other in vert/horiz direction). */ + vec4 d_mix = d_edge >= 0.0 ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0); + vec3 hv_mix = hv_edge >= 0.0 ? vec3(1.0, 1.0, 1.0) : vec3(0.0, 0.0, 0.0); + vec3 color = mix(mix(c1, c2, d_mix.xyz), mix(c3, c4, hv_mix), vec3(1.0, 1.0, 1.0) - vec3(edge_strength, edge_strength, edge_strength)); + + /* Anti-ringing code. */ + float anti_ring = 1.0 - XBR_ANTI_RINGING.x; + vec4 min_sample = min4(E, F, H, I) + anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + vec4 max_sample = max4(E, F, H, I) - anti_ring * mix((P2-H)*(F-P1), (P0-E)*(I-P3), d_mix); + color = clamp(color, min_sample.xyz, max_sample.xyz); + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/varying.def.sc new file mode 100644 index 00000000000..c65b5426733 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/varying.def.sc @@ -0,0 +1,10 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_custom-jinc2-sharper.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_custom-jinc2-sharper.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_custom-jinc2-sharper.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.sc new file mode 100644 index 00000000000..ae3b049b57a --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.sc @@ -0,0 +1,50 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR 3D Shader - pass2 ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xyxy + vec4(-2.0*dx, -2.0*dy, dx, dy); + v_texcoord2 = v_texcoord0.xyxy + vec4( -dx, -2.0*dy, 0.0, dy); + v_texcoord3 = v_texcoord0.xyxy + vec4(-2.0*dx, -dy, dx, 0.0); + v_texcoord4 = v_texcoord0.xyxy + vec4( -dx, -dy, 0.0, 0.0); + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.sc new file mode 100644 index 00000000000..c5bd41ee120 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.sc @@ -0,0 +1,24 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xyxy + vec4(-2.0*dx, -2.0*dy, dx, dy); + v_texcoord2 = v_texcoord0.xyxy + vec4( -dx, -2.0*dy, 0.0, dy); + v_texcoord3 = v_texcoord0.xyxy + vec4(-2.0*dx, -dy, dx, 0.0); + v_texcoord4 = v_texcoord0.xyxy + vec4( -dx, -dy, 0.0, 0.0); + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.sc new file mode 100644 index 00000000000..c5bd41ee120 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.sc @@ -0,0 +1,24 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xyxy + vec4(-2.0*dx, -2.0*dy, dx, dy); + v_texcoord2 = v_texcoord0.xyxy + vec4( -dx, -2.0*dy, 0.0, dy); + v_texcoord3 = v_texcoord0.xyxy + vec4(-2.0*dx, -dy, dx, 0.0); + v_texcoord4 = v_texcoord0.xyxy + vec4( -dx, -dy, 0.0, 0.0); + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.sc new file mode 100644 index 00000000000..67e2a4d6250 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.sc @@ -0,0 +1,40 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass0 vertex shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.sc new file mode 100644 index 00000000000..d76ec041199 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.sc @@ -0,0 +1,40 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass1 vertex shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.sc new file mode 100644 index 00000000000..579ee064622 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.sc @@ -0,0 +1,40 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass2 vertex shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass0.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass0.sc new file mode 100644 index 00000000000..f03cc46e2b7 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass0.sc @@ -0,0 +1,50 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass0 vertex shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xyxy + vec4(-dx, -dy, 2.0*dx, 2.0*dy); + v_texcoord2 = v_texcoord0.xyxy + vec4(0.0, -dy, dx, 2.0*dy); + v_texcoord3 = v_texcoord0.xyxy + vec4(-dx, 0.0, 2.0*dx, dy); + v_texcoord4 = v_texcoord0.xyxy + vec4(0.0, 0.0, dx, dy); + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass1.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass1.sc new file mode 100644 index 00000000000..67e2a4d6250 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass1.sc @@ -0,0 +1,40 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass0 vertex shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#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; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass2.sc new file mode 100644 index 00000000000..51ffe87fcaa --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass2.sc @@ -0,0 +1,50 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass0 vertex shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xyxy + vec4(-2.0*dx, -2.0*dy, dx, dy); + v_texcoord2 = v_texcoord0.xyxy + vec4( -dx, -2.0*dy, 0.0, dy); + v_texcoord3 = v_texcoord0.xyxy + vec4(-2.0*dx, -dy, dx, 0.0); + v_texcoord4 = v_texcoord0.xyxy + vec4( -dx, -dy, 0.0, 0.0); + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass3.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass3.sc new file mode 100644 index 00000000000..51ffe87fcaa --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass3.sc @@ -0,0 +1,50 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_color0 + +// license:MIT +// copyright-holders:Hyllian + +/* + + ******* Super XBR Shader - pass0 vertex shader ******* + + Copyright (c) 2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xyxy + vec4(-2.0*dx, -2.0*dy, dx, dy); + v_texcoord2 = v_texcoord0.xyxy + vec4( -dx, -2.0*dy, 0.0, dy); + v_texcoord3 = v_texcoord0.xyxy + vec4(-2.0*dx, -dy, dx, 0.0); + v_texcoord4 = v_texcoord0.xyxy + vec4( -dx, -dy, 0.0, 0.0); + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/varying.def.sc new file mode 100644 index 00000000000..92c3034f498 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/varying.def.sc @@ -0,0 +1,13 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord5 : TEXCOORD5 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord6 : TEXCOORD6 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord7 : TEXCOORD7 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv1-noblend.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv1-noblend.sc new file mode 100644 index 00000000000..3e97446a880 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv1-noblend.sc @@ -0,0 +1,22 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1.xy = vec2(0.0,-dy); // B + v_texcoord1.zw = vec2(-dx,0.0); // D + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-3d.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-3d.sc new file mode 100644 index 00000000000..476e11da6ea --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-3d.sc @@ -0,0 +1,23 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +uniform vec4 XBR_RES; + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = XBR_RES.xx / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = vec4(dx, 0, 0, dy); // F H + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-fast.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-fast.sc new file mode 100644 index 00000000000..38e92865308 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-fast.sc @@ -0,0 +1,29 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + // A1 B1 C1 + // A0 A B C C4 + // D0 D E F F4 + // G0 G H I I4 + // G5 H5 I5 + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, -dy); // A B C + v_texcoord2 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, 0.0); // D E F + v_texcoord3 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, dy); // G H I + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2.sc new file mode 100644 index 00000000000..ce6e411b75d --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2.sc @@ -0,0 +1,27 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4, v_texcoord5, v_texcoord6, v_texcoord7, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + + vec2 ps = 1.0 / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + v_texcoord1 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, -2.0*dy); // A1 B1 C1 + v_texcoord2 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, -dy); // A B C + v_texcoord3 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, 0.0); // D E F + v_texcoord4 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, dy); // G H I + v_texcoord5 = v_texcoord0.xxxy + vec4( -dx, 0.0, dx, 2.0*dy); // G5 H5 I5 + v_texcoord6 = v_texcoord0.xyyy + vec4(-2.0*dx, -dy, 0.0, dy); // A0 D0 G0 + v_texcoord7 = v_texcoord0.xyyy + vec4( 2.0*dx, -dy, 0.0, dy); // C4 F4 I4 + v_color0 = a_color0; +} From 0d980951c9dd3234d693b1ff5bb554ef1ca2ae5c Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 21 Apr 2016 15:44:46 +0200 Subject: [PATCH 08/16] set GIT_VERSION only where it is used (nw) --- scripts/genie.lua | 11 ----------- scripts/src/main.lua | 12 +++++++++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/scripts/genie.lua b/scripts/genie.lua index 8b7f32703c3..f290dfde9e9 100644 --- a/scripts/genie.lua +++ b/scripts/genie.lua @@ -520,17 +520,6 @@ if (_OPTIONS["SOURCES"] == nil) then dofile (path.join("target", _OPTIONS["target"],_OPTIONS["subtarget"] .. ".lua")) end - -if _OPTIONS["IGNORE_GIT"]~="1" then - GIT_VERSION = backtick( "git describe" ) - local p = string.find(GIT_VERSION, '-', 1) - if (p~=nil) then - defines { - "GIT_VERSION=" .. string.sub(GIT_VERSION,p+1) - } - end -end - configuration { "gmake" } flags { "SingleOutputDir", diff --git a/scripts/src/main.lua b/scripts/src/main.lua index 3a52b985411..3b07a69211c 100644 --- a/scripts/src/main.lua +++ b/scripts/src/main.lua @@ -136,7 +136,17 @@ end end configuration { } - + +if _OPTIONS["IGNORE_GIT"]~="1" then + GIT_VERSION = backtick( "git describe --dirty" ) + local p = string.find(GIT_VERSION, '-', 1) + if (p~=nil) then + defines { + "GIT_VERSION=" .. string.sub(GIT_VERSION,p+1) + } + end +end + if _OPTIONS["targetos"]=="android" then includedirs { MAME_DIR .. "3rdparty/SDL2/include", From b69d285eabeb6335fdbe06230dfd1a203650e05d Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 21 Apr 2016 15:49:12 +0200 Subject: [PATCH 09/16] works for sub folders of CHAIN folder specified (nw) --- src/osd/modules/render/bgfx/shaders/makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osd/modules/render/bgfx/shaders/makefile b/src/osd/modules/render/bgfx/shaders/makefile index 70c1ac31127..b0f955fe03e 100644 --- a/src/osd/modules/render/bgfx/shaders/makefile +++ b/src/osd/modules/render/bgfx/shaders/makefile @@ -4,11 +4,11 @@ BUILD_DIR=../../../../../../build include shader.mk -SUBDIRS := $(patsubst .,,$(patsubst ./,,$(shell find . -type d))) - ifneq ($(CHAIN),) -rebuild: chains/$(CHAIN) +SUBDIRS := $(patsubst .,,$(patsubst ,,$(shell find chains/$(CHAIN) -type d))) +rebuild: $(SUBDIRS) else +SUBDIRS := $(patsubst .,,$(patsubst ./,,$(shell find . -type d))) rebuild: main $(SUBDIRS) endif From c8ade5d1fcf9195f5bd3485dd7887bebe34a9a93 Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Thu, 21 Apr 2016 16:01:44 +0200 Subject: [PATCH 10/16] Fix location of shader effect, nw --- bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json b/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json index decf8d322ab..cb65457ea68 100644 --- a/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json +++ b/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json @@ -26,8 +26,8 @@ "rgb": true, "alpha": true }, - "vertex": "chains/super-xbr-2p/vs_custom-jinc2-sharper", - "fragment": "chains/super-xbr-2p/fs_custom-jinc2-sharper", + "vertex": "chains/xbr/super-xbr/vs_custom-jinc2-sharper", + "fragment": "chains/xbr/super-xbr/fs_custom-jinc2-sharper", "uniforms": [ { "name": "s_p", "type": "int", "values": [ 1.0 ] }, { "name": "JINC2_WINDOW_SINC", "type": "vec4", "values": [ 0.42, 0.0, 0.0, 0.0 ] }, From 1a844a49c5fe01552347ea086ef7c65874dadf3e Mon Sep 17 00:00:00 2001 From: Brad Hughes Date: Wed, 20 Apr 2016 10:24:59 -0400 Subject: [PATCH 11/16] Refactor OSD window. Unified renderer in osd_window as std::unique_ptr Made windows all std::shared_ptr Made window lists std::list> Updated OSD SDL worker_param to not use malloc (not compatible with smart pointers) Made renderer pointer to window a weak reference. May not be available during destruction of the window. --- scripts/build/png.pyc | Bin 0 -> 87867 bytes src/osd/modules/debugger/debugwin.cpp | 2 +- src/osd/modules/debugger/win/debugwininfo.cpp | 2 +- src/osd/modules/input/input_dinput.cpp | 2 +- src/osd/modules/input/input_dinput.h | 2 +- src/osd/modules/input/input_rawinput.cpp | 2 +- src/osd/modules/input/input_sdl.cpp | 18 +- src/osd/modules/input/input_sdlcommon.cpp | 11 +- src/osd/modules/input/input_sdlcommon.h | 6 +- src/osd/modules/input/input_win32.cpp | 12 +- src/osd/modules/input/input_windows.h | 2 +- src/osd/modules/input/input_winhybrid.cpp | 2 +- src/osd/modules/osdwindow.cpp | 23 +-- src/osd/modules/osdwindow.h | 47 +++-- src/osd/modules/render/d3d/d3dhlsl.cpp | 30 ++- src/osd/modules/render/draw13.cpp | 40 ++-- src/osd/modules/render/draw13.h | 2 +- src/osd/modules/render/drawbgfx.cpp | 80 ++++---- src/osd/modules/render/drawbgfx.h | 14 +- src/osd/modules/render/drawd3d.cpp | 134 ++++++++----- src/osd/modules/render/drawd3d.h | 2 +- src/osd/modules/render/drawgdi.cpp | 26 ++- src/osd/modules/render/drawgdi.h | 2 +- src/osd/modules/render/drawnone.cpp | 10 +- src/osd/modules/render/drawnone.h | 2 +- src/osd/modules/render/drawogl.cpp | 44 +++-- src/osd/modules/render/drawogl.h | 12 +- src/osd/modules/render/drawsdl.cpp | 53 ++--- src/osd/modules/render/drawsdl.h | 2 +- src/osd/modules/sound/direct_sound.cpp | 4 +- src/osd/sdl/video.cpp | 14 +- src/osd/sdl/window.cpp | 182 ++++++++---------- src/osd/sdl/window.h | 11 +- src/osd/windows/video.cpp | 4 +- src/osd/windows/window.cpp | 170 +++++++--------- src/osd/windows/window.h | 13 +- src/osd/windows/winmain.cpp | 6 +- 37 files changed, 529 insertions(+), 459 deletions(-) create mode 100644 scripts/build/png.pyc diff --git a/scripts/build/png.pyc b/scripts/build/png.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78fe5edad6f6742cda59d35d9370fddd6cee285e GIT binary patch literal 87867 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 Bp~e6J literal 0 HcmV?d00001 diff --git a/src/osd/modules/debugger/debugwin.cpp b/src/osd/modules/debugger/debugwin.cpp index c3994efbd2f..a32405c4aa8 100644 --- a/src/osd/modules/debugger/debugwin.cpp +++ b/src/osd/modules/debugger/debugwin.cpp @@ -236,7 +236,7 @@ void debugger_windows::show_all() void debugger_windows::hide_all() { - SetForegroundWindow(win_window_list->platform_window()); + SetForegroundWindow(win_window_list.front()->platform_window()); for (debugwin_info &info : m_window_list) info.hide(); } diff --git a/src/osd/modules/debugger/win/debugwininfo.cpp b/src/osd/modules/debugger/win/debugwininfo.cpp index 8c02ee17e1c..1e75b464b72 100644 --- a/src/osd/modules/debugger/win/debugwininfo.cpp +++ b/src/osd/modules/debugger/win/debugwininfo.cpp @@ -35,7 +35,7 @@ debugwin_info::debugwin_info(debugger_windows_interface &debugger, bool is_main_ register_window_class(); m_wnd = win_create_window_ex_utf8(DEBUG_WINDOW_STYLE_EX, "MAMEDebugWindow", title, DEBUG_WINDOW_STYLE, - 0, 0, 100, 100, win_window_list->platform_window(), create_standard_menubar(), GetModuleHandleUni(), this); + 0, 0, 100, 100, win_window_list.front()->platform_window(), create_standard_menubar(), GetModuleHandleUni(), this); if (m_wnd == NULL) return; diff --git a/src/osd/modules/input/input_dinput.cpp b/src/osd/modules/input/input_dinput.cpp index ca3bad08026..dfb63482570 100644 --- a/src/osd/modules/input/input_dinput.cpp +++ b/src/osd/modules/input/input_dinput.cpp @@ -564,7 +564,7 @@ public: dinput_joystick_device *devinfo; int result = 0; - if (win_window_list != nullptr && win_window_list->win_has_menu()) + if (!win_window_list.empty() && win_window_list.front()->win_has_menu()) cooperative_level = DISCL_BACKGROUND | DISCL_NONEXCLUSIVE; // allocate and link in a new device diff --git a/src/osd/modules/input/input_dinput.h b/src/osd/modules/input/input_dinput.h index f339bef561e..f06520cb285 100644 --- a/src/osd/modules/input/input_dinput.h +++ b/src/osd/modules/input/input_dinput.h @@ -103,7 +103,7 @@ public: } // set the cooperative level - result = devinfo->dinput.device->SetCooperativeLevel(win_window_list->platform_window(), cooperative_level); + result = devinfo->dinput.device->SetCooperativeLevel(win_window_list.front()->platform_window(), cooperative_level); if (result != DI_OK) goto error; diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp index 20ed82cc4a1..7476fea24a6 100644 --- a/src/osd/modules/input/input_rawinput.cpp +++ b/src/osd/modules/input/input_rawinput.cpp @@ -475,7 +475,7 @@ public: registration.usUsagePage = usagepage(); registration.usUsage = usage(); registration.dwFlags = m_global_inputs_enabled ? 0x00000100 : 0; - registration.hwndTarget = win_window_list->platform_window(); + registration.hwndTarget = win_window_list.front()->platform_window(); // register the device register_rawinput_devices(®istration, 1, sizeof(registration)); diff --git a/src/osd/modules/input/input_sdl.cpp b/src/osd/modules/input/input_sdl.cpp index 8814cfe3876..996221f57e6 100644 --- a/src/osd/modules/input/input_sdl.cpp +++ b/src/osd/modules/input/input_sdl.cpp @@ -115,7 +115,7 @@ public: } protected: - sdl_window_info * focus_window() + std::shared_ptr focus_window() { return sdl_event_manager::instance().focus_window(); } @@ -144,7 +144,7 @@ public: case SDL_KEYDOWN: keyboard.state[OSD_SDL_INDEX_KEYSYM(&sdlevent.key.keysym)] = 0x80; if (sdlevent.key.keysym.sym < 0x20) - machine().ui_input().push_char_event(sdl_window_list->target(), sdlevent.key.keysym.sym); + machine().ui_input().push_char_event(sdl_window_list.front()->target(), sdlevent.key.keysym.sym); break; case SDL_KEYUP: @@ -154,7 +154,7 @@ public: case SDL_TEXTINPUT: if (*sdlevent.text.text) { - sdl_window_info *window = GET_FOCUS_WINDOW(&event.text); + auto window = GET_FOCUS_WINDOW(&event.text); //printf("Focus window is %p - wl %p\n", window, sdl_window_list); unicode_char result; if (window != NULL) @@ -210,7 +210,7 @@ public: { int cx = -1, cy = -1; - sdl_window_info *window = GET_FOCUS_WINDOW(&sdlevent.motion); + auto window = GET_FOCUS_WINDOW(&sdlevent.motion); if (window != NULL && window->xy_to_render_target(sdlevent.motion.x, sdlevent.motion.y, &cx, &cy)) machine().ui_input().push_mouse_move_event(window->target(), cx, cy); @@ -228,7 +228,7 @@ public: static int last_y = 0; int cx, cy; osd_ticks_t click = osd_ticks() * 1000 / osd_ticks_per_second(); - sdl_window_info *window = GET_FOCUS_WINDOW(&sdlevent.button); + auto window = GET_FOCUS_WINDOW(&sdlevent.button); if (window != NULL && window->xy_to_render_target(sdlevent.button.x, sdlevent.button.y, &cx, &cy)) { machine().ui_input().push_mouse_down_event(window->target(), cx, cy); @@ -252,7 +252,7 @@ public: else if (sdlevent.button.button == 3) { int cx, cy; - sdl_window_info *window = GET_FOCUS_WINDOW(&sdlevent.button); + auto window = GET_FOCUS_WINDOW(&sdlevent.button); if (window != NULL && window->xy_to_render_target(sdlevent.button.x, sdlevent.button.y, &cx, &cy)) { @@ -268,7 +268,7 @@ public: if (sdlevent.button.button == 1) { int cx, cy; - sdl_window_info *window = GET_FOCUS_WINDOW(&sdlevent.button); + auto window = GET_FOCUS_WINDOW(&sdlevent.button); if (window != NULL && window->xy_to_render_target(sdlevent.button.x, sdlevent.button.y, &cx, &cy)) { @@ -278,7 +278,7 @@ public: else if (sdlevent.button.button == 3) { int cx, cy; - sdl_window_info *window = GET_FOCUS_WINDOW(&sdlevent.button); + auto window = GET_FOCUS_WINDOW(&sdlevent.button); if (window != NULL && window->xy_to_render_target(sdlevent.button.x, sdlevent.button.y, &cx, &cy)) { @@ -288,7 +288,7 @@ public: break; case SDL_MOUSEWHEEL: - sdl_window_info *window = GET_FOCUS_WINDOW(&sdlevent.wheel); + auto window = GET_FOCUS_WINDOW(&sdlevent.wheel); if (window != NULL) machine().ui_input().push_mouse_wheel_event(window->target(), 0, 0, sdlevent.wheel.y, 3); break; diff --git a/src/osd/modules/input/input_sdlcommon.cpp b/src/osd/modules/input/input_sdlcommon.cpp index 85febac18f6..6f2794e3ac5 100644 --- a/src/osd/modules/input/input_sdlcommon.cpp +++ b/src/osd/modules/input/input_sdlcommon.cpp @@ -35,12 +35,11 @@ #define GET_WINDOW(ev) window_from_id((ev)->windowID) //#define GET_WINDOW(ev) ((ev)->windowID) -static inline sdl_window_info * window_from_id(Uint32 windowID) +static inline std::shared_ptr window_from_id(Uint32 windowID) { - sdl_window_info *w; SDL_Window *window = SDL_GetWindowFromID(windowID); - for (w = sdl_window_list; w != NULL; w = w->m_next) + for (auto w : sdl_window_list) { //printf("w->window_id: %d\n", w->window_id); if (w->platform_window() == window) @@ -72,7 +71,7 @@ void sdl_event_manager::process_events(running_machine &machine) void sdl_event_manager::process_window_event(running_machine &machine, SDL_Event &sdlevent) { - sdl_window_info *window = GET_WINDOW(&sdlevent.window); + std::shared_ptr window = GET_WINDOW(&sdlevent.window); if (window == NULL) return; @@ -273,7 +272,9 @@ void sdl_osd_interface::poll_inputs(running_machine &machine) void sdl_osd_interface::release_keys() { - downcast(m_keyboard_input)->devicelist()->reset_devices(); + auto keybd = dynamic_cast(m_keyboard_input); + if (keybd != nullptr) + keybd->devicelist()->reset_devices(); } bool sdl_osd_interface::should_hide_mouse() diff --git a/src/osd/modules/input/input_sdlcommon.h b/src/osd/modules/input/input_sdlcommon.h index feecf23f975..2e40199c556 100644 --- a/src/osd/modules/input/input_sdlcommon.h +++ b/src/osd/modules/input/input_sdlcommon.h @@ -118,7 +118,7 @@ class sdl_event_manager : public event_manager_t private: bool m_mouse_over_window; bool m_has_focus; - sdl_window_info * m_focus_window; + std::shared_ptr m_focus_window; sdl_event_manager() : m_mouse_over_window(true), @@ -129,8 +129,8 @@ private: public: bool mouse_over_window() const { return m_mouse_over_window; } - bool has_focus() const { return m_focus_window; } - sdl_window_info * focus_window() { return m_focus_window; } + bool has_focus() const { return m_focus_window != nullptr; } + std::shared_ptr focus_window() { return m_focus_window; } static sdl_event_manager& instance() { diff --git a/src/osd/modules/input/input_win32.cpp b/src/osd/modules/input/input_win32.cpp index 5bef565beed..0b44c510fa0 100644 --- a/src/osd/modules/input/input_win32.cpp +++ b/src/osd/modules/input/input_win32.cpp @@ -152,7 +152,7 @@ public: mouse.lY = (cursor_info.ptScreenPos.y - win32_mouse.last_point.y) * INPUT_RELATIVE_PER_PIXEL; RECT window_pos = {0}; - GetWindowRect(win_window_list->platform_window(), &window_pos); + GetWindowRect(win_window_list.front()->platform_window(), &window_pos); // We reset the cursor position to the middle of the window each frame win32_mouse.last_point.x = window_pos.left + (window_pos.right - window_pos.left) / 2; @@ -269,13 +269,13 @@ public: // get the cursor position and transform into final results GetCursorPos(&mousepos); - if (win_window_list != NULL) + if (!win_window_list.empty()) { RECT client_rect; // get the position relative to the window - GetClientRect(win_window_list->platform_window(), &client_rect); - ScreenToClient(win_window_list->platform_window(), &mousepos); + GetClientRect(win_window_list.front()->platform_window(), &client_rect); + ScreenToClient(win_window_list.front()->platform_window(), &mousepos); // convert to absolute coordinates xpos = normalize_absolute_axis(mousepos.x, client_rect.left, client_rect.right); @@ -335,10 +335,10 @@ private: POINT mousepos; // get the position relative to the window - GetClientRect(win_window_list->platform_window(), &client_rect); + GetClientRect(win_window_list.front()->platform_window(), &client_rect); mousepos.x = args.xpos; mousepos.y = args.ypos; - ScreenToClient(win_window_list->platform_window(), &mousepos); + ScreenToClient(win_window_list.front()->platform_window(), &mousepos); // convert to absolute coordinates mouse.lX = normalize_absolute_axis(mousepos.x, client_rect.left, client_rect.right); diff --git a/src/osd/modules/input/input_windows.h b/src/osd/modules/input/input_windows.h index 85ad2c63326..d9dd28bac58 100644 --- a/src/osd/modules/input/input_windows.h +++ b/src/osd/modules/input/input_windows.h @@ -52,7 +52,7 @@ public: virtual bool should_hide_mouse() { if (winwindow_has_focus() // has focus - && (!video_config.windowed || !win_window_list->win_has_menu()) // not windowed or doesn't have a menu + && (!video_config.windowed || !win_window_list.front()->win_has_menu()) // not windowed or doesn't have a menu && (input_enabled() && !input_paused()) // input enabled and not paused && (mouse_enabled() || lightgun_enabled())) // either mouse or lightgun enabled in the core { diff --git a/src/osd/modules/input/input_winhybrid.cpp b/src/osd/modules/input/input_winhybrid.cpp index 538abe38da4..c74eb730b71 100644 --- a/src/osd/modules/input/input_winhybrid.cpp +++ b/src/osd/modules/input/input_winhybrid.cpp @@ -164,7 +164,7 @@ public: goto exit; } - if (win_window_list != nullptr && win_window_list->win_has_menu()) + if (!win_window_list.empty() && win_window_list.front()->win_has_menu()) cooperative_level = DISCL_BACKGROUND | DISCL_NONEXCLUSIVE; // allocate and link in a new device diff --git a/src/osd/modules/osdwindow.cpp b/src/osd/modules/osdwindow.cpp index cde83c3fe7f..b9afc8047cd 100644 --- a/src/osd/modules/osdwindow.cpp +++ b/src/osd/modules/osdwindow.cpp @@ -21,33 +21,34 @@ #include "render/drawsdl.h" #endif -osd_renderer* osd_renderer::make_for_type(int mode, osd_window* window, int extra_flags) +osd_window::~osd_window() +{ +} + +std::unique_ptr osd_renderer::make_for_type(int mode, std::shared_ptr window, int extra_flags) { switch(mode) { #ifdef OSD_WINDOWS case VIDEO_MODE_NONE: - return new renderer_none(window); + return std::make_unique(window); #endif case VIDEO_MODE_BGFX: - return new renderer_bgfx(window); + return std::make_unique(window); #if (USE_OPENGL) case VIDEO_MODE_OPENGL: - return new renderer_ogl(window); + return std::make_unique(window); #endif #ifdef OSD_WINDOWS case VIDEO_MODE_GDI: - return new renderer_gdi(window); + return std::make_unique(window); case VIDEO_MODE_D3D: - { - osd_renderer *renderer = new renderer_d3d9(window); - return renderer; - } + return std::make_unique(window); #else case VIDEO_MODE_SDL2ACCEL: - return new renderer_sdl2(window, extra_flags); + return std::make_unique(window, extra_flags); case VIDEO_MODE_SOFT: - return new renderer_sdl1(window, extra_flags); + return std::make_unique(window, extra_flags); #endif default: return nullptr; diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h index 428d821413c..4996cce002d 100644 --- a/src/osd/modules/osdwindow.h +++ b/src/osd/modules/osdwindow.h @@ -106,7 +106,9 @@ public: int refresh; // decoded refresh }; -class osd_window +class osd_renderer; + +class osd_window : public std::enable_shared_from_this { public: osd_window() @@ -116,16 +118,24 @@ public: #endif m_primlist(nullptr), m_index(0), - m_main(nullptr), m_prescale(1), - m_platform_window(nullptr) + m_platform_window(nullptr), + m_renderer(nullptr), + m_main(nullptr) {} - virtual ~osd_window() { } + + virtual ~osd_window(); virtual render_target *target() = 0; virtual int fullscreen() const = 0; virtual running_machine &machine() const = 0; + osd_renderer &renderer() const { return *m_renderer; } + void set_renderer(std::unique_ptr renderer) + { + m_renderer = std::move(renderer); + } + int prescale() const { return m_prescale; }; float pixel_aspect() const { return monitor()->pixel_aspect(); } @@ -152,6 +162,9 @@ public: m_platform_window = window; } + std::shared_ptr main_window() { return m_main; } + void set_main_window(std::shared_ptr main) { m_main = main; } + // Clips the pointer to the bounds of this window virtual void capture_pointer() = 0; @@ -173,12 +186,13 @@ public: render_primitive_list *m_primlist; osd_window_config m_win_config; - int m_index; - osd_window *m_main; + int m_index; protected: int m_prescale; private: - void *m_platform_window; + void *m_platform_window; + std::unique_ptr m_renderer; + std::shared_ptr m_main; }; class osd_renderer @@ -194,12 +208,23 @@ public: static const int FLAG_NEEDS_DOUBLEBUF = 0x0100; static const int FLAG_NEEDS_ASYNCBLIT = 0x0200; - osd_renderer(osd_window *window, const int flags) + osd_renderer(std::shared_ptr window, const int flags) : m_sliders_dirty(false), m_window(window), m_flags(flags) { } virtual ~osd_renderer() { } - osd_window &window() { return *m_window; } + std::shared_ptr assert_window() const + { + auto win = m_window.lock(); + assert_always(win != nullptr, "Window weak_ptr is not available!"); + return win; + } + + std::shared_ptr try_getwindow() const + { + return m_window.lock(); + } + bool has_flags(const int flag) { return ((m_flags & flag)) == flag; } void set_flags(int aflag) { m_flags |= aflag; } void clear_flags(int aflag) { m_flags &= ~aflag; } @@ -220,7 +245,7 @@ public: virtual void toggle_fsfx() { }; virtual bool sliders_dirty() { return m_sliders_dirty; } - static osd_renderer* make_for_type(int mode, osd_window *window, int extra_flags = FLAG_NONE); + static std::unique_ptr make_for_type(int mode, std::shared_ptr window, int extra_flags = FLAG_NONE); protected: virtual void build_slider_list() { } @@ -231,7 +256,7 @@ protected: std::vector m_sliders; private: - osd_window *m_window; + std::weak_ptr m_window; int m_flags; }; diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index d8ce75c06db..4ce87b3e29c 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -1612,6 +1612,8 @@ void shaders::render_quad(poly_info *poly, int vertnum) curr_texture = poly->get_texture(); curr_poly = poly; + auto win = d3d->assert_window(); + if (PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && curr_texture != nullptr) { curr_screen = curr_screen < num_screens ? curr_screen : 0; @@ -1663,7 +1665,7 @@ void shaders::render_quad(poly_info *poly, int vertnum) { lines_pending = true; - bool swap_xy = d3d->window().swap_xy(); + bool swap_xy = win->swap_xy(); int source_width = swap_xy ? (float)d3d->get_height() : (float)d3d->get_width(); int source_height = swap_xy ? (float)d3d->get_width() : (float)d3d->get_height(); @@ -1690,7 +1692,7 @@ void shaders::render_quad(poly_info *poly, int vertnum) { curr_screen = curr_screen < num_screens ? curr_screen : 0; - bool swap_xy = d3d->window().swap_xy(); + bool swap_xy = win->swap_xy(); int source_width = swap_xy ? (float)d3d->get_height() : (float)d3d->get_width(); int source_height = swap_xy ? (float)d3d->get_width() : (float)d3d->get_height(); @@ -1805,7 +1807,9 @@ d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_i return nullptr; } - bool swap_xy = d3d->window().swap_xy(); + auto win = d3d->assert_window(); + + bool swap_xy = win->swap_xy(); int target_width = swap_xy ? static_cast(prim->get_quad_height() + 0.5f) : static_cast(prim->get_quad_width() + 0.5f); @@ -1835,7 +1839,9 @@ d3d_render_target* shaders::get_vector_target(render_primitive *prim) return nullptr; } - bool swap_xy = d3d->window().swap_xy(); + auto win = d3d->assert_window(); + + bool swap_xy = win->swap_xy(); int target_width = swap_xy ? static_cast(prim->get_quad_height() + 0.5f) : static_cast(prim->get_quad_width() + 0.5f); @@ -1862,7 +1868,9 @@ d3d_render_target* shaders::get_vector_target(render_primitive *prim) void shaders::create_vector_target(render_primitive *prim) { - bool swap_xy = d3d->window().swap_xy(); + auto win = d3d->assert_window(); + + bool swap_xy = win->swap_xy(); int target_width = swap_xy ? static_cast(prim->get_quad_height() + 0.5f) : static_cast(prim->get_quad_width() + 0.5f); @@ -1974,7 +1982,9 @@ bool shaders::register_texture(render_primitive *prim, texture_info *texture) return false; } - bool swap_xy = d3d->window().swap_xy(); + auto win = d3d->assert_window(); + + bool swap_xy = win->swap_xy(); int target_width = swap_xy ? static_cast(prim->get_quad_height() + 0.5f) : static_cast(prim->get_quad_width() + 0.5f); @@ -2614,6 +2624,8 @@ void uniform::update() hlsl_options *options = shadersys->options; renderer_d3d9 *d3d = shadersys->d3d; + auto win = d3d->assert_window(); + switch (m_id) { case CU_SCREEN_DIMS: @@ -2625,7 +2637,7 @@ void uniform::update() case CU_SOURCE_DIMS: { bool vector_screen = - d3d->window().machine().first_screen()->screen_type() == SCREEN_TYPE_VECTOR; + win->machine().first_screen()->screen_type() == SCREEN_TYPE_VECTOR; if (vector_screen) { if (shadersys->curr_render_target) @@ -2673,13 +2685,13 @@ void uniform::update() case CU_SWAP_XY: { - m_shader->set_bool("SwapXY", d3d->window().swap_xy()); + m_shader->set_bool("SwapXY", win->swap_xy()); break; } case CU_VECTOR_SCREEN: { bool vector_screen = - d3d->window().machine().first_screen()->screen_type() == SCREEN_TYPE_VECTOR; + win->machine().first_screen()->screen_type() == SCREEN_TYPE_VECTOR; m_shader->set_bool("VectorScreen", vector_screen); break; } diff --git a/src/osd/modules/render/draw13.cpp b/src/osd/modules/render/draw13.cpp index b4326ff2bdf..24bf22c3b27 100644 --- a/src/osd/modules/render/draw13.cpp +++ b/src/osd/modules/render/draw13.cpp @@ -60,7 +60,7 @@ static inline bool is_transparent(const float &a) // CONSTRUCTOR & DESTRUCTOR //============================================================ -renderer_sdl2::renderer_sdl2(osd_window *window, int extra_flags) +renderer_sdl2::renderer_sdl2(std::shared_ptr window, int extra_flags) : osd_renderer(window, FLAG_NEEDS_OPENGL | extra_flags) , m_sdl_renderer(nullptr) , m_blittimer(0) @@ -434,10 +434,12 @@ int renderer_sdl2::create() SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0"); } + auto win = assert_window(); + if (video_config.waitvsync) - m_sdl_renderer = SDL_CreateRenderer(window().platform_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + m_sdl_renderer = SDL_CreateRenderer(win->platform_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); else - m_sdl_renderer = SDL_CreateRenderer(window().platform_window(), -1, SDL_RENDERER_ACCELERATED); + m_sdl_renderer = SDL_CreateRenderer(win->platform_window(), -1, SDL_RENDERER_ACCELERATED); if (!m_sdl_renderer) { @@ -481,11 +483,15 @@ int renderer_sdl2::xy_to_render_target(int x, int y, int *xt, int *yt) void renderer_sdl2::destroy_all_textures() { - if(window().m_primlist) + auto win = assert_window(); + if (win == nullptr) + return; + + if(win->m_primlist) { - window().m_primlist->acquire_lock(); + win->m_primlist->acquire_lock(); m_texlist.reset(); - window().m_primlist->release_lock(); + win->m_primlist->release_lock(); } else m_texlist.reset(); @@ -506,7 +512,8 @@ int renderer_sdl2::draw(int update) return 0; } - osd_dim wdim = window().get_size(); + auto win = assert_window(); + osd_dim wdim = win->get_size(); if (has_flags(FI_CHANGED) || (wdim.width() != m_width) || (wdim.height() != m_height)) { @@ -553,10 +560,10 @@ int renderer_sdl2::draw(int update) m_last_hofs = hofs; m_last_vofs = vofs; - window().m_primlist->acquire_lock(); + win->m_primlist->acquire_lock(); // now draw - for (render_primitive &prim : *window().m_primlist) + for (render_primitive &prim : *win->m_primlist) { Uint8 sr, sg, sb, sa; @@ -586,7 +593,7 @@ int renderer_sdl2::draw(int update) } } - window().m_primlist->release_lock(); + win->m_primlist->release_lock(); m_last_blit_pixels = blit_pixels; m_last_blit_time = -osd_ticks(); @@ -930,7 +937,8 @@ texture_info * renderer_sdl2::texture_update(const render_primitive &prim) quad_setup_data setup; texture_info *texture; - setup.compute(prim, window().prescale()); + auto win = assert_window(); + setup.compute(prim, win->prescale()); texture = texture_find(prim, setup); @@ -957,12 +965,16 @@ texture_info * renderer_sdl2::texture_update(const render_primitive &prim) render_primitive_list *renderer_sdl2::get_primitives() { - osd_dim nd = window().get_size(); + auto win = assert_window(); + if (win == nullptr) + return nullptr; + + osd_dim nd = win->get_size(); if (nd != m_blit_dim) { m_blit_dim = nd; notify_changed(); } - window().target()->set_bounds(m_blit_dim.width(), m_blit_dim.height(), window().pixel_aspect()); - return &window().target()->get_primitives(); + win->target()->set_bounds(m_blit_dim.width(), m_blit_dim.height(), win->pixel_aspect()); + return &win->target()->get_primitives(); } diff --git a/src/osd/modules/render/draw13.h b/src/osd/modules/render/draw13.h index 634c1debf6f..e242749ba10 100644 --- a/src/osd/modules/render/draw13.h +++ b/src/osd/modules/render/draw13.h @@ -149,7 +149,7 @@ struct copy_info_t class renderer_sdl2 : public osd_renderer { public: - renderer_sdl2(osd_window *window, int extra_flags); + renderer_sdl2(std::shared_ptr window, int extra_flags); virtual ~renderer_sdl2() { diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 479cea4f3b2..84f1ff0bd6f 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -77,7 +77,7 @@ uint32_t renderer_bgfx::s_current_view = 0; // renderer_bgfx - constructor //============================================================ -renderer_bgfx::renderer_bgfx(osd_window *w) +renderer_bgfx::renderer_bgfx(std::shared_ptr w) : osd_renderer(w, FLAG_NONE) , m_options(downcast(w->machine().options())) , m_dimensions(0, 0) @@ -85,7 +85,7 @@ renderer_bgfx::renderer_bgfx(osd_window *w) , m_avi_writer(nullptr) , m_avi_target(nullptr) { - m_options = downcast(window().machine().options()); + m_options = downcast(assert_window()->machine().options()); } //============================================================ @@ -146,10 +146,11 @@ static void* sdlNativeWindowHandle(SDL_Window* _window) int renderer_bgfx::create() { // create renderer - osd_dim wdim = window().get_size(); - m_width[window().m_index] = wdim.width(); - m_height[window().m_index] = wdim.height(); - if (window().m_index == 0) + auto win = assert_window(); + osd_dim wdim = win->get_size(); + m_width[win->m_index] = wdim.width(); + m_height[win->m_index] = wdim.height(); + if (win->m_index == 0) { if (!s_window_set) { @@ -164,9 +165,9 @@ int renderer_bgfx::create() bgfx::setPlatformData(blank_pd); } #ifdef OSD_WINDOWS - bgfx::winSetHwnd(window().platform_window()); + bgfx::winSetHwnd(win->platform_window()); #else - bgfx::sdlSetWindow(window().platform_window()); + bgfx::sdlSetWindow(win->platform_window()); #endif std::string backend(m_options.bgfx_backend()); if (backend == "auto") @@ -198,7 +199,7 @@ int renderer_bgfx::create() printf("Unknown backend type '%s', going with auto-detection\n", backend.c_str()); bgfx::init(); } - bgfx::reset(m_width[window().m_index], m_height[window().m_index], video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + bgfx::reset(m_width[win->m_index], m_height[win->m_index], video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); // Enable debug text. bgfx::setDebug(m_options.bgfx_debug() ? BGFX_DEBUG_STATS : BGFX_DEBUG_TEXT); m_dimensions = osd_dim(m_width[0], m_height[0]); @@ -210,14 +211,14 @@ int renderer_bgfx::create() m_shaders = new shader_manager(m_options); m_effects = new effect_manager(m_options, *m_shaders); - if (window().m_index != 0) + if (win->m_index != 0) { #ifdef OSD_WINDOWS - m_framebuffer = m_targets->create_backbuffer(window().platform_window(), m_width[window().m_index], m_height[window().m_index]); + m_framebuffer = m_targets->create_backbuffer(win->platform_window(), m_width[win->m_index], m_height[win->m_index]); #else - m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(window().platform_window()), m_width[window().m_index], m_height[window().m_index]); + m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window()), m_width[win->m_index], m_height[win->m_index]); #endif - bgfx::touch(window().m_index); + bgfx::touch(win->m_index); } // Create program from shaders. @@ -231,7 +232,7 @@ int renderer_bgfx::create() m_screen_effect[2] = m_effects->effect("screen_multiply"); m_screen_effect[3] = m_effects->effect("screen_add"); - m_chains = new chain_manager(window().machine(), m_options, *m_textures, *m_targets, *m_effects, window().m_index, *this); + m_chains = new chain_manager(win->machine(), m_options, *m_textures, *m_targets, *m_effects, win->m_index, *this); m_sliders_dirty = true; uint32_t flags = BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP | BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT; @@ -251,7 +252,8 @@ int renderer_bgfx::create() void renderer_bgfx::record() { - if (m_avi_writer == nullptr || window().m_index > 0) + auto win = assert_window(); + if (m_avi_writer == nullptr || win->m_index > 0) { return; } @@ -648,15 +650,16 @@ uint32_t renderer_bgfx::u32Color(uint32_t r, uint32_t g, uint32_t b, uint32_t a int renderer_bgfx::draw(int update) { - int window_index = window().m_index; + auto win = assert_window(); + int window_index = win->m_index; if (window_index == 0) { s_current_view = 0; if (m_avi_writer == nullptr) { - uint32_t width = window().get_size().width(); - uint32_t height = window().get_size().height(); - m_avi_writer = new avi_write(window().machine(), width, height); + uint32_t width = win->get_size().width(); + uint32_t height = win->get_size().height(); + m_avi_writer = new avi_write(win->machine(), width, height); m_avi_data = new uint8_t[width * height * 4]; m_avi_bitmap.allocate(width, height); } @@ -666,13 +669,13 @@ int renderer_bgfx::draw(int update) m_ui_view = -1; // Set view 0 default viewport. - osd_dim wdim = window().get_size(); + osd_dim wdim = win->get_size(); m_width[window_index] = wdim.width(); m_height[window_index] = wdim.height(); - window().m_primlist->acquire_lock(); - s_current_view += m_chains->handle_screen_chains(s_current_view, window().m_primlist->first(), window()); - window().m_primlist->release_lock(); + win->m_primlist->acquire_lock(); + s_current_view += m_chains->handle_screen_chains(s_current_view, win->m_primlist->first(), *win.get()); + win->m_primlist->release_lock(); bool skip_frame = update_dimensions(); if (skip_frame) @@ -689,12 +692,12 @@ int renderer_bgfx::draw(int update) s_current_view = m_max_view; } - window().m_primlist->acquire_lock(); + win->m_primlist->acquire_lock(); // Mark our texture atlas as dirty if we need to do so bool atlas_valid = update_atlas(); - render_primitive *prim = window().m_primlist->first(); + render_primitive *prim = win->m_primlist->first(); std::vector sources; while (prim != nullptr) { @@ -734,7 +737,7 @@ int renderer_bgfx::draw(int update) } } - window().m_primlist->release_lock(); + win->m_primlist->release_lock(); // This dummy draw call is here to make sure that view 0 is cleared // if no other draw calls are submitted to view 0. @@ -774,7 +777,8 @@ void renderer_bgfx::update_recording() void renderer_bgfx::add_audio_to_recording(const INT16 *buffer, int samples_this_frame) { - if (m_avi_writer != nullptr && m_avi_writer->recording() && window().m_index == 0) + auto win = assert_window(); + if (m_avi_writer != nullptr && m_avi_writer->recording() && win->m_index == 0) { m_avi_writer->audio_frame(buffer, samples_this_frame); } @@ -782,7 +786,9 @@ void renderer_bgfx::add_audio_to_recording(const INT16 *buffer, int samples_this bool renderer_bgfx::update_dimensions() { - const uint32_t window_index = window().m_index; + auto win = assert_window(); + + const uint32_t window_index = win->m_index; const uint32_t width = m_width[window_index]; const uint32_t height = m_height[window_index]; @@ -798,14 +804,14 @@ bool renderer_bgfx::update_dimensions() { if ((m_dimensions != osd_dim(width, height))) { - bgfx::reset(window().m_main->get_size().width(), window().m_main->get_size().height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + bgfx::reset(win->main_window()->get_size().width(), win->main_window()->get_size().height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); m_dimensions = osd_dim(width, height); delete m_framebuffer; #ifdef OSD_WINDOWS - m_framebuffer = m_targets->create_backbuffer(window().platform_window(), width, height); + m_framebuffer = m_targets->create_backbuffer(win->platform_window(), width, height); #else - m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(window().platform_window()), width, height); + m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window()), width, height); #endif bgfx::setViewFrameBuffer(s_current_view, m_framebuffer->target()); @@ -820,7 +826,9 @@ bool renderer_bgfx::update_dimensions() void renderer_bgfx::setup_view(uint32_t view_index, bool screen) { - const uint32_t window_index = window().m_index; + auto win = assert_window(); + + const uint32_t window_index = win->m_index; const uint32_t width = m_width[window_index]; const uint32_t height = m_height[window_index]; @@ -845,7 +853,7 @@ void renderer_bgfx::setup_view(uint32_t view_index, bool screen) { m_seen_views[view_index] = true; #endif - if (m_avi_writer != nullptr && m_avi_writer->recording() && window().m_index == 0) + if (m_avi_writer != nullptr && m_avi_writer->recording() && win->m_index == 0) { bgfx::setViewFrameBuffer(view_index, m_avi_target->target()); } @@ -857,7 +865,8 @@ void renderer_bgfx::setup_view(uint32_t view_index, bool screen) void renderer_bgfx::setup_matrices(uint32_t view_index, bool screen) { - const uint32_t window_index = window().m_index; + auto win = assert_window(); + const uint32_t window_index = win->m_index; const uint32_t width = m_width[window_index]; const uint32_t height = m_height[window_index]; @@ -1064,8 +1073,9 @@ bool renderer_bgfx::check_for_dirty_atlas() { bool atlas_dirty = false; + auto win = assert_window(); std::map acquired_infos; - for (render_primitive &prim : *window().m_primlist) + for (render_primitive &prim : *win->m_primlist) { bool pack = prim.packable(PACKABLE_SIZE); if (prim.type == render_primitive::QUAD && prim.texture.base != nullptr && pack) diff --git a/src/osd/modules/render/drawbgfx.h b/src/osd/modules/render/drawbgfx.h index 1a21b5c8259..7cc3bab9e47 100644 --- a/src/osd/modules/render/drawbgfx.h +++ b/src/osd/modules/render/drawbgfx.h @@ -32,7 +32,7 @@ class avi_write; class renderer_bgfx : public osd_renderer, public slider_dirty_notifier { public: - renderer_bgfx(osd_window *w); + renderer_bgfx(std::shared_ptr w); virtual ~renderer_bgfx(); static void init(running_machine &machine) { } @@ -55,6 +55,10 @@ public: virtual render_primitive_list *get_primitives() override { + auto win = try_getwindow(); + if (win == nullptr) + return nullptr; + // determines whether the screen container is transformed by the chain's shaders bool chain_transform = false; @@ -65,10 +69,10 @@ public: chain_transform = chain->transform(); } - osd_dim wdim = window().get_size(); - window().target()->set_bounds(wdim.width(), wdim.height(), window().pixel_aspect()); - window().target()->set_transform_container(!chain_transform); - return &window().target()->get_primitives(); + osd_dim wdim = win->get_size(); + win->target()->set_bounds(wdim.width(), wdim.height(), win->pixel_aspect()); + win->target()->set_transform_container(!chain_transform); + return &win->target()->get_primitives(); } static const char* WINDOW_PREFIX; diff --git a/src/osd/modules/render/drawd3d.cpp b/src/osd/modules/render/drawd3d.cpp index e28c3e7928a..6c682a80409 100644 --- a/src/osd/modules/render/drawd3d.cpp +++ b/src/osd/modules/render/drawd3d.cpp @@ -199,19 +199,22 @@ void renderer_d3d9::save() render_primitive_list *renderer_d3d9::get_primitives() { RECT client; + auto win = try_getwindow(); + if (win == nullptr) + return nullptr; - GetClientRectExceptMenu(window().platform_window(), &client, window().fullscreen()); + GetClientRectExceptMenu(win->platform_window(), &client, win->fullscreen()); if (rect_width(&client) > 0 && rect_height(&client) > 0) { - window().target()->set_bounds(rect_width(&client), rect_height(&client), window().pixel_aspect()); - window().target()->set_max_update_rate((get_refresh() == 0) ? get_origmode().RefreshRate : get_refresh()); + win->target()->set_bounds(rect_width(&client), rect_height(&client), win->pixel_aspect()); + win->target()->set_max_update_rate((get_refresh() == 0) ? get_origmode().RefreshRate : get_refresh()); } if (m_shaders != nullptr) { // do not transform primitives (scale, offset) if shaders are enabled, the shaders will handle the transformation - window().target()->set_transform_container(!m_shaders->enabled()); + win->target()->set_transform_container(!m_shaders->enabled()); } - return &window().target()->get_primitives(); + return &win->target()->get_primitives(); } @@ -410,8 +413,10 @@ d3d_texture_manager::d3d_texture_manager(renderer_d3d9 *d3d) } osd_printf_verbose("Direct3D: YUV format = %s\n", (m_yuv_format == D3DFMT_YUY2) ? "YUY2" : (m_yuv_format == D3DFMT_UYVY) ? "UYVY" : "RGB"); + auto win = d3d->assert_window(); + // set the max texture size - d3d->window().target()->set_max_texture_size(m_texture_max_width, m_texture_max_height); + win->target()->set_max_texture_size(m_texture_max_width, m_texture_max_height); osd_printf_verbose("Direct3D: Max texture size = %dx%d\n", (int)m_texture_max_width, (int)m_texture_max_height); } @@ -421,9 +426,11 @@ d3d_texture_manager::~d3d_texture_manager() void d3d_texture_manager::create_resources() { + auto win = m_renderer->assert_window(); + // experimental: load a PNG to use for vector rendering; it is treated // as a brightness map - emu_file file(m_renderer->window().machine().options().art_path(), OPEN_FLAG_READ); + emu_file file(win->machine().options().art_path(), OPEN_FLAG_READ); render_load_png(m_vector_bitmap, file, nullptr, "vector.png"); if (m_vector_bitmap.valid()) { @@ -447,7 +454,7 @@ void d3d_texture_manager::create_resources() texture.seqid = 0; // now create it - m_default_texture = global_alloc(texture_info(this, &texture, m_renderer->window().prescale(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32))); + m_default_texture = global_alloc(texture_info(this, &texture, win->prescale(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32))); } // experimental: if we have a vector bitmap, create a texture for it @@ -464,7 +471,7 @@ void d3d_texture_manager::create_resources() texture.seqid = 0; // now create it - m_vector_texture = global_alloc(texture_info(this, &texture, m_renderer->window().prescale(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32))); + m_vector_texture = global_alloc(texture_info(this, &texture, win->prescale(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32))); } } @@ -564,7 +571,7 @@ texture_info *d3d_texture_manager::find_texinfo(const render_texinfo *texinfo, U return nullptr; } -renderer_d3d9::renderer_d3d9(osd_window *window) +renderer_d3d9::renderer_d3d9(std::shared_ptr window) : osd_renderer(window, FLAG_NONE), m_adapter(0), m_width(0), m_height(0), m_refresh(0), m_create_error_count(0), m_device(nullptr), m_gamma_supported(0), m_pixformat(), m_vertexbuf(nullptr), m_lockedbuf(nullptr), m_numverts(0), m_vectorbatch(nullptr), m_batchindex(0), m_numpolys(0), m_restarting(false), m_mod2x_supported(0), m_mod4x_supported(0), m_screen_format(), m_last_texture(nullptr), m_last_texture_flags(0), m_last_blendenable(0), m_last_blendop(0), m_last_blendsrc(0), m_last_blenddst(0), m_last_filter(0), @@ -581,7 +588,8 @@ int renderer_d3d9::initialize() } // create the device immediately for the full screen case (defer for window mode) - if (window().fullscreen() && device_create(window().m_main->platform_window())) + auto win = assert_window(); + if (win->fullscreen() && device_create(win->main_window()->platform_window())) { return false; } @@ -591,8 +599,10 @@ int renderer_d3d9::initialize() int renderer_d3d9::pre_window_draw_check() { + auto win = assert_window(); + // if we're in the middle of resizing, leave things alone - if (window().m_resize_state == RESIZE_STATE_RESIZING) + if (win->m_resize_state == RESIZE_STATE_RESIZING) return 0; // if we're restarting the renderer, leave things alone @@ -614,7 +624,7 @@ int renderer_d3d9::pre_window_draw_check() } // in window mode, we need to track the window size - if (!window().fullscreen() || m_device == nullptr) + if (!win->fullscreen() || m_device == nullptr) { // if the size changes, skip this update since the render target will be out of date if (update_window_size()) @@ -630,7 +640,9 @@ int renderer_d3d9::pre_window_draw_check() void d3d_texture_manager::update_textures() { - for (render_primitive &prim : *m_renderer->window().m_primlist) + auto win = m_renderer->assert_window(); + + for (render_primitive &prim : *win->m_primlist) { if (prim.texture.base != nullptr) { @@ -645,7 +657,7 @@ void d3d_texture_manager::update_textures() else { // if there isn't one, create a new texture - texture = global_alloc(texture_info(this, &prim.texture, m_renderer->window().prescale(), prim.flags)); + texture = global_alloc(texture_info(this, &prim.texture, win->prescale(), prim.flags)); } } else @@ -681,12 +693,14 @@ void d3d_texture_manager::update_textures() void renderer_d3d9::begin_frame() { + auto win = assert_window(); + HRESULT result = (*d3dintf->device.clear)(m_device, 0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); m_shaders->begin_frame(); - window().m_primlist->acquire_lock(); + win->m_primlist->acquire_lock(); // first update any textures m_texture_manager->update_textures(); @@ -706,7 +720,7 @@ void renderer_d3d9::begin_frame() // loop over line primitives m_line_count = 0; - for (render_primitive &prim : *window().m_primlist) + for (render_primitive &prim : *win->m_primlist) { if (prim.type == render_primitive::LINE && PRIMFLAG_GET_VECTOR(prim.flags)) { @@ -717,8 +731,10 @@ void renderer_d3d9::begin_frame() void renderer_d3d9::process_primitives() { + auto win = assert_window(); + // Rotating index for vector time offsets - for (render_primitive &prim : *window().m_primlist) + for (render_primitive &prim : *win->m_primlist) { switch (prim.type) { @@ -748,7 +764,9 @@ void renderer_d3d9::process_primitives() void renderer_d3d9::end_frame() { - window().m_primlist->release_lock(); + auto win = assert_window(); + + win->m_primlist->release_lock(); // flush any pending polygons primitive_flush_pending(); @@ -819,6 +837,8 @@ try_again: } } + auto win = assert_window(); + // initialize the D3D presentation parameters memset(&m_presentation, 0, sizeof(m_presentation)); m_presentation.BackBufferWidth = m_width; @@ -827,13 +847,13 @@ try_again: m_presentation.BackBufferCount = video_config.triplebuf ? 2 : 1; m_presentation.MultiSampleType = D3DMULTISAMPLE_NONE; m_presentation.SwapEffect = D3DSWAPEFFECT_DISCARD; - m_presentation.hDeviceWindow = window().platform_window(); - m_presentation.Windowed = !window().fullscreen() || window().win_has_menu(); + m_presentation.hDeviceWindow = win->platform_window(); + m_presentation.Windowed = !win->fullscreen() || win->win_has_menu(); m_presentation.EnableAutoDepthStencil = FALSE; m_presentation.AutoDepthStencilFormat = D3DFMT_D16; m_presentation.Flags = 0; m_presentation.FullScreen_RefreshRateInHz = m_refresh; - m_presentation.PresentationInterval = ((video_config.triplebuf && window().fullscreen()) || + m_presentation.PresentationInterval = ((video_config.triplebuf && win->fullscreen()) || video_config.waitvsync || video_config.syncrefresh) ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; @@ -861,10 +881,10 @@ try_again: osd_printf_verbose("Direct3D: Device created at %dx%d\n", m_width, m_height); // set the gamma if we need to - if (window().fullscreen()) + if (win->fullscreen()) { // only set the gamma if it's not 1.0f - windows_options &options = downcast(window().machine().options()); + windows_options &options = downcast(win->machine().options()); float brightness = options.full_screen_brightness(); float contrast = options.full_screen_contrast(); float gamma = options.full_screen_gamma(); @@ -896,7 +916,7 @@ try_again: } m_shaders = (shaders*)global_alloc_clear(); - m_shaders->init(d3dintf, &window().machine(), this); + m_shaders->init(d3dintf, &win->machine(), this); m_sliders.clear(); int failed = m_shaders->create_resources(false, m_sliders); @@ -1194,13 +1214,15 @@ int renderer_d3d9::config_adapter_mode() return 1; } + auto win = assert_window(); + // choose a resolution: window mode case - if (!window().fullscreen() || !video_config.switchres || window().win_has_menu()) + if (!win->fullscreen() || !video_config.switchres || win->win_has_menu()) { RECT client; // bounds are from the window client rect - GetClientRectExceptMenu(window().platform_window(), &client, window().fullscreen()); + GetClientRectExceptMenu(win->platform_window(), &client, win->fullscreen()); m_width = client.right - client.left; m_height = client.bottom - client.top; @@ -1211,7 +1233,7 @@ int renderer_d3d9::config_adapter_mode() // make sure it's a pixel format we can get behind if (m_pixformat != D3DFMT_X1R5G5B5 && m_pixformat != D3DFMT_R5G6B5 && m_pixformat != D3DFMT_X8R8G8B8) { - osd_printf_error("Device %s currently in an unsupported mode\n", window().monitor()->devicename()); + osd_printf_error("Device %s currently in an unsupported mode\n", win->monitor()->devicename()); return 1; } } @@ -1231,10 +1253,10 @@ int renderer_d3d9::config_adapter_mode() } // see if we can handle the device type - result = (*d3dintf->d3d.check_device_type)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_pixformat, !window().fullscreen()); + result = (*d3dintf->d3d.check_device_type)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_pixformat, !win->fullscreen()); if (result != D3D_OK) { - osd_printf_error("Proposed video mode not supported on device %s\n", window().monitor()->devicename()); + osd_printf_error("Proposed video mode not supported on device %s\n", win->monitor()->devicename()); return 1; } return 0; @@ -1249,6 +1271,8 @@ int renderer_d3d9::get_adapter_for_monitor() { int maxadapter = (*d3dintf->d3d.get_adapter_count)(d3dintf); + auto win = assert_window(); + // iterate over adapters until we error or find a match for (int adapternum = 0; adapternum < maxadapter; adapternum++) { @@ -1256,7 +1280,7 @@ int renderer_d3d9::get_adapter_for_monitor() HMONITOR curmonitor = (*d3dintf->d3d.get_adapter_monitor)(d3dintf, adapternum); // if we match the proposed monitor, this is it - if (curmonitor == *((HMONITOR *)window().monitor()->oshandle())) + if (curmonitor == *((HMONITOR *)win->monitor()->oshandle())) { return adapternum; } @@ -1277,8 +1301,10 @@ void renderer_d3d9::pick_best_mode() INT32 minwidth, minheight; float best_score = 0.0f; + auto win = assert_window(); + // determine the refresh rate of the primary screen - const screen_device *primary_screen = window().machine().config().first_screen(); + const screen_device *primary_screen = win->machine().config().first_screen(); if (primary_screen != nullptr) { target_refresh = ATTOSECONDS_TO_HZ(primary_screen->refresh_attoseconds()); @@ -1288,7 +1314,7 @@ void renderer_d3d9::pick_best_mode() // note: technically we should not be calling this from an alternate window // thread; however, it is only done during init time, and the init code on // the main thread is waiting for us to finish, so it is safe to do so here - window().target()->compute_minimum_size(minwidth, minheight); + win->target()->compute_minimum_size(minwidth, minheight); // use those as the target for now INT32 target_width = minwidth; @@ -1323,7 +1349,7 @@ void renderer_d3d9::pick_best_mode() size_score *= 0.1f; // if we're looking for a particular mode, that's a winner - if (mode.Width == window().m_win_config.width && mode.Height == window().m_win_config.height) + if (mode.Width == win->m_win_config.width && mode.Height == win->m_win_config.height) size_score = 2.0f; // compute refresh score @@ -1334,7 +1360,7 @@ void renderer_d3d9::pick_best_mode() refresh_score *= 0.1f; // if we're looking for a particular refresh, make sure it matches - if (mode.RefreshRate == window().m_win_config.refresh) + if (mode.RefreshRate == win->m_win_config.refresh) refresh_score = 2.0f; // weight size and refresh equally @@ -1361,31 +1387,33 @@ void renderer_d3d9::pick_best_mode() int renderer_d3d9::update_window_size() { + auto win = assert_window(); + // get the current window bounds RECT client; - GetClientRectExceptMenu(window().platform_window(), &client, window().fullscreen()); + GetClientRectExceptMenu(win->platform_window(), &client, win->fullscreen()); // if we have a device and matching width/height, nothing to do if (m_device != nullptr && rect_width(&client) == m_width && rect_height(&client) == m_height) { // clear out any pending resizing if the area didn't change - if (window().m_resize_state == RESIZE_STATE_PENDING) - window().m_resize_state = RESIZE_STATE_NORMAL; + if (win->m_resize_state == RESIZE_STATE_PENDING) + win->m_resize_state = RESIZE_STATE_NORMAL; return FALSE; } // if we're in the middle of resizing, leave it alone as well - if (window().m_resize_state == RESIZE_STATE_RESIZING) + if (win->m_resize_state == RESIZE_STATE_RESIZING) return FALSE; // set the new bounds and create the device again m_width = rect_width(&client); m_height = rect_height(&client); - if (window().m_main != nullptr && device_create(window().m_main->platform_window())) + if (device_create(win->main_window()->platform_window())) return FALSE; // reset the resize state to normal, and indicate we made a change - window().m_resize_state = RESIZE_STATE_NORMAL; + win->m_resize_state = RESIZE_STATE_NORMAL; return TRUE; } @@ -1396,7 +1424,9 @@ int renderer_d3d9::update_window_size() void renderer_d3d9::batch_vectors() { - windows_options &options = downcast(window().machine().options()); + auto win = assert_window(); + + windows_options &options = downcast(win->machine().options()); float quad_width = 0.0f; float quad_height = 0.0f; @@ -1409,7 +1439,7 @@ void renderer_d3d9::batch_vectors() int line_index = 0; float period = options.screen_vector_time_period(); UINT32 cached_flags = 0; - for (render_primitive &prim : *window().m_primlist) + for (render_primitive &prim : *win->m_primlist) { switch (prim.type) { @@ -1447,15 +1477,15 @@ void renderer_d3d9::batch_vectors() if (m_shaders->enabled()) { bool orientation_swap_xy = - (window().machine().system().flags & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY; + (win->machine().system().flags & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY; bool rotation_swap_xy = - (window().target()->orientation() & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY; + (win->target()->orientation() & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY; bool swap_xy = orientation_swap_xy ^ rotation_swap_xy; - bool rotation_0 = window().target()->orientation() == ROT0; - bool rotation_90 = window().target()->orientation() == ROT90; - bool rotation_180 = window().target()->orientation() == ROT180; - bool rotation_270 = window().target()->orientation() == ROT270; + bool rotation_0 = win->target()->orientation() == ROT0; + bool rotation_90 = win->target()->orientation() == ROT90; + bool rotation_180 = win->target()->orientation() == ROT180; + bool rotation_270 = win->target()->orientation() == ROT270; bool flip_x = ((rotation_0 || rotation_270) && orientation_swap_xy) || ((rotation_180 || rotation_270) && !orientation_swap_xy); @@ -2074,7 +2104,9 @@ texture_info::texture_info(d3d_texture_manager *manager, const render_texinfo* t m_yprescale--; } - int prescale = m_renderer->window().prescale(); + auto win = m_renderer->assert_window(); + + int prescale = win->prescale(); if (m_xprescale != prescale || m_yprescale != prescale) { osd_printf_verbose("Direct3D: adjusting prescale from %dx%d to %dx%d\n", prescale, prescale, m_xprescale, m_yprescale); @@ -2941,7 +2973,7 @@ bool d3d_render_target::init(renderer_d3d9 *d3d, d3d_base *d3dintf, int source_w } bool vector_screen = - d3d->window().machine().first_screen()->screen_type() == SCREEN_TYPE_VECTOR; + d3d->assert_window()->machine().first_screen()->screen_type() == SCREEN_TYPE_VECTOR; float scale_factor = 0.75f; int scale_count = vector_screen ? MAX_BLOOM_COUNT : MAX_BLOOM_COUNT / 2; diff --git a/src/osd/modules/render/drawd3d.h b/src/osd/modules/render/drawd3d.h index 672ff6482bb..0777da977b0 100644 --- a/src/osd/modules/render/drawd3d.h +++ b/src/osd/modules/render/drawd3d.h @@ -40,7 +40,7 @@ class poly_info; class renderer_d3d9 : public osd_renderer { public: - renderer_d3d9(osd_window *window); + renderer_d3d9(std::shared_ptr window); virtual ~renderer_d3d9(); static bool init(running_machine &machine); diff --git a/src/osd/modules/render/drawgdi.cpp b/src/osd/modules/render/drawgdi.cpp index bfc949e5296..6d6b98218b6 100644 --- a/src/osd/modules/render/drawgdi.cpp +++ b/src/osd/modules/render/drawgdi.cpp @@ -45,10 +45,14 @@ int renderer_gdi::create() render_primitive_list *renderer_gdi::get_primitives() { + auto win = try_getwindow(); + if (win == nullptr) + return nullptr; + RECT client; - GetClientRect(window().platform_window(), &client); - window().target()->set_bounds(rect_width(&client), rect_height(&client), window().pixel_aspect()); - return &window().target()->get_primitives(); + GetClientRect(win->platform_window(), &client); + win->target()->set_bounds(rect_width(&client), rect_height(&client), win->pixel_aspect()); + return &win->target()->get_primitives(); } //============================================================ @@ -57,13 +61,15 @@ render_primitive_list *renderer_gdi::get_primitives() int renderer_gdi::draw(const int update) { + auto win = assert_window(); + // we don't have any special resize behaviors - if (window().m_resize_state == RESIZE_STATE_PENDING) - window().m_resize_state = RESIZE_STATE_NORMAL; + if (win->m_resize_state == RESIZE_STATE_PENDING) + win->m_resize_state = RESIZE_STATE_NORMAL; // get the target bounds RECT bounds; - GetClientRect(window().platform_window(), &bounds); + GetClientRect(win->platform_window(), &bounds); // compute width/height/pitch of target int width = rect_width(&bounds); @@ -79,16 +85,16 @@ int renderer_gdi::draw(const int update) } // draw the primitives to the bitmap - window().m_primlist->acquire_lock(); - software_renderer::draw_primitives(*window().m_primlist, m_bmdata, width, height, pitch); - window().m_primlist->release_lock(); + win->m_primlist->acquire_lock(); + software_renderer::draw_primitives(*win->m_primlist, m_bmdata, width, height, pitch); + win->m_primlist->release_lock(); // fill in bitmap-specific info m_bminfo.bmiHeader.biWidth = pitch; m_bminfo.bmiHeader.biHeight = -height; // blit to the screen - StretchDIBits(window().m_dc, 0, 0, width, height, + StretchDIBits(win->m_dc, 0, 0, width, height, 0, 0, width, height, m_bmdata, &m_bminfo, DIB_RGB_COLORS, SRCCOPY); return 0; diff --git a/src/osd/modules/render/drawgdi.h b/src/osd/modules/render/drawgdi.h index 7606bf14738..319ef9802e6 100644 --- a/src/osd/modules/render/drawgdi.h +++ b/src/osd/modules/render/drawgdi.h @@ -29,7 +29,7 @@ class renderer_gdi : public osd_renderer { public: - renderer_gdi(osd_window *window) + renderer_gdi(std::shared_ptr window) : osd_renderer(window, FLAG_NONE) , m_bmdata(nullptr) , m_bmsize(0) diff --git a/src/osd/modules/render/drawnone.cpp b/src/osd/modules/render/drawnone.cpp index 5e261daafe2..f6bde9d868f 100644 --- a/src/osd/modules/render/drawnone.cpp +++ b/src/osd/modules/render/drawnone.cpp @@ -21,8 +21,12 @@ render_primitive_list *renderer_none::get_primitives() { + auto win = try_getwindow(); + if (win == nullptr) + return nullptr; + RECT client; - GetClientRect(window().platform_window(), &client); - window().target()->set_bounds(rect_width(&client), rect_height(&client), window().pixel_aspect()); - return &window().target()->get_primitives(); + GetClientRect(win->platform_window(), &client); + win->target()->set_bounds(rect_width(&client), rect_height(&client), win->pixel_aspect()); + return &win->target()->get_primitives(); } diff --git a/src/osd/modules/render/drawnone.h b/src/osd/modules/render/drawnone.h index 08873860e61..1fc4a50b689 100644 --- a/src/osd/modules/render/drawnone.h +++ b/src/osd/modules/render/drawnone.h @@ -17,7 +17,7 @@ class renderer_none : public osd_renderer { public: - renderer_none(osd_window *window) + renderer_none(std::shared_ptr window) : osd_renderer(window, FLAG_NONE) { } virtual ~renderer_none() { } diff --git a/src/osd/modules/render/drawogl.cpp b/src/osd/modules/render/drawogl.cpp index a7ffe24a5df..01d8085efd7 100644 --- a/src/osd/modules/render/drawogl.cpp +++ b/src/osd/modules/render/drawogl.cpp @@ -559,11 +559,13 @@ void renderer_ogl::initialize_gl() int renderer_ogl::create() { + auto win = assert_window(); + // create renderer #if defined(OSD_WINDOWS) - m_gl_context = global_alloc(win_gl_context(window().platform_window())); + m_gl_context = global_alloc(win_gl_context(win->platform_window())); #else - m_gl_context = global_alloc(sdl_gl_context(window().platform_window())); + m_gl_context = global_alloc(sdl_gl_context(win->platform_window())); #endif if (m_gl_context->LastErrorMsg() != nullptr) { @@ -627,12 +629,19 @@ void renderer_ogl::destroy_all_textures() if ( !m_initialized ) return; + auto win = try_getwindow(); + + // During destroy this can get called + // and the window is no longer available + if (win == nullptr) + return; + m_gl_context->MakeCurrent(); - if(window().m_primlist) + if(win->m_primlist) { lock=TRUE; - window().m_primlist->acquire_lock(); + win->m_primlist->acquire_lock(); } glFinish(); @@ -694,7 +703,7 @@ void renderer_ogl::destroy_all_textures() m_initialized = 0; if (lock) - window().m_primlist->release_lock(); + win->m_primlist->release_lock(); } //============================================================ // loadGLExtensions @@ -914,7 +923,7 @@ void renderer_ogl::loadGLExtensions() if ( m_useglsl ) { - if ( window().prescale() != 1 ) + if (assert_window()->prescale() != 1 ) { m_useglsl = 0; if (_once) @@ -1023,7 +1032,9 @@ int renderer_ogl::draw(const int update) } #endif - osd_dim wdim = window().get_size(); + auto win = assert_window(); + + osd_dim wdim = win->get_size(); if (has_flags(FI_CHANGED) || (wdim.width() != m_width) || (wdim.height() != m_height)) { @@ -1074,7 +1085,7 @@ int renderer_ogl::draw(const int update) // we're doing nothing 3d, so the Z-buffer is currently not interesting glDisable(GL_DEPTH_TEST); - if (window().machine().options().antialias()) + if (win->machine().options().antialias()) { // enable antialiasing for lines glEnable(GL_LINE_SMOOTH); @@ -1154,10 +1165,10 @@ int renderer_ogl::draw(const int update) m_last_hofs = hofs; m_last_vofs = vofs; - window().m_primlist->acquire_lock(); + win->m_primlist->acquire_lock(); // now draw - for (render_primitive &prim : *window().m_primlist) + for (render_primitive &prim : *win->m_primlist) { int i; @@ -1373,7 +1384,7 @@ int renderer_ogl::draw(const int update) pendingPrimitive=GL_NO_PRIMITIVE; } - window().m_primlist->release_lock(); + win->m_primlist->release_lock(); m_init_context = 0; m_gl_context->SwapBuffer(); @@ -1508,8 +1519,10 @@ void renderer_ogl::texture_compute_size_subroutine(ogl_texture_info *texture, UI texture->xprescale--; while (texture->yprescale > 1 && height_create * texture->yprescale > m_texture_max_height) texture->yprescale--; - if (PRIMFLAG_GET_SCREENTEX(flags) && (texture->xprescale != window().prescale() || texture->yprescale != window().prescale())) - osd_printf_warning("SDL: adjusting prescale from %dx%d to %dx%d\n", window().prescale(), window().prescale(), texture->xprescale, texture->yprescale); + + auto win = assert_window(); + if (PRIMFLAG_GET_SCREENTEX(flags) && (texture->xprescale != win->prescale() || texture->yprescale != win->prescale())) + osd_printf_warning("SDL: adjusting prescale from %dx%d to %dx%d\n", win->prescale(), win->prescale(), texture->xprescale, texture->yprescale); width *= texture->xprescale; height *= texture->yprescale; @@ -1871,8 +1884,9 @@ ogl_texture_info *renderer_ogl::texture_create(const render_texinfo *texsource, texture->texinfo.seqid = -1; // force set data if (PRIMFLAG_GET_SCREENTEX(flags)) { - texture->xprescale = window().prescale(); - texture->yprescale = window().prescale(); + auto win = assert_window(); + texture->xprescale = win->prescale(); + texture->yprescale = win->prescale(); } else { diff --git a/src/osd/modules/render/drawogl.h b/src/osd/modules/render/drawogl.h index 7b89040e925..6b959f1da35 100644 --- a/src/osd/modules/render/drawogl.h +++ b/src/osd/modules/render/drawogl.h @@ -95,7 +95,7 @@ public: class renderer_ogl : public osd_renderer { public: - renderer_ogl(osd_window *window) + renderer_ogl(std::shared_ptr window) : osd_renderer(window, FLAG_NEEDS_OPENGL) , m_blittimer(0) , m_width(0) @@ -141,14 +141,18 @@ public: #endif virtual render_primitive_list *get_primitives() override { - osd_dim nd = window().get_size(); + auto win = try_getwindow(); + if (win == nullptr) + return nullptr; + + osd_dim nd = win->get_size(); if (nd != m_blit_dim) { m_blit_dim = nd; notify_changed(); } - window().target()->set_bounds(m_blit_dim.width(), m_blit_dim.height(), window().pixel_aspect()); - return &window().target()->get_primitives(); + win->target()->set_bounds(m_blit_dim.width(), m_blit_dim.height(), win->pixel_aspect()); + return &win->target()->get_primitives(); } #ifdef OSD_WINDOWS diff --git a/src/osd/modules/render/drawsdl.cpp b/src/osd/modules/render/drawsdl.cpp index af597516633..72d2f4c4c91 100644 --- a/src/osd/modules/render/drawsdl.cpp +++ b/src/osd/modules/render/drawsdl.cpp @@ -105,8 +105,10 @@ void renderer_sdl1::setup_texture(const osd_dim &size) SDL_DisplayMode mode; UINT32 fmt; + auto win = assert_window(); + // Determine preferred pixelformat and set up yuv if necessary - SDL_GetCurrentDisplayMode(*((UINT64 *)window().monitor()->oshandle()), &mode); + SDL_GetCurrentDisplayMode(*((UINT64 *)win->monitor()->oshandle()), &mode); if (m_yuv_bitmap) { @@ -121,11 +123,11 @@ void renderer_sdl1::setup_texture(const osd_dim &size) int m_hw_scale_width = 0; int m_hw_scale_height = 0; - window().target()->compute_minimum_size(m_hw_scale_width, m_hw_scale_height); - if (window().prescale()) + win->target()->compute_minimum_size(m_hw_scale_width, m_hw_scale_height); + if (win->prescale()) { - m_hw_scale_width *= window().prescale(); - m_hw_scale_height *= window().prescale(); + m_hw_scale_width *= win->prescale(); + m_hw_scale_height *= win->prescale(); /* This must be a multiple of 2 */ m_hw_scale_width = (m_hw_scale_width + 1) & ~1; @@ -185,6 +187,7 @@ int renderer_sdl1::create() { const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode]; + auto win = assert_window(); // create renderer /* set hints ... */ @@ -192,16 +195,16 @@ int renderer_sdl1::create() if (video_config.waitvsync) - m_sdl_renderer = SDL_CreateRenderer(window().platform_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + m_sdl_renderer = SDL_CreateRenderer(win->platform_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); else - m_sdl_renderer = SDL_CreateRenderer(window().platform_window(), -1, SDL_RENDERER_ACCELERATED); + m_sdl_renderer = SDL_CreateRenderer(win->platform_window(), -1, SDL_RENDERER_ACCELERATED); if (!m_sdl_renderer) { if (video_config.waitvsync) - m_sdl_renderer = SDL_CreateRenderer(window().platform_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_SOFTWARE); + m_sdl_renderer = SDL_CreateRenderer(win->platform_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_SOFTWARE); else - m_sdl_renderer = SDL_CreateRenderer(window().platform_window(), -1, SDL_RENDERER_SOFTWARE); + m_sdl_renderer = SDL_CreateRenderer(win->platform_window(), -1, SDL_RENDERER_SOFTWARE); } if (!m_sdl_renderer) @@ -311,7 +314,9 @@ int renderer_sdl1::draw(int update) return 0; } - osd_dim wdim = window().get_size(); + auto win = assert_window(); + + osd_dim wdim = win->get_size(); if (has_flags(FI_CHANGED) || (wdim != m_last_dim)) { destroy_all_textures(); @@ -378,7 +383,7 @@ int renderer_sdl1::draw(int update) m_last_hofs = hofs; m_last_vofs = vofs; - window().m_primlist->acquire_lock(); + win->m_primlist->acquire_lock(); int mamewidth, mameheight; @@ -396,7 +401,7 @@ int renderer_sdl1::draw(int update) // FIXME: this could be a lot easier if we get the primlist here! // Bounds would be set fit for purpose and done! - for (render_primitive &prim : *window().m_primlist) + for (render_primitive &prim : *win->m_primlist) { prim.bounds.x0 = floor(fw * prim.bounds.x0 + 0.5f); prim.bounds.x1 = floor(fw * prim.bounds.x1 + 0.5f); @@ -410,23 +415,23 @@ int renderer_sdl1::draw(int update) switch (rmask) { case 0x0000ff00: - software_renderer::draw_primitives(*window().m_primlist, surfptr, mamewidth, mameheight, pitch / 4); + software_renderer::draw_primitives(*win->m_primlist, surfptr, mamewidth, mameheight, pitch / 4); break; case 0x00ff0000: - software_renderer::draw_primitives(*window().m_primlist, surfptr, mamewidth, mameheight, pitch / 4); + software_renderer::draw_primitives(*win->m_primlist, surfptr, mamewidth, mameheight, pitch / 4); break; case 0x000000ff: - software_renderer::draw_primitives(*window().m_primlist, surfptr, mamewidth, mameheight, pitch / 4); + software_renderer::draw_primitives(*win->m_primlist, surfptr, mamewidth, mameheight, pitch / 4); break; case 0xf800: - software_renderer::draw_primitives(*window().m_primlist, surfptr, mamewidth, mameheight, pitch / 2); + software_renderer::draw_primitives(*win->m_primlist, surfptr, mamewidth, mameheight, pitch / 2); break; case 0x7c00: - software_renderer::draw_primitives(*window().m_primlist, surfptr, mamewidth, mameheight, pitch / 2); + software_renderer::draw_primitives(*win->m_primlist, surfptr, mamewidth, mameheight, pitch / 2); break; default: @@ -438,11 +443,11 @@ int renderer_sdl1::draw(int update) { assert (m_yuv_bitmap != nullptr); assert (surfptr != nullptr); - software_renderer::draw_primitives(*window().m_primlist, m_yuv_bitmap, mamewidth, mameheight, mamewidth); + software_renderer::draw_primitives(*win->m_primlist, m_yuv_bitmap, mamewidth, mameheight, mamewidth); sm->yuv_blit((UINT16 *)m_yuv_bitmap, surfptr, pitch, m_yuv_lookup, mamewidth, mameheight); } - window().m_primlist->release_lock(); + win->m_primlist->release_lock(); // unlock and flip SDL_UnlockTexture(m_texture_id); @@ -671,12 +676,16 @@ static void yuv_RGB_to_YUY2X2(const UINT16 *bitmap, UINT8 *ptr, const int pitch, render_primitive_list *renderer_sdl1::get_primitives() { - osd_dim nd = window().get_size(); + auto win = try_getwindow(); + if (win == nullptr) + return nullptr; + + osd_dim nd = win->get_size(); if (nd != m_blit_dim) { m_blit_dim = nd; notify_changed(); } - window().target()->set_bounds(m_blit_dim.width(), m_blit_dim.height(), window().pixel_aspect()); - return &window().target()->get_primitives(); + win->target()->set_bounds(m_blit_dim.width(), m_blit_dim.height(), win->pixel_aspect()); + return &win->target()->get_primitives(); } diff --git a/src/osd/modules/render/drawsdl.h b/src/osd/modules/render/drawsdl.h index 2958dbf265a..4bdceb69ab7 100644 --- a/src/osd/modules/render/drawsdl.h +++ b/src/osd/modules/render/drawsdl.h @@ -20,7 +20,7 @@ class renderer_sdl1 : public osd_renderer { public: - renderer_sdl1(osd_window *w, int extra_flags) + renderer_sdl1(std::shared_ptr w, int extra_flags) : osd_renderer(w, FLAG_NEEDS_OPENGL | extra_flags) , m_sdl_renderer(nullptr) , m_texture_id(nullptr) diff --git a/src/osd/modules/sound/direct_sound.cpp b/src/osd/modules/sound/direct_sound.cpp index 83b7edd65ca..5b20cfb61fa 100644 --- a/src/osd/modules/sound/direct_sound.cpp +++ b/src/osd/modules/sound/direct_sound.cpp @@ -404,10 +404,10 @@ HRESULT sound_direct_sound::dsound_init() #ifdef SDLMAME_WIN32 SDL_SysWMinfo wminfo; SDL_VERSION(&wminfo.version); - SDL_GetWindowWMInfo(sdl_window_list->platform_window(), &wminfo); + SDL_GetWindowWMInfo(sdl_window_list.front()->platform_window(), &wminfo); HWND const window = wminfo.info.win.window; #else // SDLMAME_WIN32 - HWND const window = win_window_list->platform_window(); + HWND const window = win_window_list.front()->platform_window(); #endif // SDLMAME_WIN32 result = m_dsound->SetCooperativeLevel(window, DSSCL_PRIORITY); } diff --git a/src/osd/sdl/video.cpp b/src/osd/sdl/video.cpp index 099c4bccfc9..3aafee31dcc 100644 --- a/src/osd/sdl/video.cpp +++ b/src/osd/sdl/video.cpp @@ -82,7 +82,7 @@ bool sdl_osd_interface::video_init() get_resolution(options().resolution(), options().resolution(index), &conf, TRUE); // create window ... - sdl_window_info *win = global_alloc(sdl_window_info(machine(), index, osd_monitor_info::pick_monitor(reinterpret_cast(options()), index), &conf)); + std::shared_ptr win = std::make_shared(machine(), index, osd_monitor_info::pick_monitor(reinterpret_cast(options()), index), &conf); if (win->window_init()) return false; @@ -140,7 +140,7 @@ void sdl_osd_interface::update(bool skip_redraw) if (!skip_redraw) { // profiler_mark(PROFILER_BLIT); - for (sdl_window_info *window = sdl_window_list; window != NULL; window = window->m_next) + for (auto window : sdl_window_list) window->update(); // profiler_mark(PROFILER_END); } @@ -270,20 +270,14 @@ finishit: static void check_osd_inputs(running_machine &machine) { - sdl_window_info *window = sdl_window_list; - // check for toggling fullscreen mode if (machine.ui_input().pressed(IPT_OSD_1)) { - sdl_window_info *curwin = sdl_window_list; - - while (curwin != (sdl_window_info *)NULL) - { + for (auto curwin : sdl_window_list) curwin->toggle_full_screen(); - curwin = curwin->m_next; - } } + auto window = sdl_window_list.front(); if (machine.ui_input().pressed(IPT_OSD_2)) { //FIXME: on a per window basis diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index ea3843515f7..0f6b94abaaf 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -23,6 +23,8 @@ #ifndef _MSC_VER #include #endif +#include +#include // MAME headers @@ -80,14 +82,7 @@ // GLOBAL VARIABLES //============================================================ -sdl_window_info *sdl_window_list; - - -//============================================================ -// LOCAL VARIABLES -//============================================================ - -static sdl_window_info **last_window_ptr; +std::list> sdl_window_list; class SDL_DM_Wrapper { @@ -104,31 +99,33 @@ static SDL_threadID window_threadid; // debugger //static int in_background; -struct worker_param { +class worker_param +{ +public: worker_param() : m_window(nullptr), m_list(nullptr), m_resize_new_width(0), m_resize_new_height(0) { } - worker_param(sdl_window_info *awindow, render_primitive_list &alist) + worker_param(std::shared_ptr awindow, render_primitive_list &alist) : m_window(awindow), m_list(&alist), m_resize_new_width(0), m_resize_new_height(0) { } - worker_param(sdl_window_info *awindow, int anew_width, int anew_height) + worker_param(std::shared_ptr awindow, int anew_width, int anew_height) : m_window(awindow), m_list(nullptr), m_resize_new_width(anew_width), m_resize_new_height(anew_height) { } - worker_param(sdl_window_info *awindow) + worker_param(std::shared_ptr awindow) : m_window(awindow), m_list(nullptr), m_resize_new_width(0), m_resize_new_height(0) { } - sdl_window_info *window() const { assert(m_window != nullptr); return m_window; } + std::shared_ptr window() const { assert(m_window != nullptr); return m_window; } render_primitive_list *list() const { return m_list; } int new_width() const { return m_resize_new_width; } int new_height() const { return m_resize_new_height; } // FIXME: only needed for window set-up which returns an error. - void set_window(sdl_window_info *window) { m_window = window; } + void set_window(std::shared_ptr window) { m_window = window; } private: - sdl_window_info *m_window; + std::shared_ptr m_window; render_primitive_list *m_list; int m_resize_new_width; int m_resize_new_height; @@ -145,20 +142,15 @@ static void sdlwindow_sync(void); // execute_async //============================================================ - -static inline void execute_async(osd_work_callback callback, const worker_param &wp) +// The idea of using unique_ptr here is to make sure the caller isn't holding onto a copy +static inline void execute_async(osd_work_callback callback, std::unique_ptr wp) { - worker_param *wp_temp = (worker_param *) osd_malloc(sizeof(worker_param)); - *wp_temp = wp; - callback((void *) wp_temp, 0); + callback(wp.release(), 0); } -static inline void execute_sync(osd_work_callback callback, const worker_param &wp) +static inline void execute_sync(osd_work_callback callback, std::unique_ptr wp) { - worker_param *wp_temp = (worker_param *) osd_malloc(sizeof(worker_param)); - *wp_temp = wp; - - callback((void *) wp_temp, 0); + callback(wp.release(), 0); } @@ -166,9 +158,9 @@ static inline void execute_sync(osd_work_callback callback, const worker_param & // execute_async_wait //============================================================ -static inline void execute_async_wait(osd_work_callback callback, const worker_param &wp) +static inline void execute_async_wait(osd_work_callback callback, std::unique_ptr wp) { - execute_async(callback, wp); + execute_async(callback, std::move(wp)); sdlwindow_sync(); } @@ -254,7 +246,6 @@ bool sdl_osd_interface::window_init() osd_printf_verbose("\t%-40s %s\n", hints[i], SDL_GetHint(hints[i])); // set up the window list - last_window_ptr = &sdl_window_list; osd_printf_verbose("Leave sdlwindow_init\n"); return true; } @@ -272,10 +263,10 @@ static void sdlwindow_sync(void) void sdl_osd_interface::update_slider_list() { - for (sdl_window_info *window = sdl_window_list; window != nullptr; window = window->m_next) + for (auto window : sdl_window_list) { // check if any window has dirty sliders - if (&window->renderer() && window->renderer().sliders_dirty()) + if (window->renderer().sliders_dirty()) { build_slider_list(); return; @@ -287,7 +278,7 @@ void sdl_osd_interface::build_slider_list() { m_sliders.clear(); - for (sdl_window_info *window = sdl_window_list; window != nullptr; window = window->m_next) + for (auto window : sdl_window_list) { std::vector window_sliders = window->renderer().get_slider_list(); m_sliders.insert(m_sliders.end(), window_sliders.begin(), window_sliders.end()); @@ -309,20 +300,19 @@ static OSDWORK_CALLBACK( sdlwindow_exit_wt ) void sdl_osd_interface::window_exit() { - worker_param wp_dummy; + std::unique_ptr wp_dummy(nullptr); ASSERT_MAIN_THREAD(); osd_printf_verbose("Enter sdlwindow_exit\n"); // free all the windows - while (sdl_window_list != nullptr) + while (!sdl_window_list.empty()) { - sdl_window_info *temp = sdl_window_list; - sdl_window_list = temp->m_next; - temp->destroy(); - // free the window itself - global_free(temp); + auto window = sdl_window_list.front(); + + // Part of destroy removes the window from the list + window->destroy(); } switch(video_config.mode) @@ -345,7 +335,7 @@ void sdl_osd_interface::window_exit() break; } - execute_async_wait(&sdlwindow_exit_wt, wp_dummy); + execute_async_wait(&sdlwindow_exit_wt, std::move(wp_dummy)); osd_printf_verbose("Leave sdlwindow_exit\n"); @@ -384,8 +374,8 @@ void sdl_window_info::show_pointer() OSDWORK_CALLBACK( sdl_window_info::sdlwindow_resize_wt ) { - worker_param * wp = (worker_param *) param; - sdl_window_info * window = wp->window(); + auto wp = std::unique_ptr(static_cast(param)); + auto window = wp->window(); int width = wp->new_width(); int height = wp->new_height(); @@ -394,7 +384,6 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_resize_wt ) SDL_SetWindowSize(window->platform_window(), width, height); window->renderer().notify_changed(); - osd_free(wp); return nullptr; } @@ -405,7 +394,10 @@ void sdl_window_info::resize(INT32 width, INT32 height) osd_dim cd = get_size(); if (width != cd.width() || height != cd.height()) - execute_async_wait(&sdlwindow_resize_wt, worker_param(this, width, height)); + { + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this()), width, height); + execute_async_wait(&sdlwindow_resize_wt, std::move(wp)); + } } @@ -416,26 +408,24 @@ void sdl_window_info::resize(INT32 width, INT32 height) OSDWORK_CALLBACK( sdl_window_info::notify_changed_wt ) { - worker_param *wp = (worker_param *) param; - sdl_window_info *window = wp->window(); + auto wp = std::unique_ptr(static_cast(param)); + auto window = wp->window(); ASSERT_WINDOW_THREAD(); window->renderer().notify_changed(); - osd_free(wp); return nullptr; } void sdl_window_info::notify_changed() { - worker_param wp; - + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this())); if (SDL_ThreadID() == main_threadid) { - execute_async_wait(¬ify_changed_wt, worker_param(this)); + execute_async_wait(¬ify_changed_wt, std::move(wp)); } else - execute_sync(¬ify_changed_wt, worker_param(this)); + execute_sync(¬ify_changed_wt, std::move(wp)); } @@ -446,8 +436,8 @@ void sdl_window_info::notify_changed() OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) { - worker_param *wp = (worker_param *) param; - sdl_window_info *window = wp->window(); + auto wp = std::unique_ptr(static_cast(param)); + auto window = wp->window(); ASSERT_WINDOW_THREAD(); @@ -461,12 +451,6 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) window->m_windowed_dim = window->get_size(); } - if (window->m_renderer != nullptr) - { - delete window->m_renderer; - window->m_renderer = nullptr; - } - bool is_osx = false; #ifdef SDLMAME_MACOSX // FIXME: This is weird behaviour and certainly a bug in SDL @@ -482,7 +466,7 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) downcast(window->machine().osd()).release_keys(); - window->set_renderer(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(window))); + window->set_renderer(osd_renderer::make_for_type(video_config.mode, window->shared_from_this())); // toggle the window mode window->set_fullscreen(!window->fullscreen()); @@ -495,13 +479,12 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) void sdl_window_info::toggle_full_screen() { ASSERT_MAIN_THREAD(); - - execute_async_wait(&sdlwindow_toggle_full_screen_wt, worker_param(this)); + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this())); + execute_async_wait(&sdlwindow_toggle_full_screen_wt, std::move(wp)); } void sdl_window_info::modify_prescale(int dir) { - worker_param wp = worker_param(this); int new_prescale = prescale(); if (dir > 0 && prescale() < 3) @@ -513,11 +496,13 @@ void sdl_window_info::modify_prescale(int dir) { if (m_fullscreen && video_config.switchres) { - execute_async_wait(&sdlwindow_video_window_destroy_wt, wp); + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this())); + execute_async_wait(&sdlwindow_video_window_destroy_wt, std::move(wp)); m_prescale = new_prescale; - execute_async_wait(&complete_create_wt, wp); + wp = std::make_unique(std::static_pointer_cast(shared_from_this())); + execute_async_wait(&complete_create_wt, std::move(wp)); } else @@ -570,12 +555,11 @@ void sdl_window_info::update_cursor_state() OSDWORK_CALLBACK( sdl_window_info::update_cursor_state_wt ) { - worker_param * wp = (worker_param *) param; - sdl_window_info * window = wp->window(); + auto wp = std::unique_ptr(static_cast(param)); + auto window = wp->window(); window->update_cursor_state(); - osd_free(wp); return nullptr; } @@ -591,7 +575,6 @@ int sdl_window_info::xy_to_render_target(int x, int y, int *xt, int *yt) int sdl_window_info::window_init() { - worker_param *wp = (worker_param *) osd_malloc(sizeof(worker_param)); int result; ASSERT_MAIN_THREAD(); @@ -602,10 +585,9 @@ int sdl_window_info::window_init() m_startmaximized = options.maximize(); // add us to the list - *last_window_ptr = this; - last_window_ptr = &this->m_next; + sdl_window_list.push_back(std::static_pointer_cast(shared_from_this())); - set_renderer(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this))); + set_renderer(osd_renderer::make_for_type(video_config.mode, static_cast(this)->shared_from_this())); // load the layout m_target = m_machine.render().target_alloc(); @@ -619,9 +601,9 @@ int sdl_window_info::window_init() else sprintf(m_title, "%s: %s [%s] - Screen %d", emulator_info::get_appname(), m_machine.system().description, m_machine.system().name, m_index); - wp->set_window(this); + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this())); - result = *((int *) sdl_window_info::complete_create_wt((void *) wp, 0)); + result = *((int *) sdl_window_info::complete_create_wt(wp.release(), 0)); // handle error conditions if (result == 1) @@ -642,15 +624,11 @@ error: OSDWORK_CALLBACK( sdl_window_info::sdlwindow_video_window_destroy_wt ) { - worker_param * wp = (worker_param *) param; - sdl_window_info * window = wp->window(); + auto wp = std::unique_ptr(static_cast(param)); + auto window = wp->window(); ASSERT_WINDOW_THREAD(); - // free the textures etc - global_free(window->m_renderer); - window->m_renderer = nullptr; - if (window->fullscreen() && video_config.switchres) { SDL_SetWindowFullscreen(window->platform_window(), 0); // Try to set mode @@ -661,28 +639,21 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_video_window_destroy_wt ) // release all keys ... downcast(window->machine().osd()).release_keys(); - osd_free(wp); return nullptr; } void sdl_window_info::destroy() { - sdl_window_info **prevptr; - ASSERT_MAIN_THREAD(); //osd_event_wait(window->rendered_event, osd_ticks_per_second()*10); // remove us from the list - for (prevptr = &sdl_window_list; *prevptr != nullptr; prevptr = &(*prevptr)->m_next) - if (*prevptr == this) - { - *prevptr = this->m_next; - break; - } + sdl_window_list.remove(std::static_pointer_cast(shared_from_this())); // free the textures etc - execute_async_wait(&sdlwindow_video_window_destroy_wt, worker_param(this)); + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this())); + execute_async_wait(&sdlwindow_video_window_destroy_wt, std::move(wp)); // free the render target, after the textures! this->machine().render().target_free(m_target); @@ -776,7 +747,8 @@ void sdl_window_info::update() // adjust the cursor state //sdlwindow_update_cursor_state(machine, window); - execute_async(&update_cursor_state_wt, worker_param(this)); + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this())); + execute_async(&update_cursor_state_wt, std::move(wp)); // if we're visible and running and not in the middle of a resize, draw if (m_target != nullptr) @@ -810,11 +782,11 @@ void sdl_window_info::update() { // ensure the target bounds are up-to-date, and then get the primitives - render_primitive_list &primlist = *m_renderer->get_primitives(); + render_primitive_list &primlist = *renderer().get_primitives(); // and redraw now - - execute_async(&draw_video_contents_wt, worker_param(this, primlist)); + auto wp = std::make_unique(std::static_pointer_cast(shared_from_this()), primlist); + execute_async(&draw_video_contents_wt, std::move(wp)); } } } @@ -850,14 +822,13 @@ void sdl_window_info::set_starting_view(int index, const char *defview, const ch OSDWORK_CALLBACK( sdl_window_info::complete_create_wt ) { - worker_param * wp = (worker_param *) param; - sdl_window_info * window = wp->window(); + auto wp = std::unique_ptr(static_cast(param)); + auto window = wp->window(); osd_dim temp(0,0); static int result[2] = {0,1}; ASSERT_WINDOW_THREAD(); - osd_free(wp); // clear out original mode. Needed on OSX if (window->fullscreen()) @@ -981,14 +952,19 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt ) // set main window if (window->m_index > 0) { - for (auto w = sdl_window_list; w != nullptr; w = w->m_next) + for (auto w : sdl_window_list) { if (w->m_index == 0) - { - window->m_main = w; + { + window->set_main_window(std::dynamic_pointer_cast(w)); break; + } + } } - } + else + { + // We must be the main window + window->set_main_window(window); } // update monitor resolution after mode change to ensure proper pixel aspect @@ -1058,8 +1034,8 @@ void sdl_window_info::measure_fps(int update) OSDWORK_CALLBACK( sdl_window_info::draw_video_contents_wt ) { int update = 1; - worker_param *wp = (worker_param *) param; - sdl_window_info *window = wp->window(); + auto wp = std::unique_ptr(static_cast(param)); + auto window = wp->window(); ASSERT_REDRAW_THREAD(); @@ -1096,7 +1072,6 @@ OSDWORK_CALLBACK( sdl_window_info::draw_video_contents_wt ) /* all done, ready for next */ window->m_rendered_event.set(); - osd_free(wp); return nullptr; } @@ -1363,6 +1338,5 @@ sdl_window_info::sdl_window_info(running_machine &a_machine, int index, osd_moni sdl_window_info::~sdl_window_info() { - global_free(m_renderer); global_free(m_original_mode); } diff --git a/src/osd/sdl/window.h b/src/osd/sdl/window.h index 14ee6e3c19a..403c12a8e46 100644 --- a/src/osd/sdl/window.h +++ b/src/osd/sdl/window.h @@ -17,6 +17,8 @@ #include "modules/osdwindow.h" #include +#include +#include //============================================================ @@ -65,7 +67,6 @@ public: render_target *target() override { return m_target; } int prescale() const { return m_prescale; } - osd_renderer &renderer() const { return *m_renderer; } // Pointer to next window sdl_window_info * m_next; @@ -88,11 +89,6 @@ private: int m_extra_flags; - void set_renderer(osd_renderer *renderer) - { - m_renderer = renderer; - } - static OSDWORK_CALLBACK( complete_create_wt ); private: @@ -111,7 +107,6 @@ private: // monitor info osd_monitor_info * m_monitor; int m_fullscreen; - osd_renderer * m_renderer; // static callbacks ... @@ -136,7 +131,7 @@ struct osd_draw_callbacks //============================================================ // window - list -extern sdl_window_info *sdl_window_list; +extern std::list> sdl_window_list; //============================================================ // PROTOTYPES diff --git a/src/osd/windows/video.cpp b/src/osd/windows/video.cpp index c4ee864389a..d394a3e1821 100644 --- a/src/osd/windows/video.cpp +++ b/src/osd/windows/video.cpp @@ -81,7 +81,7 @@ bool windows_osd_interface::video_init() } if (video_config.mode != VIDEO_MODE_NONE) - SetForegroundWindow(win_window_list->platform_window()); + SetForegroundWindow(win_window_list.front()->platform_window()); return true; } @@ -170,7 +170,7 @@ void windows_osd_interface::update(bool skip_redraw) if (!skip_redraw) { // profiler_mark(PROFILER_BLIT); - for (win_window_info *window = win_window_list; window != NULL; window = window->m_next) + for (auto window : win_window_list) window->update(); // profiler_mark(PROFILER_END); } diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index 1bae62625f3..f5534a13544 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -17,6 +17,8 @@ #include #include +#include +#include // MAME headers #include "emu.h" @@ -87,8 +89,7 @@ using namespace Windows::UI::Core; // GLOBAL VARIABLES //============================================================ -win_window_info *win_window_list; -static win_window_info **last_window_ptr; +std::list> win_window_list; static DWORD main_threadid; // actual physical resolution @@ -250,15 +251,12 @@ bool windows_osd_interface::window_init() } video_config.mode = current_mode; - // set up the window list - last_window_ptr = &win_window_list; - return true; } void windows_osd_interface::update_slider_list() { - for (win_window_info *window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) { // check if any window has dirty sliders if (window->m_renderer && window->m_renderer->sliders_dirty()) @@ -271,19 +269,14 @@ void windows_osd_interface::update_slider_list() int windows_osd_interface::window_count() { - int count = 0; - for (win_window_info *info = win_window_list; info != nullptr; info = info->m_next) - { - count++; - } - return count; + return win_window_list.size(); } void windows_osd_interface::build_slider_list() { m_sliders.clear(); - for (win_window_info *window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) { // take the sliders of the first window std::vector window_sliders = window->m_renderer->get_slider_list(); @@ -293,7 +286,7 @@ void windows_osd_interface::build_slider_list() void windows_osd_interface::add_audio_to_recording(const INT16 *buffer, int samples_this_frame) { - win_window_info *window = win_window_list; // We only record on the first window + auto window = win_window_list.front(); // We only record on the first window if (window != nullptr && window->m_renderer != nullptr) { window->m_renderer->add_audio_to_recording(buffer, samples_this_frame); @@ -310,15 +303,16 @@ void windows_osd_interface::window_exit() assert(GetCurrentThreadId() == main_threadid); // if we hid the cursor during the emulation, show it - win_window_list->show_pointer(); + if (!win_window_list.empty()) + win_window_list.front()->show_pointer(); // free all the windows - while (win_window_list != nullptr) + while (!win_window_list.empty()) { - win_window_info *temp = win_window_list; - win_window_list = temp->m_next; - temp->destroy(); - global_free(temp); + auto window = win_window_list.front(); + + // Destroy removes it from the list also + window->destroy(); } switch(video_config.mode) @@ -353,14 +347,18 @@ void windows_osd_interface::window_exit() CloseHandle(window_thread_ready_event); } -win_window_info::win_window_info(running_machine &machine) - : osd_window(), m_next(nullptr), +win_window_info::win_window_info( + running_machine &machine, + int index, + osd_monitor_info *monitor, + const osd_window_config *config) : osd_window(), + m_next(nullptr), m_init_state(0), m_startmaximized(0), m_isminimized(0), m_ismaximized(0), - m_monitor(nullptr), - m_fullscreen(0), + m_monitor(monitor), + //m_fullscreen(0), m_fullscreen_safe(0), m_aspect(0), m_target(nullptr), @@ -378,14 +376,12 @@ win_window_info::win_window_info(running_machine &machine) m_non_fullscreen_bounds.right = 0; m_non_fullscreen_bounds.bottom = 0; m_prescale = video_config.prescale; + + } win_window_info::~win_window_info() { - if (m_renderer != nullptr) - { - delete m_renderer; - } } POINT win_window_info::s_saved_cursor_pos = { -1, -1 }; @@ -480,7 +476,7 @@ void winwindow_process_events_periodic(running_machine &machine) static BOOL is_mame_window(HWND hwnd) { - for (win_window_info *window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) if (window->platform_window() == hwnd) return TRUE; @@ -655,12 +651,10 @@ void winwindow_dispatch_message(running_machine &machine, MSG *message) void winwindow_take_snap(void) { - win_window_info *window; - assert(GetCurrentThreadId() == main_threadid); // iterate over windows and request a snap - for (window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) { window->m_renderer->save(); } @@ -675,12 +669,10 @@ void winwindow_take_snap(void) void winwindow_toggle_fsfx(void) { - win_window_info *window; - assert(GetCurrentThreadId() == main_threadid); // iterate over windows and request a snap - for (window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) { window->m_renderer->toggle_fsfx(); } @@ -695,12 +687,10 @@ void winwindow_toggle_fsfx(void) void winwindow_take_video(void) { - win_window_info *window; - assert(GetCurrentThreadId() == main_threadid); // iterate over windows and request a snap - for (window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) { window->m_renderer->record(); } @@ -715,12 +705,10 @@ void winwindow_take_video(void) void winwindow_toggle_full_screen(void) { - win_window_info *window; - assert(GetCurrentThreadId() == main_threadid); // if we are in debug mode, never go full screen - for (window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) if (window->machine().debug_flags & DEBUG_FLAG_OSD_ENABLED) return; @@ -728,9 +716,11 @@ void winwindow_toggle_full_screen(void) video_config.windowed = !video_config.windowed; // iterate over windows and toggle their fullscreen state - for (window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) SendMessage(window->platform_window(), WM_USER_SET_FULLSCREEN, !video_config.windowed, 0); - SetForegroundWindow(win_window_list->platform_window()); + + // Set the first window as foreground + SetForegroundWindow(win_window_list.front()->platform_window()); } @@ -743,10 +733,9 @@ void winwindow_toggle_full_screen(void) BOOL winwindow_has_focus(void) { HWND focuswnd = GetFocus(); - win_window_info *window; // see if one of the video windows has focus - for (window = win_window_list; window != nullptr; window = window->m_next) + for (auto window : win_window_list) if (focuswnd == window->platform_window()) return TRUE; @@ -763,19 +752,21 @@ void winwindow_update_cursor_state(running_machine &machine) { assert(GetCurrentThreadId() == main_threadid); - win_window_info *window = win_window_list; - - // If no window yet, just return - if (window == nullptr) + // If no windows, just return + if (win_window_list.empty()) return; + auto window = win_window_list.front(); + // if we should hide the mouse cursor, then do it // rules are: // 1. we must have focus before hiding the cursor // 2. we also hide the cursor in full screen mode and when tshe window doesn't have a menu // 3. we also hide the cursor in windowed mode if we're not paused and // the input system requests it - if (winwindow_has_focus() && ((!video_config.windowed && !window->win_has_menu()) || (!machine.paused() && downcast(machine.osd()).should_hide_mouse()))) + if (winwindow_has_focus() && ( + (window->fullscreen() && !window->win_has_menu()) + || (!machine.paused() && WINOSD(machine)->should_hide_mouse()))) { // hide cursor window->hide_pointer(); @@ -802,44 +793,37 @@ void winwindow_update_cursor_state(running_machine &machine) void win_window_info::create(running_machine &machine, int index, osd_monitor_info *monitor, const osd_window_config *config) { - win_window_info *win; - assert(GetCurrentThreadId() == main_threadid); // allocate a new window object - win_window_info *window = global_alloc(win_window_info(machine)); - window->m_win_config = *config; - window->m_monitor = monitor; - window->m_fullscreen = !video_config.windowed; - window->m_index = index; + auto window = std::make_shared(machine, index, monitor, config); // set main window - if (index > 0) + if (window->m_index > 0) { - for (auto w = win_window_list; w != nullptr; w = w->m_next) + for (auto w : win_window_list) { if (w->m_index == 0) { - window->m_main = w; + window->set_main_window(std::dynamic_pointer_cast(w)); break; } } } else { - // Give the main window a reference to itself - window->m_main = window; + // We must be the main window + window->set_main_window(window); } // see if we are safe for fullscreen window->m_fullscreen_safe = TRUE; - for (win = win_window_list; win != nullptr; win = win->m_next) + for (auto win : win_window_list) if (win->m_monitor == monitor) window->m_fullscreen_safe = FALSE; // add us to the list - *last_window_ptr = window; - last_window_ptr = &window->m_next; + win_window_list.push_back(window); // load the layout window->m_target = machine.render().target_alloc(); @@ -880,17 +864,10 @@ void win_window_info::create(running_machine &machine, int index, osd_monitor_in void win_window_info::destroy() { - win_window_info **prevptr; - assert(GetCurrentThreadId() == main_threadid); // remove us from the list - for (prevptr = &win_window_list; *prevptr != nullptr; prevptr = &(*prevptr)->m_next) - if (*prevptr == this) - { - *prevptr = this->m_next; - break; - } + win_window_list.remove(std::static_pointer_cast(shared_from_this())); // destroy the window if (platform_window() != nullptr) @@ -927,7 +904,7 @@ void win_window_info::update() m_targetlayerconfig = targetlayerconfig; // in window mode, reminimize/maximize - if (!m_fullscreen) + if (!fullscreen()) { if (m_isminimized) SendMessage(platform_window(), WM_USER_SET_MINSIZE, 0, 0); @@ -985,7 +962,7 @@ osd_monitor_info *win_window_info::winwindow_video_window_monitor(const osd_rect osd_monitor_info *monitor; // in window mode, find the nearest - if (!m_fullscreen) + if (!fullscreen()) { if (proposed != nullptr) { @@ -1159,7 +1136,7 @@ int winwindow_ui_is_paused(running_machine &machine) int win_window_info::wnd_extra_width() { RECT temprect = { 100, 100, 200, 200 }; - if (m_fullscreen) + if (fullscreen()) return 0; AdjustWindowRectEx(&temprect, WINDOW_STYLE, win_has_menu(), WINDOW_STYLE_EX); return rect_width(&temprect) - 100; @@ -1175,7 +1152,7 @@ int win_window_info::wnd_extra_width() int win_window_info::wnd_extra_height() { RECT temprect = { 100, 100, 200, 200 }; - if (m_fullscreen) + if (fullscreen()) return 0; AdjustWindowRectEx(&temprect, WINDOW_STYLE, win_has_menu(), WINDOW_STYLE_EX); return rect_height(&temprect) - 100; @@ -1304,10 +1281,10 @@ int win_window_info::complete_create() // create the window, but don't show it yet HWND hwnd = win_create_window_ex_utf8( - m_fullscreen ? FULLSCREEN_STYLE_EX : WINDOW_STYLE_EX, + fullscreen() ? FULLSCREEN_STYLE_EX : WINDOW_STYLE_EX, "MAME", m_title, - m_fullscreen ? FULLSCREEN_STYLE : WINDOW_STYLE, + fullscreen() ? FULLSCREEN_STYLE : WINDOW_STYLE, monitorbounds.left() + 20, monitorbounds.top() + 20, monitorbounds.left() + 100, monitorbounds.top() + 100, nullptr,//(win_window_list != nullptr) ? win_window_list->m_hwnd : nullptr, @@ -1343,14 +1320,9 @@ int win_window_info::complete_create() adjust_window_position_after_major_change(); // show the window - if (!m_fullscreen || m_fullscreen_safe) + if (!fullscreen() || m_fullscreen_safe) { - // finish off by trying to initialize DirectX; if we fail, ignore it - if (m_renderer != nullptr) - { - delete m_renderer; - } - m_renderer = osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this)); + m_renderer = osd_renderer::make_for_type(video_config.mode, std::static_pointer_cast(shared_from_this())); if (m_renderer->create()) return 1; @@ -1401,7 +1373,7 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR // non-client paint: punt if full screen case WM_NCPAINT: - if (!window->m_fullscreen || window->win_has_menu()) + if (!window->fullscreen() || window->win_has_menu()) return DefWindowProc(wnd, message, wparam, lparam); break; @@ -1547,8 +1519,7 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR // destroy: clean up all attached rendering bits and nullptr out our hwnd case WM_DESTROY: - global_free(window->m_renderer); - window->m_renderer = nullptr; + window->m_renderer.reset(); window->set_platform_window(nullptr); return DefWindowProc(wnd, message, wparam, lparam); @@ -1718,7 +1689,7 @@ osd_rect win_window_info::constrain_to_aspect_ratio(const osd_rect &rect, int ad propheight = MAX(propheight, minheight); // clamp against the maximum (fit on one screen for full screen mode) - if (m_fullscreen) + if (fullscreen()) { maxwidth = monitor->position_size().width() - extrawidth; maxheight = monitor->position_size().height() - extraheight; @@ -1878,7 +1849,7 @@ void win_window_info::update_minmax_state() { assert(GetCurrentThreadId() == window_threadid); - if (!m_fullscreen) + if (!fullscreen()) { RECT bounds; @@ -1963,7 +1934,7 @@ void win_window_info::adjust_window_position_after_major_change() osd_rect newrect = RECT_to_osd_rect(oldrect); // adjust the window size so the client area is what we want - if (!m_fullscreen) + if (!fullscreen()) { // constrain the existing size to the aspect ratio if (video_config.keepaspect) @@ -1980,12 +1951,12 @@ void win_window_info::adjust_window_position_after_major_change() // adjust the position if different if (oldrect.left != newrect.left() || oldrect.top != newrect.top() || oldrect.right != newrect.right() || oldrect.bottom != newrect.bottom()) - SetWindowPos(platform_window(), m_fullscreen ? HWND_TOPMOST : HWND_TOP, + SetWindowPos(platform_window(), fullscreen() ? HWND_TOPMOST : HWND_TOP, newrect.left(), newrect.top(), newrect.width(), newrect.height(), 0); // take note of physical window size (used for lightgun coordinate calculation) - if (this == win_window_list) + if (m_index == 0) { win_physical_width = newrect.width(); win_physical_height = newrect.height(); @@ -2004,13 +1975,12 @@ void win_window_info::set_fullscreen(int fullscreen) assert(GetCurrentThreadId() == window_threadid); // if we're in the right state, punt - if (m_fullscreen == fullscreen) + if (this->fullscreen() == fullscreen) return; - m_fullscreen = fullscreen; + video_config.windowed = !fullscreen; // kill off the drawers - delete m_renderer; - m_renderer = nullptr; + m_renderer.reset(); // hide ourself ShowWindow(platform_window(), SW_HIDE); @@ -2062,12 +2032,12 @@ void win_window_info::set_fullscreen(int fullscreen) adjust_window_position_after_major_change(); // show ourself - if (!m_fullscreen || m_fullscreen_safe) + if (!this->fullscreen() || m_fullscreen_safe) { if (video_config.mode != VIDEO_MODE_NONE) ShowWindow(platform_window(), SW_SHOW); - m_renderer = reinterpret_cast(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this))); + m_renderer = osd_renderer::make_for_type(video_config.mode, std::static_pointer_cast(shared_from_this())); if (m_renderer->create()) exit(1); } diff --git a/src/osd/windows/window.h b/src/osd/windows/window.h index a8d1fbffdb6..47eae45d034 100644 --- a/src/osd/windows/window.h +++ b/src/osd/windows/window.h @@ -17,6 +17,9 @@ #include #include +#include +#include + #include "video.h" #include "render.h" @@ -44,13 +47,13 @@ class win_window_info : public osd_window { public: - win_window_info(running_machine &machine); + win_window_info(running_machine &machine, int index, osd_monitor_info *monitor, const osd_window_config *config); virtual ~win_window_info(); running_machine &machine() const override { return m_machine; } virtual render_target *target() override { return m_target; } - int fullscreen() const override { return m_fullscreen; } + int fullscreen() const override { return !video_config.windowed; } void update(); @@ -108,7 +111,7 @@ public: // monitor info osd_monitor_info * m_monitor; - int m_fullscreen; + //int m_fullscreen; int m_fullscreen_safe; float m_aspect; @@ -125,7 +128,7 @@ public: int m_lastclicky; // drawing data - osd_renderer * m_renderer; + std::unique_ptr m_renderer; private: void draw_video_contents(HDC dc, int update); @@ -162,7 +165,7 @@ struct osd_draw_callbacks //============================================================ // windows -extern win_window_info *win_window_list; +extern std::list> win_window_list; diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp index 7edb996fb0a..14243c67fd7 100644 --- a/src/osd/windows/winmain.cpp +++ b/src/osd/windows/winmain.cpp @@ -69,11 +69,11 @@ public: char buffer[1024]; // if we are in fullscreen mode, go to windowed mode - if ((video_config.windowed == 0) && (win_window_list != nullptr)) + if ((video_config.windowed == 0) && !win_window_list.empty()) winwindow_toggle_full_screen(); vsnprintf(buffer, ARRAY_LENGTH(buffer), msg, args); - win_message_box_utf8(win_window_list ? win_window_list->platform_window() : nullptr, buffer, emulator_info::get_appname(), MB_OK); + win_message_box_utf8(!win_window_list.empty() ? win_window_list.front()->platform_window() : nullptr, buffer, emulator_info::get_appname(), MB_OK); } else chain_output(channel, msg, args); @@ -515,7 +515,7 @@ void windows_osd_interface::init(running_machine &machine) osd_common_t::init_subsystems(); // notify listeners of screen configuration - for (win_window_info *info = win_window_list; info != nullptr; info = info->m_next) + for (auto info : win_window_list) { machine.output().set_value(string_format("Orientation(%s)", info->m_monitor->devicename()).c_str(), info->m_targetorient); } From 4d24ad98542f2146adef8597b9dc3f6d43a948a7 Mon Sep 17 00:00:00 2001 From: Brad Hughes Date: Thu, 21 Apr 2016 11:54:31 -0400 Subject: [PATCH 12/16] Removed accidentally added pyc file. --- scripts/build/png.pyc | Bin 87867 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 scripts/build/png.pyc diff --git a/scripts/build/png.pyc b/scripts/build/png.pyc deleted file mode 100644 index 78fe5edad6f6742cda59d35d9370fddd6cee285e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87867 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 Bp~e6J From ee3ff18ccbe24d9aafb28c6873daf86def2c5121 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Thu, 21 Apr 2016 17:30:16 +0100 Subject: [PATCH 13/16] bad rom in pokonyan was redumped, fixed up dipswitches, marked as working. --- src/mame/drivers/cps1.cpp | 80 +++++++++++++++++++-------------------- src/mame/video/cps1.cpp | 8 ++-- 2 files changed, 42 insertions(+), 46 deletions(-) diff --git a/src/mame/drivers/cps1.cpp b/src/mame/drivers/cps1.cpp index 602689100e7..49b04eb1006 100644 --- a/src/mame/drivers/cps1.cpp +++ b/src/mame/drivers/cps1.cpp @@ -3114,82 +3114,78 @@ static INPUT_PORTS_START( pokonyan ) PORT_INCLUDE( cps1_3b ) PORT_START("DSWA") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW(A):1,2") + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_1C ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW(A):3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW(A):4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW(A):5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW(A):6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW(A):7") // not listed in service mode, but left/right don't seem to work otherwise? maybe tied to some cabinet sensor? PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW(A):8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSWB") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW(B):1,2") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, "Every 4" ) + PORT_DIPSETTING( 0x02, "Every 2" ) + PORT_DIPSETTING( 0x03, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "Prize Mode" ) PORT_DIPLOCATION("SW(B):3") + PORT_DIPSETTING( 0x00, "Not Used" ) + PORT_DIPSETTING( 0x04, "Used" ) + PORT_DIPNAME( 0x08, 0x08, "Credit Mode" ) PORT_DIPLOCATION("SW(B):4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, "Max Stage" ) PORT_DIPLOCATION("SW(B):5") + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPSETTING( 0x10, "3" ) + PORT_DIPNAME( 0x20, 0x20, "Card Check" ) PORT_DIPLOCATION("SW(B):6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW(B):7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW(B):8") + PORT_DIPSETTING( 0x00, "1.0 sec" ) + PORT_DIPSETTING( 0x80, "1.2 sec" ) PORT_START("DSWC") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW(C):1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x02, 0x02, "Body Check") PORT_DIPLOCATION("SW(C):2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW(C):3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x08, 0x08, "Screen Stop" ) PORT_DIPLOCATION("SW(C):4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW(C):5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW(C):6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW(C):7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW(C):8" ) INPUT_PORTS_END /* @@ -11677,7 +11673,7 @@ ROM_START( pokonyan ) ROMX_LOAD( "xmqq-5c.bin", 0x000005, 0x20000, CRC(e2169bb5) SHA1(2ca3d6eeee27606af0b21c69491c3bfbe1f82ed6) , ROM_SKIP(7) ) ROMX_LOAD( "xmqq-8h.bin", 0x000006, 0x20000, CRC(113121f5) SHA1(d5b3c97e70c3f53d4d68ed56d98e84df59f42073) , ROM_SKIP(7) ) ROMX_LOAD( "xmqq-8f.bin", 0x000007, 0x20000, CRC(beb00e07) SHA1(ab0264cb98fe9d77c5acff86800273ed4bdf2e1f) , ROM_SKIP(7) ) - ROMX_LOAD( "xmqq-5b.bin", 0x100000, 0x20000, BAD_DUMP CRC(1849760c) SHA1(81707c50ddab864bb45cf524ffba092b8b212310) , ROM_SKIP(7) ) // issues with one of the address lines + ROMX_LOAD( "xmqq-5b.bin", 0x100000, 0x20000, CRC(05354905) SHA1(6a53c47c9d87f76bf73b8cab540910cdcfcb9133) , ROM_SKIP(7) ) ROMX_LOAD( "xmqq-5a.bin", 0x100001, 0x20000, CRC(bd40215e) SHA1(7350e56ecef8e87cf5a4d4f50231fada6fc5356b) , ROM_SKIP(7) ) ROMX_LOAD( "xmqq-10b.bin", 0x100002, 0x20000, CRC(9fa773ef) SHA1(4f0cf813cfe7fbdf20403cfab81b1c01907eb62f) , ROM_SKIP(7) ) ROMX_LOAD( "xmqq-10a.bin", 0x100003, 0x20000, CRC(638d4bc7) SHA1(fca924ad53ad1d00dc2e70436fd22de81c08115f) , ROM_SKIP(7) ) @@ -12326,7 +12322,7 @@ GAME( 1995, megaman, 0, cps1_12MHz, megaman, cps_state, cps1, GAME( 1995, megamana, megaman, cps1_12MHz, megaman, cps_state, cps1, ROT0, "Capcom", "Mega Man: The Power Battle (CPS1, Asia 951006)", MACHINE_SUPPORTS_SAVE ) GAME( 1995, rockmanj, megaman, cps1_12MHz, rockmanj, cps_state, cps1, ROT0, "Capcom", "Rockman: The Power Battle (CPS1, Japan 950922)", MACHINE_SUPPORTS_SAVE ) GAME( 2000, ganbare, 0, ganbare, ganbare, cps_state, ganbare, ROT0, "Capcom", "Ganbare! Marine Kun (Japan 2K0411)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, pokonyan, 0, cps1_10MHz, pokonyan, cps_state, cps1, ROT0, "Capcom", "Pokonyan (Japan 940322)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) // 2002-10-24 was on the ROM labels, 940322 on the startup screen... take your pick +GAME( 1994, pokonyan, 0, cps1_10MHz, pokonyan, cps_state, cps1, ROT0, "Capcom", "Pokonyan (Japan 940322)", MACHINE_SUPPORTS_SAVE ) // 2002-10-24 was on the ROM labels, 940322 on the startup screen... take your pick /* Games released on CPS-1 hardware by Mitchell */ diff --git a/src/mame/video/cps1.cpp b/src/mame/video/cps1.cpp index a9d7bc06866..51f37d896f2 100644 --- a/src/mame/video/cps1.cpp +++ b/src/mame/video/cps1.cpp @@ -1383,15 +1383,15 @@ static const struct gfx_range mapper_KNM10B_table[] = { 0 } }; -// unknown part number, this could still be incorrect +// unknown part number, this is just based on where the gfx are in the ROM #define mapper_pokonyan { 0x8000, 0x8000, 0x8000, 0 }, mapper_pokonyan_table static const struct gfx_range mapper_pokonyan_table[] = { /* type start end bank */ - { GFXTYPE_SPRITES, 0x0000, 0x7fff, 0 }, + { GFXTYPE_SPRITES, 0x0000, 0x2fff, 0 }, { GFXTYPE_SCROLL1, 0x7000, 0x7fff, 0 }, - { GFXTYPE_SCROLL3, 0x0000, 0x7fff, 0 }, - { GFXTYPE_SCROLL2, 0x0000, 0x7fff, 0 }, + { GFXTYPE_SCROLL3, 0x3000, 0x3fff, 0 }, + { GFXTYPE_SCROLL2, 0x4000, 0x6fff, 0 }, { 0 } }; From 0fd7f90e2fbe1ace0b323e49d5fbe198b5eeccf6 Mon Sep 17 00:00:00 2001 From: yz70s Date: Thu, 21 Apr 2016 19:31:51 +0200 Subject: [PATCH 14/16] xbox.cpp: more usb (nw) --- src/mame/drivers/chihiro.cpp | 14 +- src/mame/drivers/xbox.cpp | 4 +- src/mame/includes/xbox.h | 111 +++++++---- src/mame/machine/xbox.cpp | 359 +++++++++++++++++++---------------- 4 files changed, 278 insertions(+), 210 deletions(-) diff --git a/src/mame/drivers/chihiro.cpp b/src/mame/drivers/chihiro.cpp index 86e0104b3e6..72319a30dfd 100644 --- a/src/mame/drivers/chihiro.cpp +++ b/src/mame/drivers/chihiro.cpp @@ -388,7 +388,7 @@ class ohci_hlean2131qc_device : public device_t, public ohci_function_device { public: ohci_hlean2131qc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void initialize(running_machine &machine, xbox_base_state *usb_bus_manager) override; + void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) override; int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override; int handle_bulk_pid(int endpoint, int pid, UINT8 *buffer, int size) override; void set_region_base(UINT8 *data); @@ -424,7 +424,7 @@ class ohci_hlean2131sc_device : public device_t, public ohci_function_device { public: ohci_hlean2131sc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void initialize(running_machine &machine, xbox_base_state *usb_bus_manager) override; + void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) override; int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override; protected: @@ -689,7 +689,7 @@ ohci_hlean2131qc_device::ohci_hlean2131qc_device(const machine_config &mconfig, region = nullptr; } -void ohci_hlean2131qc_device::initialize(running_machine &machine, xbox_base_state *usb_bus_manager) +void ohci_hlean2131qc_device::initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) { ohci_function_device::initialize(machine, usb_bus_manager); add_device_descriptor(devdesc); @@ -802,7 +802,7 @@ ohci_hlean2131sc_device::ohci_hlean2131sc_device(const machine_config &mconfig, { } -void ohci_hlean2131sc_device::initialize(running_machine &machine, xbox_base_state *usb_bus_manager) +void ohci_hlean2131sc_device::initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) { ohci_function_device::initialize(machine, usb_bus_manager); add_device_descriptor(devdesc); @@ -1106,10 +1106,10 @@ void chihiro_state::machine_start() } usbhack_counter = 0; usb_device = machine().device("ohci_hlean2131qc"); - usb_device->initialize(machine(), this); + usb_device->initialize(machine(), ohci_usb); usb_device->set_region_base(memregion(":others")->base()); // temporary - //usb_device = new ohci_hlean2131sc_device(machine()); - usb_ohci_plug(1, usb_device); // connect + //usb_device = machine().device("ohci_hlean2131sc"); + ohci_usb->usb_ohci_plug(1, usb_device); // connect // savestates save_item(NAME(usbhack_counter)); } diff --git a/src/mame/drivers/xbox.cpp b/src/mame/drivers/xbox.cpp index 04cfb3b9a56..0115488e63e 100644 --- a/src/mame/drivers/xbox.cpp +++ b/src/mame/drivers/xbox.cpp @@ -191,8 +191,8 @@ void xbox_state::machine_reset() } SLOT_INTERFACE_START(xbox_ata_devices) -SLOT_INTERFACE("hdd", IDE_HARDDISK) -SLOT_INTERFACE("cdrom", ATAPI_CDROM) + SLOT_INTERFACE("hdd", IDE_HARDDISK) + SLOT_INTERFACE("cdrom", ATAPI_CDROM) SLOT_INTERFACE_END static MACHINE_CONFIG_DERIVED_CLASS(xbox, xbox_base, xbox_state) diff --git a/src/mame/includes/xbox.h b/src/mame/includes/xbox.h index f93bbed0f53..41cf01835fd 100644 --- a/src/mame/includes/xbox.h +++ b/src/mame/includes/xbox.h @@ -296,12 +296,76 @@ struct usb_device_configuration std::forward_list interfaces; }; -class xbox_base_state; // forward declaration +class ohci_function_device; // forward declaration + +class ohci_usb_controller : public device_t +{ +public: + ohci_usb_controller(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + ~ohci_usb_controller() {} + void usb_ohci_plug(int port, ohci_function_device *function); + void usb_ohci_device_address_changed(int old_address, int new_address); + + template static devcb_base &set_interrupt_handler(device_t &device, _Object object) { return downcast(device).m_interrupt_handler.set_callback(object); } + + DECLARE_READ32_MEMBER(read); + DECLARE_WRITE32_MEMBER(write); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + +private: + void usb_ohci_interrupts(); + void usb_ohci_read_endpoint_descriptor(UINT32 address); + void usb_ohci_writeback_endpoint_descriptor(UINT32 address); + void usb_ohci_read_transfer_descriptor(UINT32 address); + void usb_ohci_writeback_transfer_descriptor(UINT32 address); + void usb_ohci_read_isochronous_transfer_descriptor(UINT32 address); + void usb_ohci_writeback_isochronous_transfer_descriptor(UINT32 address); + cpu_device *m_maincpu; + //required_device pic8259_1; + struct { + UINT32 hc_regs[256]; + struct { + ohci_function_device *function; + int address; + int delay; + } ports[4 + 1]; + struct + { + ohci_function_device *function; + int port; + } address[256]; + emu_timer *timer; + int state; + UINT32 framenumber; + UINT32 nextinterupted; + UINT32 nextbulked; + int interruptbulkratio; + int writebackdonehadcounter; + address_space *space; + UINT8 buffer[1024]; + OHCIEndpointDescriptor endpoint_descriptor; + OHCITransferDescriptor transfer_descriptor; + OHCIIsochronousTransferDescriptor isochronous_transfer_descriptor; + } ohcist; + devcb_write_line m_interrupt_handler; +}; + +extern const device_type OHCI_USB_CONTROLLER; + +#define MCFG_OHCI_USB_CONTROLLER_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, OHCI_USB_CONTROLLER, 0) +#define MCFG_OHCI_USB_CONTROLLER_INTERRUPT_HANDLER(_devcb) \ + devcb = &ohci_usb_controller::set_interrupt_handler(*device, DEVCB_##_devcb); class ohci_function_device { public: ohci_function_device(); - virtual void initialize(running_machine &machine, xbox_base_state *usb_bus_manager); + virtual void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager); virtual void execute_reset(); virtual void execute_connect() {}; virtual void execute_disconnect() {}; @@ -329,7 +393,7 @@ protected: UINT8 *position_device_descriptor(int &size); UINT8 *position_configuration_descriptor(int index, int &size); UINT8 *position_string_descriptor(int index, int &size); - xbox_base_state *busmanager; + ohci_usb_controller *busmanager; struct { int type; int controldirection; @@ -361,7 +425,7 @@ class ohci_game_controller_device : public device_t, public ohci_function_device { public: ohci_game_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void initialize(running_machine &machine, xbox_base_state *usb_bus_manager) override; + void initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) override; int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override; int handle_interrupt_pid(int endpoint, int pid, UINT8 *buffer, int size) override; @@ -402,8 +466,6 @@ public: DECLARE_READ32_MEMBER(geforce_r); DECLARE_WRITE32_MEMBER(geforce_w); - DECLARE_READ32_MEMBER(usbctrl_r); - DECLARE_WRITE32_MEMBER(usbctrl_w); DECLARE_READ32_MEMBER(smbus_r); DECLARE_WRITE32_MEMBER(smbus_w); DECLARE_READ8_MEMBER(superio_read); @@ -421,15 +483,6 @@ public: int smbus_pic16lc(int command, int rw, int data); int smbus_cx25871(int command, int rw, int data); int smbus_eeprom(int command, int rw, int data); - void usb_ohci_plug(int port, ohci_function_device *function); - void usb_ohci_interrupts(); - void usb_ohci_read_endpoint_descriptor(UINT32 address); - void usb_ohci_writeback_endpoint_descriptor(UINT32 address); - void usb_ohci_read_transfer_descriptor(UINT32 address); - void usb_ohci_writeback_transfer_descriptor(UINT32 address); - void usb_ohci_read_isochronous_transfer_descriptor(UINT32 address); - void usb_ohci_writeback_isochronous_transfer_descriptor(UINT32 address); - void usb_ohci_device_address_changed(int old_address, int new_address); void debug_generate_irq(int irq, bool active); virtual void hack_eeprom() {}; virtual void hack_usb() {}; @@ -442,9 +495,9 @@ public: DECLARE_READ8_MEMBER(get_slave_ack); DECLARE_WRITE_LINE_MEMBER(xbox_pit8254_out0_changed); DECLARE_WRITE_LINE_MEMBER(xbox_pit8254_out2_changed); + DECLARE_WRITE_LINE_MEMBER(xbox_ohci_usb_interrupt_changed); IRQ_CALLBACK_MEMBER(irq_callback); TIMER_CALLBACK_MEMBER(audio_apu_timer); - TIMER_CALLBACK_MEMBER(usb_ohci_timer); struct xbox_devices { pic8259_device *pic8259_1; @@ -486,31 +539,6 @@ public: UINT32 mixer_regs[0x80 / 4]; UINT32 controller_regs[0x38 / 4]; } ac97st; - struct ohci_state { - UINT32 hc_regs[255]; - struct { - ohci_function_device *function; - int address; - int delay; - } ports[4 + 1]; - struct - { - ohci_function_device *function; - int port; - } address[256]; - emu_timer *timer; - int state; - UINT32 framenumber; - UINT32 nextinterupted; - UINT32 nextbulked; - int interruptbulkratio; - int writebackdonehadcounter; - address_space *space; - UINT8 buffer[1024]; - OHCIEndpointDescriptor endpoint_descriptor; - OHCITransferDescriptor transfer_descriptor; - OHCIIsochronousTransferDescriptor isochronous_transfer_descriptor; - } ohcist; struct superio_state { bool configuration_mode; @@ -523,6 +551,7 @@ public: bool debug_irq_active; int debug_irq_number; required_device m_maincpu; + ohci_usb_controller *ohci_usb; }; ADDRESS_MAP_EXTERN(xbox_base_map, 32); diff --git a/src/mame/machine/xbox.cpp b/src/mame/machine/xbox.cpp index d29fac1ccbc..f02b5ed2eb1 100644 --- a/src/mame/machine/xbox.cpp +++ b/src/mame/machine/xbox.cpp @@ -522,7 +522,43 @@ static const char *const usbregnames[] = { }; #endif -READ32_MEMBER(xbox_base_state::usbctrl_r) +const device_type OHCI_USB_CONTROLLER = &device_creator; + +ohci_usb_controller::ohci_usb_controller(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, OHCI_USB_CONTROLLER, "OHCI USB CONTROLLER", tag, owner, clock, "ohciusb", __FILE__), + //m_maincpu(*this, "maincpu"), + //pic8259_1(*this, "pic8259_1"), + m_interrupt_handler(*this) +{ + memset(&ohcist, 0, sizeof(ohcist)); +} + +void ohci_usb_controller::device_start() +{ + m_maincpu = machine().device("maincpu"); + m_interrupt_handler.resolve_safe(); + ohcist.hc_regs[HcRevision] = 0x10; + ohcist.hc_regs[HcFmInterval] = 0x2edf; + ohcist.hc_regs[HcLSThreshold] = 0x628; + ohcist.hc_regs[HcRhDescriptorA] = 4; + ohcist.hc_regs[HcControl] = UsbReset << 6; + ohcist.state = UsbReset; + ohcist.interruptbulkratio = 1; + ohcist.writebackdonehadcounter = 7; + for (int n = 0; n <= 4; n++) + ohcist.ports[n].address = -1; + for (int n = 0; n < 256; n++) + ohcist.address[n].port = -1; + ohcist.space = &(m_maincpu->space()); + ohcist.timer = timer_alloc(0);// machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xbox_base_state::usb_ohci_timer), this), (void *)"USB OHCI Timer"); + ohcist.timer->enable(false); +} + +void ohci_usb_controller::device_reset() +{ +} + +READ32_MEMBER(ohci_usb_controller::read) { UINT32 ret; @@ -532,7 +568,7 @@ READ32_MEMBER(xbox_base_state::usbctrl_r) else logerror("usb controller 0 register %s read\n", usbregnames[offset]); #endif - ret=ohcist.hc_regs[offset]; + ret = ohcist.hc_regs[offset]; if (offset == 0) { /* hacks needed until usb (and jvs) is implemented */ #ifndef USB_HACK_ENABLED hack_usb(); @@ -541,7 +577,7 @@ READ32_MEMBER(xbox_base_state::usbctrl_r) return ret; } -WRITE32_MEMBER(xbox_base_state::usbctrl_w) +WRITE32_MEMBER(ohci_usb_controller::write) { UINT32 old = ohcist.hc_regs[offset]; @@ -603,7 +639,7 @@ WRITE32_MEMBER(xbox_base_state::usbctrl_w) } if (offset >= HcRhPortStatus1) { int port = offset - HcRhPortStatus1 + 1; // port 0 not used - // bit 0 R:CurrentConnectStatus W:ClearPortEnable: 1 clears PortEnableStatus + // bit 0 R:CurrentConnectStatus W:ClearPortEnable: 1 clears PortEnableStatus if (data & CCS) { ohcist.hc_regs[offset] &= ~PES; ohcist.address[ohcist.ports[port].address].port = -1; @@ -674,7 +710,7 @@ WRITE32_MEMBER(xbox_base_state::usbctrl_w) ohcist.hc_regs[offset] = data; } -TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) +void ohci_usb_controller::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { UINT32 hcca; UINT32 plh; @@ -710,7 +746,7 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) if (list == 0) { if (ohcist.hc_regs[HcControl] & PLE) { // periodic list - plh=ohcist.space->read_dword(hcca + (ohcist.framenumber & 0x1f) * 4); + plh = ohcist.space->read_dword(hcca + (ohcist.framenumber & 0x1f) * 4); cont = true; while (cont == true) { if (plh != 0) { @@ -752,7 +788,7 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) pid = OutPid; // out else if (ohcist.endpoint_descriptor.d == 2) pid = InPid; // in - else + else pid = InPid; // in R = (int)ohcist.framenumber - (int)ohcist.isochronous_transfer_descriptor.sf; //if ((R < 0) || (R > (int)ohcist.isochronous_transfer_descriptor.fc)) @@ -766,7 +802,7 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) else a = ohcist.isochronous_transfer_descriptor.bp0 | (a & 0xfff); } - b=ohcist.isochronous_transfer_descriptor.offset[R]; + b = ohcist.isochronous_transfer_descriptor.offset[R]; if (b & (1 << 12)) b = (ohcist.isochronous_transfer_descriptor.be & 0xfffff000) | (b & 0xfff); else @@ -836,7 +872,8 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) else { usb_ohci_writeback_transfer_descriptor(ohcist.endpoint_descriptor.headp); } - } else + } + else { // status writeback ohcist.isochronous_transfer_descriptor.cc = NoError; @@ -865,7 +902,7 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) { plh = ohcist.endpoint_descriptor.nexted; } - else + else cont = false; } } @@ -911,9 +948,9 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) usb_ohci_read_transfer_descriptor(ohcist.endpoint_descriptor.headp); // get pid if (ohcist.endpoint_descriptor.d == 1) - pid=OutPid; // out + pid = OutPid; // out else if (ohcist.endpoint_descriptor.d == 2) - pid=InPid; // in + pid = InPid; // in else { pid = ohcist.transfer_descriptor.dp; // 0 setup 1 out 2 in } @@ -951,7 +988,7 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) if (pid == InPid) { // ... store done bytes for (int c = 0; c < done; c++) { - ohcist.space->write_byte(b,ohcist.buffer[c]); + ohcist.space->write_byte(b, ohcist.buffer[c]); b++; if ((b & 0xfff) == 0) b = ohcist.transfer_descriptor.be & 0xfffff000; @@ -986,7 +1023,8 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) } usb_ohci_writeback_transfer_descriptor(a); usb_ohci_writeback_endpoint_descriptor(ohcist.hc_regs[HcControlCurrentED]); - } else { + } + else { usb_ohci_writeback_transfer_descriptor(ohcist.endpoint_descriptor.headp); } } @@ -1161,12 +1199,12 @@ TIMER_CALLBACK_MEMBER(xbox_base_state::usb_ohci_timer) usb_ohci_interrupts(); } -void xbox_base_state::usb_ohci_plug(int port, ohci_function_device *function) +void ohci_usb_controller::usb_ohci_plug(int port, ohci_function_device *function) { if ((port > 0) && (port <= 4)) { ohcist.ports[port].function = function; ohcist.ports[port].address = -1; - ohcist.hc_regs[HcRhPortStatus1+port-1] = CCS | CSC; + ohcist.hc_regs[HcRhPortStatus1 + port - 1] = CCS | CSC; if (ohcist.state != UsbReset) { ohcist.hc_regs[HcInterruptStatus] |= RootHubStatusChange; @@ -1175,11 +1213,146 @@ void xbox_base_state::usb_ohci_plug(int port, ohci_function_device *function) } } +void ohci_usb_controller::usb_ohci_interrupts() +{ + if (((ohcist.hc_regs[HcInterruptStatus] & ohcist.hc_regs[HcInterruptEnable]) != 0) && ((ohcist.hc_regs[HcInterruptEnable] & MasterInterruptEnable) != 0)) + { + //pic8259_1->ir1_w(1); + m_interrupt_handler(1); + } else + { + //pic8259_1->ir1_w(0); + m_interrupt_handler(0); + } +} + +void ohci_usb_controller::usb_ohci_read_endpoint_descriptor(UINT32 address) +{ + UINT32 w; + + w = ohcist.space->read_dword(address); + ohcist.endpoint_descriptor.word0 = w; + ohcist.endpoint_descriptor.fa = w & 0x7f; + ohcist.endpoint_descriptor.en = (w >> 7) & 15; + ohcist.endpoint_descriptor.d = (w >> 11) & 3; + ohcist.endpoint_descriptor.s = (w >> 13) & 1; + ohcist.endpoint_descriptor.k = (w >> 14) & 1; + ohcist.endpoint_descriptor.f = (w >> 15) & 1; + ohcist.endpoint_descriptor.mps = (w >> 16) & 0x7ff; + ohcist.endpoint_descriptor.tailp = ohcist.space->read_dword(address + 4); + w = ohcist.space->read_dword(address + 8); + ohcist.endpoint_descriptor.headp = w & 0xfffffffc; + ohcist.endpoint_descriptor.h = w & 1; + ohcist.endpoint_descriptor.c = (w >> 1) & 1; + ohcist.endpoint_descriptor.nexted = ohcist.space->read_dword(address + 12); +} + +void ohci_usb_controller::usb_ohci_writeback_endpoint_descriptor(UINT32 address) +{ + UINT32 w; + + w = ohcist.endpoint_descriptor.word0 & 0xf8000000; + w = w | (ohcist.endpoint_descriptor.mps << 16) | (ohcist.endpoint_descriptor.f << 15) | (ohcist.endpoint_descriptor.k << 14) | (ohcist.endpoint_descriptor.s << 13) | (ohcist.endpoint_descriptor.d << 11) | (ohcist.endpoint_descriptor.en << 7) | ohcist.endpoint_descriptor.fa; + ohcist.space->write_dword(address, w); + w = ohcist.endpoint_descriptor.headp | (ohcist.endpoint_descriptor.c << 1) | ohcist.endpoint_descriptor.h; + ohcist.space->write_dword(address + 8, w); +} + +void ohci_usb_controller::usb_ohci_read_transfer_descriptor(UINT32 address) +{ + UINT32 w; + + w = ohcist.space->read_dword(address); + ohcist.transfer_descriptor.word0 = w; + ohcist.transfer_descriptor.cc = (w >> 28) & 15; + ohcist.transfer_descriptor.ec = (w >> 26) & 3; + ohcist.transfer_descriptor.t = (w >> 24) & 3; + ohcist.transfer_descriptor.di = (w >> 21) & 7; + ohcist.transfer_descriptor.dp = (w >> 19) & 3; + ohcist.transfer_descriptor.r = (w >> 18) & 1; + ohcist.transfer_descriptor.cbp = ohcist.space->read_dword(address + 4); + ohcist.transfer_descriptor.nexttd = ohcist.space->read_dword(address + 8); + ohcist.transfer_descriptor.be = ohcist.space->read_dword(address + 12); +} + +void ohci_usb_controller::usb_ohci_writeback_transfer_descriptor(UINT32 address) +{ + UINT32 w; + + w = ohcist.transfer_descriptor.word0 & 0x0003ffff; + w = w | (ohcist.transfer_descriptor.cc << 28) | (ohcist.transfer_descriptor.ec << 26) | (ohcist.transfer_descriptor.t << 24) | (ohcist.transfer_descriptor.di << 21) | (ohcist.transfer_descriptor.dp << 19) | (ohcist.transfer_descriptor.r << 18); + ohcist.space->write_dword(address, w); + ohcist.space->write_dword(address + 4, ohcist.transfer_descriptor.cbp); + ohcist.space->write_dword(address + 8, ohcist.transfer_descriptor.nexttd); +} + +void ohci_usb_controller::usb_ohci_read_isochronous_transfer_descriptor(UINT32 address) +{ + UINT32 w; + + w = ohcist.space->read_dword(address); + ohcist.isochronous_transfer_descriptor.word0 = w; + ohcist.isochronous_transfer_descriptor.cc = (w >> 28) & 15; + ohcist.isochronous_transfer_descriptor.fc = (w >> 24) & 7; + ohcist.isochronous_transfer_descriptor.di = (w >> 21) & 7; + ohcist.isochronous_transfer_descriptor.sf = w & 0xffff; + w = ohcist.space->read_dword(address + 4); + ohcist.isochronous_transfer_descriptor.word1 = w; + ohcist.isochronous_transfer_descriptor.bp0 = w & 0xfffff000; + ohcist.isochronous_transfer_descriptor.nexttd = ohcist.space->read_dword(address + 8); + ohcist.isochronous_transfer_descriptor.be = ohcist.space->read_dword(address + 12); + w = ohcist.space->read_dword(address + 16); + ohcist.isochronous_transfer_descriptor.offset[0] = w & 0xffff; + ohcist.isochronous_transfer_descriptor.offset[1] = (w >> 16) & 0xffff; + w = ohcist.space->read_dword(address + 20); + ohcist.isochronous_transfer_descriptor.offset[2] = w & 0xffff; + ohcist.isochronous_transfer_descriptor.offset[3] = (w >> 16) & 0xffff; + w = ohcist.space->read_dword(address + 24); + ohcist.isochronous_transfer_descriptor.offset[4] = w & 0xffff; + ohcist.isochronous_transfer_descriptor.offset[5] = (w >> 16) & 0xffff; + w = ohcist.space->read_dword(address + 28); + ohcist.isochronous_transfer_descriptor.offset[6] = w & 0xffff; + ohcist.isochronous_transfer_descriptor.offset[7] = (w >> 16) & 0xffff; +} + +void ohci_usb_controller::usb_ohci_writeback_isochronous_transfer_descriptor(UINT32 address) +{ + UINT32 w; + + w = ohcist.isochronous_transfer_descriptor.word0 & 0x1f0000; + w = w | (ohcist.isochronous_transfer_descriptor.cc << 28) | (ohcist.isochronous_transfer_descriptor.fc << 24) | (ohcist.isochronous_transfer_descriptor.di << 21) | ohcist.isochronous_transfer_descriptor.sf; + ohcist.space->write_dword(address, w); + w = ohcist.isochronous_transfer_descriptor.word1 & 0xfff; + w = w | ohcist.isochronous_transfer_descriptor.bp0; + ohcist.space->write_dword(address + 4, w); + ohcist.space->write_dword(address + 8, ohcist.isochronous_transfer_descriptor.nexttd); + ohcist.space->write_dword(address + 12, ohcist.isochronous_transfer_descriptor.be); + w = (ohcist.isochronous_transfer_descriptor.offset[1] << 16) | ohcist.isochronous_transfer_descriptor.offset[0]; + ohcist.space->write_dword(address + 16, w); + w = (ohcist.isochronous_transfer_descriptor.offset[3] << 16) | ohcist.isochronous_transfer_descriptor.offset[2]; + ohcist.space->write_dword(address + 20, w); + w = (ohcist.isochronous_transfer_descriptor.offset[5] << 16) | ohcist.isochronous_transfer_descriptor.offset[4]; + ohcist.space->write_dword(address + 24, w); + w = (ohcist.isochronous_transfer_descriptor.offset[7] << 16) | ohcist.isochronous_transfer_descriptor.offset[6]; + ohcist.space->write_dword(address + 28, w); +} + +void ohci_usb_controller::usb_ohci_device_address_changed(int old_address, int new_address) +{ + ohcist.address[new_address].function = ohcist.address[old_address].function; + ohcist.address[new_address].port = ohcist.address[old_address].port; + ohcist.address[old_address].port = -1; +} + +/* +* ohci device base class +*/ + ohci_function_device::ohci_function_device() { } -void ohci_function_device::initialize(running_machine &machine, xbox_base_state *usb_bus_manager) +void ohci_function_device::initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) { busmanager = usb_bus_manager; state = DefaultState; @@ -1726,7 +1899,7 @@ ohci_game_controller_device::ohci_game_controller_device(const machine_config &m { } -void ohci_game_controller_device::initialize(running_machine &machine, xbox_base_state *usb_bus_manager) +void ohci_game_controller_device::initialize(running_machine &machine, ohci_usb_controller *usb_bus_manager) { ohci_function_device::initialize(machine, usb_bus_manager); add_device_descriptor(devdesc); @@ -1838,130 +2011,9 @@ ioport_constructor ohci_game_controller_device::device_input_ports() const return INPUT_PORTS_NAME(xbox_controller); } -void xbox_base_state::usb_ohci_interrupts() +WRITE_LINE_MEMBER(xbox_base_state::xbox_ohci_usb_interrupt_changed) { - if (((ohcist.hc_regs[HcInterruptStatus] & ohcist.hc_regs[HcInterruptEnable]) != 0) && ((ohcist.hc_regs[HcInterruptEnable] & MasterInterruptEnable) != 0)) - xbox_base_devs.pic8259_1->ir1_w(1); - else - xbox_base_devs.pic8259_1->ir1_w(0); -} - -void xbox_base_state::usb_ohci_read_endpoint_descriptor(UINT32 address) -{ - UINT32 w; - - w = ohcist.space->read_dword(address); - ohcist.endpoint_descriptor.word0 = w; - ohcist.endpoint_descriptor.fa = w & 0x7f; - ohcist.endpoint_descriptor.en = (w >> 7) & 15; - ohcist.endpoint_descriptor.d = (w >> 11) & 3; - ohcist.endpoint_descriptor.s = (w >> 13) & 1; - ohcist.endpoint_descriptor.k = (w >> 14) & 1; - ohcist.endpoint_descriptor.f = (w >> 15) & 1; - ohcist.endpoint_descriptor.mps = (w >> 16) & 0x7ff; - ohcist.endpoint_descriptor.tailp = ohcist.space->read_dword(address + 4); - w = ohcist.space->read_dword(address + 8); - ohcist.endpoint_descriptor.headp = w & 0xfffffffc; - ohcist.endpoint_descriptor.h = w & 1; - ohcist.endpoint_descriptor.c = (w >> 1) & 1; - ohcist.endpoint_descriptor.nexted = ohcist.space->read_dword(address + 12); -} - -void xbox_base_state::usb_ohci_writeback_endpoint_descriptor(UINT32 address) -{ - UINT32 w; - - w = ohcist.endpoint_descriptor.word0 & 0xf8000000; - w = w | (ohcist.endpoint_descriptor.mps << 16) | (ohcist.endpoint_descriptor.f << 15) | (ohcist.endpoint_descriptor.k << 14) | (ohcist.endpoint_descriptor.s << 13) | (ohcist.endpoint_descriptor.d << 11) | (ohcist.endpoint_descriptor.en << 7) | ohcist.endpoint_descriptor.fa; - ohcist.space->write_dword(address, w); - w = ohcist.endpoint_descriptor.headp | (ohcist.endpoint_descriptor.c << 1) | ohcist.endpoint_descriptor.h; - ohcist.space->write_dword(address + 8, w); -} - -void xbox_base_state::usb_ohci_read_transfer_descriptor(UINT32 address) -{ - UINT32 w; - - w = ohcist.space->read_dword(address); - ohcist.transfer_descriptor.word0 = w; - ohcist.transfer_descriptor.cc = (w >> 28) & 15; - ohcist.transfer_descriptor.ec= (w >> 26) & 3; - ohcist.transfer_descriptor.t= (w >> 24) & 3; - ohcist.transfer_descriptor.di= (w >> 21) & 7; - ohcist.transfer_descriptor.dp= (w >> 19) & 3; - ohcist.transfer_descriptor.r = (w >> 18) & 1; - ohcist.transfer_descriptor.cbp = ohcist.space->read_dword(address + 4); - ohcist.transfer_descriptor.nexttd = ohcist.space->read_dword(address + 8); - ohcist.transfer_descriptor.be = ohcist.space->read_dword(address + 12); -} - -void xbox_base_state::usb_ohci_writeback_transfer_descriptor(UINT32 address) -{ - UINT32 w; - - w = ohcist.transfer_descriptor.word0 & 0x0003ffff; - w = w | (ohcist.transfer_descriptor.cc << 28) | (ohcist.transfer_descriptor.ec << 26) | (ohcist.transfer_descriptor.t << 24) | (ohcist.transfer_descriptor.di << 21) | (ohcist.transfer_descriptor.dp << 19) | (ohcist.transfer_descriptor.r << 18); - ohcist.space->write_dword(address, w); - ohcist.space->write_dword(address + 4, ohcist.transfer_descriptor.cbp); - ohcist.space->write_dword(address + 8, ohcist.transfer_descriptor.nexttd); -} - -void xbox_base_state::usb_ohci_read_isochronous_transfer_descriptor(UINT32 address) -{ - UINT32 w; - - w = ohcist.space->read_dword(address); - ohcist.isochronous_transfer_descriptor.word0 = w; - ohcist.isochronous_transfer_descriptor.cc = (w >> 28) & 15; - ohcist.isochronous_transfer_descriptor.fc = (w >> 24) & 7; - ohcist.isochronous_transfer_descriptor.di = (w >> 21) & 7; - ohcist.isochronous_transfer_descriptor.sf = w & 0xffff; - w = ohcist.space->read_dword(address + 4); - ohcist.isochronous_transfer_descriptor.word1 = w; - ohcist.isochronous_transfer_descriptor.bp0 = w & 0xfffff000; - ohcist.isochronous_transfer_descriptor.nexttd = ohcist.space->read_dword(address + 8); - ohcist.isochronous_transfer_descriptor.be = ohcist.space->read_dword(address + 12); - w = ohcist.space->read_dword(address + 16); - ohcist.isochronous_transfer_descriptor.offset[0] = w & 0xffff; - ohcist.isochronous_transfer_descriptor.offset[1] = (w >> 16) & 0xffff; - w = ohcist.space->read_dword(address + 20); - ohcist.isochronous_transfer_descriptor.offset[2] = w & 0xffff; - ohcist.isochronous_transfer_descriptor.offset[3] = (w >> 16) & 0xffff; - w = ohcist.space->read_dword(address + 24); - ohcist.isochronous_transfer_descriptor.offset[4] = w & 0xffff; - ohcist.isochronous_transfer_descriptor.offset[5] = (w >> 16) & 0xffff; - w = ohcist.space->read_dword(address + 28); - ohcist.isochronous_transfer_descriptor.offset[6] = w & 0xffff; - ohcist.isochronous_transfer_descriptor.offset[7] = (w >> 16) & 0xffff; -} - -void xbox_base_state::usb_ohci_writeback_isochronous_transfer_descriptor(UINT32 address) -{ - UINT32 w; - - w = ohcist.isochronous_transfer_descriptor.word0 & 0x1f0000; - w = w | (ohcist.isochronous_transfer_descriptor.cc << 28) | (ohcist.isochronous_transfer_descriptor.fc << 24) | (ohcist.isochronous_transfer_descriptor.di << 21) | ohcist.isochronous_transfer_descriptor.sf; - ohcist.space->write_dword(address, w); - w = ohcist.isochronous_transfer_descriptor.word1 & 0xfff; - w = w | ohcist.isochronous_transfer_descriptor.bp0; - ohcist.space->write_dword(address + 4, w); - ohcist.space->write_dword(address + 8, ohcist.isochronous_transfer_descriptor.nexttd); - ohcist.space->write_dword(address + 12, ohcist.isochronous_transfer_descriptor.be); - w = (ohcist.isochronous_transfer_descriptor.offset[1] << 16) | ohcist.isochronous_transfer_descriptor.offset[0]; - ohcist.space->write_dword(address + 16, w); - w = (ohcist.isochronous_transfer_descriptor.offset[3] << 16) | ohcist.isochronous_transfer_descriptor.offset[2]; - ohcist.space->write_dword(address + 20, w); - w = (ohcist.isochronous_transfer_descriptor.offset[5] << 16) | ohcist.isochronous_transfer_descriptor.offset[4]; - ohcist.space->write_dword(address + 24, w); - w = (ohcist.isochronous_transfer_descriptor.offset[7] << 16) | ohcist.isochronous_transfer_descriptor.offset[6]; - ohcist.space->write_dword(address + 28, w); -} - -void xbox_base_state::usb_ohci_device_address_changed(int old_address, int new_address) -{ - ohcist.address[new_address].function = ohcist.address[old_address].function; - ohcist.address[new_address].port = ohcist.address[old_address].port; - ohcist.address[old_address].port = -1; + xbox_base_devs.pic8259_1->ir1_w(state); } /* @@ -2476,7 +2528,7 @@ ADDRESS_MAP_START(xbox_base_map, AS_PROGRAM, 32, xbox_base_state) AM_RANGE(0x00000000, 0x07ffffff) AM_RAM AM_SHARE("nv2a_share") // 128 megabytes AM_RANGE(0xf0000000, 0xf7ffffff) AM_RAM AM_SHARE("nv2a_share") // 3d accelerator wants this AM_RANGE(0xfd000000, 0xfdffffff) AM_RAM AM_READWRITE(geforce_r, geforce_w) - AM_RANGE(0xfed00000, 0xfed003ff) AM_READWRITE(usbctrl_r, usbctrl_w) + AM_RANGE(0xfed00000, 0xfed003ff) AM_DEVREADWRITE("ohci_usb", ohci_usb_controller, read, write) AM_RANGE(0xfe800000, 0xfe85ffff) AM_READWRITE(audio_apu_r, audio_apu_w) AM_RANGE(0xfec00000, 0xfec001ff) AM_READWRITE(audio_ac93_r, audio_ac93_w) AM_RANGE(0xff000000, 0xff0fffff) AM_ROM AM_REGION("bios", 0) AM_MIRROR(0x00f80000) @@ -2521,31 +2573,16 @@ void xbox_base_state::machine_start() apust.timer->enable(false); if (machine().debug_flags & DEBUG_FLAG_ENABLED) debug_console_register_command(machine(), "xbox", CMDFLAG_NONE, 0, 1, 4, xbox_debug_commands); - memset(&ohcist, 0, sizeof(ohcist)); // PIC challenge handshake data pic16lc_buffer[0x1c] = 0x0c; pic16lc_buffer[0x1d] = 0x0d; pic16lc_buffer[0x1e] = 0x0e; pic16lc_buffer[0x1f] = 0x0f; // usb - ohcist.hc_regs[HcRevision] = 0x10; - ohcist.hc_regs[HcFmInterval] = 0x2edf; - ohcist.hc_regs[HcLSThreshold] = 0x628; - ohcist.hc_regs[HcRhDescriptorA] = 4; - ohcist.hc_regs[HcControl] = UsbReset << 6; - ohcist.state = UsbReset; - ohcist.interruptbulkratio = 1; - ohcist.writebackdonehadcounter = 7; - for (int n = 0; n <= 4; n++) - ohcist.ports[n].address = -1; - for (int n = 0; n < 256; n++) - ohcist.address[n].port = -1; - ohcist.space = &m_maincpu->space(); - ohcist.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xbox_base_state::usb_ohci_timer), this), (void *)"USB OHCI Timer"); - ohcist.timer->enable(false); + ohci_usb = machine().device("ohci_usb"); usb_device = machine().device("ohci_gamepad"); - usb_device->initialize(machine(), this); - usb_ohci_plug(3, usb_device); // connect to root hub port 3, chihiro needs to use 1 and 2 + usb_device->initialize(machine(), ohci_usb); + ohci_usb->usb_ohci_plug(3, usb_device); // connect to root hub port 3, chihiro needs to use 1 and 2 // super-io memset(&superiost, 0, sizeof(superiost)); superiost.configuration_mode = false; @@ -2604,6 +2641,8 @@ MACHINE_CONFIG_START(xbox_base, xbox_base_state) MCFG_BUS_MASTER_IDE_CONTROLLER_SPACE("maincpu", AS_PROGRAM) // next line is temporary + MCFG_OHCI_USB_CONTROLLER_ADD("ohci_usb") + MCFG_OHCI_USB_CONTROLLER_INTERRUPT_HANDLER(WRITELINE(xbox_base_state, xbox_ohci_usb_interrupt_changed)) MCFG_DEVICE_ADD("ohci_gamepad", OHCI_GAME_CONTROLLER, 0) /* video hardware */ From e5690695e1d36d8ff9f0d8d61d28fec472842462 Mon Sep 17 00:00:00 2001 From: yz70s Date: Thu, 21 Apr 2016 20:21:20 +0200 Subject: [PATCH 15/16] tidy up (nw) --- src/mame/machine/xbox.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mame/machine/xbox.cpp b/src/mame/machine/xbox.cpp index f02b5ed2eb1..c789c9c8d38 100644 --- a/src/mame/machine/xbox.cpp +++ b/src/mame/machine/xbox.cpp @@ -526,8 +526,6 @@ const device_type OHCI_USB_CONTROLLER = &device_creator; ohci_usb_controller::ohci_usb_controller(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, OHCI_USB_CONTROLLER, "OHCI USB CONTROLLER", tag, owner, clock, "ohciusb", __FILE__), - //m_maincpu(*this, "maincpu"), - //pic8259_1(*this, "pic8259_1"), m_interrupt_handler(*this) { memset(&ohcist, 0, sizeof(ohcist)); @@ -550,7 +548,7 @@ void ohci_usb_controller::device_start() for (int n = 0; n < 256; n++) ohcist.address[n].port = -1; ohcist.space = &(m_maincpu->space()); - ohcist.timer = timer_alloc(0);// machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xbox_base_state::usb_ohci_timer), this), (void *)"USB OHCI Timer"); + ohcist.timer = timer_alloc(0); ohcist.timer->enable(false); } From 682bc907644430982629f9a8a27b9cce802f8a23 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 21 Apr 2016 20:52:21 +0200 Subject: [PATCH 16/16] Created mame_options as 1st step towards creating core independent of MAME implementation (nw) --- src/emu/clifront.cpp | 14 +- src/emu/emuopts.cpp | 822 ++++++++++++++++++++-------------------- src/emu/emuopts.h | 57 +-- src/emu/info.cpp | 2 +- src/emu/mame.cpp | 6 +- src/emu/ui/miscmenu.cpp | 2 +- src/emu/ui/slotopt.cpp | 2 +- 7 files changed, 456 insertions(+), 449 deletions(-) diff --git a/src/emu/clifront.cpp b/src/emu/clifront.cpp index 835573f2f41..49097f2c016 100644 --- a/src/emu/clifront.cpp +++ b/src/emu/clifront.cpp @@ -159,7 +159,7 @@ cli_frontend::cli_frontend(emu_options &options, osd_interface &osd) cli_frontend::~cli_frontend() { // nuke any device options since they will leak memory - m_options.remove_device_options(); + mame_options::remove_device_options(m_options); } //------------------------------------------------- @@ -177,9 +177,9 @@ int cli_frontend::execute(int argc, char **argv) { // first parse options to be able to get software from it std::string option_errors; - m_options.parse_command_line(argc, argv, option_errors); + mame_options::parse_command_line(m_options,argc, argv, option_errors); - m_options.parse_standard_inis(option_errors); + mame_options::parse_standard_inis(m_options,option_errors); load_translation(m_options); @@ -226,7 +226,7 @@ int cli_frontend::execute(int argc, char **argv) std::string val = string_format("%s:%s:%s", swlistdev.list_name(), m_options.software_name(), swpart.name()); // call this in order to set slot devices according to mounting - m_options.parse_slot_devices(argc, argv, option_errors, image.instance_name(), val.c_str(), &swpart); + mame_options::parse_slot_devices(m_options, argc, argv, option_errors, image.instance_name(), val.c_str(), &swpart); break; } } @@ -249,7 +249,7 @@ int cli_frontend::execute(int argc, char **argv) } // parse the command line, adding any system-specific options - if (!m_options.parse_command_line(argc, argv, option_errors)) + if (!mame_options::parse_command_line(m_options,argc, argv, option_errors)) { // if we failed, check for no command and a system name first; in that case error on the name if (*(m_options.command()) == 0 && m_options.system() == nullptr && *(m_options.system_name()) != 0) @@ -276,7 +276,7 @@ int cli_frontend::execute(int argc, char **argv) if (m_options.read_config()) { m_options.revert(OPTION_PRIORITY_INI); - m_options.parse_standard_inis(option_errors); + mame_options::parse_standard_inis(m_options,option_errors); } if (!option_errors.empty()) osd_printf_error("Error in command line:\n%s\n", strtrimspace(option_errors).c_str()); @@ -1670,7 +1670,7 @@ void cli_frontend::execute_commands(const char *exename) // other commands need the INIs parsed std::string option_errors; - m_options.parse_standard_inis(option_errors); + mame_options::parse_standard_inis(m_options,option_errors); if (!option_errors.empty()) osd_printf_error("%s\n", option_errors.c_str()); diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp index d8c04bea283..6e8f267d117 100644 --- a/src/emu/emuopts.cpp +++ b/src/emu/emuopts.cpp @@ -225,309 +225,11 @@ emu_options::emu_options() , m_joystick_contradictory(false) , m_sleep(true) , m_refresh_speed(false) -, m_slot_options(0) -, m_device_options(0) { add_entries(emu_options::s_option_entries); } -//------------------------------------------------- -// add_slot_options - add all of the slot -// options for the configured system -//------------------------------------------------- - -bool emu_options::add_slot_options(const software_part *swpart) -{ - // look up the system configured by name; if no match, do nothing - const game_driver *cursystem = system(); - if (cursystem == nullptr) - return false; - - // create the configuration - machine_config config(*cursystem, *this); - - // iterate through all slot devices - int starting_count = options_count(); - for (const device_slot_interface &slot : slot_interface_iterator(config.root_device())) - { - // skip fixed slots - if (slot.fixed()) - continue; - - // retrieve info about the device instance - const char *name = slot.device().tag() + 1; - if (!exists(name)) - { - // first device? add the header as to be pretty - if (m_slot_options++ == 0) - add_entry(nullptr, "SLOT DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE); - - // add the option - add_entry(name, nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, slot.default_option(), true); - } - - // allow software lists to supply their own defaults - if (swpart != nullptr) - { - std::string featurename = std::string(name).append("_default"); - const char *value = swpart->feature(featurename.c_str()); - if (value != nullptr && (*value == '\0' || slot.option(value) != nullptr)) - { - // set priority above INIs but below actual command line - std::string error; - set_value(name, value, OPTION_PRIORITY_SUBCMD, error); - } - } - } - return (options_count() != starting_count); -} - - -//------------------------------------------------- -// update_slot_options - update slot values -// depending of image mounted -//------------------------------------------------- - -void emu_options::update_slot_options(const software_part *swpart) -{ - // look up the system configured by name; if no match, do nothing - const game_driver *cursystem = system(); - if (cursystem == nullptr) - return; - machine_config config(*cursystem, *this); - - // iterate through all slot devices - for (device_slot_interface &slot : slot_interface_iterator(config.root_device())) - { - // retrieve info about the device instance - const char *name = slot.device().tag() + 1; - if (exists(name) && !slot.option_list().empty()) - { - std::string defvalue = slot.get_default_card_software(); - if (defvalue.empty()) - { - // keep any non-default setting - if (priority(name) > OPTION_PRIORITY_DEFAULT) - continue; - - // reinstate the actual default value as configured - if (slot.default_option() != nullptr) - defvalue.assign(slot.default_option()); - } - - // set the value and hide the option if not selectable - set_default_value(name, defvalue.c_str()); - const device_slot_option *option = slot.option(defvalue.c_str()); - set_flag(name, ~OPTION_FLAG_INTERNAL, (option != nullptr && !option->selectable()) ? OPTION_FLAG_INTERNAL : 0); - } - } - while (add_slot_options(swpart)) { } - add_device_options(); -} - - -//------------------------------------------------- -// add_device_options - add all of the device -// options for the configured system -//------------------------------------------------- - -void emu_options::add_device_options() -{ - // look up the system configured by name; if no match, do nothing - const game_driver *cursystem = system(); - if (cursystem == nullptr) - return; - machine_config config(*cursystem, *this); - - // iterate through all image devices - for (const device_image_interface &image : image_interface_iterator(config.root_device())) - { - if (!image.user_loadable()) - continue; - - // retrieve info about the device instance - std::ostringstream option_name; - util::stream_format(option_name, "%s;%s", image.instance_name(), image.brief_instance_name()); - if (strcmp(image.device_typename(image.image_type()), image.instance_name()) == 0) - util::stream_format(option_name, ";%s1;%s1", image.instance_name(), image.brief_instance_name()); - - // add the option - if (!exists(image.instance_name())) - { - // first device? add the header as to be pretty - if (m_device_options++ == 0) - add_entry(nullptr, "IMAGE DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE); - - // add the option - add_entry(option_name.str().c_str(), nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, nullptr, true); - } - } -} - - -//------------------------------------------------- -// remove_device_options - remove device options -//------------------------------------------------- - -void emu_options::remove_device_options() -{ - // iterate through options and remove interesting ones - entry *nextentry; - for (entry *curentry = first(); curentry != nullptr; curentry = nextentry) - { - // pre-fetch the next entry in case we delete this one - nextentry = curentry->next(); - - // if this is a device option, nuke it - if ((curentry->flags() & OPTION_FLAG_DEVICE) != 0) - remove_entry(*curentry); - } - - // take also care of ramsize options - set_default_value(OPTION_RAMSIZE, ""); - - // reset counters - m_slot_options = 0; - m_device_options = 0; -} - - -//------------------------------------------------- -// parse_slot_devices - parse the command line -// and update slot and image devices -//------------------------------------------------- - -bool emu_options::parse_slot_devices(int argc, char *argv[], std::string &error_string, const char *name, const char *value, const software_part *swpart) -{ - // an initial parse to capture the initial set of values - bool result; - - core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); - - // keep adding slot options until we stop seeing new stuff - while (add_slot_options(swpart)) - core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); - - // add device options and reparse - add_device_options(); - if (name != nullptr && exists(name)) - set_value(name, value, OPTION_PRIORITY_SUBCMD, error_string); - core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); - - int num; - do { - num = options_count(); - update_slot_options(swpart); - result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); - } while (num != options_count()); - - update_cached_options(); - - return result; -} - - -//------------------------------------------------- -// parse_command_line - parse the command line -// and update the devices -//------------------------------------------------- - -bool emu_options::parse_command_line(int argc, char *argv[], std::string &error_string) -{ - // parse as normal - core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); - bool result = parse_slot_devices(argc, argv, error_string); - update_cached_options(); - return result; -} - - -//------------------------------------------------- -// parse_standard_inis - parse the standard set -// of INI files -//------------------------------------------------- - -void emu_options::parse_standard_inis(std::string &error_string, const game_driver *driver) -{ - // start with an empty string - error_string.clear(); - - // parse the INI file defined by the platform (e.g., "mame.ini") - // we do this twice so that the first file can change the INI path - parse_one_ini(emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI); - parse_one_ini(emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI, &error_string); - - // debug mode: parse "debug.ini" as well - if (debug()) - parse_one_ini("debug", OPTION_PRIORITY_DEBUG_INI, &error_string); - - // if we have a valid system driver, parse system-specific INI files - const game_driver *cursystem = (driver == nullptr) ? system() : driver; - if (cursystem == nullptr) - return; - - // parse "vertical.ini" or "horizont.ini" - if (cursystem->flags & ORIENTATION_SWAP_XY) - parse_one_ini("vertical", OPTION_PRIORITY_ORIENTATION_INI, &error_string); - else - parse_one_ini("horizont", OPTION_PRIORITY_ORIENTATION_INI, &error_string); - - if (cursystem->flags & MACHINE_TYPE_ARCADE) - parse_one_ini("arcade", OPTION_PRIORITY_SYSTYPE_INI, &error_string); - else if (cursystem->flags & MACHINE_TYPE_CONSOLE) - parse_one_ini("console", OPTION_PRIORITY_SYSTYPE_INI, &error_string); - else if (cursystem->flags & MACHINE_TYPE_COMPUTER) - parse_one_ini("computer", OPTION_PRIORITY_SYSTYPE_INI, &error_string); - else if (cursystem->flags & MACHINE_TYPE_OTHER) - parse_one_ini("othersys", OPTION_PRIORITY_SYSTYPE_INI, &error_string); - - machine_config config(*cursystem, *this); - for (const screen_device &device : screen_device_iterator(config.root_device())) - { - // parse "raster.ini" for raster games - if (device.screen_type() == SCREEN_TYPE_RASTER) - { - parse_one_ini("raster", OPTION_PRIORITY_SCREEN_INI, &error_string); - break; - } - // parse "vector.ini" for vector games - if (device.screen_type() == SCREEN_TYPE_VECTOR) - { - parse_one_ini("vector", OPTION_PRIORITY_SCREEN_INI, &error_string); - break; - } - // parse "lcd.ini" for lcd games - if (device.screen_type() == SCREEN_TYPE_LCD) - { - parse_one_ini("lcd", OPTION_PRIORITY_SCREEN_INI, &error_string); - break; - } - } - - // next parse "source/.ini"; if that doesn't exist, try .ini - std::string sourcename = core_filename_extract_base(cursystem->source_file, true).insert(0, "source" PATH_SEPARATOR); - if (!parse_one_ini(sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string)) - { - sourcename = core_filename_extract_base(cursystem->source_file, true); - parse_one_ini(sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string); - } - - // then parse the grandparent, parent, and system-specific INIs - int parent = driver_list::clone(*cursystem); - int gparent = (parent != -1) ? driver_list::clone(parent) : -1; - if (gparent != -1) - parse_one_ini(driver_list::driver(gparent).name, OPTION_PRIORITY_GPARENT_INI, &error_string); - if (parent != -1) - parse_one_ini(driver_list::driver(parent).name, OPTION_PRIORITY_PARENT_INI, &error_string); - parse_one_ini(cursystem->name, OPTION_PRIORITY_DRIVER_INI, &error_string); - - // Re-evaluate slot options after loading ini files - update_slot_options(); - - update_cached_options(); -} - //------------------------------------------------- // system - return a pointer to the specified @@ -541,117 +243,6 @@ const game_driver *emu_options::system() const } -//------------------------------------------------- -// set_system_name - set a new system name -//------------------------------------------------- - -void emu_options::set_system_name(const char *name) -{ - // remember the original system name - std::string old_system_name(system_name()); - bool new_system = old_system_name.compare(name)!=0; - - // if the system name changed, fix up the device options - if (new_system) - { - // first set the new name - std::string error; - set_value(OPTION_SYSTEMNAME, name, OPTION_PRIORITY_CMDLINE, error); - assert(error.empty()); - - // remove any existing device options - remove_device_options(); - } - else - { - // revert device options set for the old software - revert(OPTION_PRIORITY_SUBCMD, OPTION_PRIORITY_SUBCMD); - } - - // get the new system - const game_driver *cursystem = system(); - if (cursystem == nullptr) - return; - - if (*software_name() != 0) - { - std::string sw_load(software_name()); - std::string sw_list, sw_name, sw_part, sw_instance, error_string; - int left = sw_load.find_first_of(':'); - int middle = sw_load.find_first_of(':', left + 1); - int right = sw_load.find_last_of(':'); - - sw_list = sw_load.substr(0, left - 1); - sw_name = sw_load.substr(left + 1, middle - left - 1); - sw_part = sw_load.substr(middle + 1, right - middle - 1); - sw_instance = sw_load.substr(right + 1); - sw_load.assign(sw_load.substr(0, right)); - - // look up the software part - machine_config config(*cursystem, *this); - software_list_device *swlist = software_list_device::find_by_name(config, sw_list.c_str()); - software_info *swinfo = swlist != nullptr ? swlist->find(sw_name.c_str()) : nullptr; - software_part *swpart = swinfo != nullptr ? swinfo->find_part(sw_part.c_str()) : nullptr; - - // then add the options - if (new_system) - { - while (add_slot_options(swpart)) { } - add_device_options(); - } - - set_value(OPTION_SOFTWARENAME, sw_name.c_str(), OPTION_PRIORITY_CMDLINE, error_string); - if (exists(sw_instance.c_str())) - set_value(sw_instance.c_str(), sw_load.c_str(), OPTION_PRIORITY_SUBCMD, error_string); - - int num; - do { - num = options_count(); - update_slot_options(swpart); - } while(num != options_count()); - } - else if (new_system) - { - // add the options afresh - while (add_slot_options()) { } - add_device_options(); - int num; - do { - num = options_count(); - update_slot_options(); - } while(num != options_count()); - } -} - -//------------------------------------------------- -// parse_one_ini - parse a single INI file -//------------------------------------------------- - -bool emu_options::parse_one_ini(const char *basename, int priority, std::string *error_string) -{ - // don't parse if it has been disabled - if (!read_config()) - return false; - - // open the file; if we fail, that's ok - emu_file file(ini_path(), OPEN_FLAG_READ); - osd_file::error filerr = file.open(basename, ".ini"); - if (filerr != osd_file::error::NONE) - return false; - - // parse the file - osd_printf_verbose("Parsing %s.ini\n", basename); - std::string error; - bool result = parse_ini_file((util::core_file&)file, priority, OPTION_PRIORITY_DRIVER_INI, error); - - // append errors if requested - if (!error.empty() && error_string) - error_string->append(string_format("While parsing %s:\n%s\n", file.fullpath(), error)); - - return result; -} - - std::string emu_options::main_value(const char *name) const { std::string buffer = value(name); @@ -692,3 +283,416 @@ void emu_options::update_cached_options() m_sleep = bool_value(OPTION_SLEEP); m_refresh_speed = bool_value(OPTION_REFRESHSPEED); } + + + + +int mame_options::m_slot_options = 0; +int mame_options::m_device_options = 0; + +//------------------------------------------------- +// add_slot_options - add all of the slot +// options for the configured system +//------------------------------------------------- + +bool mame_options::add_slot_options(emu_options &options, const software_part *swpart) +{ + // look up the system configured by name; if no match, do nothing + const game_driver *cursystem = options.system(); + if (cursystem == nullptr) + return false; + + // create the configuration + machine_config config(*cursystem, options); + + // iterate through all slot devices + int starting_count = options.options_count(); + for (const device_slot_interface &slot : slot_interface_iterator(config.root_device())) + { + // skip fixed slots + if (slot.fixed()) + continue; + + // retrieve info about the device instance + const char *name = slot.device().tag() + 1; + if (!options.exists(name)) + { + // first device? add the header as to be pretty + if (m_slot_options++ == 0) + options.add_entry(nullptr, "SLOT DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE); + + // add the option + options.add_entry(name, nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, slot.default_option(), true); + } + + // allow software lists to supply their own defaults + if (swpart != nullptr) + { + std::string featurename = std::string(name).append("_default"); + const char *value = swpart->feature(featurename.c_str()); + if (value != nullptr && (*value == '\0' || slot.option(value) != nullptr)) + { + // set priority above INIs but below actual command line + std::string error; + options.set_value(name, value, OPTION_PRIORITY_SUBCMD, error); + } + } + } + return (options.options_count() != starting_count); +} + + +//------------------------------------------------- +// update_slot_options - update slot values +// depending of image mounted +//------------------------------------------------- + +void mame_options::update_slot_options(emu_options &options, const software_part *swpart) +{ + // look up the system configured by name; if no match, do nothing + const game_driver *cursystem = options.system(); + if (cursystem == nullptr) + return; + machine_config config(*cursystem, options); + + // iterate through all slot devices + for (device_slot_interface &slot : slot_interface_iterator(config.root_device())) + { + // retrieve info about the device instance + const char *name = slot.device().tag() + 1; + if (options.exists(name) && !slot.option_list().empty()) + { + std::string defvalue = slot.get_default_card_software(); + if (defvalue.empty()) + { + // keep any non-default setting + if (options.priority(name) > OPTION_PRIORITY_DEFAULT) + continue; + + // reinstate the actual default value as configured + if (slot.default_option() != nullptr) + defvalue.assign(slot.default_option()); + } + + // set the value and hide the option if not selectable + options.set_default_value(name, defvalue.c_str()); + const device_slot_option *option = slot.option(defvalue.c_str()); + options.set_flag(name, ~OPTION_FLAG_INTERNAL, (option != nullptr && !option->selectable()) ? OPTION_FLAG_INTERNAL : 0); + } + } + while (add_slot_options(options,swpart)) {} + add_device_options(options); +} + + +//------------------------------------------------- +// add_device_options - add all of the device +// options for the configured system +//------------------------------------------------- + +void mame_options::add_device_options(emu_options &options) +{ + // look up the system configured by name; if no match, do nothing + const game_driver *cursystem = options.system(); + if (cursystem == nullptr) + return; + machine_config config(*cursystem, options); + + // iterate through all image devices + for (const device_image_interface &image : image_interface_iterator(config.root_device())) + { + if (!image.user_loadable()) + continue; + + // retrieve info about the device instance + std::ostringstream option_name; + util::stream_format(option_name, "%s;%s", image.instance_name(), image.brief_instance_name()); + if (strcmp(image.device_typename(image.image_type()), image.instance_name()) == 0) + util::stream_format(option_name, ";%s1;%s1", image.instance_name(), image.brief_instance_name()); + + // add the option + if (!options.exists(image.instance_name())) + { + // first device? add the header as to be pretty + if (m_device_options++ == 0) + options.add_entry(nullptr, "IMAGE DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE); + + // add the option + options.add_entry(option_name.str().c_str(), nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, nullptr, true); + } + } +} + + +//------------------------------------------------- +// remove_device_options - remove device options +//------------------------------------------------- + +void mame_options::remove_device_options(emu_options &options) +{ + // iterate through options and remove interesting ones + core_options::entry *nextentry; + for (auto *curentry = options.first(); curentry != nullptr; curentry = nextentry) + { + // pre-fetch the next entry in case we delete this one + nextentry = curentry->next(); + + // if this is a device option, nuke it + if ((curentry->flags() & OPTION_FLAG_DEVICE) != 0) + options.remove_entry(*curentry); + } + + // take also care of ramsize options + options.set_default_value(OPTION_RAMSIZE, ""); + + // reset counters + m_slot_options = 0; + m_device_options = 0; +} + + +//------------------------------------------------- +// parse_slot_devices - parse the command line +// and update slot and image devices +//------------------------------------------------- + +bool mame_options::parse_slot_devices(emu_options &options, int argc, char *argv[], std::string &error_string, const char *name, const char *value, const software_part *swpart) +{ + // an initial parse to capture the initial set of values + bool result; + + options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); + + // keep adding slot options until we stop seeing new stuff + while (add_slot_options(options,swpart)) + options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); + + // add device options and reparse + add_device_options(options); + if (name != nullptr && options.exists(name)) + options.set_value(name, value, OPTION_PRIORITY_SUBCMD, error_string); + options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); + + int num; + do { + num = options.options_count(); + update_slot_options(options,swpart); + result = options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); + } while (num != options.options_count()); + + options.update_cached_options(); + + return result; +} + + +//------------------------------------------------- +// parse_command_line - parse the command line +// and update the devices +//------------------------------------------------- + +bool mame_options::parse_command_line(emu_options &options, int argc, char *argv[], std::string &error_string) +{ + // parse as normal + options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); + bool result = parse_slot_devices(options,argc, argv, error_string); + options.update_cached_options(); + return result; +} + + +//------------------------------------------------- +// parse_standard_inis - parse the standard set +// of INI files +//------------------------------------------------- + +void mame_options::parse_standard_inis(emu_options &options, std::string &error_string, const game_driver *driver) +{ + // start with an empty string + error_string.clear(); + + // parse the INI file defined by the platform (e.g., "mame.ini") + // we do this twice so that the first file can change the INI path + parse_one_ini(options,emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI); + parse_one_ini(options,emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI, &error_string); + + // debug mode: parse "debug.ini" as well + if (options.debug()) + parse_one_ini(options,"debug", OPTION_PRIORITY_DEBUG_INI, &error_string); + + // if we have a valid system driver, parse system-specific INI files + const game_driver *cursystem = (driver == nullptr) ? options.system() : driver; + if (cursystem == nullptr) + return; + + // parse "vertical.ini" or "horizont.ini" + if (cursystem->flags & ORIENTATION_SWAP_XY) + parse_one_ini(options,"vertical", OPTION_PRIORITY_ORIENTATION_INI, &error_string); + else + parse_one_ini(options,"horizont", OPTION_PRIORITY_ORIENTATION_INI, &error_string); + + if (cursystem->flags & MACHINE_TYPE_ARCADE) + parse_one_ini(options,"arcade", OPTION_PRIORITY_SYSTYPE_INI, &error_string); + else if (cursystem->flags & MACHINE_TYPE_CONSOLE) + parse_one_ini(options,"console", OPTION_PRIORITY_SYSTYPE_INI, &error_string); + else if (cursystem->flags & MACHINE_TYPE_COMPUTER) + parse_one_ini(options,"computer", OPTION_PRIORITY_SYSTYPE_INI, &error_string); + else if (cursystem->flags & MACHINE_TYPE_OTHER) + parse_one_ini(options,"othersys", OPTION_PRIORITY_SYSTYPE_INI, &error_string); + + machine_config config(*cursystem, options); + for (const screen_device &device : screen_device_iterator(config.root_device())) + { + // parse "raster.ini" for raster games + if (device.screen_type() == SCREEN_TYPE_RASTER) + { + parse_one_ini(options,"raster", OPTION_PRIORITY_SCREEN_INI, &error_string); + break; + } + // parse "vector.ini" for vector games + if (device.screen_type() == SCREEN_TYPE_VECTOR) + { + parse_one_ini(options,"vector", OPTION_PRIORITY_SCREEN_INI, &error_string); + break; + } + // parse "lcd.ini" for lcd games + if (device.screen_type() == SCREEN_TYPE_LCD) + { + parse_one_ini(options,"lcd", OPTION_PRIORITY_SCREEN_INI, &error_string); + break; + } + } + + // next parse "source/.ini"; if that doesn't exist, try .ini + std::string sourcename = core_filename_extract_base(cursystem->source_file, true).insert(0, "source" PATH_SEPARATOR); + if (!parse_one_ini(options,sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string)) + { + sourcename = core_filename_extract_base(cursystem->source_file, true); + parse_one_ini(options,sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string); + } + + // then parse the grandparent, parent, and system-specific INIs + int parent = driver_list::clone(*cursystem); + int gparent = (parent != -1) ? driver_list::clone(parent) : -1; + if (gparent != -1) + parse_one_ini(options,driver_list::driver(gparent).name, OPTION_PRIORITY_GPARENT_INI, &error_string); + if (parent != -1) + parse_one_ini(options,driver_list::driver(parent).name, OPTION_PRIORITY_PARENT_INI, &error_string); + parse_one_ini(options,cursystem->name, OPTION_PRIORITY_DRIVER_INI, &error_string); + + // Re-evaluate slot options after loading ini files + update_slot_options(options); + + options.update_cached_options(); +} + +//------------------------------------------------- +// set_system_name - set a new system name +//------------------------------------------------- + +void mame_options::set_system_name(emu_options &options, const char *name) +{ + // remember the original system name + std::string old_system_name(options.system_name()); + bool new_system = old_system_name.compare(name) != 0; + + // if the system name changed, fix up the device options + if (new_system) + { + // first set the new name + std::string error; + options.set_value(OPTION_SYSTEMNAME, name, OPTION_PRIORITY_CMDLINE, error); + assert(error.empty()); + + // remove any existing device options + remove_device_options(options); + } + else + { + // revert device options set for the old software + options.revert(OPTION_PRIORITY_SUBCMD, OPTION_PRIORITY_SUBCMD); + } + + // get the new system + const game_driver *cursystem = options.system(); + if (cursystem == nullptr) + return; + + if (*options.software_name() != 0) + { + std::string sw_load(options.software_name()); + std::string sw_list, sw_name, sw_part, sw_instance, error_string; + int left = sw_load.find_first_of(':'); + int middle = sw_load.find_first_of(':', left + 1); + int right = sw_load.find_last_of(':'); + + sw_list = sw_load.substr(0, left - 1); + sw_name = sw_load.substr(left + 1, middle - left - 1); + sw_part = sw_load.substr(middle + 1, right - middle - 1); + sw_instance = sw_load.substr(right + 1); + sw_load.assign(sw_load.substr(0, right)); + + // look up the software part + machine_config config(*cursystem, options); + software_list_device *swlist = software_list_device::find_by_name(config, sw_list.c_str()); + software_info *swinfo = swlist != nullptr ? swlist->find(sw_name.c_str()) : nullptr; + software_part *swpart = swinfo != nullptr ? swinfo->find_part(sw_part.c_str()) : nullptr; + + // then add the options + if (new_system) + { + while (add_slot_options(options,swpart)) {} + add_device_options(options); + } + + options.set_value(OPTION_SOFTWARENAME, sw_name.c_str(), OPTION_PRIORITY_CMDLINE, error_string); + if (options.exists(sw_instance.c_str())) + options.set_value(sw_instance.c_str(), sw_load.c_str(), OPTION_PRIORITY_SUBCMD, error_string); + + int num; + do { + num = options.options_count(); + update_slot_options(options,swpart); + } while (num != options.options_count()); + } + else if (new_system) + { + // add the options afresh + while (add_slot_options(options)) {} + add_device_options(options); + int num; + do { + num = options.options_count(); + update_slot_options(options); + } while (num != options.options_count()); + } +} + +//------------------------------------------------- +// parse_one_ini - parse a single INI file +//------------------------------------------------- + +bool mame_options::parse_one_ini(emu_options &options, const char *basename, int priority, std::string *error_string) +{ + // don't parse if it has been disabled + if (!options.read_config()) + return false; + + // open the file; if we fail, that's ok + emu_file file(options.ini_path(), OPEN_FLAG_READ); + osd_file::error filerr = file.open(basename, ".ini"); + if (filerr != osd_file::error::NONE) + return false; + + // parse the file + osd_printf_verbose("Parsing %s.ini\n", basename); + std::string error; + bool result = options.parse_ini_file((util::core_file&)file, priority, OPTION_PRIORITY_DRIVER_INI, error); + + // append errors if requested + if (!error.empty() && error_string) + error_string->append(string_format("While parsing %s:\n%s\n", file.fullpath(), error)); + + return result; +} + diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h index a0e20153241..ccf1738a8c4 100644 --- a/src/emu/emuopts.h +++ b/src/emu/emuopts.h @@ -218,25 +218,43 @@ enum struct game_driver; class software_part; - -class emu_options : public core_options +class mame_options { static const UINT32 OPTION_FLAG_DEVICE = 0x80000000; +public: + // parsing wrappers + static bool parse_command_line(emu_options &options, int argc, char *argv[], std::string &error_string); + static void parse_standard_inis(emu_options &options, std::string &error_string, const game_driver *driver = nullptr); + static bool parse_slot_devices(emu_options &options, int argc, char *argv[], std::string &error_string, const char *name = nullptr, const char *value = nullptr, const software_part *swpart = nullptr); + // FIXME: Couriersud: This should be in image_device_exit + static void remove_device_options(emu_options &options); + + static void set_system_name(emu_options &options, const char *name); + static bool add_slot_options(emu_options &options, const software_part *swpart = nullptr); +private: + // device-specific option handling + static void add_device_options(emu_options &options); + static void update_slot_options(emu_options &options, const software_part *swpart = nullptr); + + // INI parsing helper + static bool parse_one_ini(emu_options &options, const char *basename, int priority, std::string *error_string = nullptr); + + static int m_slot_options; + static int m_device_options; + +}; + +class emu_options : public core_options +{ public: // construction/destruction emu_options(); - // parsing wrappers - bool parse_command_line(int argc, char *argv[], std::string &error_string); - void parse_standard_inis(std::string &error_string, const game_driver *driver = nullptr); - bool parse_slot_devices(int argc, char *argv[], std::string &error_string, const char *name = nullptr, const char *value = nullptr, const software_part *swpart = nullptr); - // core options const char *system_name() const { return value(OPTION_SYSTEMNAME); } const char *software_name() const { return value(OPTION_SOFTWARENAME); } const game_driver *system() const; - void set_system_name(const char *name); // core configuration options bool read_config() const { return bool_value(OPTION_READCONFIG); } @@ -405,26 +423,13 @@ public: const char *no_plugin() const { return value(OPTION_NO_PLUGIN); } const char *language() const { return value(OPTION_LANGUAGE); } - - // FIXME: Couriersud: This should be in image_device_exit - void remove_device_options(); - - std::string main_value(const char *option) const; - std::string sub_value(const char *name, const char *subname) const; - bool add_slot_options(const software_part *swpart = nullptr); - - -private: - // device-specific option handling - void add_device_options(); - void update_slot_options(const software_part *swpart = nullptr); - - // INI parsing helper - bool parse_one_ini(const char *basename, int priority, std::string *error_string = nullptr); - + // cache frequently used options in members void update_cached_options(); + std::string main_value(const char *option) const; + std::string sub_value(const char *name, const char *subname) const; +private: static const options_entry s_option_entries[]; // cached options @@ -432,8 +437,6 @@ private: bool m_joystick_contradictory; bool m_sleep; bool m_refresh_speed; - int m_slot_options; - int m_device_options; }; diff --git a/src/emu/info.cpp b/src/emu/info.cpp index 7f64e85b596..9169796f04d 100644 --- a/src/emu/info.cpp +++ b/src/emu/info.cpp @@ -184,7 +184,7 @@ info_xml_creator::info_xml_creator(driver_enumerator &drivlist) m_drivlist(drivlist), m_lookup_options(m_drivlist.options()) { - m_lookup_options.remove_device_options(); + mame_options::remove_device_options(m_lookup_options); } diff --git a/src/emu/mame.cpp b/src/emu/mame.cpp index 3c4b35df058..3ba16963bb7 100644 --- a/src/emu/mame.cpp +++ b/src/emu/mame.cpp @@ -259,7 +259,7 @@ int machine_manager::execute() { m_options.revert(OPTION_PRIORITY_INI); std::string errors; - m_options.parse_standard_inis(errors); + mame_options::parse_standard_inis(m_options,errors); } // otherwise, perform validity checks before anything else @@ -286,12 +286,12 @@ int machine_manager::execute() if (m_new_driver_pending) { // set up new system name and adjust device options accordingly - m_options.set_system_name(m_new_driver_pending->name); + mame_options::set_system_name(m_options,m_new_driver_pending->name); firstrun = true; } else { - if (machine.exit_pending()) m_options.set_system_name(""); + if (machine.exit_pending()) mame_options::set_system_name(m_options,""); } if (machine.exit_pending() && (!started_empty || (system == &GAME_NAME(___empty)))) diff --git a/src/emu/ui/miscmenu.cpp b/src/emu/ui/miscmenu.cpp index 518c834535e..4a000595de4 100644 --- a/src/emu/ui/miscmenu.cpp +++ b/src/emu/ui/miscmenu.cpp @@ -693,7 +693,7 @@ ui_menu_machine_configure::ui_menu_machine_configure(running_machine &machine, r { // parse the INI file std::string error; - m_opts.parse_standard_inis(error, m_drv); + mame_options::parse_standard_inis(m_opts,error, m_drv); setup_bios(); } diff --git a/src/emu/ui/slotopt.cpp b/src/emu/ui/slotopt.cpp index b676778b07e..470647ea063 100644 --- a/src/emu/ui/slotopt.cpp +++ b/src/emu/ui/slotopt.cpp @@ -188,7 +188,7 @@ void ui_menu_slot_devices::handle() { if ((FPTR)menu_event->itemref == 1 && menu_event->iptkey == IPT_UI_SELECT) { - machine().options().add_slot_options(); + mame_options::add_slot_options(machine().options()); machine().schedule_hard_reset(); } else if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT)