#include <cstring>
#include <msp/core/hash.h>
#include <msp/core/maputils.h>
+#include <msp/gl/extensions/arb_shader_objects.h>
+#include <msp/gl/extensions/arb_uniform_buffer_object.h>
+#include <msp/gl/extensions/arb_vertex_shader.h>
#include <msp/strings/format.h>
-#include "arb_shader_objects.h"
-#include "arb_uniform_buffer_object.h"
-#include "arb_vertex_shader.h"
#include "buffer.h"
#include "error.h"
#include "program.h"
(*i)->compile();
uniforms.clear();
+ legacy_vars = false;
glLinkProgram(id);
int value;
if(!(linked = value))
throw compile_error(get_info_log());
- glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &value);
- unsigned count = value;
+ int count;
+ glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &count);
vector<UniformInfo *> uniforms_by_index(count);
- for(unsigned i=0; i<count; ++i)
+ for(int i=0; i<count; ++i)
{
char name[128];
int len = 0;
int size;
GLenum type;
- glGetActiveUniform(id, i, 128, &len, &size, &type, name);
+ glGetActiveUniform(id, i, sizeof(name), &len, &size, &type, name);
if(len && strncmp(name, "gl_", 3))
{
+ /* Some implementations report the first element of a uniform array,
+ others report just the name of an array. */
+ if(len>3 && !strcmp(name+len-3, "[0]"))
+ name[len-3] = 0;
+
UniformInfo &info = uniforms[name];
info.block = 0;
info.name = name;
info.type = type;
uniforms_by_index[i] = &info;
}
+ else
+ legacy_vars = true;
+ }
+
+ glGetProgramiv(id, GL_ACTIVE_ATTRIBUTES, &count);
+ for(int i=0; i<count; ++i)
+ {
+ char name[128];
+ int len = 0;
+ int size;
+ GLenum type;
+ glGetActiveAttrib(id, i, sizeof(name), &len, &size, &type, name);
+ if(len && !strncmp(name, "gl_", 3))
+ legacy_vars = true;
}
if(ARB_uniform_buffer_object)
{
- glGetProgramiv(id, GL_ACTIVE_UNIFORM_BLOCKS, &value);
- count = value;
- for(unsigned i=0; i<count; ++i)
+ glGetProgramiv(id, GL_ACTIVE_UNIFORM_BLOCKS, &count);
+ for(int i=0; i<count; ++i)
{
char name[128];
int len;
- glGetActiveUniformBlockName(id, i, 128, &len, name);
+ glGetActiveUniformBlockName(id, i, sizeof(name), &len, name);
UniformBlockInfo &info = uniform_blocks[name];
info.name = name;
gives us the first element of the array, so try to look that up and
add an offset. */
unsigned offset = lexical_cast<unsigned>(n.substr(open_bracket+1, n.size()-2-open_bracket));
- i = uniforms.find(n.substr(0, open_bracket)+"[0]");
+ i = uniforms.find(n.substr(0, open_bracket));
if(i!=uniforms.end() && !i->second.block && offset<i->second.size)
return i->second.location+offset;
}