void update_layout_hash();
static LayoutHash compute_layout_hash(const std::vector<const UniformInfo *> &);
static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
void update_layout_hash();
static LayoutHash compute_layout_hash(const std::vector<const UniformInfo *> &);
static bool uniform_location_compare(const UniformInfo *, const UniformInfo *);
const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
const std::vector<UniformInfo> &get_uniforms() const { return uniforms; }
const UniformInfo &get_uniform_info(const std::string &) const;
const UniformBlockInfo &get_uniform_block_info(const std::string &) const;
const std::vector<UniformInfo> &get_uniforms() const { return uniforms; }
const UniformInfo &get_uniform_info(const std::string &) const;
const std::vector<AttributeInfo> &get_attributes() const { return attributes; }
const AttributeInfo &get_attribute_info(const std::string &) const;
int get_attribute_location(const std::string &) const;
const std::vector<AttributeInfo> &get_attributes() const { return attributes; }
const AttributeInfo &get_attribute_info(const std::string &) const;
int get_attribute_location(const std::string &) const;