1 #ifndef MSP_GL_PROGRAM_H_
2 #define MSP_GL_PROGRAM_H_
6 #include <msp/datafile/objectloader.h>
15 class Program: public Bindable<Program>
18 class Loader: public DataFile::ObjectLoader<Program>
24 virtual void finish();
26 void attribute(unsigned, const std::string &);
27 void fragment_shader(const std::string &);
29 void vertex_shader(const std::string &);
32 struct StandardFeatures
34 class Loader: public DataFile::ObjectLoader<StandardFeatures>
37 Loader(StandardFeatures &);
51 std::string create_flags() const;
54 struct UniformBlockInfo;
59 const UniformBlockInfo *block;
62 unsigned array_stride;
63 unsigned matrix_stride;
67 struct UniformBlockInfo
72 std::vector<const UniformInfo *> uniforms;
76 typedef std::list<Shader *> ShaderList;
77 typedef std::map<std::string, UniformInfo> UniformMap;
78 typedef std::map<std::string, UniformBlockInfo> UniformBlockMap;
83 ShaderList owned_data;
85 UniformBlockMap uniform_blocks;
87 unsigned uniform_layout_hash;
91 Program(const StandardFeatures &);
92 Program(const std::string &, const std::string &);
98 void attach_shader(Shader &shader);
99 void attach_shader_owned(Shader *shader);
100 void detach_shader(Shader &shader);
101 void add_standard_shaders(const StandardFeatures &);
103 static std::string process_standard_source(const char **, const std::string &);
105 const ShaderList &get_shaders() const { return shaders; }
107 void bind_attribute(unsigned, const std::string &);
111 static unsigned compute_layout_hash(const std::vector<const UniformInfo *> &);
112 static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
114 bool is_linked() const { return linked; }
115 std::string get_info_log() const;
117 unsigned get_uniform_layout_hash() const { return uniform_layout_hash; }
118 const UniformBlockMap &get_uniform_blocks() const { return uniform_blocks; }
119 const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
120 const UniformMap &get_uniforms() const { return uniforms; }
121 const UniformInfo &get_uniform_info(const std::string &) const;
122 int get_uniform_location(const std::string &) const;
125 static void unbind();