diff options
author | 2016-03-12 01:31:13 +0100 | |
---|---|---|
committer | 2016-03-13 15:51:19 +0100 | |
commit | cd8f796df658caf91af31de35d87ab0de77e69e9 (patch) | |
tree | d4abc539d9cfa747080806c0e10e3f190265dc4d /src | |
parent | ad1e6ef899eb856f14354fa952b2a2b0c8aafaa7 (diff) |
Add bgfx command line options, major shakeup of organization, nw
Diffstat (limited to 'src')
42 files changed, 740 insertions, 157 deletions
diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp index 5cb7cb85da4..8a0d0f86107 100644 --- a/src/osd/modules/lib/osdobj_common.cpp +++ b/src/osd/modules/lib/osdobj_common.cpp @@ -141,7 +141,11 @@ const options_entry osd_options::s_option_entries[] = { OSDOPTION_AUDIO_EFFECT "9", OSDOPTVAL_NONE, OPTION_STRING, "AudioUnit effect 9" }, #endif - // End of list + { nullptr, nullptr, OPTION_HEADER, "BGFX POST-PROCESSING OPTIONS" }, + { OSDOPTION_BGFX_PATH, "bgfx", OPTION_STRING, "path to BGFX-related files" }, + { OSDOPTION_BGFX_SCREEN_CHAIN, "hlsl", OPTION_STRING, "screen chain JSON file to use" }, + + // End of list { nullptr } }; diff --git a/src/osd/modules/lib/osdobj_common.h b/src/osd/modules/lib/osdobj_common.h index 592391b5161..652ae8d6cfc 100644 --- a/src/osd/modules/lib/osdobj_common.h +++ b/src/osd/modules/lib/osdobj_common.h @@ -78,7 +78,8 @@ #define OSDOPTVAL_AUTO "auto" #define OSDOPTVAL_NONE "none" - +#define OSDOPTION_BGFX_PATH "bgfx_path" +#define OSDOPTION_BGFX_SCREEN_CHAIN "screen_chain" //============================================================ // TYPE DEFINITIONS @@ -149,6 +150,10 @@ public: const char *audio_output() const { return value(OSDOPTION_AUDIO_OUTPUT); } const char *audio_effect(int index) const { return value(string_format("%s%d", OSDOPTION_AUDIO_EFFECT, index).c_str()); } + // BGFX specific options + const char *bgfx_path() const { return value(OSDOPTION_BGFX_PATH); } + const char *bgfx_screen_chain() const { return value(OSDOPTION_BGFX_SCREEN_CHAIN); } + private: static const options_entry s_option_entries[]; }; diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp index 3a9d4248691..9b7d1674fb6 100644 --- a/src/osd/modules/render/bgfx/chainentry.cpp +++ b/src/osd/modules/render/bgfx/chainentry.cpp @@ -27,10 +27,10 @@ bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, std::vector<bgfx_suppressor*> suppressors, std::vector<bgfx_input_pair> inputs, std::vector<bgfx_entry_uniform*> uniforms, bgfx_target* output) : m_name(name) , m_effect(effect) - , m_inputs(inputs) , m_suppressors(suppressors) - , m_output(output) + , m_inputs(inputs) , m_uniforms(uniforms) + , m_output(output) { } @@ -58,6 +58,39 @@ void bgfx_chain_entry::submit(render_primitive* prim, int view, texture_manager& put_screen_buffer(prim, &buffer); bgfx::setVertexBuffer(&buffer); + bgfx_uniform* screen_rect = m_effect->uniform("u_screenrect"); + if (screen_rect != nullptr) + { + float values[2]; + float width = screen_width; + float height = screen_height; + if (m_inputs.size() > 0) + { + width = float(textures.provider(m_inputs[0].texture())->width()); + height = float(textures.provider(m_inputs[0].texture())->height()); + } + values[0] = 1.0f / width; + values[1] = 1.0f / height; + screen_rect->set(values, sizeof(float) * 2); + } + + bgfx_uniform* quad_dims = m_effect->uniform("u_quad_dims"); + if (quad_dims != nullptr) + { + float values[2]; + values[0] = prim->bounds.x1 - prim->bounds.x0; + values[1] = prim->bounds.y1 - prim->bounds.y0; + quad_dims->set(values, sizeof(float) * 2); + } + + bgfx_uniform* guest_dims = m_effect->uniform("u_guest_dims"); + if (guest_dims != nullptr) + { + float values[2]; + values[0] = 1.0f / float(prim->texture.width); + values[1] = 1.0f / float(prim->texture.height); + guest_dims->set(values, sizeof(float) * 2); + } for (bgfx_entry_uniform* uniform : m_uniforms) { uniform->bind(); @@ -159,13 +192,27 @@ bool bgfx_chain_entry::skip() return false; } + // Group all AND/OR'd results together and OR them together (hack for now) + // TODO: Make this a bit more logical + + bool or_suppress = false; + int and_count = 0; + int and_suppressed = 0; for (bgfx_suppressor* suppressor : m_suppressors) { - if (suppressor->suppress()) + if (suppressor->combine() == bgfx_suppressor::combine_mode::COMBINE_AND) + { + and_count++; + if (suppressor->suppress()) + { + and_suppressed++; + } + } + else if (suppressor->combine() == bgfx_suppressor::combine_mode::COMBINE_OR) { - return true; + or_suppress |= suppressor->suppress(); } } - return false; + return (and_count != 0 && and_suppressed == and_count) || or_suppress; }
\ No newline at end of file diff --git a/src/osd/modules/render/bgfx/chainentryreader.cpp b/src/osd/modules/render/bgfx/chainentryreader.cpp index 1f856ec2d8c..5e4c9b2de9d 100644 --- a/src/osd/modules/render/bgfx/chainentryreader.cpp +++ b/src/osd/modules/render/bgfx/chainentryreader.cpp @@ -23,7 +23,7 @@ #include "suppressor.h" #include "suppressorreader.h" -bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects, std::map<std::string, bgfx_slider*>& sliders) +bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects, std::map<std::string, bgfx_slider*>& sliders, std::map<std::string, bgfx_parameter*>& params) { validate_parameters(value); @@ -49,7 +49,7 @@ bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, textur const Value& uniform_array = value["uniforms"]; for (UINT32 i = 0; i < uniform_array.Size(); i++) { - uniforms.push_back(entry_uniform_reader::read_from_value(uniform_array[i], effect, sliders)); + uniforms.push_back(entry_uniform_reader::read_from_value(uniform_array[i], effect, sliders, params)); } } diff --git a/src/osd/modules/render/bgfx/chainentryreader.h b/src/osd/modules/render/bgfx/chainentryreader.h index 9c6ca979bf4..bb2501bf039 100644 --- a/src/osd/modules/render/bgfx/chainentryreader.h +++ b/src/osd/modules/render/bgfx/chainentryreader.h @@ -20,11 +20,12 @@ class texture_manager; class target_manager; class effect_manager; class bgfx_slider; +class bgfx_parameter; class chain_entry_reader : public state_reader { public: - static bgfx_chain_entry* read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects, std::map<std::string, bgfx_slider*>& sliders); + static bgfx_chain_entry* read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects, std::map<std::string, bgfx_slider*>& sliders, std::map<std::string, bgfx_parameter*>& params); private: static void validate_parameters(const Value& value); diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index 09383ae08ad..cea272c0049 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -31,20 +31,20 @@ chain_manager::~chain_manager() m_chains.clear(); } -bgfx_chain* chain_manager::chain(std::string name, running_machine& machine) +bgfx_chain* chain_manager::chain(std::string name, running_machine& machine, uint32_t window_index) { - std::map<std::string, bgfx_chain*>::iterator iter = m_chains.find(name); + std::map<std::string, bgfx_chain*>::iterator iter = m_chains.find(name + std::to_string(window_index)); if (iter != m_chains.end()) { return iter->second; } - return load_chain(name, machine); + return load_chain(name, machine, window_index); } -bgfx_chain* chain_manager::load_chain(std::string name, running_machine& machine) +bgfx_chain* chain_manager::load_chain(std::string name, running_machine& machine, uint32_t window_index) { - std::string path = "bgfx/chains/" + name + ".json"; + std::string path = std::string(m_options.bgfx_path()) + "/chains/" + name + ".json"; bx::CrtFileReader reader; bx::open(&reader, path.c_str()); @@ -58,9 +58,9 @@ bgfx_chain* chain_manager::load_chain(std::string name, running_machine& machine Document document; document.Parse<0>(data); - bgfx_chain* chain = chain_reader::read_from_value(document, machine, m_textures, m_targets, m_effects, m_width, m_height); + bgfx_chain* chain = chain_reader::read_from_value(document, machine, window_index, m_textures, m_targets, m_effects, m_width, m_height); - m_chains[name] = chain; + m_chains[name + std::to_string(window_index)] = chain; return chain; } diff --git a/src/osd/modules/render/bgfx/chainmanager.h b/src/osd/modules/render/bgfx/chainmanager.h index e4527cd81c0..4f413459d37 100644 --- a/src/osd/modules/render/bgfx/chainmanager.h +++ b/src/osd/modules/render/bgfx/chainmanager.h @@ -27,8 +27,9 @@ 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) + chain_manager(osd_options& options, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t width, uint32_t height) + : m_options(options) + , m_textures(textures) , m_targets(targets) , m_effects(effects) , m_width(width) @@ -38,11 +39,12 @@ public: ~chain_manager(); // Getters - bgfx_chain* chain(std::string name, running_machine& machine); + bgfx_chain* chain(std::string name, running_machine& machine, uint32_t window_index); private: - bgfx_chain* load_chain(std::string name, running_machine& machine); + bgfx_chain* load_chain(std::string name, running_machine& machine, uint32_t window_index); + osd_options& m_options; texture_manager& m_textures; target_manager& m_targets; effect_manager& m_effects; diff --git a/src/osd/modules/render/bgfx/chainreader.cpp b/src/osd/modules/render/bgfx/chainreader.cpp index 00eb77eaa59..84868e19237 100644 --- a/src/osd/modules/render/bgfx/chainreader.cpp +++ b/src/osd/modules/render/bgfx/chainreader.cpp @@ -20,6 +20,7 @@ #include "chainreader.h" #include "target.h" #include "slider.h" +#include "parameter.h" const chain_reader::string_to_enum chain_reader::STYLE_NAMES[chain_reader::STYLE_COUNT] = { { "guest", TARGET_STYLE_GUEST }, @@ -27,7 +28,7 @@ const chain_reader::string_to_enum chain_reader::STYLE_NAMES[chain_reader::STYLE { "custom", TARGET_STYLE_CUSTOM } }; -bgfx_chain* chain_reader::read_from_value(const Value& value, running_machine& machine, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t screen_width, uint32_t screen_height) +bgfx_chain* chain_reader::read_from_value(const Value& value, running_machine& machine, uint32_t window_index, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t screen_width, uint32_t screen_height) { validate_parameters(value); @@ -63,10 +64,17 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, running_machine& m const Value& param_array = value["parameters"]; for (UINT32 i = 0; i < param_array.Size(); i++) { - parameters.push_back(parameter_reader::read_from_value(param_array[i])); + parameters.push_back(parameter_reader::read_from_value(param_array[i], window_index)); } } + // Map parameters + std::map<std::string, bgfx_parameter*> param_map; + for (bgfx_parameter* param : parameters) + { + param_map[param->name()] = param; + } + // Create targets if (value.HasMember("targets")) { @@ -121,7 +129,7 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, running_machine& m const Value& entry_array = value["passes"]; for (UINT32 i = 0; i < entry_array.Size(); i++) { - entries.push_back(chain_entry_reader::read_from_value(entry_array[i], textures, targets, effects, slider_map)); + entries.push_back(chain_entry_reader::read_from_value(entry_array[i], textures, targets, effects, slider_map, param_map)); } } diff --git a/src/osd/modules/render/bgfx/chainreader.h b/src/osd/modules/render/bgfx/chainreader.h index ed584a06105..76c696868cb 100644 --- a/src/osd/modules/render/bgfx/chainreader.h +++ b/src/osd/modules/render/bgfx/chainreader.h @@ -21,7 +21,7 @@ class effect_manager; class chain_reader : public state_reader { public: - static bgfx_chain* read_from_value(const Value& value, running_machine& machine, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t screen_width, uint32_t screen_height); + static bgfx_chain* read_from_value(const Value& value, running_machine& machine, uint32_t window_index, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t screen_width, uint32_t screen_height); private: static void validate_parameters(const Value& value); diff --git a/src/osd/modules/render/bgfx/effect.h b/src/osd/modules/render/bgfx/effect.h index 80fd6fc454f..8c1c3c4f617 100644 --- a/src/osd/modules/render/bgfx/effect.h +++ b/src/osd/modules/render/bgfx/effect.h @@ -26,7 +26,6 @@ public: void submit(int view, uint64_t blend = 0L); bgfx_uniform* uniform(std::string name); - bool has_uniform(std::string name); private: uint64_t m_state; diff --git a/src/osd/modules/render/bgfx/effectmanager.cpp b/src/osd/modules/render/bgfx/effectmanager.cpp index ed10e600a42..f86afc6719a 100644 --- a/src/osd/modules/render/bgfx/effectmanager.cpp +++ b/src/osd/modules/render/bgfx/effectmanager.cpp @@ -46,7 +46,7 @@ bgfx_effect* effect_manager::effect(std::string name) bgfx_effect* effect_manager::load_effect(std::string name) { - std::string path = "bgfx/effects/" + name + ".json"; + std::string path = std::string(m_options.bgfx_path()) + "/effects/" + name + ".json"; bx::CrtFileReader reader; bx::open(&reader, path.c_str()); diff --git a/src/osd/modules/render/bgfx/effectmanager.h b/src/osd/modules/render/bgfx/effectmanager.h index e3d1666d26e..476d00ba62a 100644 --- a/src/osd/modules/render/bgfx/effectmanager.h +++ b/src/osd/modules/render/bgfx/effectmanager.h @@ -25,7 +25,7 @@ class bgfx_effect; class effect_manager { public: - effect_manager(shader_manager& shaders) : m_shaders(shaders) { } + effect_manager(osd_options& options, shader_manager& shaders) : m_options(options), m_shaders(shaders) { } ~effect_manager(); // Getters @@ -34,6 +34,7 @@ public: private: bgfx_effect* load_effect(std::string name); + osd_options& m_options; shader_manager& m_shaders; std::map<std::string, bgfx_effect*> m_effects; }; diff --git a/src/osd/modules/render/bgfx/entryuniformreader.cpp b/src/osd/modules/render/bgfx/entryuniformreader.cpp index 483406fdecc..8bac8399292 100644 --- a/src/osd/modules/render/bgfx/entryuniformreader.cpp +++ b/src/osd/modules/render/bgfx/entryuniformreader.cpp @@ -12,13 +12,17 @@ #include "effect.h" #include "slideruniformreader.h" #include "valueuniformreader.h" +#include "paramuniform.h" #include "uniform.h" -bgfx_entry_uniform* entry_uniform_reader::read_from_value(const Value& value, bgfx_effect* effect, std::map<std::string, bgfx_slider*>& sliders) +bgfx_entry_uniform* entry_uniform_reader::read_from_value(const Value& value, bgfx_effect* effect, std::map<std::string, bgfx_slider*>& sliders, std::map<std::string, bgfx_parameter*>& params) { validate_parameters(value); - bgfx_uniform* uniform = effect->uniform(value["uniform"].GetString()); + std::string name = value["uniform"].GetString(); + bgfx_uniform* uniform = effect->uniform(name); + + assert(uniform != nullptr); if (value.HasMember("slider")) { @@ -28,6 +32,10 @@ bgfx_entry_uniform* entry_uniform_reader::read_from_value(const Value& value, bg { return value_uniform_reader::read_from_value(value, uniform); } + else if (value.HasMember("parameter")) + { + return new bgfx_param_uniform(uniform, params[value["parameter"].GetString()]); + } return nullptr; } diff --git a/src/osd/modules/render/bgfx/entryuniformreader.h b/src/osd/modules/render/bgfx/entryuniformreader.h index a254a3d187c..ae9e5535594 100644 --- a/src/osd/modules/render/bgfx/entryuniformreader.h +++ b/src/osd/modules/render/bgfx/entryuniformreader.h @@ -19,11 +19,12 @@ class bgfx_entry_uniform; class bgfx_slider; class bgfx_effect; +class bgfx_parameter; class entry_uniform_reader : public state_reader { public: - static bgfx_entry_uniform* read_from_value(const Value& value, bgfx_effect* effect, std::map<std::string, bgfx_slider*>& sliders); + static bgfx_entry_uniform* read_from_value(const Value& value, bgfx_effect* effect, std::map<std::string, bgfx_slider*>& sliders, std::map<std::string, bgfx_parameter*>& params); private: static void validate_parameters(const Value& value); diff --git a/src/osd/modules/render/bgfx/frameparameter.cpp b/src/osd/modules/render/bgfx/frameparameter.cpp new file mode 100644 index 00000000000..9febb7ae128 --- /dev/null +++ b/src/osd/modules/render/bgfx/frameparameter.cpp @@ -0,0 +1,26 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// frameparameter.cpp - Frame-based dynamic shader param +// +//============================================================ + +#include "frameparameter.h" + +bgfx_frame_parameter::bgfx_frame_parameter(std::string name, parameter_type type, uint32_t period) + : bgfx_parameter(name, type) + , m_period(period) +{ +} + +float bgfx_frame_parameter::value() +{ + return float(m_current_frame); +} + +void bgfx_frame_parameter::tick(float /*delta*/) +{ + m_current_frame++; + m_current_frame %= m_period; +} diff --git a/src/osd/modules/render/bgfx/frameparameter.h b/src/osd/modules/render/bgfx/frameparameter.h new file mode 100644 index 00000000000..f1ec9d64abc --- /dev/null +++ b/src/osd/modules/render/bgfx/frameparameter.h @@ -0,0 +1,34 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// frameparameter.cpp - Frame-based dynamic shader param +// +//============================================================ + +#pragma once + +#ifndef __DRAWBGFX_FRAME_PARAMETER__ +#define __DRAWBGFX_FRAME_PARAMETER__ + +#include <bgfx/bgfx.h> + +#include <string> + +#include "parameter.h" + +class bgfx_frame_parameter : public bgfx_parameter +{ +public: + bgfx_frame_parameter(std::string name, parameter_type type, uint32_t period); + virtual ~bgfx_frame_parameter() { } + + virtual float value() override; + virtual void tick(float delta) override; + +private: + uint32_t m_current_frame; + uint32_t m_period; +}; + +#endif // __DRAWBGFX_FRAME_PARAMETER__ diff --git a/src/osd/modules/render/bgfx/fs_color.sc b/src/osd/modules/render/bgfx/fs_color.sc new file mode 100644 index 00000000000..8ee80110440 --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_color.sc @@ -0,0 +1,53 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz,ImJezze +//----------------------------------------------------------------------------- +// Color Convolution Effect +//----------------------------------------------------------------------------- + +// NB: intentionally wasteful of uniforms in order for easier slider utilization + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +uniform vec4 u_red_ratios; +uniform vec4 u_grn_ratios; +uniform vec4 u_blu_ratios; +uniform vec4 u_offset; +uniform vec4 u_scale; +uniform vec4 u_saturation; + +#define RedRatios u_red_ratios.xyz +#define GrnRatios u_grn_ratios.xyz +#define BluRatios u_blu_ratios.xyz +#define Offset u_offset.xyz +#define Scale u_scale.xyz +#define Saturation u_saturation.x + +uniform vec4 u_texsize; +uniform vec4 u_screenrect; + +SAMPLER2D(DiffuseSampler, 0); + +void main() +{ + vec4 BaseTexel = texture2D(DiffuseSampler, v_texcoord0); + + vec3 OutRGB = BaseTexel.rgb; + + // RGB Tint & Shift + float ShiftedRed = dot(OutRGB, RedRatios); + float ShiftedGrn = dot(OutRGB, GrnRatios); + float ShiftedBlu = dot(OutRGB, BluRatios); + + // RGB Scale & Offset + vec3 OutTexel = vec3(ShiftedRed, ShiftedGrn, ShiftedBlu) * Scale + Offset; + + // Saturation + vec3 Grayscale = vec3(0.299, 0.587, 0.114); + float OutLuma = dot(OutTexel, Grayscale); + vec3 OutChroma = OutTexel - OutLuma; + vec3 Saturated = OutLuma + OutChroma * Saturation; + + gl_FragColor = vec4(Saturated, BaseTexel.a); +} diff --git a/src/osd/modules/render/bgfx/fs_deconverge.sc b/src/osd/modules/render/bgfx/fs_deconverge.sc new file mode 100644 index 00000000000..343896cec2c --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_deconverge.sc @@ -0,0 +1,21 @@ +$input v_color0, v_texcoord0, v_texcoord1, v_texcoord2 + +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz,ImJezze +//----------------------------------------------------------------------------- +// Deconvergence Effect +//----------------------------------------------------------------------------- + +// NB: intentionally wasteful of uniforms in order for easier slider utilization + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +SAMPLER2D(DiffuseSampler, 0); + +void main() +{ + float r = texture2D(DiffuseSampler, v_texcoord0).r; + float g = texture2D(DiffuseSampler, v_texcoord1).g; + float b = texture2D(DiffuseSampler, v_texcoord2).b; + gl_FragColor = vec4(r, g, b, 1.0) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/fs_ntsc_decode.sc b/src/osd/modules/render/bgfx/fs_ntsc_decode.sc new file mode 100644 index 00000000000..fa40850ff58 --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_ntsc_decode.sc @@ -0,0 +1,135 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz,ImJezze +//----------------------------------------------------------------------------- +// NTSC Decode Effect +//----------------------------------------------------------------------------- + +// NB: intentionally wasteful of uniforms in order for easier slider utilization + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +uniform vec4 u_a_value; +uniform vec4 u_b_value; +uniform vec4 u_cc_value; +uniform vec4 u_o_value; +uniform vec4 u_scan_time; +uniform vec4 u_notch_width; +uniform vec4 u_y_freq_response; +uniform vec4 u_i_freq_response; +uniform vec4 u_q_freq_response; +uniform vec4 u_jitter_amount; +uniform vec4 u_jitter_offset; + +uniform vec4 u_texsize; +uniform vec4 u_screenrect; + +SAMPLER2D(DiffuseSampler, 0); + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +const vec4 PI = vec4(3.1415927, 3.1415927, 3.1415927, 3.1415927); +const vec4 PI2 = vec4(6.2831854, 6.2831854, 6.2831854, 6.2831854); + +const vec4 YDot = vec4(0.299, 0.587, 0.114, 0.0); +const vec4 IDot = vec4(0.595716, -0.274453, -0.321263, 0.0); +const vec4 QDot = vec4(0.211456, -0.522591, 0.311135, 0.0); + +const vec3 RDot = vec3(1.0, 0.956, 0.621); +const vec3 GDot = vec3(1.0, -0.272, -0.647); +const vec3 BDot = vec3(1.0, -1.106, 1.703); + +const vec4 OffsetX = vec4(0.0, 0.25, 0., 0.75); +const vec4 NotchOffset = vec4(0.0, 1.0, 2.0, 3.0); + +void main() +{ + vec4 BaseTexel = texture2D(DiffuseSampler, v_texcoord0.xy); + + vec2 SourceTexelDims = u_texsize.xy; + vec2 SourceRes = (1.0 / u_texsize.xy) * u_screenrect.xy; + + vec4 zero = vec4(0.0, 0.0, 0.0, 0.0); + vec4 quarter = vec4(0.25, 0.25, 0.25, 0.25); + vec4 onehalf = vec4(0.5, 0.5, 0.5, 0.5); + vec4 one = vec4(1.0, 1.0, 1.0, 1.0); + vec4 two = vec4(2.0, 2.0, 2.0, 2.0); + vec4 four = vec4(4.0, 4.0, 4.0, 4.0); + vec4 TimePerSample = u_scan_time.xxxx / (SourceRes.xxxx * four); + + vec4 Fc_y1 = (u_cc_value.xxxx - u_notch_width.xxxx * onehalf) * TimePerSample; + vec4 Fc_y2 = (u_cc_value.xxxx + u_notch_width.xxxx * onehalf) * TimePerSample; + vec4 Fc_y3 = u_y_freq_response.xxxx * TimePerSample; + vec4 Fc_i = u_i_freq_response.xxxx * TimePerSample; + vec4 Fc_q = u_q_freq_response.xxxx * TimePerSample; + vec4 Fc_i_2 = Fc_i * two; + vec4 Fc_q_2 = Fc_q * two; + + vec4 W = PI2 * u_cc_value.xxxx * u_scan_time.xxxx; + vec4 WoPI = W / PI; + + vec4 HOffset = (u_b_value.xxxx + u_jitter_amount.xxxx * u_jitter_offset.xxxx) / WoPI; + vec4 VScale = (u_a_value.xxxx * SourceRes.yyyy) / WoPI; + + vec4 YAccum = zero; + vec4 IAccum = zero; + vec4 QAccum = zero; + + vec4 Cy = v_texcoord0.yyyy; + vec4 VPosition = vec4(Cy / u_screenrect.y); + + vec4 i = zero; + /* for (int i = 0; i < 64; i = i + 4) */ + /* { &*/ + // float n = i - 32.0; + // vec4 n4 = vec4(n, n, n, n) + NotchOffset; + vec4 n4 = i + NotchOffset; + + vec4 Cx = v_texcoord0.xxxx + SourceTexelDims.xxxx * (n4 * quarter); + vec4 HPosition = Cx / u_screenrect.xxxx; + + vec4 C = texture2D(DiffuseSampler, vec2(Cx.x, Cy.x)); + + vec4 T = HPosition + HOffset + VPosition * VScale; + vec4 WT = W * T + u_o_value.xxxx; + + vec4 SincKernel = vec4(0.54, 0.54, 0.54, 0.54) + vec4(0.46, 0.46, 0.46, 0.46) * cos((PI2 / 1.0) * n4); + + vec4 SincYIn1 = Fc_y1 * PI2 * n4; + vec4 SincYIn2 = Fc_y2 * PI2 * n4; + vec4 SincYIn3 = Fc_y3 * PI2 * n4; + vec4 SincIIn = Fc_i * PI2 * n4; + vec4 SincQIn = Fc_q * PI2 * n4; + + vec4 SincY1 = SincYIn1 != zero ? sin(SincYIn1) / SincYIn1 : one; + vec4 SincY2 = SincYIn2 != zero ? sin(SincYIn2) / SincYIn2 : one; + vec4 SincY3 = SincYIn3 != zero ? sin(SincYIn3) / SincYIn3 : one; + + vec4 IdealY = (Fc_y1 * two * SincY1 - Fc_y2 * two * SincY2) + Fc_y3 * two * SincY3; + vec4 IdealI = Fc_i_2 * (SincIIn != zero ? sin(SincIIn) / SincIIn : one); + vec4 IdealQ = Fc_q_2 * (SincQIn != zero ? sin(SincIIn) / SincIIn : one); + + vec4 FilterY = SincKernel * IdealY; + vec4 FilterI = SincKernel * IdealI; + vec4 FilterQ = SincKernel * IdealQ; + + YAccum = YAccum + C * FilterY; + IAccum = IAccum + C * cos(WT) * FilterI; + QAccum = QAccum + C * sin(WT) * FilterQ; + /* } */ + + vec3 YIQ = vec3( + (YAccum.r + YAccum.g + YAccum.b + YAccum.a), + (IAccum.r + IAccum.g + IAccum.b + IAccum.a) * 2.0, + (QAccum.r + QAccum.g + QAccum.b + QAccum.a) * 2.0); + + vec3 RGB = vec3( + dot(YIQ, RDot), + dot(YIQ, GDot), + dot(YIQ, BDot)); + + gl_FragColor = vec4(RGB, BaseTexel.a) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/fs_ntsc_encode.sc b/src/osd/modules/render/bgfx/fs_ntsc_encode.sc new file mode 100644 index 00000000000..5cf8a8ada26 --- /dev/null +++ b/src/osd/modules/render/bgfx/fs_ntsc_encode.sc @@ -0,0 +1,77 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz,ImJezze +//----------------------------------------------------------------------------- +// NTSC Effect +//----------------------------------------------------------------------------- + +// NB: intentionally wasteful of uniforms in order for easier slider utilization + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +uniform vec4 u_a_value; +uniform vec4 u_b_value; +uniform vec4 u_cc_value; +uniform vec4 u_p_value; +uniform vec4 u_scan_time; +uniform vec4 u_jitter_amount; +uniform vec4 u_jitter_offset; + +uniform vec4 u_texsize; +uniform vec4 u_screenrect; + +SAMPLER2D(DiffuseSampler, 0); + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +const vec4 PI = vec4(3.1415927, 3.1415927, 3.1415927, 3.1415927); +const vec4 PI2 = vec4(6.2831854, 6.2831854, 6.2831854, 6.2831854); + +const vec4 YDot = vec4(0.299, 0.587, 0.114, 0.0); +const vec4 IDot = vec4(0.595716, -0.274453, -0.321263, 0.0); +const vec4 QDot = vec4(0.211456, -0.522591, 0.311135, 0.0); + +const vec4 OffsetX = vec4(0.0, 0.25, 0., 0.75); +const vec4 NotchOffset = vec4(0.0, 1.0, 2.0, 3.0); + +void main() +{ + vec2 SourceTexelDims = u_texsize.xy; + vec2 SourceRes = (1.0 / u_texsize.xy) * u_screenrect.xy; + + vec2 PValueSourceTexel = vec2(u_p_value.x, 0.0) * u_texsize.xy; + + vec2 C0 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.x, 0.0); + vec2 C1 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.y, 0.0); + vec2 C2 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.z, 0.0); + vec2 C3 = v_texcoord0 + PValueSourceTexel * vec2(OffsetX.w, 0.0); + vec4 Cx = vec4(C0.x, C1.x, C2.x, C3.x); + vec4 Cy = vec4(C0.y, C1.y, C2.y, C3.y); + vec4 Texel0 = texture2D(DiffuseSampler, C0); + vec4 Texel1 = texture2D(DiffuseSampler, C1); + vec4 Texel2 = texture2D(DiffuseSampler, C2); + vec4 Texel3 = texture2D(DiffuseSampler, C3); + + vec4 HPosition = Cx / u_screenrect.x; + vec4 VPosition = Cy / u_screenrect.y; + + vec4 Y = vec4(dot(Texel0, YDot), dot(Texel1, YDot), dot(Texel2, YDot), dot(Texel3, YDot)); + vec4 I = vec4(dot(Texel0, IDot), dot(Texel1, IDot), dot(Texel2, IDot), dot(Texel3, IDot)); + vec4 Q = vec4(dot(Texel0, QDot), dot(Texel1, QDot), dot(Texel2, QDot), dot(Texel3, QDot)); + + vec4 W = PI2 * u_cc_value.xxxx * u_scan_time.xxxx; + vec4 WoPI = W / PI; + + vec4 HOffset = (u_b_value.xxxx + u_jitter_amount.xxxx * u_jitter_offset.xxxx) / WoPI; + vec4 VScale = (u_a_value.xxxx * SourceRes.yyyy) / WoPI; + + vec4 T = HPosition + HOffset + VPosition * VScale; + vec4 TW = T * W; + + vec4 output_rgb = Y + I * cos(TW) + Q * sin(TW); + + gl_FragColor = vec4(output_rgb.xyz, 1.0); +} diff --git a/src/osd/modules/render/bgfx/inputpair.h b/src/osd/modules/render/bgfx/inputpair.h index eccd9bccb09..f03dfe8200d 100644 --- a/src/osd/modules/render/bgfx/inputpair.h +++ b/src/osd/modules/render/bgfx/inputpair.h @@ -26,6 +26,10 @@ public: void bind(bgfx_effect *effect, texture_manager& textures); + // Getters + std::string sampler() const { return m_sampler; } + std::string texture() const { return m_texture; } + private: int m_index; std::string m_sampler; diff --git a/src/osd/modules/render/bgfx/parameter.cpp b/src/osd/modules/render/bgfx/parameter.cpp deleted file mode 100644 index 004d5fd17f8..00000000000 --- a/src/osd/modules/render/bgfx/parameter.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -//============================================================ -// -// parameter.cpp - BGFX shader parameter -// -// A value that represents some form of parametric -// operation, which can be fed to the input of a BGFX -// shader uniform. -// -//============================================================ - -#include "emu.h" - -// NB: NOT FINISHED! - -#include "parameter.h" - -bgfx_parameter::bgfx_parameter(std::string name, parameter_type type, int period) - : m_name(name) - , m_type(type) - , m_period(period) - , m_frame(0) -{ -} - -bgfx_parameter::~bgfx_parameter() -{ -} - -void bgfx_parameter::frame() -{ - switch(m_type) - { - case PARAM_FRAME_MASK: - m_frame++; - if (m_frame == m_period) - { - m_frame = 0; - } - break; - default: - break; - } -} - -bool bgfx_parameter::active() -{ - switch (m_type) - { - case PARAM_FRAME_MASK: - return (m_frame % m_period == 0); - default: - return false; - } -} diff --git a/src/osd/modules/render/bgfx/parameter.h b/src/osd/modules/render/bgfx/parameter.h index b31b25d8a75..4cfbc5880c8 100644 --- a/src/osd/modules/render/bgfx/parameter.h +++ b/src/osd/modules/render/bgfx/parameter.h @@ -17,27 +17,27 @@ #include <string> -#include "emu.h" - class bgfx_parameter { public: enum parameter_type { - PARAM_FRAME_MASK + PARAM_FRAME, + PARAM_WINDOW }; - bgfx_parameter(std::string name, parameter_type type, int period); - ~bgfx_parameter(); + bgfx_parameter(std::string name, parameter_type type) : m_name(name), m_type(type) { } + virtual ~bgfx_parameter() { } + + virtual void tick(float delta) = 0; - void frame(); - bool active(); + // Getters + virtual float value() = 0; + std::string name() const { return m_name; } -private: - std::string m_name; - parameter_type m_type; - UINT32 m_period; - UINT32 m_frame; +protected: + std::string m_name; + parameter_type m_type; }; #endif // __DRAWBGFX_PARAMETER__ diff --git a/src/osd/modules/render/bgfx/paramreader.cpp b/src/osd/modules/render/bgfx/paramreader.cpp index 786f7d09847..c10d447c190 100644 --- a/src/osd/modules/render/bgfx/paramreader.cpp +++ b/src/osd/modules/render/bgfx/paramreader.cpp @@ -11,20 +11,36 @@ #include "paramreader.h" #include "parameter.h" +#include "frameparameter.h" +#include "windowparameter.h" const parameter_reader::string_to_enum parameter_reader::TYPE_NAMES[parameter_reader::TYPE_COUNT] = { - { "frame_mask", uint64_t(bgfx_parameter::parameter_type::PARAM_FRAME_MASK) } + { "frame", bgfx_parameter::parameter_type::PARAM_FRAME }, + { "window", bgfx_parameter::parameter_type::PARAM_WINDOW } }; -bgfx_parameter* parameter_reader::read_from_value(const Value& value) +bgfx_parameter* parameter_reader::read_from_value(const Value& value, uint32_t window_index) { validate_parameters(value); std::string name = value["name"].GetString(); - bgfx_parameter::parameter_type type = bgfx_parameter::parameter_type(get_enum_from_value(value, "type", uint64_t(bgfx_parameter::parameter_type::PARAM_FRAME_MASK), TYPE_NAMES, TYPE_COUNT)); - int period = int(value["period"].GetDouble()); - - return new bgfx_parameter(name, type, period); + bgfx_parameter::parameter_type type = bgfx_parameter::parameter_type(get_enum_from_value(value, "type", bgfx_parameter::parameter_type::PARAM_FRAME, TYPE_NAMES, TYPE_COUNT)); + + if (type == bgfx_parameter::parameter_type::PARAM_FRAME) + { + uint32_t period = int(value["period"].GetDouble()); + return new bgfx_frame_parameter(name, type, period); + } + else if (type == bgfx_parameter::parameter_type::PARAM_WINDOW) + { + return new bgfx_window_parameter(name, type, window_index); + } + else + { + assert(false); + } + + return nullptr; } void parameter_reader::validate_parameters(const Value& value) diff --git a/src/osd/modules/render/bgfx/paramreader.h b/src/osd/modules/render/bgfx/paramreader.h index 4b31db52528..14ab9cecf02 100644 --- a/src/osd/modules/render/bgfx/paramreader.h +++ b/src/osd/modules/render/bgfx/paramreader.h @@ -18,13 +18,13 @@ class bgfx_parameter; class parameter_reader : public state_reader { public: - static bgfx_parameter* read_from_value(const Value& value); + static bgfx_parameter* read_from_value(const Value& value, uint32_t window_index); private: static void validate_parameters(const Value& value); - static const int TYPE_COUNT = 1; - static const string_to_enum TYPE_NAMES[TYPE_COUNT]; + static const int TYPE_COUNT = 2; + static const string_to_enum TYPE_NAMES[TYPE_COUNT]; }; #endif // __DRAWBGFX_PARAM_READER__ diff --git a/src/osd/modules/render/bgfx/paramuniform.cpp b/src/osd/modules/render/bgfx/paramuniform.cpp new file mode 100644 index 00000000000..c318f2ff01c --- /dev/null +++ b/src/osd/modules/render/bgfx/paramuniform.cpp @@ -0,0 +1,23 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// paramuniform.cpp - BGFX shader chain parametric uniform +// +//============================================================ + +#include "paramuniform.h" + +#include "parameter.h" + +bgfx_param_uniform::bgfx_param_uniform(bgfx_uniform* uniform, bgfx_parameter* param) + : bgfx_entry_uniform(uniform) + , m_param(param) +{ +} + +void bgfx_param_uniform::bind() +{ + float value = m_param->value(); + m_uniform->set(&value, sizeof(float)); +} diff --git a/src/osd/modules/render/bgfx/paramuniform.h b/src/osd/modules/render/bgfx/paramuniform.h new file mode 100644 index 00000000000..b49fb2c7d61 --- /dev/null +++ b/src/osd/modules/render/bgfx/paramuniform.h @@ -0,0 +1,29 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// paramuniform.h - BGFX shader chain parametric uniform +// +//============================================================ + +#pragma once + +#ifndef __DRAWBGFX_PARAM_UNIFORM__ +#define __DRAWBGFX_PARAM_UNIFORM__ + +#include "entryuniform.h" + +class bgfx_parameter; + +class bgfx_param_uniform : public bgfx_entry_uniform +{ +public: + bgfx_param_uniform(bgfx_uniform* uniform, bgfx_parameter* param); + + virtual void bind() override; + +private: + bgfx_parameter* m_param; +}; + +#endif // __DRAWBGFX_PARAM_UNIFORM__ diff --git a/src/osd/modules/render/bgfx/shadermanager.cpp b/src/osd/modules/render/bgfx/shadermanager.cpp index 9a277a2aeae..3d9479a228a 100644 --- a/src/osd/modules/render/bgfx/shadermanager.cpp +++ b/src/osd/modules/render/bgfx/shadermanager.cpp @@ -41,28 +41,32 @@ bgfx::ShaderHandle shader_manager::shader(std::string name) bgfx::ShaderHandle shader_manager::load_shader(std::string name) { - std::string shader_path = "shaders/dx9/"; + std::string shader_path; switch (bgfx::getRendererType()) { + case bgfx::RendererType::Direct3D9: + shader_path = m_options.bgfx_path() + std::string("/shaders/dx9/"); + break; + case bgfx::RendererType::Direct3D11: case bgfx::RendererType::Direct3D12: - shader_path = "shaders/dx11/"; + shader_path = m_options.bgfx_path() + std::string("/shaders/dx11/"); break; case bgfx::RendererType::OpenGL: - shader_path = "shaders/glsl/"; + shader_path = m_options.bgfx_path() + std::string("/shaders/glsl/"); break; case bgfx::RendererType::Metal: - shader_path = "shaders/metal/"; + shader_path = m_options.bgfx_path() + std::string("/shaders/metal/"); break; case bgfx::RendererType::OpenGLES: - shader_path = "shaders/gles/"; + shader_path = m_options.bgfx_path() + std::string("/shaders/gles/"); break; default: - break; + fatalerror("Unknown BGFX renderer type %d", bgfx::getRendererType()); } bgfx::ShaderHandle handle = bgfx::createShader(load_mem(shader_path + name + ".bin")); diff --git a/src/osd/modules/render/bgfx/shadermanager.h b/src/osd/modules/render/bgfx/shadermanager.h index 5cc971ca829..18c95bf6238 100644 --- a/src/osd/modules/render/bgfx/shadermanager.h +++ b/src/osd/modules/render/bgfx/shadermanager.h @@ -14,14 +14,17 @@ #ifndef __DRAWBGFX_SHADER_MANAGER__ #define __DRAWBGFX_SHADER_MANAGER__ +#include <bgfx/bgfx.h> + +#include <modules/lib/osdobj_common.h> + #include <map> #include <string> -#include <bgfx/bgfx.h> class shader_manager { public: - shader_manager() {} + shader_manager(osd_options& options) : m_options(options) { } ~shader_manager(); // Getters @@ -31,7 +34,8 @@ private: bgfx::ShaderHandle load_shader(std::string name); static const bgfx::Memory* load_mem(std::string name); - std::map<std::string, bgfx::ShaderHandle> m_shaders; + std::map<std::string, bgfx::ShaderHandle> m_shaders; + osd_options& m_options; }; #endif // __DRAWBGFX_SHADER_MANAGER__ diff --git a/src/osd/modules/render/bgfx/suppressor.cpp b/src/osd/modules/render/bgfx/suppressor.cpp index eec0efb6440..d29e289ff2a 100644 --- a/src/osd/modules/render/bgfx/suppressor.cpp +++ b/src/osd/modules/render/bgfx/suppressor.cpp @@ -11,9 +11,10 @@ #include "slider.h" -bgfx_suppressor::bgfx_suppressor(std::vector<bgfx_slider*> sliders, uint32_t condition, void* value) +bgfx_suppressor::bgfx_suppressor(std::vector<bgfx_slider*> sliders, uint32_t condition, combine_mode combine, void* value) : m_sliders(sliders) , m_condition(condition) + , m_combine(combine) , m_value(nullptr) { uint32_t size = sliders[0]->size(); diff --git a/src/osd/modules/render/bgfx/suppressor.h b/src/osd/modules/render/bgfx/suppressor.h index a371ed4e9fa..93166eff693 100644 --- a/src/osd/modules/render/bgfx/suppressor.h +++ b/src/osd/modules/render/bgfx/suppressor.h @@ -12,6 +12,8 @@ #ifndef __DRAWBGFX_SUPPRESSOR__ #define __DRAWBGFX_SUPPRESSOR__ +#include <bgfx/bgfx.h> + #include <vector> class bgfx_slider; @@ -27,15 +29,23 @@ public: CONDITION_COUNT }; - bgfx_suppressor(std::vector<bgfx_slider*> sliders, uint32_t condition, void* value); + enum combine_mode { + COMBINE_AND, + COMBINE_OR + }; + + bgfx_suppressor(std::vector<bgfx_slider*> sliders, uint32_t condition, combine_mode combine, void* value); ~bgfx_suppressor(); - bool suppress(); + // Getters + bool suppress(); + combine_mode combine() const { return m_combine; } private: std::vector<bgfx_slider*> m_sliders; uint32_t m_condition; - void* m_value; + combine_mode m_combine; + uint8_t* m_value; }; #endif // __DRAWBGFX_SUPPRESSOR__ diff --git a/src/osd/modules/render/bgfx/suppressorreader.cpp b/src/osd/modules/render/bgfx/suppressorreader.cpp index daa3a55c7c6..b32c7f4bd5d 100644 --- a/src/osd/modules/render/bgfx/suppressorreader.cpp +++ b/src/osd/modules/render/bgfx/suppressorreader.cpp @@ -18,12 +18,18 @@ const suppressor_reader::string_to_enum suppressor_reader::CONDITION_NAMES[suppr { "notequal", bgfx_suppressor::condition_type::CONDITION_NOTEQUAL } }; +const suppressor_reader::string_to_enum suppressor_reader::COMBINE_NAMES[suppressor_reader::COMBINE_COUNT] = { + { "and", bgfx_suppressor::combine_mode::COMBINE_AND }, + { "or", bgfx_suppressor::combine_mode::COMBINE_OR } +}; + bgfx_suppressor* suppressor_reader::read_from_value(const Value& value, std::map<std::string, bgfx_slider*>& sliders) { validate_parameters(value); std::string name = value["name"].GetString(); uint32_t condition = uint32_t(get_enum_from_value(value, "condition", bgfx_suppressor::condition_type::CONDITION_EQUAL, CONDITION_NAMES, CONDITION_COUNT)); + bgfx_suppressor::combine_mode mode = bgfx_suppressor::combine_mode(get_enum_from_value(value, "combine", bgfx_suppressor::combine_mode::COMBINE_OR, COMBINE_NAMES, COMBINE_COUNT)); std::vector<bgfx_slider*> check_sliders; check_sliders.push_back(sliders[name + "0"]); @@ -51,7 +57,7 @@ bgfx_suppressor* suppressor_reader::read_from_value(const Value& value, std::map if (slider_count > 1) { get_values(value, "value", values, slider_count); - for (int index = 0; index < slider_count; index++) + for (int index = 1; index < slider_count; index++) { std::string desc; char full_name[1024]; // arbitrary @@ -64,7 +70,7 @@ bgfx_suppressor* suppressor_reader::read_from_value(const Value& value, std::map values[0] = get_int(value, "value", 0); } - return new bgfx_suppressor(check_sliders, condition, values); + return new bgfx_suppressor(check_sliders, condition, mode, values); } void suppressor_reader::validate_parameters(const Value& value) diff --git a/src/osd/modules/render/bgfx/suppressorreader.h b/src/osd/modules/render/bgfx/suppressorreader.h index ea0e86304b0..bad13d0d0b6 100644 --- a/src/osd/modules/render/bgfx/suppressorreader.h +++ b/src/osd/modules/render/bgfx/suppressorreader.h @@ -31,6 +31,8 @@ private: static const int CONDITION_COUNT = 2; static const string_to_enum CONDITION_NAMES[CONDITION_COUNT]; + static const int COMBINE_COUNT = 2; + static const string_to_enum COMBINE_NAMES[COMBINE_COUNT]; }; #endif // __DRAWBGFX_SUPPRESSOR_READER__ diff --git a/src/osd/modules/render/bgfx/varying.def.sc b/src/osd/modules/render/bgfx/varying.def.sc index 4745725e015..95b607539a7 100644 --- a/src/osd/modules/render/bgfx/varying.def.sc +++ b/src/osd/modules/render/bgfx/varying.def.sc @@ -1,6 +1,8 @@ vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); -vec3 v_pos : TEXCOORD1 = vec3(0.0, 0.0, 0.0); +vec2 v_texcoord1 : TEXCOORD1 = vec2(0.0, 0.0); +vec2 v_texcoord2 : TEXCOORD2 = vec2(0.0, 0.0); +vec3 v_pos : TEXCOORD3 = vec3(0.0, 0.0, 0.0); vec3 a_position : POSITION; vec4 a_color0 : COLOR0; diff --git a/src/osd/modules/render/bgfx/vs_color.sc b/src/osd/modules/render/bgfx/vs_color.sc new file mode 100644 index 00000000000..c3699f6fbd9 --- /dev/null +++ b/src/osd/modules/render/bgfx/vs_color.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_deconverge.sc b/src/osd/modules/render/bgfx/vs_deconverge.sc new file mode 100644 index 00000000000..60603ae8dbe --- /dev/null +++ b/src/osd/modules/render/bgfx/vs_deconverge.sc @@ -0,0 +1,40 @@ +$input a_position, a_texcoord0, a_color0 +$output v_color0, v_texcoord0, v_texcoord1, v_texcoord2 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "../../../../../3rdparty/bgfx/examples/common/common.sh" + +uniform vec4 u_texsize; +uniform vec4 u_screenrect; + +uniform vec4 u_swap_xy; +uniform vec4 u_quad_dims; + +uniform vec4 u_converge_red; +uniform vec4 u_converge_green; +uniform vec4 u_converge_blue; +uniform vec4 u_radial_converge_red; +uniform vec4 u_radial_converge_green; +uniform vec4 u_radial_converge_blue; + +uniform vec4 u_guest_dims; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + + vec2 HalfSourceRect = u_screenrect.xy * 0.5; + + vec2 QuadRatio = vec2(1.0, (u_swap_xy.x > 0.0) ? u_quad_dims.y / u_quad_dims.x : u_quad_dims.x / u_quad_dims.y); + + // radial converge offset to "translate" the most outer pixel as thay would be translated by the linar converge with the same amount + vec2 radialConvergeOffset = 2.0 * u_screenrect.xy; + + v_texcoord0 = (a_texcoord0 - HalfSourceRect) * (1.0 + u_radial_converge_red.xy * radialConvergeOffset) + HalfSourceRect + u_converge_red.xy * u_guest_dims.xy; + v_texcoord1 = (a_texcoord0 - HalfSourceRect) * (1.0 + u_radial_converge_green.xy * radialConvergeOffset) + HalfSourceRect + u_converge_green.xy * u_guest_dims.xy; + v_texcoord2 = (a_texcoord0 - HalfSourceRect) * (1.0 + u_radial_converge_blue.xy * radialConvergeOffset) + HalfSourceRect + u_converge_blue.xy * u_guest_dims.xy; + + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/vs_ntsc_decode.sc b/src/osd/modules/render/bgfx/vs_ntsc_decode.sc new file mode 100644 index 00000000000..c3699f6fbd9 --- /dev/null +++ b/src/osd/modules/render/bgfx/vs_ntsc_decode.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_ntsc_encode.sc b/src/osd/modules/render/bgfx/vs_ntsc_encode.sc new file mode 100644 index 00000000000..c3699f6fbd9 --- /dev/null +++ b/src/osd/modules/render/bgfx/vs_ntsc_encode.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/windowparameter.h b/src/osd/modules/render/bgfx/windowparameter.h new file mode 100644 index 00000000000..f4763647c32 --- /dev/null +++ b/src/osd/modules/render/bgfx/windowparameter.h @@ -0,0 +1,33 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// windowparameter.h - Static window-index shader param +// +//============================================================ + +#pragma once + +#ifndef __DRAWBGFX_WINDOW_PARAMETER__ +#define __DRAWBGFX_WINDOW_PARAMETER__ + +#include <bgfx/bgfx.h> + +#include <string> + +#include "parameter.h" + +class bgfx_window_parameter : public bgfx_parameter +{ +public: + bgfx_window_parameter(std::string name, parameter_type type, uint32_t index) : bgfx_parameter(name, type), m_index(index) { } + virtual ~bgfx_window_parameter() { } + + virtual float value() override { return float(m_index); } + virtual void tick(float delta) override { }; + +private: + uint32_t m_index; +}; + +#endif // __DRAWBGFX_WINDOW_PARAMETER__ diff --git a/src/osd/modules/render/d3d/d3dcomm.h b/src/osd/modules/render/d3d/d3dcomm.h index 4894cd7f491..28e79725cf5 100644 --- a/src/osd/modules/render/d3d/d3dcomm.h +++ b/src/osd/modules/render/d3d/d3dcomm.h @@ -112,34 +112,34 @@ public: render_texinfo & get_texinfo() { return m_texinfo; } - int get_width() { return m_rawdims.c.x; } - int get_height() { return m_rawdims.c.y; } - int get_xscale() { return m_xprescale; } - int get_yscale() { return m_yprescale; } + int get_width() const { return m_rawdims.c.x; } + int get_height() const { return m_rawdims.c.y; } + int get_xscale() const { return m_xprescale; } + int get_yscale() const { return m_yprescale; } - UINT32 get_flags() { return m_flags; } + UINT32 get_flags() const { return m_flags; } void set_data(const render_texinfo *texsource, UINT32 flags); - texture_info * get_next() { return m_next; } - texture_info * get_prev() { return m_prev; } + texture_info * get_next() const { return m_next; } + texture_info * get_prev() const { return m_prev; } - UINT32 get_hash() { return m_hash; } + UINT32 get_hash() const { return m_hash; } void set_next(texture_info *next) { m_next = next; } void set_prev(texture_info *prev) { m_prev = prev; } - bool paused() { return m_cur_frame == m_prev_frame; } + bool paused() const { return m_cur_frame == m_prev_frame; } void advance_frame() { m_prev_frame = m_cur_frame; } void increment_frame_count() { m_cur_frame++; } void mask_frame_count(int mask) { m_cur_frame %= mask; } - int get_cur_frame() { return m_cur_frame; } - int get_prev_frame() { return m_prev_frame; } + int get_cur_frame() const { return m_cur_frame; } + int get_prev_frame() const { return m_prev_frame; } - texture * get_tex() { return m_d3dtex; } - surface * get_surface() { return m_d3dsurface; } - texture * get_finaltex() { return m_d3dfinaltex; } + texture * get_tex() const { return m_d3dtex; } + surface * get_surface() const { return m_d3dsurface; } + texture * get_finaltex() const { return m_d3dfinaltex; } vec2f & get_uvstart() { return m_start; } vec2f & get_uvstop() { return m_stop; } @@ -187,19 +187,20 @@ public: float line_time, float line_length, float prim_width, float prim_height); - D3DPRIMITIVETYPE get_type() { return m_type; } - UINT32 get_count() { return m_count; } - UINT32 get_vertcount() { return m_numverts; } - UINT32 get_flags() { return m_flags; } + // TODO: Remove needless 'get_' prefix + D3DPRIMITIVETYPE get_type() const { return m_type; } + UINT32 get_count() const { return m_count; } + UINT32 get_vertcount() const { return m_numverts; } + UINT32 get_flags() const { return m_flags; } - texture_info * get_texture() { return m_texture; } - DWORD get_modmode() { return m_modmode; } + texture_info * get_texture() const { return m_texture; } + DWORD get_modmode() const { return m_modmode; } - float get_line_time() { return m_line_time; } - float get_line_length() { return m_line_length; } + float get_line_time() const { return m_line_time; } + float get_line_length() const { return m_line_length; } - float get_prim_width() { return m_prim_width; } - float get_prim_height() { return m_prim_height; } + float get_prim_width() const { return m_prim_width; } + float get_prim_height() const { return m_prim_height; } private: diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 6b64a239317..76ae3dd800b 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -135,10 +135,12 @@ int renderer_bgfx::create() m_dimensions = osd_dim(m_width[0], m_height[0]); } + osd_options& options = downcast<osd_options &>(window().machine().options()); m_textures = new texture_manager(); m_targets = new target_manager(*m_textures); - m_shaders = new shader_manager(); - m_effects = new effect_manager(*m_shaders); + + m_shaders = new shader_manager(options); + m_effects = new effect_manager(options, *m_shaders); if (window().m_index != 0) { @@ -162,8 +164,8 @@ int renderer_bgfx::create() m_screen_effect[3] = m_effects->effect("screen_add"); #if USE_NEW_SHADERS - m_chains = new chain_manager(*m_textures, *m_targets, *m_effects, m_width[window().m_index], m_height[window().m_index]); - m_screen_chain = m_chains->chain("test", window().machine()); + m_chains = new chain_manager(options, *m_textures, *m_targets, *m_effects, m_width[window().m_index], m_height[window().m_index]); + m_screen_chain = m_chains->chain(options.bgfx_screen_chain(), window().machine(), window().m_index); m_sliders_dirty = true; #endif @@ -852,12 +854,10 @@ const bgfx::Memory* renderer_bgfx::mame_texture_data_to_bgfx_texture_data(UINT32 int renderer_bgfx::handle_screen_chains() { - int index = window().m_index; - window().m_primlist->acquire_lock(); - + int view = 0; - + // process render_primitive *prim = window().m_primlist->first(); while (prim != nullptr) diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp index 1171775d042..cc413d79da0 100644 --- a/src/osd/windows/winmain.cpp +++ b/src/osd/windows/winmain.cpp @@ -279,7 +279,7 @@ const options_entry windows_options::s_option_entries[] = { nullptr, nullptr, OPTION_HEADER, "DIRECTDRAW-SPECIFIC OPTIONS" }, { WINOPTION_HWSTRETCH ";hws", "1", OPTION_BOOLEAN, "enables hardware stretching" }, - // post-processing options + // D3D post-processing options { nullptr, nullptr, OPTION_HEADER, "DIRECT3D POST-PROCESSING OPTIONS" }, { WINOPTION_HLSL_ENABLE";hlsl", "0", OPTION_BOOLEAN, "enables HLSL post-processing (PS3.0 required)" }, { WINOPTION_HLSLPATH, "hlsl", OPTION_STRING, "path to hlsl files" }, |