+#include <msp/core/maputils.h>
#include <msp/gl/extensions/arb_direct_state_access.h>
#include "buffer.h"
#include "color.h"
}
}
+void ProgramData::uniform(const string &name, const Uniform &u)
+{
+ uniform(name, u.clone());
+}
+
void ProgramData::uniform(const string &name, int v)
{
uniform(name, new Uniform1i(v));
uniform(name, new UniformArray<Uniform4f>(n, v));
}
+void ProgramData::uniform_matrix2_array(const string &name, unsigned n, const float *v)
+{
+ uniform(name, new UniformArray<UniformMatrix2x2f>(n, v));
+}
+
+void ProgramData::uniform_matrix3_array(const string &name, unsigned n, const float *v)
+{
+ uniform(name, new UniformArray<UniformMatrix3x3f>(n, v));
+}
+
void ProgramData::uniform_matrix4_array(const string &name, unsigned n, const float *v)
{
uniform(name, new UniformArray<UniformMatrix4x4f>(n, v));
}
}
+vector<string> ProgramData::get_uniform_names() const
+{
+ vector<string> names;
+ for(SlotMap::const_iterator i=uniform_slots.begin(); i!=uniform_slots.end(); ++i)
+ names.push_back(i->first);
+ return names;
+}
+
+const Uniform &ProgramData::get_uniform(const string &name) const
+{
+ return *uniforms[get_item(uniform_slots, name)];
+}
+
unsigned ProgramData::compute_slot_mask(const Program::UniformBlockInfo &block) const
{
unsigned mask = 0;
for(vector<const Program::UniformInfo *>::const_iterator i=block.uniforms.begin(); i!=block.uniforms.end(); ++i)
{
SlotMap::const_iterator j = uniform_slots.find((*i)->name);
+ /* TODO issue a warning (or even error?) either here or in update_block
+ if all uniforms for a buffer-backed block are not found */
if(j!=uniform_slots.end() && j->second<MASK_BITS)
mask |= 1<<j->second;
}
ProgramData::ProgramBlock::ProgramBlock(int p, SharedBlock *b):
bind_point(p),
- block(b ? b->block : 0),
+ block((b && b->used) ? b->block : 0),
shared(b)
{ }