From 31bab00bc3b476be9814c1ee06b9a2f0dc77d4e9 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Sun, 16 Jul 2017 18:26:22 +0300 Subject: [PATCH] fixed shader manager, added it --- src/opengl/shader-gl.cc | 10 +--------- src/opengl/shader-gl.h | 1 - src/shader.cc | 10 +++++----- src/shader.h | 7 +++---- src/shader_manager.cc | 48 +++++++++++++++++++++++++++++++++++++++++++++++ src/shader_manager.h | 20 ++++++++++++++++++++ 6 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 src/shader_manager.cc create mode 100644 src/shader_manager.h diff --git a/src/opengl/shader-gl.cc b/src/opengl/shader-gl.cc index c82a7d7..67aa096 100644 --- a/src/opengl/shader-gl.cc +++ b/src/opengl/shader-gl.cc @@ -32,6 +32,7 @@ bool ShaderGL::create(char *buf, unsigned int bsz, const char *fname) fprintf(stderr, "Unknown shader type.\n"); return false; } + name = std::string(fname); sdr = glCreateShader(stype); /* compile */ @@ -92,13 +93,6 @@ ShaderProgramGL::~ShaderProgramGL() destroy(); } -void ShaderProgramGL::delete_shaders() -{ - for(unsigned int i=0; i<(sizeof shaders) / (sizeof *shaders); ++i) { - delete shaders[i]; - } -} - bool ShaderProgramGL::create() { prog = glCreateProgram(); @@ -178,8 +172,6 @@ void ShaderProgramGL::destroy() glDeleteProgram(prog); prog = 0; is_linked = false; - - delete_shaders(); } void ShaderProgramGL::attach_shader(Shader *shader) diff --git a/src/opengl/shader-gl.h b/src/opengl/shader-gl.h index 8c81afb..635d6b7 100644 --- a/src/opengl/shader-gl.h +++ b/src/opengl/shader-gl.h @@ -27,7 +27,6 @@ public: virtual ~ShaderProgramGL(); virtual void cache_uniforms() override; - virtual void delete_shaders() override; virtual bool link() override; virtual bool use() override; diff --git a/src/shader.cc b/src/shader.cc index 3bd46e2..b8ca8ef 100644 --- a/src/shader.cc +++ b/src/shader.cc @@ -75,11 +75,11 @@ ShaderProgram::~ShaderProgram() } } -void ShaderProgram::add_shader(Shader *sdr) -{ - assert(sdr->type < sizeof shaders / sizeof *shaders); - shaders[sdr->type] = sdr; -} +// void ShaderProgram::add_shader(Shader *sdr) +// { +// assert(sdr->type < sizeof shaders / sizeof *shaders); +// shaders[sdr->type] = sdr; +// } ShaderProgram *get_current_program() { diff --git a/src/shader.h b/src/shader.h index abfe364..53f8654 100644 --- a/src/shader.h +++ b/src/shader.h @@ -18,10 +18,12 @@ enum SType { class Shader { protected: + SType type; + std::string name; + virtual bool create(char *buf, unsigned int bsz, const char *fname) = 0; public: - SType type; Shader(); virtual ~Shader() = 0; @@ -49,9 +51,6 @@ public: virtual void cache_uniforms() = 0; - virtual void add_shader(Shader *sdr); - virtual void delete_shaders() = 0; - virtual bool create() = 0; virtual bool link() = 0; virtual bool use() = 0; diff --git a/src/shader_manager.cc b/src/shader_manager.cc new file mode 100644 index 0000000..2b683d6 --- /dev/null +++ b/src/shader_manager.cc @@ -0,0 +1,48 @@ +#include + +#include "shader_manager.h" +#include "opengl/shader-gl.h" + +extern bool use_vulkan; + +ShaderManager::ShaderManager() {} +ShaderManager::~ShaderManager() {} + +void ShaderManager::add_shader(Shader *sdr, const char *name) +{ + shaders[name] = sdr; +} + +Shader *ShaderManager::load_shader(const char *name, SType type) +{ + std::map::const_iterator it; + it = shaders.find(name); + + if(it != shaders.end()) { + return it->second; + } + + Shader* sdr; + if(use_vulkan) { + // sdr = new ShaderVK; + } + else { + sdr = new ShaderGL; + } + + if(!sdr->load(name, type)) { + delete sdr; + return 0; + } + + add_shader(sdr, name); + return sdr; +} + +void ShaderManager::delete_shaders() +{ + std::map::iterator it; + for(it=shaders.begin(); it != shaders.end(); it++) { + delete it->second; + } +} \ No newline at end of file diff --git a/src/shader_manager.h b/src/shader_manager.h new file mode 100644 index 0000000..da44c09 --- /dev/null +++ b/src/shader_manager.h @@ -0,0 +1,20 @@ +#ifndef SHADER_MANAGER_H_ +#define SHADER_MANAGER_H_ + +#include + +#include "shader.h" + +class ShaderManager { +private: + std::map shaders; +public: + ShaderManager(); + ~ShaderManager(); + + void add_shader(Shader *sdr, const char *name); + Shader *load_shader(const char *name, SType type); + void delete_shaders(); +}; + +#endif // SHADER_MANAGER_H_ \ No newline at end of file -- 1.7.10.4