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.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/osd/modules/render/bgfx/shadermanager.cpp b/src/osd/modules/render/bgfx/shadermanager.cpp
new file mode 100644
index 00000000000..0629bd210e3
--- /dev/null
+++ b/src/osd/modules/render/bgfx/shadermanager.cpp
@@ -0,0 +1,73 @@
+#include "emu.h"
+
+#include <bgfx/bgfxplatform.h>
+#include <bgfx/bgfx.h>
+#include <bx/fpumath.h>
+#include <bx/readerwriter.h>
+
+#include "shadermanager.h"
+
+shader_manager::~shader_manager()
+{
+ for (std::pair<std::string, bgfx::ShaderHandle> shader : m_shaders)
+ {
+ bgfx::destroyShader(shader.second);
+ }
+ m_shaders.clear();
+}
+
+bgfx::ShaderHandle shader_manager::shader(std::string name)
+{
+ std::map<std::string, bgfx::ShaderHandle>::iterator iter = m_shaders.find(name);
+ if (iter != m_shaders.end())
+ {
+ return iter->second;
+ }
+
+ return load_shader(name);
+}
+
+bgfx::ShaderHandle shader_manager::load_shader(std::string name) {
+ std::string shader_path = "shaders/dx9/";
+ switch (bgfx::getRendererType())
+ {
+ case bgfx::RendererType::Direct3D11:
+ case bgfx::RendererType::Direct3D12:
+ shader_path = "shaders/dx11/";
+ break;
+
+ case bgfx::RendererType::OpenGL:
+ shader_path = "shaders/glsl/";
+ break;
+
+ case bgfx::RendererType::Metal:
+ shader_path = "shaders/metal/";
+ break;
+
+ case bgfx::RendererType::OpenGLES:
+ shader_path = "shaders/gles/";
+ break;
+
+ default:
+ break;
+ }
+
+ bgfx::ShaderHandle handle = bgfx::createShader(load_mem(shader_path + name + ".bin"));
+
+ m_shaders[name] = handle;
+
+ return handle;
+}
+
+const bgfx::Memory* shader_manager::load_mem(std::string name) {
+ bx::CrtFileReader reader;
+ bx::open(&reader, name.c_str());
+
+ uint32_t size = (uint32_t)bx::getSize(&reader);
+ const bgfx::Memory* mem = bgfx::alloc(size + 1);
+ bx::read(&reader, mem->data, size);
+ bx::close(&reader);
+
+ mem->data[mem->size - 1] = '\0';
+ return mem;
+}