]> git.tdb.fi Git - libs/gl.git/blob - source/program.h
Add interface for glBindFragDataLocation, required for modern 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         bool legacy_vars;
68
69 public:
70         Program();
71         Program(const ProgramBuilder::StandardFeatures &);
72         Program(const std::string &, const std::string &);
73 private:
74         void init();
75 public:
76         virtual ~Program();
77
78         void attach_shader(Shader &shader);
79         void attach_shader_owned(Shader *shader);
80         void detach_shader(Shader &shader);
81         const ShaderList &get_shaders() const { return shaders; }
82
83         void bind_attribute(unsigned, const std::string &);
84         void bind_fragment_data(unsigned, const std::string &);
85
86         void link();
87 private:
88         static unsigned compute_layout_hash(const std::vector<const UniformInfo *> &);
89         static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
90 public:
91         bool is_linked() const { return linked; }
92         std::string get_info_log() const;
93
94         unsigned get_uniform_layout_hash() const { return uniform_layout_hash; }
95         const UniformBlockMap &get_uniform_blocks() const { return uniform_blocks; }
96         const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
97         const UniformMap &get_uniforms() const { return uniforms; }
98         const UniformInfo &get_uniform_info(const std::string &) const;
99         int get_uniform_location(const std::string &) const;
100
101         bool uses_legacy_variables() const { return legacy_vars; }
102
103         void bind() const;
104         static void unbind();
105 };
106
107 } // namespace GL
108 } // namespace Msp
109
110 #endif