// XXX All these mutables are a bit silly, but I'm out of better ideas
const Program *tied_program;
std::vector<TaggedUniform> uniforms;
// XXX All these mutables are a bit silly, but I'm out of better ideas
const Program *tied_program;
std::vector<TaggedUniform> uniforms;
mutable std::vector<SharedBlock> blocks;
mutable std::vector<ProgramBlock> programs;
mutable BufferBackedUniformBlock *last_buffer_block;
mutable Buffer *buffer;
mutable Mask dirty;
mutable std::vector<SharedBlock> blocks;
mutable std::vector<ProgramBlock> programs;
mutable BufferBackedUniformBlock *last_buffer_block;
mutable Buffer *buffer;
mutable Mask dirty;
void uniform_array(Tag, unsigned, V);
bool validate_tag(Tag) const;
void add_uniform(Tag, Uniform *);
void uniform_array(Tag, unsigned, V);
bool validate_tag(Tag) const;
void add_uniform(Tag, Uniform *);
std::vector<Tag> get_uniform_tags() const;
const Uniform &get_uniform(Tag) const;
const Uniform *find_uniform(Tag) const;
std::vector<Tag> get_uniform_tags() const;
const Uniform &get_uniform(Tag) const;
const Uniform *find_uniform(Tag) const;