fixed shader manager, added it
authorEleni Maria Stea <estea@igalia.com>
Sun, 16 Jul 2017 15:26:22 +0000 (18:26 +0300)
committerEleni Maria Stea <estea@igalia.com>
Sun, 16 Jul 2017 15:26:22 +0000 (18:26 +0300)
src/opengl/shader-gl.cc
src/opengl/shader-gl.h
src/shader.cc
src/shader.h
src/shader_manager.cc [new file with mode: 0644]
src/shader_manager.h [new file with mode: 0644]

index c82a7d7..67aa096 100644 (file)
@@ -32,6 +32,7 @@ bool ShaderGL::create(char *buf, unsigned int bsz, const char *fname)
                fprintf(stderr, "Unknown shader type.\n");
                return false;
        }
                fprintf(stderr, "Unknown shader type.\n");
                return false;
        }
+       name = std::string(fname);
        sdr = glCreateShader(stype);
 
        /* compile */
        sdr = glCreateShader(stype);
 
        /* compile */
@@ -92,13 +93,6 @@ ShaderProgramGL::~ShaderProgramGL()
        destroy();
 }
 
        destroy();
 }
 
-void ShaderProgramGL::delete_shaders()
-{
-       for(unsigned int i=0; i<(sizeof shaders) / (sizeof *shaders); ++i) {
-               delete shaders[i];
-       }
-}
-
 bool ShaderProgramGL::create()
 {
        prog = glCreateProgram();
 bool ShaderProgramGL::create()
 {
        prog = glCreateProgram();
@@ -178,8 +172,6 @@ void ShaderProgramGL::destroy()
        glDeleteProgram(prog);
        prog = 0;
        is_linked = false;
        glDeleteProgram(prog);
        prog = 0;
        is_linked = false;
-
-       delete_shaders();
 }
 
 void ShaderProgramGL::attach_shader(Shader *shader)
 }
 
 void ShaderProgramGL::attach_shader(Shader *shader)
index 8c81afb..635d6b7 100644 (file)
@@ -27,7 +27,6 @@ public:
        virtual ~ShaderProgramGL();
 
        virtual void cache_uniforms() override;
        virtual ~ShaderProgramGL();
 
        virtual void cache_uniforms() override;
-       virtual void delete_shaders() override;
 
        virtual bool link() override;
        virtual bool use() override;
 
        virtual bool link() override;
        virtual bool use() override;
index 3bd46e2..b8ca8ef 100644 (file)
@@ -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()
 {
 
 ShaderProgram *get_current_program()
 {
index abfe364..53f8654 100644 (file)
@@ -18,10 +18,12 @@ enum SType {
 
 class Shader {
 protected:
 
 class Shader {
 protected:
+       SType type;
+       std::string name;
+
        virtual bool create(char *buf, unsigned int bsz, const char *fname) = 0;
 
 public:
        virtual bool create(char *buf, unsigned int bsz, const char *fname) = 0;
 
 public:
-       SType type;
 
        Shader();
        virtual ~Shader() = 0;
 
        Shader();
        virtual ~Shader() = 0;
@@ -49,9 +51,6 @@ public:
 
        virtual void cache_uniforms() = 0;
 
 
        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;
        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 (file)
index 0000000..2b683d6
--- /dev/null
@@ -0,0 +1,48 @@
+#include <map>
+
+#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<std::string, Shader*>::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<std::string, Shader *>::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 (file)
index 0000000..da44c09
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef SHADER_MANAGER_H_
+#define SHADER_MANAGER_H_
+
+#include <string>
+
+#include "shader.h"
+
+class ShaderManager {
+private:
+       std::map<std::string, Shader *> 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