diff options
Diffstat (limited to 'src/osd/modules/render/bgfx/shadermanager.cpp')
-rw-r--r-- | src/osd/modules/render/bgfx/shadermanager.cpp | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/src/osd/modules/render/bgfx/shadermanager.cpp b/src/osd/modules/render/bgfx/shadermanager.cpp index 7583b58dec5..dd131e719a5 100644 --- a/src/osd/modules/render/bgfx/shadermanager.cpp +++ b/src/osd/modules/render/bgfx/shadermanager.cpp @@ -28,7 +28,7 @@ shader_manager::~shader_manager() m_shaders.clear(); } -bgfx::ShaderHandle shader_manager::shader(std::string name) +bgfx::ShaderHandle shader_manager::get_or_load_shader(osd_options &options, std::string name) { std::map<std::string, bgfx::ShaderHandle>::iterator iter = m_shaders.find(name); if (iter != m_shaders.end()) @@ -36,12 +36,49 @@ bgfx::ShaderHandle shader_manager::shader(std::string name) return iter->second; } - return load_shader(name); + bgfx::ShaderHandle handle = load_shader(options, name); + if (handle.idx != bgfx::kInvalidHandle) + { + m_shaders[name] = handle; + } + + return handle; +} + +bgfx::ShaderHandle shader_manager::load_shader(osd_options &options, std::string name) +{ + std::string shader_path = make_path_string(options, name); + const bgfx::Memory* mem = load_mem(shader_path + name + ".bin"); + if (mem != nullptr) + { + return bgfx::createShader(mem); + } + + return BGFX_INVALID_HANDLE; } -bgfx::ShaderHandle shader_manager::load_shader(std::string name) +bool shader_manager::is_shader_present(osd_options &options, std::string name) { - std::string shader_path(m_options.bgfx_path()); + std::string shader_path = make_path_string(options, name); + std::string file_name = shader_path + name + ".bin"; + bx::FileReader reader; + if (bx::open(&reader, file_name.c_str())) + { + uint32_t expected_size(bx::getSize(&reader)); + uint8_t *data = new uint8_t[expected_size]; + uint32_t read_size = (uint32_t)bx::read(&reader, data, expected_size); + delete [] data; + bx::close(&reader); + + return expected_size == read_size; + } + + return false; +} + +std::string shader_manager::make_path_string(osd_options &options, std::string name) +{ + std::string shader_path(options.bgfx_path()); shader_path += PATH_SEPARATOR "shaders" PATH_SEPARATOR; switch (bgfx::getRendererType()) { @@ -81,17 +118,7 @@ bgfx::ShaderHandle shader_manager::load_shader(std::string name) shader_path += PATH_SEPARATOR; osd_subst_env(shader_path, shader_path); - const bgfx::Memory* mem = load_mem(shader_path + name + ".bin"); - if (mem != nullptr) - { - bgfx::ShaderHandle handle = bgfx::createShader(mem); - - m_shaders[name] = handle; - - return handle; - } - - return BGFX_INVALID_HANDLE; + return shader_path; } const bgfx::Memory* shader_manager::load_mem(std::string name) @@ -109,7 +136,7 @@ const bgfx::Memory* shader_manager::load_mem(std::string name) } else { - printf("Unable to load shader %s\n", name.c_str()); + osd_printf_error("Unable to load shader %s\n", name.c_str()); } return nullptr; } |