]> git.tdb.fi Git - libs/gl.git/blob - source/core/program.h
Use the new _member utility functions to search and sort things
[libs/gl.git] / source / core / program.h
1 #ifndef MSP_GL_PROGRAM_H_
2 #define MSP_GL_PROGRAM_H_
3
4 #include <string>
5 #include <vector>
6 #include <msp/datafile/objectloader.h>
7 #include "bindable.h"
8 #include "datatype.h"
9 #include "gl.h"
10 #include "module.h"
11 #include "tag.h"
12 #include "vertexformat.h"
13
14 namespace Msp {
15 namespace GL {
16
17 class Shader;
18
19 /**
20 A complete shader program.  Programs can be assembled of individual Shaders or
21 generated with a set of standard features.
22 */
23 class Program: public Bindable<Program>
24 {
25 public:
26         class Loader: public DataFile::CollectionObjectLoader<Program>
27         {
28         public:
29                 Loader(Program &, Collection &);
30
31         private:
32                 virtual void finish();
33
34                 void attribute(unsigned, const std::string &);
35                 void fragment_shader(const std::string &);
36                 void geometry_shader(const std::string &);
37                 void module(const std::string &);
38                 void vertex_shader(const std::string &);
39         };
40
41 private:
42         class SpecializationLoader: public DataFile::Loader
43         {
44         private:
45                 std::map<std::string, int> &spec_values;
46
47                 static ActionMap shared_actions;
48
49         public:
50                 SpecializationLoader(std::map<std::string, int> &);
51
52         private:
53                 virtual void init_actions();
54
55                 void specialize_bool(const std::string &, bool);
56                 void specialize_int(const std::string &, int);
57         };
58
59 public:
60         typedef unsigned LayoutHash;
61         struct UniformBlockInfo;
62
63         struct UniformInfo
64         {
65                 std::string name;
66                 const UniformBlockInfo *block;
67                 union
68                 {
69                         int location;
70                         unsigned offset;
71                 };
72                 unsigned array_size;
73                 unsigned array_stride;
74                 unsigned matrix_stride;
75                 DataType type;
76                 Tag tag;
77
78                 UniformInfo();
79         };
80
81         struct UniformBlockInfo
82         {
83                 std::string name;
84                 unsigned data_size;
85                 int bind_point;
86                 std::vector<const UniformInfo *> uniforms;
87                 LayoutHash layout_hash;
88
89                 UniformBlockInfo();
90         };
91
92         struct AttributeInfo
93         {
94                 std::string name;
95                 unsigned location;
96                 unsigned array_size;
97                 DataType type;
98
99                 AttributeInfo();
100         };
101
102 private:
103         struct Bindings
104         {
105                 std::map<std::string, unsigned> textures;
106                 std::map<std::string, unsigned> blocks;
107         };
108
109         unsigned id;
110         std::vector<unsigned> stage_ids;
111         const Module *module;
112         Bindings *bindings;
113         bool linked;
114         std::vector<UniformBlockInfo> uniform_blocks;
115         std::vector<UniformInfo> uniforms;
116         LayoutHash uniform_layout_hash;
117         std::vector<AttributeInfo> attributes;
118
119 public:
120         /// Constructs an empty Program with no shader stages attached.
121         Program();
122
123         /// Constructs a Program from unified source code using ProgramCompiler.
124         DEPRECATED Program(const std::string &);
125
126         /// Constructs a Program from vertex and fragment shader source code.
127         DEPRECATED Program(const std::string &, const std::string &);
128
129         /// Constructs a Program from a Module, with specialization constants.
130         Program(const Module &, const std::map<std::string, int> & = std::map<std::string, int>());
131
132 private:
133         void init();
134 public:
135         virtual ~Program();
136
137         void add_stages(const Module &, const std::map<std::string, int> & = std::map<std::string, int>());
138 private:
139         unsigned add_stage(GLenum);
140         void add_glsl_stages(const GlslModule &, const std::map<std::string, int> &);
141         void compile_glsl_stage(unsigned);
142         void add_spirv_stages(const SpirVModule &, const std::map<std::string, int> &);
143
144 public:
145         DEPRECATED void attach_shader(Shader &shader);
146         DEPRECATED void attach_shader_owned(Shader *shader);
147         DEPRECATED void detach_shader(Shader &shader);
148         DEPRECATED const std::vector<Shader *> &get_attached_shaders() const;
149
150         DEPRECATED void bind_attribute(unsigned, const std::string &);
151         DEPRECATED void bind_attribute(VertexAttribute, const std::string &);
152         DEPRECATED void bind_fragment_data(unsigned, const std::string &);
153
154         void link();
155 private:
156         void query_uniforms();
157         void query_uniform_blocks(const std::vector<UniformInfo *> &);
158         void query_attributes();
159         void collect_uniforms();
160         void collect_block_uniforms(const SpirVModule::Structure &, const std::string &, unsigned, std::vector<std::string> &);
161         void collect_attributes();
162         void update_layout_hash();
163         static LayoutHash compute_layout_hash(const std::vector<const UniformInfo *> &);
164         static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
165 public:
166         bool is_linked() const { return linked; }
167         DEPRECATED std::string get_info_log() const;
168
169         LayoutHash get_uniform_layout_hash() const { return uniform_layout_hash; }
170         const std::vector<UniformBlockInfo> &get_uniform_blocks() const { return uniform_blocks; }
171         const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
172         const std::vector<UniformInfo> &get_uniforms() const { return uniforms; }
173         const UniformInfo &get_uniform_info(const std::string &) const;
174         const UniformInfo &get_uniform_info(Tag) const;
175         int get_uniform_location(const std::string &) const;
176         int get_uniform_location(Tag) const;
177         const std::vector<AttributeInfo> &get_attributes() const { return attributes; }
178         const AttributeInfo &get_attribute_info(const std::string &) const;
179         int get_attribute_location(const std::string &) const;
180
181         void bind() const;
182         static void unbind();
183 };
184
185 } // namespace GL
186 } // namespace Msp
187
188 #endif