summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author therealmogminer@gmail.com <therealmogminer@gmail.com>2016-04-14 17:22:08 +0200
committer therealmogminer@gmail.com <therealmogminer@gmail.com>2016-04-14 17:22:24 +0200
commit99aa7eacd7a2bb7a3711f8ff3f918e8fbe1f2819 (patch)
treea681a4407878fcf7cc89973e6bb5bc09dcb22c3c /src
parent0ff1223fe85b054b3b8ef3a8e5ca6ad859154ed8 (diff)
bgfx: Add data-driven render target clearing [Ryan Holtz]
Diffstat (limited to 'src')
-rw-r--r--src/osd/modules/render/bgfx/chainentry.cpp7
-rw-r--r--src/osd/modules/render/bgfx/chainentry.h4
-rw-r--r--src/osd/modules/render/bgfx/chainentryreader.cpp15
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp8
-rw-r--r--src/osd/modules/render/bgfx/clear.cpp22
-rw-r--r--src/osd/modules/render/bgfx/clear.h30
-rw-r--r--src/osd/modules/render/bgfx/clearreader.cpp62
-rw-r--r--src/osd/modules/render/bgfx/clearreader.h31
-rw-r--r--src/osd/modules/render/bgfx/effectreader.cpp23
-rw-r--r--src/osd/modules/render/bgfx/shadermanager.cpp34
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_distortion.sc2
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
{