]> git.tdb.fi Git - libs/gl.git/blob - source/core/program.h
1ca146f1e998c0fd0d05221a4dab0b66a6da31e6
[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 "datatype.h"
8 #include "gl.h"
9 #include "module.h"
10 #include "tag.h"
11 #include "vertexformat.h"
12
13 namespace Msp {
14 namespace GL {
15
16 /**
17 A complete shader program.  Programs can be assembled of individual Shaders or
18 generated with a set of standard features.
19 */
20 class Program
21 {
22         friend class PipelineState;
23
24 public:
25         class Loader: public DataFile::CollectionObjectLoader<Program>
26         {
27         public:
28                 Loader(Program &, Collection &);
29
30         private:
31                 virtual void finish();
32
33                 void module(const std::string &);
34         };
35
36 private:
37         class SpecializationLoader: public DataFile::Loader
38         {
39         private:
40                 std::map<std::string, int> &spec_values;
41
42                 static ActionMap shared_actions;
43
44         public:
45                 SpecializationLoader(std::map<std::string, int> &);
46
47         private:
48                 virtual void init_actions();
49
50                 void specialize_bool(const std::string &, bool);
51                 void specialize_int(const std::string &, int);
52         };
53
54 public:
55         typedef unsigned LayoutHash;
56         struct UniformBlockInfo;
57
58         struct UniformInfo
59         {
60                 std::string name;
61                 const UniformBlockInfo *block;
62                 union
63                 {
64                         int location;
65                         unsigned offset;
66                 };
67                 unsigned array_size;
68                 unsigned array_stride;
69                 unsigned matrix_stride;
70                 DataType type;
71                 Tag tag;
72                 int binding;
73
74                 UniformInfo();
75         };
76
77         struct UniformBlockInfo
78         {
79                 std::string name;
80                 unsigned data_size;
81                 int bind_point;
82                 std::vector<const UniformInfo *> uniforms;
83                 LayoutHash layout_hash;
84
85                 UniformBlockInfo();
86         };
87
88         struct AttributeInfo
89         {
90                 std::string name;
91                 unsigned location;
92                 unsigned array_size;
93                 DataType type;
94
95                 AttributeInfo();
96         };
97
98 private:
99         enum Stage
100         {
101                 VERTEX,
102                 GEOMETRY,
103                 FRAGMENT,
104                 MAX_STAGES
105         };
106
107         struct TransientData
108         {
109                 std::map<std::string, unsigned> textures;
110                 std::map<std::string, unsigned> blocks;
111                 std::map<unsigned, int> spec_values;
112         };
113
114         unsigned id;
115         unsigned stage_ids[MAX_STAGES];
116         const Module *module;
117         TransientData *transient;
118         bool linked;
119         std::vector<UniformBlockInfo> uniform_blocks;
120         std::vector<UniformInfo> uniforms;
121         LayoutHash uniform_layout_hash;
122         std::vector<AttributeInfo> attributes;
123         std::string debug_name;
124
125 public:
126         /// Constructs an empty Program with no shader stages attached.
127         Program();
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         bool has_stages() const;
140         unsigned add_stage(Stage);
141         void add_glsl_stages(const GlslModule &, const std::map<std::string, int> &);
142         void compile_glsl_stage(unsigned);
143         void add_spirv_stages(const SpirVModule &, const std::map<std::string, int> &);
144
145 public:
146         void link();
147 private:
148         void query_uniforms();
149         void query_uniform_blocks(const std::vector<UniformInfo *> &);
150         void query_attributes();
151         void collect_uniforms();
152         void collect_block_uniforms(const SpirVModule::Structure &, const std::string &, unsigned, std::vector<std::string> &);
153         void collect_attributes();
154         void update_layout_hash();
155         static LayoutHash compute_layout_hash(const std::vector<const UniformInfo *> &);
156         static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
157 public:
158         bool is_linked() const { return linked; }
159
160         LayoutHash get_uniform_layout_hash() const { return uniform_layout_hash; }
161         const std::vector<UniformBlockInfo> &get_uniform_blocks() const { return uniform_blocks; }
162         const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
163         const std::vector<UniformInfo> &get_uniforms() const { return uniforms; }
164         const UniformInfo &get_uniform_info(const std::string &) const;
165         const UniformInfo &get_uniform_info(Tag) const;
166         int get_uniform_location(const std::string &) const;
167         int get_uniform_location(Tag) const;
168         int get_uniform_binding(Tag) const;
169         const std::vector<AttributeInfo> &get_attributes() const { return attributes; }
170         const AttributeInfo &get_attribute_info(const std::string &) const;
171         int get_attribute_location(const std::string &) const;
172
173         void set_debug_name(const std::string &);
174 private:
175         void set_stage_debug_name(unsigned, Stage);
176 };
177
178 } // namespace GL
179 } // namespace Msp
180
181 #endif