]> git.tdb.fi Git - libs/gl.git/blob - source/core/program.h
201d927037c57edf0d1464ca1af4002fb28a6d1a
[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                 int binding;
78
79                 UniformInfo();
80         };
81
82         struct UniformBlockInfo
83         {
84                 std::string name;
85                 unsigned data_size;
86                 int bind_point;
87                 std::vector<const UniformInfo *> uniforms;
88                 LayoutHash layout_hash;
89
90                 UniformBlockInfo();
91         };
92
93         struct AttributeInfo
94         {
95                 std::string name;
96                 unsigned location;
97                 unsigned array_size;
98                 DataType type;
99
100                 AttributeInfo();
101         };
102
103 private:
104         struct TransientData
105         {
106                 std::map<std::string, unsigned> textures;
107                 std::map<std::string, unsigned> blocks;
108                 std::map<unsigned, int> spec_values;
109         };
110
111         unsigned id;
112         std::vector<unsigned> stage_ids;
113         const Module *module;
114         TransientData *transient;
115         bool linked;
116         std::vector<UniformBlockInfo> uniform_blocks;
117         std::vector<UniformInfo> uniforms;
118         LayoutHash uniform_layout_hash;
119         std::vector<AttributeInfo> attributes;
120
121 public:
122         /// Constructs an empty Program with no shader stages attached.
123         Program();
124
125         /// Constructs a Program from unified source code using ProgramCompiler.
126         DEPRECATED Program(const std::string &);
127
128         /// Constructs a Program from vertex and fragment shader source code.
129         DEPRECATED Program(const std::string &, const std::string &);
130
131         /// Constructs a Program from a Module, with specialization constants.
132         Program(const Module &, const std::map<std::string, int> & = std::map<std::string, int>());
133
134 private:
135         void init();
136 public:
137         virtual ~Program();
138
139         void add_stages(const Module &, const std::map<std::string, int> & = std::map<std::string, int>());
140 private:
141         unsigned add_stage(GLenum);
142         void add_glsl_stages(const GlslModule &, const std::map<std::string, int> &);
143         void compile_glsl_stage(unsigned);
144         void add_spirv_stages(const SpirVModule &, const std::map<std::string, int> &);
145
146 public:
147         DEPRECATED void attach_shader(Shader &shader);
148         DEPRECATED void attach_shader_owned(Shader *shader);
149         DEPRECATED void detach_shader(Shader &shader);
150         DEPRECATED const std::vector<Shader *> &get_attached_shaders() const;
151
152         DEPRECATED void bind_attribute(unsigned, const std::string &);
153         DEPRECATED void bind_attribute(VertexAttribute, const std::string &);
154         DEPRECATED void bind_fragment_data(unsigned, const std::string &);
155
156         void link();
157 private:
158         void query_uniforms();
159         void query_uniform_blocks(const std::vector<UniformInfo *> &);
160         void query_attributes();
161         void collect_uniforms();
162         void collect_block_uniforms(const SpirVModule::Structure &, const std::string &, unsigned, std::vector<std::string> &);
163         void collect_attributes();
164         void update_layout_hash();
165         static LayoutHash compute_layout_hash(const std::vector<const UniformInfo *> &);
166         static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
167 public:
168         bool is_linked() const { return linked; }
169         DEPRECATED std::string get_info_log() const;
170
171         LayoutHash get_uniform_layout_hash() const { return uniform_layout_hash; }
172         const std::vector<UniformBlockInfo> &get_uniform_blocks() const { return uniform_blocks; }
173         const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
174         const std::vector<UniformInfo> &get_uniforms() const { return uniforms; }
175         const UniformInfo &get_uniform_info(const std::string &) const;
176         const UniformInfo &get_uniform_info(Tag) const;
177         int get_uniform_location(const std::string &) const;
178         int get_uniform_location(Tag) const;
179         int get_uniform_binding(Tag) const;
180         const std::vector<AttributeInfo> &get_attributes() const { return attributes; }
181         const AttributeInfo &get_attribute_info(const std::string &) const;
182         int get_attribute_location(const std::string &) const;
183
184         void bind() const;
185         static void unbind();
186 };
187
188 } // namespace GL
189 } // namespace Msp
190
191 #endif