summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/effectreader.cpp
diff options
context:
space:
mode:
author MooglyGuy <MooglyGuy@users.noreply.github.com>2022-03-16 03:32:33 +0100
committer GitHub <noreply@github.com>2022-03-15 22:32:33 -0400
commit92ece92fedb15efa82a12901bc343b46a0f06905 (patch)
treedc16d467c041bb86470b409111d156ef803b73d3 /src/osd/modules/render/bgfx/effectreader.cpp
parent8d267ad2c7d3e757bf47d05ce816e060e37de401 (diff)
Updated BGFX fixes; verified as working on Linux and Windows. (#9420)
* -bgfx: Improved stability when encountering missing files, and improved multi-window stability. [Ryan Holtz] * -osd: Added video-init fallback functionality to other OSDs. [Ryan Holtz] * -bgfx: Fixed issues from the previous batch of changes. [Ryan Holtz] * -osdwindow: Remove no-longer-needed addition of post_create(). [Ryan Holtz]
Diffstat (limited to 'src/osd/modules/render/bgfx/effectreader.cpp')
-rw-r--r--src/osd/modules/render/bgfx/effectreader.cpp129
1 files changed, 99 insertions, 30 deletions
diff --git a/src/osd/modules/render/bgfx/effectreader.cpp b/src/osd/modules/render/bgfx/effectreader.cpp
index 3e51cb9d9dc..fd59b0bde44 100644
--- a/src/osd/modules/render/bgfx/effectreader.cpp
+++ b/src/osd/modules/render/bgfx/effectreader.cpp
@@ -23,13 +23,77 @@
#include "effectreader.h"
-bgfx_effect* effect_reader::read_from_value(const Value& value, std::string prefix, shader_manager& shaders)
+bgfx_effect *effect_reader::read_from_value(const Value& value, std::string prefix, osd_options &options, shader_manager& shaders)
{
- if (!validate_parameters(value, prefix))
+ uint64_t flags = 0;
+ std::string vertex_name;
+ std::string fragment_name;
+ bgfx::ShaderHandle vertex_shader = BGFX_INVALID_HANDLE;
+ bgfx::ShaderHandle fragment_shader = BGFX_INVALID_HANDLE;
+ std::vector<bgfx_uniform *> uniforms;
+
+ if (!get_base_effect_data(value, prefix, flags, vertex_name, fragment_name, uniforms))
+ {
+ return nullptr;
+ }
+
+ if (!get_shader_data(value, options, shaders, vertex_name, vertex_shader, fragment_name, fragment_shader))
{
+ clear_uniform_list(uniforms);
return nullptr;
}
+ bgfx_effect *effect = new bgfx_effect(flags, vertex_shader, fragment_shader, uniforms);
+ if (effect->is_valid())
+ {
+ return effect;
+ }
+
+ delete effect;
+
+ return nullptr;
+}
+
+bool effect_reader::validate_value(const Value& value, std::string prefix, osd_options &options)
+{
+ if (!validate_parameters(value, prefix))
+ {
+ return false;
+ }
+
+ uint64_t flags = 0;
+ std::string vertex_name;
+ std::string fragment_name;
+ std::vector<bgfx_uniform *> uniforms;
+
+ if (!get_base_effect_data(value, prefix, flags, vertex_name, fragment_name, uniforms))
+ {
+ return false;
+ }
+
+ if (!shader_manager::is_shader_present(options, vertex_name))
+ {
+ clear_uniform_list(uniforms);
+ return false;
+ }
+
+ if (!shader_manager::is_shader_present(options, fragment_name))
+ {
+ clear_uniform_list(uniforms);
+ return false;
+ }
+
+ return true;
+}
+
+bool effect_reader::get_base_effect_data(const Value& value, std::string &prefix, uint64_t &flags, std::string &vertex_name, std::string &fragment_name,
+ std::vector<bgfx_uniform *> &uniforms)
+{
+ if (!validate_parameters(value, prefix))
+ {
+ return false;
+ }
+
uint64_t blend = 0;
if (value.HasMember("blend"))
{
@@ -38,34 +102,21 @@ bgfx_effect* effect_reader::read_from_value(const Value& value, std::string pref
uint64_t depth = depth_reader::read_from_value(value["depth"], prefix + "depth: ");
uint64_t cull = cull_reader::read_from_value(value["cull"]);
uint64_t write = write_reader::read_from_value(value["write"]);
+ flags = blend | depth | cull | write;
- std::vector<bgfx_uniform*> uniforms;
const Value& uniform_array = value["uniforms"];
for (uint32_t i = 0; i < uniform_array.Size(); i++)
{
- bgfx_uniform* uniform = uniform_reader::read_from_value(uniform_array[i], prefix + "uniforms[" + std::to_string(i) + "]: ");
+ bgfx_uniform *uniform = uniform_reader::read_from_value(uniform_array[i], prefix + "uniforms[" + std::to_string(i) + "]: ");
if (uniform == nullptr)
{
- return nullptr;
+ return false;
}
uniforms.push_back(uniform);
}
- 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;
- }
+ vertex_name = value["vertex"].GetString();
- std::string fragment_name("");
if (value.HasMember("fragment"))
{
fragment_name = value["fragment"].GetString();
@@ -74,20 +125,38 @@ 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)
+ else
{
- for (bgfx_uniform* uniform : uniforms)
- {
- if (uniform != nullptr)
- {
- delete uniform;
- }
- }
- return nullptr;
+ fragment_name = "";
}
- return new bgfx_effect(blend | depth | cull | write, vertex_shader, fragment_shader, uniforms);
+ return true;
+}
+
+bool effect_reader::get_shader_data(const Value& value, osd_options &options, shader_manager &shaders, std::string &vertex_name, bgfx::ShaderHandle &vertex_shader,
+ std::string &fragment_name, bgfx::ShaderHandle &fragment_shader)
+{
+ vertex_shader = shaders.load_shader(options, vertex_name);
+ if (vertex_shader.idx == bgfx::kInvalidHandle)
+ {
+ return false;
+ }
+
+ fragment_shader = shaders.load_shader(options, fragment_name);
+ if (fragment_shader.idx == bgfx::kInvalidHandle)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+void effect_reader::clear_uniform_list(std::vector<bgfx_uniform *> &uniforms)
+{
+ for (bgfx_uniform *uniform : uniforms)
+ {
+ delete uniform;
+ }
}
bool effect_reader::validate_parameters(const Value& value, std::string prefix)