diff options
author | 2016-04-14 17:22:08 +0200 | |
---|---|---|
committer | 2016-04-14 17:22:24 +0200 | |
commit | 99aa7eacd7a2bb7a3711f8ff3f918e8fbe1f2819 (patch) | |
tree | a681a4407878fcf7cc89973e6bb5bc09dcb22c3c /src | |
parent | 0ff1223fe85b054b3b8ef3a8e5ca6ad859154ed8 (diff) |
bgfx: Add data-driven render target clearing [Ryan Holtz]
Diffstat (limited to 'src')
-rw-r--r-- | src/osd/modules/render/bgfx/chainentry.cpp | 7 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/chainentry.h | 4 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/chainentryreader.cpp | 15 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/chainmanager.cpp | 8 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/clear.cpp | 22 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/clear.h | 30 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/clearreader.cpp | 62 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/clearreader.h | 31 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/effectreader.cpp | 23 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/shadermanager.cpp | 34 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_distortion.sc | 2 |
11 files changed, 218 insertions, 20 deletions
diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp index a5f091a554b..c30139e17c4 100644 --- a/src/osd/modules/render/bgfx/chainentry.cpp +++ b/src/osd/modules/render/bgfx/chainentry.cpp @@ -17,6 +17,7 @@ #include "chainentry.h" #include "effect.h" +#include "clear.h" #include "texture.h" #include "target.h" #include "entryuniform.h" @@ -27,9 +28,10 @@ #include "render.h" -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, target_manager& targets, std::string output) +bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, clear_state* clear, std::vector<bgfx_suppressor*> suppressors, std::vector<bgfx_input_pair> inputs, std::vector<bgfx_entry_uniform*> uniforms, target_manager& targets, std::string output) : m_name(name) , m_effect(effect) + , m_clear(clear) , m_suppressors(suppressors) , m_inputs(inputs) , m_uniforms(uniforms) @@ -45,6 +47,7 @@ bgfx_chain_entry::~bgfx_chain_entry() delete uniform; } m_uniforms.clear(); + delete m_clear; } void bgfx_chain_entry::submit(int view, render_primitive* prim, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint32_t rotation_type, bool swap_xy, uint64_t blend, int32_t screen) @@ -193,7 +196,7 @@ bool bgfx_chain_entry::setup_view(int view, uint16_t screen_width, uint16_t scre bx::mtxOrtho(projMat, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 100.0f); bgfx::setViewTransform(view, nullptr, projMat); - bgfx::setViewClear(view, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x00000000, 1.0f, 0); + m_clear->bind(view); return true; } diff --git a/src/osd/modules/render/bgfx/chainentry.h b/src/osd/modules/render/bgfx/chainentry.h index 1d14e0dcfcf..eb102aaa059 100644 --- a/src/osd/modules/render/bgfx/chainentry.h +++ b/src/osd/modules/render/bgfx/chainentry.h @@ -27,13 +27,14 @@ class bgfx_effect; class bgfx_target; class bgfx_entry_uniform; class bgfx_suppressor; +class clear_state; class texture_manager; class target_manager; class bgfx_chain_entry { public: - 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, target_manager& targets, std::string output); + bgfx_chain_entry(std::string name, bgfx_effect* effect, clear_state* clear, std::vector<bgfx_suppressor*> suppressors, std::vector<bgfx_input_pair> inputs, std::vector<bgfx_entry_uniform*> uniforms, target_manager& targets, std::string output); ~bgfx_chain_entry(); void submit(int view, render_primitive* prim, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint32_t rotation_type, bool swap_xy, uint64_t blend, int32_t screen); @@ -56,6 +57,7 @@ private: std::string m_name; bgfx_effect* m_effect; + clear_state* m_clear; std::vector<bgfx_suppressor*> m_suppressors; std::vector<bgfx_input_pair> m_inputs; std::vector<bgfx_entry_uniform*> m_uniforms; diff --git a/src/osd/modules/render/bgfx/chainentryreader.cpp b/src/osd/modules/render/bgfx/chainentryreader.cpp index 0aa7085cb7f..c3f214f1d3e 100644 --- a/src/osd/modules/render/bgfx/chainentryreader.cpp +++ b/src/osd/modules/render/bgfx/chainentryreader.cpp @@ -26,6 +26,8 @@ #include "entryuniformreader.h" #include "suppressor.h" #include "suppressorreader.h" +#include "clear.h" +#include "clearreader.h" bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, std::string prefix, osd_options& options, texture_manager& textures, target_manager& targets, effect_manager& effects, std::map<std::string, bgfx_slider*>& sliders, std::map<std::string, bgfx_parameter*>& params, uint32_t screen_index) { @@ -134,8 +136,19 @@ bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, std::s } } + // Parse clear state + clear_state* clear = nullptr; + if (value.HasMember("clear")) + { + clear = clear_reader::read_from_value(value["clear"], prefix + "clear state: "); + } + else + { + clear = new clear_state(BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x00000000, 1.0f, 0); + } + std::string output = value["output"].GetString(); - return new bgfx_chain_entry(name, effect, suppressors, inputs, uniforms, targets, output); + return new bgfx_chain_entry(name, effect, clear, suppressors, inputs, uniforms, targets, output); } bool chain_entry_reader::validate_parameters(const Value& value, std::string prefix) diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index 5eaf6fc1378..25f79e5e456 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -391,7 +391,7 @@ uint32_t chain_manager::handle_screen_chains(uint32_t view, render_primitive *st uint32_t screen_index = 0; for (render_primitive* prim : screens) { - if (m_current_chain[screen_index] == CHAIN_NONE) + if (m_current_chain[screen_index] == CHAIN_NONE || screen_chain(screen_index) == nullptr) { screen_index++; continue; @@ -449,7 +449,7 @@ std::vector<ui_menu_item> chain_manager::get_slider_list() for (bgfx_slider* slider : chain_sliders) { slider_state* core_slider = slider->core_slider(); - + ui_menu_item item; item.text = core_slider->description; item.subtext = ""; @@ -457,7 +457,7 @@ std::vector<ui_menu_item> chain_manager::get_slider_list() item.ref = core_slider; item.type = ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER; m_selection_sliders.push_back(item); - + sliders.push_back(item); } @@ -469,7 +469,7 @@ std::vector<ui_menu_item> chain_manager::get_slider_list() item.flags = 0; item.ref = nullptr; item.type = ui_menu_item_type::UI_MENU_ITEM_TYPE_SEPARATOR; - + sliders.push_back(item); } } diff --git a/src/osd/modules/render/bgfx/clear.cpp b/src/osd/modules/render/bgfx/clear.cpp new file mode 100644 index 00000000000..2e6b27a4fe3 --- /dev/null +++ b/src/osd/modules/render/bgfx/clear.cpp @@ -0,0 +1,22 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// clear.cpp - View clear info for a BGFX chain entry +// +//============================================================ + +#include "clear.h" + +clear_state::clear_state(uint64_t flags, uint32_t color, float depth, uint8_t stencil) + : m_flags(flags) + , m_color(color) + , m_depth(depth) + , m_stencil(stencil) +{ +} + +void clear_state::bind(int view) const +{ + bgfx::setViewClear(view, m_flags, m_color, m_depth, m_stencil); +} diff --git a/src/osd/modules/render/bgfx/clear.h b/src/osd/modules/render/bgfx/clear.h new file mode 100644 index 00000000000..3d45f9a7d62 --- /dev/null +++ b/src/osd/modules/render/bgfx/clear.h @@ -0,0 +1,30 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// clear.h - View clear info for a BGFX chain entry +// +//============================================================ + +#pragma once + +#ifndef __DRAWBGFX_CLEAR__ +#define __DRAWBGFX_CLEAR__ + +#include <bgfx/bgfx.h> + +class clear_state +{ +public: + clear_state(uint64_t flags, uint32_t color, float depth, uint8_t stencil); + + void bind(int view) const; + +private: + const uint64_t m_flags; + const uint32_t m_color; + const float m_depth; + const uint8_t m_stencil; +}; + +#endif // __DRAWBGFX_CLEAR__ diff --git a/src/osd/modules/render/bgfx/clearreader.cpp b/src/osd/modules/render/bgfx/clearreader.cpp new file mode 100644 index 00000000000..78c3d139d25 --- /dev/null +++ b/src/osd/modules/render/bgfx/clearreader.cpp @@ -0,0 +1,62 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// clearreader.cpp - BGFX clear state JSON reader +// +//============================================================ + +#include <bgfx/bgfx.h> + +#include "clearreader.h" + +#include "clear.h" + +clear_state* clear_reader::read_from_value(const Value& value, std::string prefix) +{ + if (!validate_parameters(value, prefix)) + { + return nullptr; + } + + uint64_t clear_flags = 0; + uint32_t clear_color = 0; + float clear_depth = 1.0f; + uint8_t clear_stencil = 0; + + if (value.HasMember("clearcolor")) + { + const Value& colors = value["clearcolor"]; + for (int i = 0; i < colors.Size(); i++) + { + if (!READER_CHECK(colors[i].IsNumber(), (prefix + "clearcolor[" + std::to_string(i) + "] must be a numeric value\n").c_str())) return nullptr; + int32_t value = int32_t(float(colors[i].GetDouble()) * 255.0f); + if (value > 255) value = 255; + if (value < 0) value = 0; + clear_color |= value << (24 - (i * 3)); + } + clear_flags |= BGFX_CLEAR_COLOR; + } + + if (value.HasMember("cleardepth")) + { + get_float(value, "cleardepth", &clear_depth, &clear_depth); + clear_flags |= BGFX_CLEAR_DEPTH; + } + + if (value.HasMember("clearstencil")) + { + clear_stencil = uint8_t(get_int(value, "clearstencil", clear_stencil)); + clear_flags |= BGFX_CLEAR_STENCIL; + } + + return new clear_state(clear_flags, clear_color, clear_depth, clear_stencil); +} + +bool clear_reader::validate_parameters(const Value& value, std::string prefix) +{ + if (!READER_CHECK(!value.HasMember("clearcolor") || (value["clearcolor"].IsArray() && value["clearcolor"].GetArray().Size() == 4), (prefix + "'clearcolor' must be an array of four numeric RGBA values representing the color to which to clear the color buffer\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("cleardepth") || value["cleardepth"].IsNumber(), (prefix + "'cleardepth' must be a numeric value representing the depth to which to clear the depth buffer\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("clearstencil") || value["clearstencil"].IsNumber(), (prefix + "'clearstencil' must be a numeric value representing the stencil value to which to clear the stencil buffer\n").c_str())) return false; + return true; +} diff --git a/src/osd/modules/render/bgfx/clearreader.h b/src/osd/modules/render/bgfx/clearreader.h new file mode 100644 index 00000000000..80605ea35f3 --- /dev/null +++ b/src/osd/modules/render/bgfx/clearreader.h @@ -0,0 +1,31 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//============================================================ +// +// clearreader.h - BGFX clear state JSON reader +// +//============================================================ + +#pragma once + +#ifndef __DRAWBGFX_CLEAR_READER__ +#define __DRAWBGFX_CLEAR_READER__ + +#include <string> + +#include "statereader.h" + +class clear_state; + +class clear_reader : public state_reader { +public: + static clear_state* read_from_value(const Value& value, std::string prefix); + +private: + static bool validate_parameters(const Value& value, std::string prefix); + + static const int FLAG_COUNT = 3; + static const string_to_enum FLAG_NAMES[FLAG_COUNT]; +}; + +#endif // __DRAWBGFX_CLEAR_READER__ diff --git a/src/osd/modules/render/bgfx/effectreader.cpp b/src/osd/modules/render/bgfx/effectreader.cpp index f8e21974ead..f2a00cff562 100644 --- a/src/osd/modules/render/bgfx/effectreader.cpp +++ b/src/osd/modules/render/bgfx/effectreader.cpp @@ -19,6 +19,7 @@ #include "writereader.h" #include "shadermanager.h" #include "uniformreader.h" +#include "uniform.h" #include "effectreader.h" @@ -52,6 +53,17 @@ bgfx_effect* effect_reader::read_from_value(const Value& value, std::string pref std::string vertex_name(value["vertex"].GetString()); bgfx::ShaderHandle vertex_shader = shaders.shader(vertex_name); + if (vertex_shader.idx == 0xffff) + { + for (bgfx_uniform* uniform : uniforms) + { + if (uniform != nullptr) + { + delete uniform; + } + } + return nullptr; + } std::string fragment_name(""); if (value.HasMember("fragment")) @@ -63,6 +75,17 @@ bgfx_effect* effect_reader::read_from_value(const Value& value, std::string pref fragment_name = value["pixel"].GetString(); } bgfx::ShaderHandle fragment_shader = shaders.shader(fragment_name); + if (fragment_shader.idx == 0xffff) + { + for (bgfx_uniform* uniform : uniforms) + { + if (uniform != nullptr) + { + delete uniform; + } + } + return nullptr; + } return new bgfx_effect(blend | depth | cull | write, vertex_shader, fragment_shader, uniforms); } diff --git a/src/osd/modules/render/bgfx/shadermanager.cpp b/src/osd/modules/render/bgfx/shadermanager.cpp index 12dfd15910b..8471b360549 100644 --- a/src/osd/modules/render/bgfx/shadermanager.cpp +++ b/src/osd/modules/render/bgfx/shadermanager.cpp @@ -69,23 +69,35 @@ bgfx::ShaderHandle shader_manager::load_shader(std::string name) fatalerror("Unknown BGFX renderer type %d", bgfx::getRendererType()); } - bgfx::ShaderHandle handle = bgfx::createShader(load_mem(shader_path + name + ".bin")); + const bgfx::Memory* mem = load_mem(shader_path + name + ".bin"); + if (mem != nullptr) + { + bgfx::ShaderHandle handle = bgfx::createShader(mem); + + m_shaders[name] = handle; - m_shaders[name] = handle; + return handle; + } - return handle; + return BGFX_INVALID_HANDLE; } const bgfx::Memory* shader_manager::load_mem(std::string name) { bx::CrtFileReader reader; - bx::open(&reader, name.c_str()); - - uint32_t size(bx::getSize(&reader)); - const bgfx::Memory* mem = bgfx::alloc(size + 1); - bx::read(&reader, mem->data, size); - bx::close(&reader); + if (bx::open(&reader, name.c_str())) + { + uint32_t size(bx::getSize(&reader)); + const bgfx::Memory* mem = bgfx::alloc(size + 1); + bx::read(&reader, mem->data, size); + bx::close(&reader); - mem->data[mem->size - 1] = '\0'; - return mem; + mem->data[mem->size - 1] = '\0'; + return mem; + } + else + { + printf("Unable to load shader %s\n", name.c_str()); + } + return nullptr; } diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_distortion.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_distortion.sc index 0f69c288c5b..1547324f894 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_distortion.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_distortion.sc @@ -192,7 +192,7 @@ void main() // Clamp if (BaseCoord.x > 1.0 || BaseCoord.y > 1.0 || BaseCoord.x < 0.0 || BaseCoord.y < 0.0) { - gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); } else { |