virtual ~compile_error() throw() { }
};
+class incomplete_uniform_block: public std::runtime_error
+{
+public:
+ incomplete_uniform_block(const std::string &w): std::runtime_error(w) { }
+ virtual ~incomplete_uniform_block() throw() { }
+};
+
} // namespace GL
} // namespace Msp
if(i==blocks.end())
{
bool any_found = false;
- for(vector<const Program::UniformInfo *>::const_iterator j=info.uniforms.begin(); (!any_found && j!=info.uniforms.end()); ++j)
- any_found = (find_uniform_index((*j)->name)>=0);
+ bool all_found = true;
+ for(vector<const Program::UniformInfo *>::const_iterator j=info.uniforms.begin(); j!=info.uniforms.end(); ++j)
+ {
+ if(find_uniform_index((*j)->name)>=0)
+ any_found = true;
+ else
+ all_found = false;
+ }
- // TODO throw if all uniforms for a buffer-backed block are not found
if(!any_found)
return 0;
+ else if(!all_found && info.bind_point>=0)
+ {
+#ifdef DEBUG
+ IO::print(IO::cerr, "Warning: not all uniforms for block %s are present\n", info.name);
+#else
+ throw incomplete_uniform_block(info.name);
+#endif
+ }
UniformBlock *block;
if(info.bind_point>=0)