]> git.tdb.fi Git - libs/gl.git/blob - source/program.h
Entirely new system for building standard shaders
[libs/gl.git] / source / program.h
1 #ifndef MSP_GL_PROGRAM_H_
2 #define MSP_GL_PROGRAM_H_
3
4 #include <list>
5 #include <string>
6 #include <msp/datafile/objectloader.h>
7 #include "bindable.h"
8 #include "gl.h"
9 #include "programbuilder.h"
10
11 namespace Msp {
12 namespace GL {
13
14 class Shader;
15
16 class Program: public Bindable<Program>
17 {
18 public:
19         class Loader: public DataFile::ObjectLoader<Program>
20         {
21         public:
22                 Loader(Program &);
23
24         private:
25                 virtual void finish();
26
27                 void attribute(unsigned, const std::string &);
28                 void fragment_shader(const std::string &);
29                 void standard();
30                 void vertex_shader(const std::string &);
31         };
32
33         struct UniformBlockInfo;
34
35         struct UniformInfo
36         {
37                 std::string name;
38                 const UniformBlockInfo *block;
39                 unsigned location;
40                 unsigned size;
41                 unsigned array_stride;
42                 unsigned matrix_stride;
43                 GLenum type;
44         };
45
46         struct UniformBlockInfo
47         {
48                 std::string name;
49                 unsigned data_size;
50                 unsigned bind_point;
51                 std::vector<const UniformInfo *> uniforms;
52                 unsigned layout_hash;
53         };
54
55         typedef std::list<Shader *> ShaderList;
56         typedef std::map<std::string, UniformInfo> UniformMap;
57         typedef std::map<std::string, UniformBlockInfo> UniformBlockMap;
58
59 private:
60         unsigned id;
61         ShaderList shaders;
62         ShaderList owned_data;
63         bool linked;
64         UniformBlockMap uniform_blocks;
65         UniformMap uniforms;
66         unsigned uniform_layout_hash;
67
68 public:
69         Program();
70         Program(const ProgramBuilder::StandardFeatures &);
71         Program(const std::string &, const std::string &);
72 private:
73         void init();
74 public:
75         virtual ~Program();
76
77         void attach_shader(Shader &shader);
78         void attach_shader_owned(Shader *shader);
79         void detach_shader(Shader &shader);
80         const ShaderList &get_shaders() const { return shaders; }
81
82         void bind_attribute(unsigned, const std::string &);
83
84         void link();
85 private:
86         static unsigned compute_layout_hash(const std::vector<const UniformInfo *> &);
87         static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
88 public:
89         bool is_linked() const { return linked; }
90         std::string get_info_log() const;
91
92         unsigned get_uniform_layout_hash() const { return uniform_layout_hash; }
93         const UniformBlockMap &get_uniform_blocks() const { return uniform_blocks; }
94         const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
95         const UniformMap &get_uniforms() const { return uniforms; }
96         const UniformInfo &get_uniform_info(const std::string &) const;
97         int get_uniform_location(const std::string &) const;
98
99         void bind() const;
100         static void unbind();
101 };
102
103 } // namespace GL
104 } // namespace Msp
105
106 #endif