1 #ifndef MSP_GL_PROGRAM_H_
2 #define MSP_GL_PROGRAM_H_
6 #include <msp/datafile/objectloader.h>
9 #include "programbuilder.h"
16 class Program: public Bindable<Program>
19 class Loader: public DataFile::ObjectLoader<Program>
25 virtual void finish();
27 void attribute(unsigned, const std::string &);
28 void fragment_shader(const std::string &);
30 void vertex_shader(const std::string &);
33 struct UniformBlockInfo;
38 const UniformBlockInfo *block;
41 unsigned array_stride;
42 unsigned matrix_stride;
46 struct UniformBlockInfo
51 std::vector<const UniformInfo *> uniforms;
55 typedef std::list<Shader *> ShaderList;
56 typedef std::map<std::string, UniformInfo> UniformMap;
57 typedef std::map<std::string, UniformBlockInfo> UniformBlockMap;
62 ShaderList owned_data;
64 UniformBlockMap uniform_blocks;
66 unsigned uniform_layout_hash;
70 Program(const ProgramBuilder::StandardFeatures &);
71 Program(const std::string &, const std::string &);
77 void attach_shader(Shader &shader);
78 void attach_shader_owned(Shader *shader);
79 void detach_shader(Shader &shader);
80 const ShaderList &get_shaders() const { return shaders; }
82 void bind_attribute(unsigned, const std::string &);
86 static unsigned compute_layout_hash(const std::vector<const UniformInfo *> &);
87 static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
89 bool is_linked() const { return linked; }
90 std::string get_info_log() const;
92 unsigned get_uniform_layout_hash() const { return uniform_layout_hash; }
93 const UniformBlockMap &get_uniform_blocks() const { return uniform_blocks; }
94 const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
95 const UniformMap &get_uniforms() const { return uniforms; }
96 const UniformInfo &get_uniform_info(const std::string &) const;
97 int get_uniform_location(const std::string &) const;
100 static void unbind();