diff --git a/bgfx/chains/test.json b/bgfx/chains/test.json new file mode 100644 index 00000000000..0026802d2aa --- /dev/null +++ b/bgfx/chains/test.json @@ -0,0 +1,98 @@ +{ "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 }, + + { "type": "color", "name": "red_ratios", "text": "Red Amount", "default": [ 1, 0, 0 ]}, + { "type": "color", "name": "grn_ratios", "text": "Green Amount", "default": [ 0, 1, 0 ], "max": 1, "min": 0 }, + { "type": "color", "name": "blu_ratios", "text": "Blue Amount", "default": [ 0, 0, 1 ], "max": 1, "min": 0 }, + { "type": "color", "name": "tint": "text": "Tint", "default": [ 1, 1, 1 ], "max": 1, "min": 0 } + { "type": "color", "name": "phosphor", "text": "Phosphor Amount", "default": [ 0, 0, 0 ], "max": 1, "min": 0 }, + { "type": "vec2", "name": "shift", "text": "Frame Shift", "default": [ 0, 0 ], "max": 25, "min": -25 }, + ] + "parameters": [ + { "name": "alternating", "type": "frame_mask", "period": 2 } + ] + "targets": [ + { "name": "native", + "screen": true, + }, + { "name": "previous", + "screen": true, + "prescale": true + } + ] + "passes": [ + { "effect": "ratios", + "name": "Matrix Pass" + "disable_conditions": [ + { "type": "slider", "name": "adjustments", "value": false }, + { "type": "slider", "name": "ratio_amount", "value": 0 } + ], + "uniforms": [ + { "name": "u_ratio_amount", "slider": "ratio_amount" }, + { "name": "u_red_ratios", "slider": "red_ratios" }, + { "name": "u_grn_ratios", "slider": "grn_ratios" }, + { "name": "u_blu_ratios", "slider": "blu_ratios" } + ], + "input": [ + { "sampler": "s_tex", "texture": "screen" } + ], + "output": "native" + }, + { "effect": "tint", + "name": "Tint Pass" + "disable_conditions": [ + { "type": "slider", "name": "adjustments", "value": false } + ], + "uniforms": [ + { "name": "u_tint", "slider": "tint" }, + { "name": "u_shift", "slider": "shift" } + ], + "input": [ + { "sampler": "s_tex", "texture": "native" } + ], + "output": "native" + }, + { "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_phosphor", "slider": "phosphor" } + ], + "input": [ + { "sampler": "s_tex", "texture": "native" }, + { "sampler": "s_prev", "texture": "previous" } + ], + "output": "native" + }, + { "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_phosphor", "slider": "phosphor" } + ], + "input": [ + { "sampler": "s_tex", "texture": "native" }, + { "sampler": "s_prev", "texture": "native" } + ], + "output": "previous" + }, + { "effect": "blit" + "name": "Final Blit", + "input": [ + { "sampler": "s_tex", "texture": "native" } + ], + "output": "backbuffer" + } + ] +} \ No newline at end of file diff --git a/scripts/src/osd/modules.lua b/scripts/src/osd/modules.lua index 3e18ee72050..bba8678ef9c 100644 --- a/scripts/src/osd/modules.lua +++ b/scripts/src/osd/modules.lua @@ -109,8 +109,9 @@ function osdmodulesbuild() MAME_DIR .. "src/osd/modules/render/bgfx/effect.cpp", MAME_DIR .. "src/osd/modules/render/bgfx/effectmanager.cpp", MAME_DIR .. "src/osd/modules/render/bgfx/effectreader.cpp", - MAME_DIR .. "src/osd/modules/render/bgfx/pass.cpp", - MAME_DIR .. "src/osd/modules/render/bgfx/passreader.cpp", + MAME_DIR .. "src/osd/modules/render/bgfx/chainentry.cpp", + MAME_DIR .. "src/osd/modules/render/bgfx/chainentryreader.cpp", + MAME_DIR .. "src/osd/modules/render/bgfx/inputpair.cpp", MAME_DIR .. "src/osd/modules/render/bgfx/shadermanager.cpp", MAME_DIR .. "src/osd/modules/render/bgfx/statereader.cpp", MAME_DIR .. "src/osd/modules/render/bgfx/target.cpp", diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h index 69f3675d4d0..10cbec5674f 100644 --- a/src/osd/modules/osdwindow.h +++ b/src/osd/modules/osdwindow.h @@ -10,6 +10,7 @@ #define __OSDWINDOW__ #include "emu.h" +#include "ui/ui.h" //============================================================ // TYPE DEFINITIONS @@ -221,6 +222,7 @@ public: virtual int init(running_machine &machine) = 0; virtual render_primitive_list *get_primitives() = 0; + virtual slider_state* get_slider_list() { return nullptr; } virtual int draw(const int update) = 0; virtual int xy_to_render_target(const int x, const int y, int *xt, int *yt) { return 0; }; virtual void save() { }; diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp new file mode 100644 index 00000000000..7121d88cbe6 --- /dev/null +++ b/src/osd/modules/render/bgfx/chainentry.cpp @@ -0,0 +1,33 @@ +#include "emu.h" + +#include + +#include "effect.h" +#include "texture.h" +#include "target.h" +#include "chainentry.h" + +bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, std::vector& inputs, bgfx_target* output) + : m_name(name) + , m_effect(effect) + , m_output(output) +{ + for (bgfx_input_pair input : inputs) + { + m_inputs.push_back(input); + } +} + +bgfx_chain_entry::~bgfx_chain_entry() +{ +} + +void bgfx_chain_entry::submit(render_primitive* prim, int view) +{ + for (bgfx_input_pair input : m_inputs) + { + input.bind(m_effect); + } + bgfx::setViewFrameBuffer(view, m_output->target()); + m_effect->submit(view); +} diff --git a/src/osd/modules/render/bgfx/chainentry.h b/src/osd/modules/render/bgfx/chainentry.h new file mode 100644 index 00000000000..1428ab8a6b2 --- /dev/null +++ b/src/osd/modules/render/bgfx/chainentry.h @@ -0,0 +1,34 @@ +#pragma once + +#ifndef __DRAWBGFX_CHAIN_ENTRY__ +#define __DRAWBGFX_CHAIN_ENTRY__ + +#include +#include + +#include "inputpair.h" + +class render_primitive; +class bgfx_effect; +class bgfx_texture; +class bgfx_target; + +class bgfx_chain_entry +{ +public: + bgfx_chain_entry(std::string name, bgfx_effect* effect, std::vector& inputs, bgfx_target* output); + ~bgfx_chain_entry(); + + void submit(render_primitive* prim, int view); + + // Getters + std::string name() const { return m_name; } + +private: + std::string m_name; + bgfx_effect* m_effect; + std::vector m_inputs; + bgfx_target* m_output; +}; + +#endif // __DRAWBGFX_CHAIN_ENTRY__ \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/chainentryreader.cpp b/src/osd/modules/render/bgfx/chainentryreader.cpp new file mode 100644 index 00000000000..a778e6bdbee --- /dev/null +++ b/src/osd/modules/render/bgfx/chainentryreader.cpp @@ -0,0 +1,48 @@ +#include + +#include "emu.h" + +#include "chainentryreader.h" + +#include "texturemanager.h" +#include "targetmanager.h" +#include "effectmanager.h" +#include "chainentry.h" +#include "inputpair.h" + +bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects) +{ + validate_parameters(value); + + bgfx_effect* effect = effects.effect(value["effect"].GetString()); + + std::vector inputs; + if (value.HasMember("input")) + { + const Value& input_array = value["input"]; + for (UINT32 i = 0; i < input_array.Size(); i++) + { + std::string sampler = input_array[i]["sampler"].GetString(); + std::string texture = input_array[i]["texture"].GetString(); + inputs.push_back(bgfx_input_pair(i, sampler, textures.texture(texture))); + } + } + + bgfx_target* output = targets.target(value["output"].GetString()); + + return new bgfx_chain_entry(value["name"].GetString(), effect, inputs, output); +} + +void chain_entry_reader::validate_parameters(const Value& value) +{ + assert(value.HasMember("effect")); + assert(value["effect"].IsString()); + if (value.HasMember("name")) + { + assert(value["name"].IsString()); + } + assert(value.HasMember("shader")); + assert(value["shader"].IsString()); + assert(value.HasMember("output")); + assert(value["output"].IsString()); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/chainentryreader.h b/src/osd/modules/render/bgfx/chainentryreader.h new file mode 100644 index 00000000000..52517365004 --- /dev/null +++ b/src/osd/modules/render/bgfx/chainentryreader.h @@ -0,0 +1,22 @@ +#pragma once + +#ifndef __DRAWBGFX_CHAIN_ENTRY_READER__ +#define __DRAWBGFX_CHAIN_ENTRY_READER__ + +#include "statereader.h" + +class bgfx_chain_entry; +class texture_manager; +class target_manager; +class effect_manager; + +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); + +private: + static void validate_parameters(const Value& value); +}; + +#endif // __DRAWBGFX_CHAIN_ENTRY_READER__ \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/inputpair.cpp b/src/osd/modules/render/bgfx/inputpair.cpp new file mode 100644 index 00000000000..0077180c0de --- /dev/null +++ b/src/osd/modules/render/bgfx/inputpair.cpp @@ -0,0 +1,15 @@ +#include "inputpair.h" +#include "texture.h" +#include "effect.h" + +bgfx_input_pair::bgfx_input_pair(int index, std::string sampler, bgfx_texture* texture) + : m_index(index) + , m_sampler(sampler) + , m_texture(texture) +{ +} + +void bgfx_input_pair::bind(bgfx_effect *effect) +{ + bgfx::setTexture(m_index, effect->uniform(m_sampler)->handle(), m_texture->handle()); +} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/inputpair.h b/src/osd/modules/render/bgfx/inputpair.h new file mode 100644 index 00000000000..74aedc11d0d --- /dev/null +++ b/src/osd/modules/render/bgfx/inputpair.h @@ -0,0 +1,26 @@ +#pragma once + +#ifndef __DRAWBGFX_INPUT_PAIR__ +#define __DRAWBGFX_INPUT_PAIR__ + +#include + +#include + +class bgfx_effect; +class bgfx_texture; + +class bgfx_input_pair +{ +public: + bgfx_input_pair(int index, std::string sampler, bgfx_texture* texture); + + void bind(bgfx_effect *effect); + +private: + int m_index; + std::string m_sampler; + bgfx_texture* m_texture; +}; + +#endif // __DRAWBGFX_INPUT_PAIR__ \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/pass.cpp b/src/osd/modules/render/bgfx/pass.cpp deleted file mode 100644 index 246399eeebd..00000000000 --- a/src/osd/modules/render/bgfx/pass.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "emu.h" - -#include - -#include "effect.h" -#include "texture.h" -#include "target.h" -#include "pass.h" - -bgfx_pass::bgfx_pass(std::string name, bgfx_effect* effect, std::vector& inputs, bgfx_target* output) - : m_name(name) - , m_effect(effect) - , m_output(output) -{ - for (bgfx_texture* input : inputs) - { - m_inputs.push_back(input); - } -} - -bgfx_pass::~bgfx_pass() -{ -} - -void bgfx_pass::submit(render_primitive* prim, int view) -{ - for (int index = 0; index < m_inputs.size(); index++) - { - bgfx::setTexture(index, m_effect->uniform(m_inputs[index]->name())->handle(), m_inputs[index]->handle()); - } - bgfx::setViewFrameBuffer(view, m_output->target()); - m_effect->submit(view); -} diff --git a/src/osd/modules/render/bgfx/pass.h b/src/osd/modules/render/bgfx/pass.h deleted file mode 100644 index 30c0b88a991..00000000000 --- a/src/osd/modules/render/bgfx/pass.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#ifndef __DRAWBGFX_PASS__ -#define __DRAWBGFX_PASS__ - -#include -#include - -class render_primitive; -class bgfx_effect; -class bgfx_texture; -class bgfx_target; - -class bgfx_pass -{ -public: - bgfx_pass(std::string name, bgfx_effect* effect, std::vector& inputs, bgfx_target* output); - ~bgfx_pass(); - - void submit(render_primitive* prim, int view); - - // Getters - std::string name() const { return m_name; } - -private: - std::string m_name; - bgfx_effect* m_effect; - std::vector m_inputs; - bgfx_target* m_output; -}; - -#endif // __DRAWBGFX_PASS__ \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/passreader.cpp b/src/osd/modules/render/bgfx/passreader.cpp deleted file mode 100644 index 723a3f1f3f3..00000000000 --- a/src/osd/modules/render/bgfx/passreader.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include - -#include "emu.h" - -#include "passreader.h" - -#include "texturemanager.h" -#include "targetmanager.h" -#include "effectmanager.h" -#include "pass.h" - -bgfx_pass* pass_reader::read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects) -{ - validate_parameters(value); - - bgfx_effect* effect = effects.effect(value["effect"].GetString()); - - std::vector inputs; - if (value.HasMember("input")) - { - const Value& input_array = value["input"]; - for (UINT32 i = 0; i < input_array.Size(); i++) - { - inputs.push_back(textures.texture(input_array[i].GetString())); - } - } - - bgfx_target* output = targets.target(value["output"].GetString()); - - return new bgfx_pass(value["name"].GetString(), effect, inputs, output); -} - -void pass_reader::validate_parameters(const Value& value) -{ - assert(value.HasMember("name")); - assert(value["name"].IsString()); - assert(value.HasMember("output")); - assert(value["output"].IsString()); - assert(value.HasMember("effect")); - assert(value["effect"].IsString()); - if (value.HasMember("input")) - { - const Value& input_array = value["input"]; - for (int i = 0; i < input_array.Size(); i++) - { - assert(uniform_array[i].IsString()); - } - } -} \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/passreader.h b/src/osd/modules/render/bgfx/passreader.h deleted file mode 100644 index dfda1323eac..00000000000 --- a/src/osd/modules/render/bgfx/passreader.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#ifndef __DRAWBGFX_PASS_READER__ -#define __DRAWBGFX_PASS_READER__ - -#include "statereader.h" - -class bgfx_pass; -class texture_manager; -class target_manager; -class effect_manager; - -class pass_reader : public state_reader -{ -public: - static bgfx_pass* read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects); - -private: - static void validate_parameters(const Value& value); -}; - -#endif // __DRAWBGFX_PASS_READER__ \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/slider.h b/src/osd/modules/render/bgfx/slider.h new file mode 100644 index 00000000000..d0bcc97aaf0 --- /dev/null +++ b/src/osd/modules/render/bgfx/slider.h @@ -0,0 +1,40 @@ +#pragma once + +#ifndef __DRAWBGFX_SLIDER__ +#define __DRAWBGFX_SLIDER__ + +#include + +#include +#include +#include + +#include "uniform.h" + +class bgfx_slider +{ +public: + bgfx_slider(slider_type type, std::string name, std::string description, void *defaults, void *min, void *max); + ~bgfx_slider(); + + enum slider_type + { + SLIDER_BOOL, + SLIDER_FLOAT, + SLIDER_INT, + SLIDER_COLOR, + SLIDER_VEC2 + }; + + // Getters + bgfx_uniform* uniform(std::string name); + bgfx::ProgramHandle get_program() const { return m_program_handle; } + +protected: + std::string m_name; + void * m_data; + void * m_min; + void * m_max; +}; + +#endif // __DRAWBGFX_SLIDER__ \ No newline at end of file diff --git a/src/osd/modules/render/bgfx/sliderreader.h b/src/osd/modules/render/bgfx/sliderreader.h new file mode 100644 index 00000000000..c7e8c315dfe --- /dev/null +++ b/src/osd/modules/render/bgfx/sliderreader.h @@ -0,0 +1,20 @@ +#pragma once + +#ifndef __DRAWBGFX_SLIDER_READER__ +#define __DRAWBGFX_SLIDER_READER__ + +#include "statereader.h" + +class bgfx_slider; +class shader_manager; + +class slider_reader : public state_reader +{ +public: + static bgfx_slider* read_from_value(const Value& value); + +private: + static void validate_parameters(const Value& value); +}; + +#endif // __DRAWBGFX_SLIDER_READER__ \ No newline at end of file diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 621db1a46ff..d7db252180c 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -3525,7 +3525,7 @@ ULONG effect::release() // get_slider_list //============================================================ -slider_state *windows_osd_interface::get_slider_list() +slider_state *renderer_d3d9::get_slider_list() { return g_slider_list; } diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 73c4b336434..8ae5f7933c6 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -124,15 +124,24 @@ int renderer_bgfx::create() m_effects = new effect_manager(*m_shaders); // Create program from shaders. + printf("1\n"); fflush(stdout); m_gui_effect[0] = m_effects->effect("gui_opaque"); + printf("2\n"); fflush(stdout); m_gui_effect[1] = m_effects->effect("gui_blend"); + printf("3\n"); fflush(stdout); m_gui_effect[2] = m_effects->effect("gui_multiply"); + printf("4\n"); fflush(stdout); m_gui_effect[3] = m_effects->effect("gui_add"); + printf("5\n"); fflush(stdout); m_screen_effect[0] = m_effects->effect("screen_opaque"); + printf("6\n"); fflush(stdout); m_screen_effect[1] = m_effects->effect("screen_blend"); + printf("7\n"); fflush(stdout); m_screen_effect[2] = m_effects->effect("screen_multiply"); + printf("8\n"); fflush(stdout); m_screen_effect[3] = m_effects->effect("screen_add"); + printf("9\n"); fflush(stdout); 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); @@ -1078,3 +1087,8 @@ void renderer_bgfx::allocate_buffer(render_primitive *prim, UINT32 blend, bgfx:: bgfx::allocTransientVertexBuffer(buffer, vertices, ScreenVertex::ms_decl); } } + +slider_state* renderer_bgfx::get_slider_list() +{ + return nullptr; +} \ No newline at end of file diff --git a/src/osd/modules/render/drawbgfx.h b/src/osd/modules/render/drawbgfx.h index 67064b686f8..524d7ab41ae 100644 --- a/src/osd/modules/render/drawbgfx.h +++ b/src/osd/modules/render/drawbgfx.h @@ -28,6 +28,7 @@ public: virtual ~renderer_bgfx(); virtual int create() override; + virtual slider_state* get_slider_list() override; virtual int init(running_machine &machine) override { return 0; } virtual int draw(const int update) override; #ifdef OSD_SDL diff --git a/src/osd/modules/render/drawd3d.h b/src/osd/modules/render/drawd3d.h index ac7195db8d7..8ddb8acef54 100644 --- a/src/osd/modules/render/drawd3d.h +++ b/src/osd/modules/render/drawd3d.h @@ -42,6 +42,7 @@ public: virtual ~renderer_d3d9(); virtual int create() override; + virtual slider_state* get_slider_list() override; virtual int init(running_machine &machine) override; virtual render_primitive_list *get_primitives() override; virtual int draw(const int update) override; diff --git a/src/osd/windows/video.cpp b/src/osd/windows/video.cpp index c814310fb29..44106621816 100644 --- a/src/osd/windows/video.cpp +++ b/src/osd/windows/video.cpp @@ -12,6 +12,7 @@ // MAME headers #include "emu.h" +#include "ui/ui.h" #include "emuopts.h" #include "render.h" #include "uiinput.h" @@ -66,8 +67,6 @@ static osd_window_config windows[MAX_WINDOWS]; // configuration data pe bool windows_osd_interface::video_init() { - int index; - // extract data from the options extract_video_config(); @@ -79,14 +78,47 @@ bool windows_osd_interface::video_init() // create the windows windows_options &options = downcast(machine().options()); - for (index = 0; index < video_config.numscreens; index++) + for (int index = 0; index < video_config.numscreens; index++) + { win_window_info::create(machine(), index, osd_monitor_info::pick_monitor(options, index), &windows[index]); + } + + m_sliders = nullptr; + slider_state *curr = m_sliders; + for (win_window_info *info = win_window_list; info != nullptr; info = info->m_next) + { + slider_state *window_sliders = info->m_renderer->get_slider_list(); + if (window_sliders != nullptr) + { + if (m_sliders == nullptr) + { + m_sliders = curr = window_sliders; + } + else + { + while (curr->next != nullptr) + { + curr = curr->next; + } + curr->next = window_sliders; + } + } + } + if (video_config.mode != VIDEO_MODE_NONE) SetForegroundWindow(win_window_list->m_hwnd); return true; } +//============================================================ +// get_slider_list +//============================================================ + +slider_state *windows_osd_interface::get_slider_list() +{ + return m_sliders; +} //============================================================ // video_exit diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp index cfa0a4fb0b7..5a00fe13706 100644 --- a/src/osd/windows/winmain.cpp +++ b/src/osd/windows/winmain.cpp @@ -58,15 +58,15 @@ class dynamic_bind public: // constructor which looks up the function dynamic_bind(const TCHAR *dll, const char *symbol) - : m_function(NULL) + : m_function(nullptr) { HMODULE module = LoadLibrary(dll); - if (module != NULL) + if (module != nullptr) m_function = reinterpret_cast<_FunctionPtr>(GetProcAddress(module, symbol)); } - // bool to test if the function is NULL or not - operator bool() const { return (m_function != NULL); } + // bool to test if the function is nullptr or not + operator bool() const { return (m_function != nullptr); } // dereference to get the underlying pointer _FunctionPtr operator *() const { return m_function; } @@ -132,14 +132,14 @@ private: bool parse_sym_line(const char *line, FPTR &address, std::string &symbol); bool parse_map_line(const char *line, FPTR &address, std::string &symbol); void scan_cache_for_address(FPTR address); - void format_symbol(const char *name, UINT32 displacement, const char *filename = NULL, int linenumber = 0); + void format_symbol(const char *name, UINT32 displacement, const char *filename = nullptr, int linenumber = 0); static FPTR get_text_section_base(); struct cache_entry { cache_entry(FPTR address, const char *symbol) : - m_next(NULL), m_address(address), m_name(symbol) { } + m_next(nullptr), m_address(address), m_name(symbol) { } cache_entry *next() const { return m_next; } cache_entry * m_next; @@ -206,11 +206,11 @@ public: char buffer[1024]; // if we are in fullscreen mode, go to windowed mode - if ((video_config.windowed == 0) && (win_window_list != NULL)) + if ((video_config.windowed == 0) && (win_window_list != nullptr)) winwindow_toggle_full_screen(); vsnprintf(buffer, ARRAY_LENGTH(buffer), msg, args); - win_message_box_utf8(win_window_list ? win_window_list->m_hwnd : NULL, buffer, emulator_info::get_appname(), MB_OK); + win_message_box_utf8(win_window_list ? win_window_list->m_hwnd : nullptr, buffer, emulator_info::get_appname(), MB_OK); } else chain_output(channel, msg, args); @@ -242,8 +242,8 @@ static running_machine *g_current_machine; static int timeresult = !TIMERR_NOERROR; static TIMECAPS timecaps; -static sampling_profiler *profiler = NULL; -static symbol_manager *symbols = NULL; +static sampling_profiler *profiler = nullptr; +static symbol_manager *symbols = nullptr; bool stack_walker::s_initialized = false; @@ -267,25 +267,25 @@ static LONG WINAPI exception_filter(struct _EXCEPTION_POINTERS *info); const options_entry windows_options::s_option_entries[] = { // performance options - { NULL, NULL, OPTION_HEADER, "WINDOWS PERFORMANCE OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "WINDOWS PERFORMANCE OPTIONS" }, { WINOPTION_PRIORITY "(-15-1)", "0", OPTION_INTEGER, "thread priority for the main game thread; range from -15 to 1" }, { WINOPTION_PROFILE, "0", OPTION_INTEGER, "enables profiling, specifying the stack depth to track" }, // video options - { NULL, NULL, OPTION_HEADER, "WINDOWS VIDEO OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "WINDOWS VIDEO OPTIONS" }, { WINOPTION_MENU, "0", OPTION_BOOLEAN, "enables menu bar if available by UI implementation" }, // DirectDraw-specific options - { NULL, NULL, OPTION_HEADER, "DIRECTDRAW-SPECIFIC OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "DIRECTDRAW-SPECIFIC OPTIONS" }, { WINOPTION_HWSTRETCH ";hws", "1", OPTION_BOOLEAN, "enables hardware stretching" }, // post-processing options - { NULL, NULL, 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" }, - { WINOPTION_HLSL_PRESCALE_X, "0", OPTION_INTEGER, "HLSL pre-scale override factor for X (0 for auto)" }, - { WINOPTION_HLSL_PRESCALE_Y, "0", OPTION_INTEGER, "HLSL pre-scale override factor for Y (0 for auto)" }, - { WINOPTION_HLSL_WRITE, NULL, OPTION_STRING, "enables HLSL AVI writing (huge disk bandwidth suggested)" }, + { 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" }, + { WINOPTION_HLSL_PRESCALE_X, "0", OPTION_INTEGER, "HLSL pre-scale override factor for X (0 for auto)" }, + { WINOPTION_HLSL_PRESCALE_Y, "0", OPTION_INTEGER, "HLSL pre-scale override factor for Y (0 for auto)" }, + { WINOPTION_HLSL_WRITE, nullptr, OPTION_STRING, "enables HLSL AVI writing (huge disk bandwidth suggested)" }, { WINOPTION_HLSL_SNAP_WIDTH, "2048", OPTION_STRING, "HLSL upscaled-snapshot width" }, { WINOPTION_HLSL_SNAP_HEIGHT, "1536", OPTION_STRING, "HLSL upscaled-snapshot height" }, { WINOPTION_SHADOW_MASK_TILE_MODE, "0", OPTION_INTEGER, "shadow mask tile mode (0 for screen based, 1 for source based)" }, @@ -326,7 +326,7 @@ const options_entry windows_options::s_option_entries[] = { WINOPTION_FLOOR";fs_floor", "0.05,0.05,0.05", OPTION_STRING, "signal floor level" }, { WINOPTION_PHOSPHOR";fs_phosphor", "0.4,0.4,0.4", OPTION_STRING, "phosphorescence decay rate (0.0 is instant, 1.0 is forever)" }, /* NTSC simulation below this line */ - { NULL, NULL, OPTION_HEADER, "NTSC POST-PROCESSING OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "NTSC POST-PROCESSING OPTIONS" }, { WINOPTION_YIQ_ENABLE";yiq", "0", OPTION_BOOLEAN, "enables YIQ-space HLSL post-processing" }, { WINOPTION_YIQ_JITTER";yiqj", "0.0", OPTION_FLOAT, "Jitter for the NTSC signal processing" }, { WINOPTION_YIQ_CCVALUE";yiqcc", "3.57954545", OPTION_FLOAT, "Color Carrier frequency for NTSC signal processing" }, @@ -341,11 +341,11 @@ const options_entry windows_options::s_option_entries[] = { WINOPTION_YIQ_SCAN_TIME";yiqsc", "52.6", OPTION_FLOAT, "Horizontal scanline duration for NTSC signal processing (in usec)" }, { WINOPTION_YIQ_PHASE_COUNT";yiqp", "2", OPTION_INTEGER, "Phase Count value for NTSC signal processing" }, /* Vector simulation below this line */ - { NULL, NULL, OPTION_HEADER, "VECTOR POST-PROCESSING OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "VECTOR POST-PROCESSING OPTIONS" }, { WINOPTION_VECTOR_LENGTH_SCALE";veclength", "0.5", OPTION_FLOAT, "How much length affects vector fade" }, { WINOPTION_VECTOR_LENGTH_RATIO";vecsize", "500.0", OPTION_FLOAT, "Vector fade length (4.0 - vectors fade the most at and above 4 pixels, etc.)" }, /* Bloom below this line */ - { NULL, NULL, OPTION_HEADER, "BLOOM POST-PROCESSING OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "BLOOM POST-PROCESSING OPTIONS" }, { WINOPTION_BLOOM_BLEND_MODE, "0", OPTION_INTEGER, "bloom blend mode (0 for addition, 1 for darken)" }, { WINOPTION_BLOOM_SCALE, "0.25", OPTION_FLOAT, "Intensity factor for bloom" }, { WINOPTION_BLOOM_OVERDRIVE, "1.0,1.0,1.0", OPTION_STRING, "Overdrive factor for bloom" }, @@ -362,18 +362,18 @@ const options_entry windows_options::s_option_entries[] = { WINOPTION_BLOOM_LEVEL10_WEIGHT, "0.01", OPTION_FLOAT, "Bloom level 10 (1x1 target) weight" }, // full screen options - { NULL, NULL, OPTION_HEADER, "FULL SCREEN OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "FULL SCREEN OPTIONS" }, { WINOPTION_TRIPLEBUFFER ";tb", "0", OPTION_BOOLEAN, "enables triple buffering" }, { WINOPTION_FULLSCREENBRIGHTNESS ";fsb(0.1-2.0)", "1.0", OPTION_FLOAT, "brightness value in full screen mode" }, { WINOPTION_FULLSCREENCONTRAST ";fsc(0.1-2.0)", "1.0", OPTION_FLOAT, "contrast value in full screen mode" }, { WINOPTION_FULLSCREENGAMMA ";fsg(0.1-3.0)", "1.0", OPTION_FLOAT, "gamma value in full screen mode" }, // input options - { NULL, NULL, OPTION_HEADER, "INPUT DEVICE OPTIONS" }, + { nullptr, nullptr, OPTION_HEADER, "INPUT DEVICE OPTIONS" }, { WINOPTION_GLOBAL_INPUTS ";global_inputs", "0", OPTION_BOOLEAN, "enables global inputs" }, { WINOPTION_DUAL_LIGHTGUN ";dual", "0", OPTION_BOOLEAN, "enables dual lightgun input" }, - { NULL } + { nullptr } }; //************************************************************************** @@ -389,9 +389,9 @@ int main(int argc, char *argv[]) { // use small output buffers on non-TTYs (i.e. pipes) if (!isatty(fileno(stdout))) - setvbuf(stdout, (char *) NULL, _IOFBF, 64); + setvbuf(stdout, (char *) nullptr, _IOFBF, 64); if (!isatty(fileno(stderr))) - setvbuf(stderr, (char *) NULL, _IOFBF, 64); + setvbuf(stderr, (char *) nullptr, _IOFBF, 64); // initialize common controls InitCommonControls(); @@ -434,7 +434,7 @@ int main(int argc, char *argv[]) osd_output::pop(&winerror); } // free symbols - symbols = NULL; + symbols = nullptr; return result; } @@ -469,7 +469,7 @@ static BOOL WINAPI control_handler(DWORD type) // if we don't have a machine yet, or if we are handling ctrl+c/ctrl+break, // just terminate hard, without throwing or handling any atexit stuff - if (g_current_machine == NULL || type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT) + if (g_current_machine == nullptr || type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT) { fprintf(stderr, ", exiting\n"); TerminateProcess(GetCurrentProcess(), MAMERR_FATALERROR); @@ -505,7 +505,9 @@ static void output_oslog(const running_machine &machine, const char *buffer) //============================================================ windows_osd_interface::windows_osd_interface(windows_options &options) -: osd_common_t(options), m_options(options) + : osd_common_t(options) + , m_options(options) + , m_sliders(nullptr) { } @@ -525,10 +527,10 @@ windows_osd_interface::~windows_osd_interface() void windows_osd_interface::video_register() { - video_options_add("gdi", NULL); - video_options_add("d3d", NULL); - video_options_add("bgfx", NULL); - //video_options_add("auto", NULL); // making d3d video default one + video_options_add("gdi", nullptr); + video_options_add("d3d", nullptr); + video_options_add("bgfx", nullptr); + //video_options_add("auto", nullptr); // making d3d video default one } //============================================================ @@ -589,7 +591,7 @@ void windows_osd_interface::init(running_machine &machine) // notify listeners of screen configuration std::string tempstring; - for (win_window_info *info = win_window_list; info != NULL; info = info->m_next) + for (win_window_info *info = win_window_list; info != nullptr; info = info->m_next) { strprintf(tempstring, "Orientation(%s)", info->m_monitor->devicename()); machine.output().set_value(tempstring.c_str(), info->m_targetorient); @@ -609,12 +611,12 @@ void windows_osd_interface::init(running_machine &machine) int watchdog = options.watchdog(); if (watchdog != 0) { - watchdog_reset_event = CreateEvent(NULL, FALSE, FALSE, NULL); - assert_always(watchdog_reset_event != NULL, "Failed to create watchdog reset event"); - watchdog_exit_event = CreateEvent(NULL, TRUE, FALSE, NULL); - assert_always(watchdog_exit_event != NULL, "Failed to create watchdog exit event"); - watchdog_thread = CreateThread(NULL, 0, watchdog_thread_entry, (LPVOID)(FPTR)watchdog, 0, NULL); - assert_always(watchdog_thread != NULL, "Failed to create watchdog thread"); + watchdog_reset_event = CreateEvent(nullptr, FALSE, FALSE, nullptr); + assert_always(watchdog_reset_event != nullptr, "Failed to create watchdog reset event"); + watchdog_exit_event = CreateEvent(nullptr, TRUE, FALSE, nullptr); + assert_always(watchdog_exit_event != nullptr, "Failed to create watchdog exit event"); + watchdog_thread = CreateThread(nullptr, 0, watchdog_thread_entry, (LPVOID)(FPTR)watchdog, 0, nullptr); + assert_always(watchdog_thread != nullptr, "Failed to create watchdog thread"); } // create and start the profiler @@ -639,7 +641,7 @@ void windows_osd_interface::init(running_machine &machine) void windows_osd_interface::osd_exit() { // no longer have a machine - g_current_machine = NULL; + g_current_machine = nullptr; // cleanup sockets win_cleanup_sockets(); @@ -647,20 +649,20 @@ void windows_osd_interface::osd_exit() osd_common_t::osd_exit(); // take down the watchdog thread if it exists - if (watchdog_thread != NULL) + if (watchdog_thread != nullptr) { SetEvent(watchdog_exit_event); WaitForSingleObject(watchdog_thread, INFINITE); CloseHandle(watchdog_reset_event); CloseHandle(watchdog_exit_event); CloseHandle(watchdog_thread); - watchdog_reset_event = NULL; - watchdog_exit_event = NULL; - watchdog_thread = NULL; + watchdog_reset_event = nullptr; + watchdog_exit_event = nullptr; + watchdog_thread = nullptr; } // stop the profiler - if (profiler != NULL) + if (profiler != nullptr) { profiler->stop(); profiler->print_results(*symbols); @@ -688,7 +690,7 @@ void winmain_dump_stack() // walk the stack while (walker.unwind()) - fprintf(stderr, " %p: %p%s\n", (void *)walker.frame(), (void *)walker.ip(), (symbols == NULL) ? "" : symbols->symbol_for_address(walker.ip())); + fprintf(stderr, " %p: %p%s\n", (void *)walker.frame(), (void *)walker.ip(), (symbols == nullptr) ? "" : symbols->symbol_for_address(walker.ip())); } @@ -753,7 +755,7 @@ static DWORD WINAPI watchdog_thread_entry(LPVOID lpParameter) void winmain_watchdog_ping(void) { // if we have a watchdog, reset it - if (watchdog_reset_event != NULL) + if (watchdog_reset_event != nullptr) SetEvent(watchdog_reset_event); } @@ -866,7 +868,7 @@ static LONG WINAPI exception_filter(struct _EXCEPTION_POINTERS *info) // walk the stack while (walker.unwind()) - fprintf(stderr, " %p: %p%s\n", (void *)walker.frame(), (void *)walker.ip(), (symbols == NULL) ? "" : symbols->symbol_for_address(walker.ip())); + fprintf(stderr, " %p: %p%s\n", (void *)walker.frame(), (void *)walker.ip(), (symbols == nullptr) ? "" : symbols->symbol_for_address(walker.ip())); // flush stderr, so the data is actually written when output is being redirected fflush(stderr); @@ -901,7 +903,7 @@ stack_walker::stack_walker() // initialize the symbols if (!s_initialized && m_sym_initialize && m_stack_walk_64 && m_sym_function_table_access_64 && m_sym_get_module_base_64) { - (*m_sym_initialize)(m_process, NULL, TRUE); + (*m_sym_initialize)(m_process, nullptr, TRUE); s_initialized = true; } } @@ -975,9 +977,9 @@ bool stack_walker::unwind() if (s_initialized) { #ifdef PTR64 - return (*m_stack_walk_64)(IMAGE_FILE_MACHINE_AMD64, m_process, m_thread, &m_stackframe, &m_context, NULL, *m_sym_function_table_access_64, *m_sym_get_module_base_64, NULL); + return (*m_stack_walk_64)(IMAGE_FILE_MACHINE_AMD64, m_process, m_thread, &m_stackframe, &m_context, nullptr, *m_sym_function_table_access_64, *m_sym_get_module_base_64, nullptr); #else - return (*m_stack_walk_64)(IMAGE_FILE_MACHINE_I386, m_process, m_thread, &m_stackframe, &m_context, NULL, *m_sym_function_table_access_64, *m_sym_get_module_base_64, NULL); + return (*m_stack_walk_64)(IMAGE_FILE_MACHINE_I386, m_process, m_thread, &m_stackframe, &m_context, nullptr, *m_sym_function_table_access_64, *m_sym_get_module_base_64, nullptr); #endif } @@ -1056,7 +1058,7 @@ const char *symbol_manager::symbol_for_address(FPTR address) if (!query_system_for_address(address)) { // if that fails, scan the cache if we have one - if (m_cache.first() != NULL) + if (m_cache.first() != nullptr) scan_cache_for_address(address); // or else try to open a sym/map file and find it there @@ -1113,20 +1115,20 @@ bool symbol_manager::query_system_for_address(FPTR address) void symbol_manager::scan_file_for_address(FPTR address, bool create_cache) { bool is_symfile = false; - FILE *srcfile = NULL; + FILE *srcfile = nullptr; #ifdef __GNUC__ // see if we have a symbol file (gcc only) srcfile = fopen(m_symfile.c_str(), "r"); - is_symfile = (srcfile != NULL); + is_symfile = (srcfile != nullptr); #endif // if not, see if we have a map file - if (srcfile == NULL) + if (srcfile == nullptr) srcfile = fopen(m_mapfile.c_str(), "r"); // if not, fail - if (srcfile == NULL) + if (srcfile == nullptr) return; // reset the best info @@ -1179,7 +1181,7 @@ void symbol_manager::scan_cache_for_address(FPTR address) FPTR best_addr = 0; // walk the cache, looking for valid entries - for (cache_entry *entry = m_cache.first(); entry != NULL; entry = entry->next()) + for (cache_entry *entry = m_cache.first(); entry != nullptr; entry = entry->next()) // if this is the best one so far, remember it if (entry->m_address <= address && entry->m_address > best_addr) @@ -1212,7 +1214,7 @@ bool symbol_manager::parse_sym_line(const char *line, FPTR &address, std::string // first look for a (ty) entry const char *type = strstr(line, "(ty 20)"); - if (type == NULL) + if (type == nullptr) return false; // scan forward in the line to find the address @@ -1299,7 +1301,7 @@ void symbol_manager::format_symbol(const char *name, UINT32 displacement, const strcatprintf(m_buffer, "+0x%04x", (UINT32)displacement); // append file/line if present - if (filename != NULL) + if (filename != nullptr) strcatprintf(m_buffer, ", %s:%d", filename, linenumber); // close up the string @@ -1319,18 +1321,18 @@ FPTR symbol_manager::get_text_section_base() // start with the image base PVOID base = reinterpret_cast(GetModuleHandleUni()); - assert(base != NULL); + assert(base != nullptr); // make sure we have the functions we need if (image_nt_header && image_rva_to_section) { // get the NT header PIMAGE_NT_HEADERS headers = (*image_nt_header)(base); - assert(headers != NULL); + assert(headers != nullptr); // look ourself up (assuming we are in the .text section) PIMAGE_SECTION_HEADER section = (*image_rva_to_section)(headers, base, reinterpret_cast(get_text_section_base) - reinterpret_cast(base)); - if (section != NULL) + if (section != nullptr) return reinterpret_cast(base) + section->VirtualAddress; } @@ -1349,8 +1351,8 @@ FPTR symbol_manager::get_text_section_base() //------------------------------------------------- sampling_profiler::sampling_profiler(UINT32 max_seconds, UINT8 stack_depth = 0) - : m_target_thread(NULL), - m_thread(NULL), + : m_target_thread(nullptr), + m_thread(nullptr), m_thread_id(0), m_thread_exit(false), m_stack_depth(stack_depth), @@ -1386,8 +1388,8 @@ void sampling_profiler::start() m_thread_exit = false; // start the thread - m_thread = CreateThread(NULL, 0, thread_entry, (LPVOID)this, 0, &m_thread_id); - assert_always(m_thread != NULL, "Failed to create profiler thread\n"); + m_thread = CreateThread(nullptr, 0, thread_entry, (LPVOID)this, 0, &m_thread_id); + assert_always(m_thread != nullptr, "Failed to create profiler thread\n"); // max out the priority SetThreadPriority(m_thread, THREAD_PRIORITY_TIME_CRITICAL); @@ -1555,7 +1557,7 @@ void sampling_profiler::thread_run() *count += 1; } - // fill in any missing parts with NULLs + // fill in any missing parts with nulls for (; frame <= m_stack_depth; frame++) *m_buffer_ptr++ = 0; diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h index 59088235d65..239690d2945 100644 --- a/src/osd/windows/winmain.h +++ b/src/osd/windows/winmain.h @@ -276,6 +276,7 @@ public: private: virtual void osd_exit() override; windows_options &m_options; + slider_state *m_sliders; static const int DEFAULT_FONT_HEIGHT = 200; };