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