diff --git a/bgfx/chains/test.json b/bgfx/chains/test.json index d5b815ca3fc..bc5603a18f2 100644 --- a/bgfx/chains/test.json +++ b/bgfx/chains/test.json @@ -1,5 +1,5 @@ -{ "name": "Test Shader Chain" - "author": "Ryan Holtz" +{ "name": "Test Shader Chain", + "author": "Ryan Holtz", "sliders": [ { "type": "bool", "name": "adjustments", "text": "Enable Adjustments", "default": false }, { "type": "float", "name": "ratio_amount", "text": "Ratio Amount", "default": 0, "max": 1, "min": 0 }, @@ -7,25 +7,25 @@ { "type": "color", "name": "red_ratios", "text": "Red Amount", "default": [ 1, 0, 0 ], "max": [ 1, 1, 1 ], "min": [ 0, 0, 0 ] }, { "type": "color", "name": "grn_ratios", "text": "Green Amount", "default": [ 0, 1, 0 ], "max": [ 1, 1, 1 ], "min": [ 0, 0, 0 ] }, { "type": "color", "name": "blu_ratios", "text": "Blue Amount", "default": [ 0, 0, 1 ], "max": [ 1, 1, 1 ], "min": [ 0, 0, 0 ] }, - { "type": "color", "name": "tint": "text": "Tint", "default": [ 1, 1, 1 ], "max": [ 1, 1, 1 ], "min": [ 0, 0, 0 ] } - { "type": "color", "name": "phosphor", "text": "Phosphor Amount", "default": [ 0, 0, 0 ], "max": [ 1, 1, 1 ], "min": [ 0, 0 ,0 ] }, + { "type": "color", "name": "tint", "text": "Tint", "default": [ 1, 1, 1 ], "max": [ 1, 1, 1 ], "min": [ 0, 0, 0 ] }, + { "type": "color", "name": "phosphor", "text": "Phosphor Amount", "default": [ 0, 0, 0 ], "max": [ 1, 1, 1 ], "min": [ 0, 0, 0 ] }, { "type": "vec2", "name": "shift", "text": "Frame Shift", "default": [ 0, 0 ], "max": [ 25, 25 ], "min": [ -25, -25 ] } - ] + ], "parameters": [ { "name": "alternating", "type": "frame_mask", "period": 2 } - ] + ], "targets": [ { "name": "native", - "screen": true, + "screen": true }, { "name": "previous", "screen": true, "prescale": true } - ] + ], "passes": [ { "effect": "ratios", - "name": "Matrix Pass" + "name": "Matrix Pass", "disable_conditions": [ { "type": "slider", "name": "adjustments", "value": false }, { "type": "slider", "name": "ratio_amount", "value": 0 } @@ -42,7 +42,7 @@ "output": "native" }, { "effect": "tint", - "name": "Tint Pass" + "name": "Tint Pass", "disable_conditions": [ { "type": "slider", "name": "adjustments", "value": false } ], @@ -55,14 +55,14 @@ ], "output": "native" }, - { "effect": "phosphor" + { "effect": "phosphor", "name": "Phosphor Decay", "disable_conditions": [ { "type": "slider", "name": "adjustments", "value": false }, { "type": "slider", "name": "phosphor", "value": [ 0, 0, 0 ] } ], "uniforms": [ - { "name": "u_passthrough", "value": [ 0.0f ] }, + { "name": "u_passthrough", "value": [ 0 ] }, { "name": "u_phosphor", "slider": "phosphor" } ], "input": [ @@ -71,14 +71,14 @@ ], "output": "native" }, - { "effect": "phosphor" + { "effect": "phosphor", "name": "Phosphor Store", "disable_conditions": [ { "type": "slider", "name": "adjustments", "value": false }, { "type": "slider", "name": "phosphor", "value": [ 0, 0, 0 ] } ], "uniforms": [ - { "name": "u_passthrough", "value": [ 1.0f ] }, + { "name": "u_passthrough", "value": [ 1 ] }, { "name": "u_phosphor", "slider": "phosphor" } ], "input": [ @@ -87,7 +87,7 @@ ], "output": "previous" }, - { "effect": "blit" + { "effect": "blit", "name": "Final Blit", "input": [ { "sampler": "s_tex", "texture": "native" } diff --git a/bgfx/effects/blit.json b/bgfx/effects/blit.json new file mode 100644 index 00000000000..2d2d281df62 --- /dev/null +++ b/bgfx/effects/blit.json @@ -0,0 +1,22 @@ +{ + "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": "vs_blit", + "fragment": "fs_blit", + "uniforms": [ + { "name": "s_tex", "type": "int", "values": [ 1.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/phosphor.json b/bgfx/effects/phosphor.json new file mode 100644 index 00000000000..0efbad997de --- /dev/null +++ b/bgfx/effects/phosphor.json @@ -0,0 +1,25 @@ +{ + "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": "vs_phosphor", + "fragment": "fs_phosphor", + "uniforms": [ + { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, + { "name": "s_prev", "type": "int", "values": [ 1.0 ] }, + { "name": "u_passthrough", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }, + { "name": "u_phosphor", "type": "vec4", "values": [ 0.7, 0.7, 0.7, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/ratios.json b/bgfx/effects/ratios.json new file mode 100644 index 00000000000..0949172b0c9 --- /dev/null +++ b/bgfx/effects/ratios.json @@ -0,0 +1,26 @@ +{ + "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": "vs_ratios", + "fragment": "fs_ratios", + "uniforms": [ + { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, + { "name": "u_red_ratios", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 1.0 ] }, + { "name": "u_grn_ratios", "type": "vec4", "values": [ 0.0, 1.0, 0.0, 1.0 ] }, + { "name": "u_blu_ratios", "type": "vec4", "values": [ 0.0, 0.0, 1.0, 1.0 ] }, + { "name": "u_ratio_amount", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/bgfx/effects/tint.json b/bgfx/effects/tint.json new file mode 100644 index 00000000000..19cd7687f15 --- /dev/null +++ b/bgfx/effects/tint.json @@ -0,0 +1,24 @@ +{ + "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": "vs_tint", + "fragment": "fs_tint", + "uniforms": [ + { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, + { "name": "u_tint", "type": "vec4", "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "u_shift", "type": "vec4", "values": [ 0.1, 0.1, 0.0, 0.0 ] } + ] +} \ No newline at end of file diff --git a/shaders/dx11/fs_blit.bin b/shaders/dx11/fs_blit.bin new file mode 100644 index 00000000000..80d85fb1107 Binary files /dev/null and b/shaders/dx11/fs_blit.bin differ diff --git a/shaders/dx11/fs_phosphor.bin b/shaders/dx11/fs_phosphor.bin new file mode 100644 index 00000000000..ad1523baf07 Binary files /dev/null and b/shaders/dx11/fs_phosphor.bin differ diff --git a/shaders/dx11/fs_ratios.bin b/shaders/dx11/fs_ratios.bin new file mode 100644 index 00000000000..2df1e3de93f Binary files /dev/null and b/shaders/dx11/fs_ratios.bin differ diff --git a/shaders/dx11/fs_tint.bin b/shaders/dx11/fs_tint.bin new file mode 100644 index 00000000000..eca7aa371a1 Binary files /dev/null and b/shaders/dx11/fs_tint.bin differ diff --git a/shaders/dx11/vs_blit.bin b/shaders/dx11/vs_blit.bin new file mode 100644 index 00000000000..b0bebf9da4c Binary files /dev/null and b/shaders/dx11/vs_blit.bin differ diff --git a/shaders/dx11/vs_phosphor.bin b/shaders/dx11/vs_phosphor.bin new file mode 100644 index 00000000000..b0bebf9da4c Binary files /dev/null and b/shaders/dx11/vs_phosphor.bin differ diff --git a/shaders/dx11/vs_ratios.bin b/shaders/dx11/vs_ratios.bin new file mode 100644 index 00000000000..b0bebf9da4c Binary files /dev/null and b/shaders/dx11/vs_ratios.bin differ diff --git a/shaders/dx11/vs_tint.bin b/shaders/dx11/vs_tint.bin new file mode 100644 index 00000000000..b0bebf9da4c Binary files /dev/null and b/shaders/dx11/vs_tint.bin differ diff --git a/shaders/dx9/fs_blit.bin b/shaders/dx9/fs_blit.bin new file mode 100644 index 00000000000..ee2b018cae8 Binary files /dev/null and b/shaders/dx9/fs_blit.bin differ diff --git a/shaders/dx9/fs_phosphor.bin b/shaders/dx9/fs_phosphor.bin new file mode 100644 index 00000000000..4efb78ecae0 Binary files /dev/null and b/shaders/dx9/fs_phosphor.bin differ diff --git a/shaders/dx9/fs_ratios.bin b/shaders/dx9/fs_ratios.bin new file mode 100644 index 00000000000..8bd9eed37bb Binary files /dev/null and b/shaders/dx9/fs_ratios.bin differ diff --git a/shaders/dx9/fs_tint.bin b/shaders/dx9/fs_tint.bin new file mode 100644 index 00000000000..aa19e6def30 Binary files /dev/null and b/shaders/dx9/fs_tint.bin differ diff --git a/shaders/dx9/vs_blit.bin b/shaders/dx9/vs_blit.bin new file mode 100644 index 00000000000..c071222605b Binary files /dev/null and b/shaders/dx9/vs_blit.bin differ diff --git a/shaders/dx9/vs_phosphor.bin b/shaders/dx9/vs_phosphor.bin new file mode 100644 index 00000000000..c071222605b Binary files /dev/null and b/shaders/dx9/vs_phosphor.bin differ diff --git a/shaders/dx9/vs_ratios.bin b/shaders/dx9/vs_ratios.bin new file mode 100644 index 00000000000..c071222605b Binary files /dev/null and b/shaders/dx9/vs_ratios.bin differ diff --git a/shaders/dx9/vs_tint.bin b/shaders/dx9/vs_tint.bin new file mode 100644 index 00000000000..c071222605b Binary files /dev/null and b/shaders/dx9/vs_tint.bin differ diff --git a/shaders/gles/fs_blit.bin b/shaders/gles/fs_blit.bin new file mode 100644 index 00000000000..22e2f0c23d0 Binary files /dev/null and b/shaders/gles/fs_blit.bin differ diff --git a/shaders/gles/fs_phosphor.bin b/shaders/gles/fs_phosphor.bin new file mode 100644 index 00000000000..9ebdaa8f4ce Binary files /dev/null and b/shaders/gles/fs_phosphor.bin differ diff --git a/shaders/gles/fs_ratios.bin b/shaders/gles/fs_ratios.bin new file mode 100644 index 00000000000..2f053c136f7 Binary files /dev/null and b/shaders/gles/fs_ratios.bin differ diff --git a/shaders/gles/fs_tint.bin b/shaders/gles/fs_tint.bin new file mode 100644 index 00000000000..a0863060977 Binary files /dev/null and b/shaders/gles/fs_tint.bin differ diff --git a/shaders/gles/vs_blit.bin b/shaders/gles/vs_blit.bin new file mode 100644 index 00000000000..9dd618de8a0 Binary files /dev/null and b/shaders/gles/vs_blit.bin differ diff --git a/shaders/gles/vs_phosphor.bin b/shaders/gles/vs_phosphor.bin new file mode 100644 index 00000000000..9dd618de8a0 Binary files /dev/null and b/shaders/gles/vs_phosphor.bin differ diff --git a/shaders/gles/vs_ratios.bin b/shaders/gles/vs_ratios.bin new file mode 100644 index 00000000000..9dd618de8a0 Binary files /dev/null and b/shaders/gles/vs_ratios.bin differ diff --git a/shaders/gles/vs_tint.bin b/shaders/gles/vs_tint.bin new file mode 100644 index 00000000000..9dd618de8a0 Binary files /dev/null and b/shaders/gles/vs_tint.bin differ diff --git a/shaders/glsl/fs_blit.bin b/shaders/glsl/fs_blit.bin new file mode 100644 index 00000000000..db0fe2b487b Binary files /dev/null and b/shaders/glsl/fs_blit.bin differ diff --git a/shaders/glsl/fs_phosphor.bin b/shaders/glsl/fs_phosphor.bin new file mode 100644 index 00000000000..5996130d730 Binary files /dev/null and b/shaders/glsl/fs_phosphor.bin differ diff --git a/shaders/glsl/fs_ratios.bin b/shaders/glsl/fs_ratios.bin new file mode 100644 index 00000000000..7fea68ef815 Binary files /dev/null and b/shaders/glsl/fs_ratios.bin differ diff --git a/shaders/glsl/fs_tint.bin b/shaders/glsl/fs_tint.bin new file mode 100644 index 00000000000..ec324cd4c4d Binary files /dev/null and b/shaders/glsl/fs_tint.bin differ diff --git a/shaders/glsl/vs_blit.bin b/shaders/glsl/vs_blit.bin new file mode 100644 index 00000000000..af6c9349f41 Binary files /dev/null and b/shaders/glsl/vs_blit.bin differ diff --git a/shaders/glsl/vs_phosphor.bin b/shaders/glsl/vs_phosphor.bin new file mode 100644 index 00000000000..af6c9349f41 Binary files /dev/null and b/shaders/glsl/vs_phosphor.bin differ diff --git a/shaders/glsl/vs_ratios.bin b/shaders/glsl/vs_ratios.bin new file mode 100644 index 00000000000..af6c9349f41 Binary files /dev/null and b/shaders/glsl/vs_ratios.bin differ diff --git a/shaders/glsl/vs_tint.bin b/shaders/glsl/vs_tint.bin new file mode 100644 index 00000000000..af6c9349f41 Binary files /dev/null and b/shaders/glsl/vs_tint.bin differ diff --git a/shaders/metal/fs_blit.bin b/shaders/metal/fs_blit.bin new file mode 100644 index 00000000000..6a3da392480 Binary files /dev/null and b/shaders/metal/fs_blit.bin differ diff --git a/shaders/metal/fs_phosphor.bin b/shaders/metal/fs_phosphor.bin new file mode 100644 index 00000000000..5cf08944c95 Binary files /dev/null and b/shaders/metal/fs_phosphor.bin differ diff --git a/shaders/metal/fs_ratios.bin b/shaders/metal/fs_ratios.bin new file mode 100644 index 00000000000..1c36f16eccd Binary files /dev/null and b/shaders/metal/fs_ratios.bin differ diff --git a/shaders/metal/fs_tint.bin b/shaders/metal/fs_tint.bin new file mode 100644 index 00000000000..5e51658527d Binary files /dev/null and b/shaders/metal/fs_tint.bin differ diff --git a/shaders/metal/vs_blit.bin b/shaders/metal/vs_blit.bin new file mode 100644 index 00000000000..122b7dee5c3 Binary files /dev/null and b/shaders/metal/vs_blit.bin differ diff --git a/shaders/metal/vs_phosphor.bin b/shaders/metal/vs_phosphor.bin new file mode 100644 index 00000000000..122b7dee5c3 Binary files /dev/null and b/shaders/metal/vs_phosphor.bin differ diff --git a/shaders/metal/vs_ratios.bin b/shaders/metal/vs_ratios.bin new file mode 100644 index 00000000000..122b7dee5c3 Binary files /dev/null and b/shaders/metal/vs_ratios.bin differ diff --git a/shaders/metal/vs_tint.bin b/shaders/metal/vs_tint.bin new file mode 100644 index 00000000000..122b7dee5c3 Binary files /dev/null and b/shaders/metal/vs_tint.bin differ diff --git a/src/osd/modules/render/bgfx/chain.cpp b/src/osd/modules/render/bgfx/chain.cpp index 271695b56a1..6827864df7e 100644 --- a/src/osd/modules/render/bgfx/chain.cpp +++ b/src/osd/modules/render/bgfx/chain.cpp @@ -23,6 +23,18 @@ bgfx_chain::bgfx_chain(std::string name, std::string author, std::vector + +#include +#include +#include + +#include "chainmanager.h" +#include "chainreader.h" +#include "chain.h" + +using namespace rapidjson; + +chain_manager::~chain_manager() +{ + for (std::pair chain : m_chains) + { + delete chain.second; + } + m_chains.clear(); +} + +bgfx_chain* chain_manager::chain(std::string name) +{ + std::map::iterator iter = m_chains.find(name); + if (iter != m_chains.end()) + { + return iter->second; + } + + return load_chain(name); +} + +bgfx_chain* chain_manager::load_chain(std::string name) { + std::string path = "bgfx/chains/" + name + ".json"; + + bx::CrtFileReader reader; + bx::open(&reader, path.c_str()); + + int32_t size = (uint32_t)bx::getSize(&reader); + + char* data = new char[size + 1]; + bx::read(&reader, reinterpret_cast(data), size); + bx::close(&reader); + data[size] = 0; + + Document document; + document.Parse<0>(data); + bgfx_chain* chain = chain_reader::read_from_value(document, m_textures, m_targets, m_effects, m_width, m_height); + + m_chains[name] = chain; + + return chain; +} diff --git a/src/osd/modules/render/bgfx/chainmanager.h b/src/osd/modules/render/bgfx/chainmanager.h new file mode 100644 index 00000000000..63c97215dec --- /dev/null +++ b/src/osd/modules/render/bgfx/chainmanager.h @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// chainmanager.h - BGFX shader chain manager +// +// Maintains a string-to-entry lookup of BGFX shader +// effect chains, defined by chain.h and read by chainreader.h +// +//============================================================ + +#pragma once + +#ifndef __DRAWBGFX_CHAIN_MANAGER__ +#define __DRAWBGFX_CHAIN_MANAGER__ + +#include +#include + +#include + +#include "texturemanager.h" +#include "targetmanager.h" +#include "effectmanager.h" + +class bgfx_chain; + +class chain_manager { +public: + chain_manager(texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t width, uint32_t height) + : m_textures(textures) + , m_targets(targets) + , m_effects(effects) + , m_width(width) + , m_height(height) + { + } + ~chain_manager(); + + // Getters + bgfx_chain* chain(std::string name); + +private: + bgfx_chain* load_chain(std::string name); + + texture_manager& m_textures; + target_manager& m_targets; + effect_manager& m_effects; + uint32_t m_width; + uint32_t m_height; + std::map m_chains; +}; + +#endif // __DRAWBGFX_CHAIN_MANAGER__ diff --git a/src/osd/modules/render/bgfx/chainreader.cpp b/src/osd/modules/render/bgfx/chainreader.cpp index 2498e8206b6..392fb93fb65 100644 --- a/src/osd/modules/render/bgfx/chainreader.cpp +++ b/src/osd/modules/render/bgfx/chainreader.cpp @@ -25,6 +25,7 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, texture_manager& t std::string name = value["name"].GetString(); std::string author = value["author"].GetString(); + // Parse sliders std::vector sliders; if (value.HasMember("sliders")) { @@ -35,6 +36,7 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, texture_manager& t } } + // Parse parameters std::vector parameters; if (value.HasMember("parameters")) { @@ -45,6 +47,7 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, texture_manager& t } } + // Parse chain entries std::vector entries; if (value.HasMember("passes")) { @@ -55,6 +58,7 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, texture_manager& t } } + // Create targets if (value.HasMember("targets")) { const Value& target_array = value["targets"]; diff --git a/src/osd/modules/render/bgfx/fs_blit.sc b/src/osd/modules/render/bgfx/fs_blit.sc new file mode 100644 index 00000000000..5130d1bebb5 --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_blit.sc @@ -0,0 +1,13 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/fs_phosphor.sc b/src/osd/modules/render/bgfx/fs_phosphor.sc new file mode 100644 index 00000000000..2df6b3f827d --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_phosphor.sc @@ -0,0 +1,20 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +uniform vec4 u_passthrough; +uniform vec4 u_phosphor; + +SAMPLER2D(s_tex, 0); +SAMPLER2D(s_prev, 1); + +void main() +{ + vec4 curr = texture2D(s_tex, v_texcoord0); + vec4 prev = texture2D(s_prev, v_texcoord0); + vec4 phosphored = vec4(max(curr.r, prev.r * u_phosphor.r), max(curr.g, prev.g * u_phosphor.g), max(curr.b, prev.b * u_phosphor.b), curr.a); + gl_FragColor = mix(phosphored, curr, u_passthrough.x) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/fs_ratios.sc b/src/osd/modules/render/bgfx/fs_ratios.sc new file mode 100644 index 00000000000..c45050d4a4f --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_ratios.sc @@ -0,0 +1,23 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +uniform vec4 u_ratio_amount; +uniform vec4 u_red_ratios; +uniform vec4 u_grn_ratios; +uniform vec4 u_blu_ratios; + +SAMPLER2D(s_tex, 0); + +void main() +{ + vec4 texel = texture2D(s_tex, v_texcoord0); + float red = dot(texel.rgb, u_red_ratios.rgb); + float grn = dot(texel.rgb, u_grn_ratios.rgb); + float blu = dot(texel.rgb, u_blu_ratios.rgb); + vec3 mixed = mix(texel.rgb, vec3(red, grn, blu), u_ratio_amount.x); + gl_FragColor = vec4(mixed, texel.a) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/fs_tint.sc b/src/osd/modules/render/bgfx/fs_tint.sc new file mode 100644 index 00000000000..3e79f1e16e6 --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_tint.sc @@ -0,0 +1,16 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +uniform vec4 u_tint; +uniform vec4 u_shift; + +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, v_texcoord0 + u_shift.xy) * u_tint * v_color0; +} diff --git a/src/osd/modules/render/bgfx/target.h b/src/osd/modules/render/bgfx/target.h index d4cea313464..19bf429e606 100644 --- a/src/osd/modules/render/bgfx/target.h +++ b/src/osd/modules/render/bgfx/target.h @@ -22,6 +22,7 @@ public: // Getters bgfx::FrameBufferHandle target() const { return m_target; } + virtual bool is_target() const override { return true; } private: bgfx::FrameBufferHandle m_target; diff --git a/src/osd/modules/render/bgfx/targetmanager.cpp b/src/osd/modules/render/bgfx/targetmanager.cpp index 930fbf1bfe0..88a3013350e 100644 --- a/src/osd/modules/render/bgfx/targetmanager.cpp +++ b/src/osd/modules/render/bgfx/targetmanager.cpp @@ -25,7 +25,6 @@ target_manager::~target_manager() bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat::Enum format, uint32_t width, uint32_t height, bool filter) { - printf("Creating %s\n", name.c_str()); bgfx_target* target = new bgfx_target(name, format, width, height, filter); m_targets[name] = target; @@ -35,7 +34,6 @@ bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat bgfx_target* target_manager::create_target(std::string name, void *handle, uint32_t width, uint32_t height) { - printf("Creating %s\n", name.c_str()); bgfx_target* target = new bgfx_target(name, handle, width, height); m_targets[name] = target; diff --git a/src/osd/modules/render/bgfx/texture.h b/src/osd/modules/render/bgfx/texture.h index 2fc3a596ddc..70dad1c13b6 100644 --- a/src/osd/modules/render/bgfx/texture.h +++ b/src/osd/modules/render/bgfx/texture.h @@ -27,6 +27,7 @@ public: uint32_t width() const { return m_width; } uint32_t height() const { return m_height; } bgfx::TextureHandle handle() const { return m_handle; } + virtual bool is_target() const { return false; } protected: std::string m_name; diff --git a/src/osd/modules/render/bgfx/texturemanager.cpp b/src/osd/modules/render/bgfx/texturemanager.cpp index 4a8cdd5d934..4da872978dd 100644 --- a/src/osd/modules/render/bgfx/texturemanager.cpp +++ b/src/osd/modules/render/bgfx/texturemanager.cpp @@ -18,7 +18,10 @@ texture_manager::~texture_manager() { for (std::pair texture : m_textures) { - delete texture.second; + if (!(texture.second)->is_target()) + { + delete texture.second; + } } m_textures.clear(); } diff --git a/src/osd/modules/render/bgfx/vs_blit.sc b/src/osd/modules/render/bgfx/vs_blit.sc new file mode 100644 index 00000000000..c3699f6fbd9 --- /dev/null +++ b/src/osd/modules/render/bgfx/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 "../../../../../3rdparty/bgfx/examples/common/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/vs_phosphor.sc b/src/osd/modules/render/bgfx/vs_phosphor.sc new file mode 100644 index 00000000000..c3699f6fbd9 --- /dev/null +++ b/src/osd/modules/render/bgfx/vs_phosphor.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 "../../../../../3rdparty/bgfx/examples/common/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/vs_ratios.sc b/src/osd/modules/render/bgfx/vs_ratios.sc new file mode 100644 index 00000000000..c3699f6fbd9 --- /dev/null +++ b/src/osd/modules/render/bgfx/vs_ratios.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 "../../../../../3rdparty/bgfx/examples/common/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/vs_tint.sc b/src/osd/modules/render/bgfx/vs_tint.sc new file mode 100644 index 00000000000..c3699f6fbd9 --- /dev/null +++ b/src/osd/modules/render/bgfx/vs_tint.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 "../../../../../3rdparty/bgfx/examples/common/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/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 4198148d8cd..786bdb1e936 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -35,9 +35,11 @@ #include "bgfx/targetmanager.h" #include "bgfx/shadermanager.h" #include "bgfx/effectmanager.h" +#include "bgfx/chainmanager.h" #include "bgfx/effect.h" #include "bgfx/texture.h" #include "bgfx/target.h" +#include "bgfx/chain.h" //============================================================ // DEBUGGING @@ -129,6 +131,7 @@ int renderer_bgfx::create() m_targets = new target_manager(*m_textures); m_shaders = new shader_manager(); m_effects = new effect_manager(*m_shaders); + m_chains = new chain_manager(*m_textures, *m_targets, *m_effects, m_width[window().m_index], m_height[window().m_index]); if (window().m_index != 0) { @@ -151,6 +154,8 @@ int renderer_bgfx::create() m_screen_effect[2] = m_effects->effect("screen_multiply"); m_screen_effect[3] = m_effects->effect("screen_add"); + //m_screen_chain[0] = m_chains->chain("test"); + uint32_t flags = BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP | BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT; m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::RGBA8, CACHE_SIZE, CACHE_SIZE, nullptr, flags); @@ -167,10 +172,11 @@ int renderer_bgfx::create() renderer_bgfx::~renderer_bgfx() { // Cleanup. - delete m_targets; - delete m_textures; + delete m_chains; delete m_effects; delete m_shaders; + delete m_textures; + delete m_targets; } void renderer_bgfx::exit() diff --git a/src/osd/modules/render/drawbgfx.h b/src/osd/modules/render/drawbgfx.h index 924ee0add29..d96943ce6c1 100644 --- a/src/osd/modules/render/drawbgfx.h +++ b/src/osd/modules/render/drawbgfx.h @@ -14,9 +14,11 @@ class texture_manager; class target_manager; class shader_manager; class effect_manager; +class chain_manager; class bgfx_texture; class bgfx_effect; class bgfx_target; +class bgfx_chain; /* sdl_info is the information about SDL for the current screen */ class renderer_bgfx : public osd_renderer @@ -107,8 +109,11 @@ private: target_manager* m_targets; shader_manager* m_shaders; effect_manager* m_effects; + chain_manager* m_chains; + bgfx_effect* m_gui_effect[4]; bgfx_effect* m_screen_effect[4]; + //bgfx_chain* m_screen_chain[4]; std::map m_hash_to_entry; std::vector m_texinfo;