diff options
Diffstat (limited to 'src/osd/modules/render/bgfx/effectreader.cpp')
-rw-r--r-- | src/osd/modules/render/bgfx/effectreader.cpp | 129 |
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) |