summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/shadermanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/bgfx/shadermanager.cpp')
-rw-r--r--src/osd/modules/render/bgfx/shadermanager.cpp59
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;
}