]> git.tdb.fi Git - libs/gl.git/blob - source/program.h
Query information about uniform blocks when linking a Program
[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
10 namespace Msp {
11 namespace GL {
12
13 class Shader;
14
15 class Program: public Bindable<Program>
16 {
17 public:
18         class Loader: public DataFile::ObjectLoader<Program>
19         {
20         public:
21                 Loader(Program &);
22
23         private:
24                 virtual void finish();
25
26                 void attribute(unsigned, const std::string &);
27                 void fragment_shader(const std::string &);
28                 void standard();
29                 void vertex_shader(const std::string &);
30         };
31
32         struct StandardFeatures
33         {
34                 class Loader: public DataFile::ObjectLoader<StandardFeatures>
35                 {
36                 public:
37                         Loader(StandardFeatures &);
38                 };
39
40                 bool texture;
41                 bool material;
42                 bool lighting;
43                 bool specular;
44                 bool normalmap;
45                 bool shadow;
46                 bool reflection;
47                 bool transform;
48
49                 StandardFeatures();
50
51                 std::string create_flags() const;
52         };
53
54         struct UniformInfo
55         {
56                 std::string name;
57                 unsigned location;
58                 unsigned size;
59                 unsigned array_stride;
60                 unsigned matrix_stride;
61                 GLenum type;
62         };
63
64         struct UniformBlockInfo
65         {
66                 std::string name;
67                 unsigned data_size;
68                 unsigned bind_point;
69                 std::vector<const UniformInfo *> uniforms;
70                 unsigned layout_hash;
71         };
72
73         typedef std::list<Shader *> ShaderList;
74         typedef std::map<std::string, UniformInfo> UniformMap;
75         typedef std::map<std::string, UniformBlockInfo> UniformBlockMap;
76
77 private:
78         unsigned id;
79         ShaderList shaders;
80         ShaderList owned_data;
81         bool linked;
82         UniformBlockMap uniform_blocks;
83         UniformMap uniforms;
84         unsigned uniform_layout_hash;
85
86 public:
87         Program();
88         Program(const StandardFeatures &);
89         Program(const std::string &, const std::string &);
90 private:
91         void init();
92 public:
93         virtual ~Program();
94
95         void attach_shader(Shader &shader);
96         void attach_shader_owned(Shader *shader);
97         void detach_shader(Shader &shader);
98         void add_standard_shaders(const StandardFeatures &);
99 private:
100         static std::string process_standard_source(const char **, const std::string &);
101 public:
102         const ShaderList &get_shaders() const { return shaders; }
103
104         void bind_attribute(unsigned, const std::string &);
105
106         void link();
107 private:
108         static unsigned compute_layout_hash(const std::vector<const UniformInfo *> &);
109 public:
110         bool is_linked() const { return linked; }
111         std::string get_info_log() const;
112
113         unsigned get_uniform_layout_hash() const { return uniform_layout_hash; }
114         const UniformBlockMap &get_uniform_blocks() const { return uniform_blocks; }
115         const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
116         const UniformMap &get_uniforms() const { return uniforms; }
117         const UniformInfo &get_uniform_info(const std::string &) const;
118         int get_uniform_location(const std::string &) const;
119
120         void bind() const;
121         static void unbind();
122 };
123
124 } // namespace GL
125 } // namespace Msp
126
127 #endif