summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/effectreader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/bgfx/effectreader.cpp')
-rw-r--r--src/osd/modules/render/bgfx/effectreader.cpp153
1 files changed, 29 insertions, 124 deletions
diff --git a/src/osd/modules/render/bgfx/effectreader.cpp b/src/osd/modules/render/bgfx/effectreader.cpp
index 98c9a6dc48a..3e51cb9d9dc 100644
--- a/src/osd/modules/render/bgfx/effectreader.cpp
+++ b/src/osd/modules/render/bgfx/effectreader.cpp
@@ -23,80 +23,11 @@
#include "effectreader.h"
-bgfx_effect *effect_reader::read_from_value(const Value& value, std::string prefix, osd_options &options, shader_manager& shaders)
-{
- 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)
+bgfx_effect* effect_reader::read_from_value(const Value& value, std::string prefix, shader_manager& shaders)
{
if (!validate_parameters(value, prefix))
{
- return false;
- }
-
- 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 false;
- }
-
- if (!get_shader_data(value, options, vertex_name, vertex_shader, fragment_name, fragment_shader))
- {
- clear_uniform_list(uniforms);
- return false;
- }
-
- bgfx::ProgramHandle program = bgfx::createProgram(vertex_shader, fragment_shader, true);
-
- bool success = false;
- if (program.idx != bgfx::kInvalidHandle)
- {
- success = true;
- bgfx::destroy(program);
- }
-
- return success;
-}
-
-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;
+ return nullptr;
}
uint64_t blend = 0;
@@ -107,21 +38,34 @@ bool effect_reader::get_base_effect_data(const Value& value, std::string &prefix
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 false;
+ return nullptr;
}
uniforms.push_back(uniform);
}
- vertex_name = value["vertex"].GetString();
+ 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"))
{
fragment_name = value["fragment"].GetString();
@@ -130,59 +74,20 @@ bool effect_reader::get_base_effect_data(const Value& value, std::string &prefix
{
fragment_name = value["pixel"].GetString();
}
- else
- {
- fragment_name = "";
- }
-
- 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;
-}
-
-bool effect_reader::get_shader_data(const Value& value, osd_options &options, std::string &vertex_name, bgfx::ShaderHandle &vertex_shader, std::string &fragment_name,
- bgfx::ShaderHandle &fragment_shader)
-{
- vertex_shader = shader_manager::load_shader(options, vertex_name);
- if (vertex_shader.idx == bgfx::kInvalidHandle)
+ bgfx::ShaderHandle fragment_shader = shaders.shader(fragment_name);
+ if (fragment_shader.idx == 0xffff)
{
- return false;
- }
-
- fragment_shader = shader_manager::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)
- {
- if (uniform != nullptr)
+ for (bgfx_uniform* uniform : uniforms)
{
- delete uniform;
+ if (uniform != nullptr)
+ {
+ delete uniform;
+ }
}
+ return nullptr;
}
+
+ return new bgfx_effect(blend | depth | cull | write, vertex_shader, fragment_shader, uniforms);
}
bool effect_reader::validate_parameters(const Value& value, std::string prefix)