]> git.tdb.fi Git - libs/gl.git/blobdiff - source/program.cpp
Remove the deprecated ProgramBuilder class
[libs/gl.git] / source / program.cpp
index c3625f4159589916f0e83e7c9f88135266e91b49..00bca8343cb4d89e05f619f78bda72773a76ce77 100644 (file)
@@ -28,15 +28,6 @@ Program::Program()
        init();
 }
 
-Program::Program(const ProgramBuilder::StandardFeatures &features)
-{
-       init();
-
-       ProgramBuilder builder(features);
-       builder.add_shaders(*this);
-       link();
-}
-
 Program::Program(const std::string &source)
 {
        init();
@@ -129,7 +120,6 @@ void Program::link()
                        (*i)->compile();
 
        uniforms.clear();
-       legacy_vars = false;
 
        glLinkProgram(id);
        linked = get_program_i(id, GL_LINK_STATUS);
@@ -144,6 +134,26 @@ void Program::link()
 
        query_uniforms();
        query_attributes();
+
+       for(UniformMap::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
+               require_type(i->second.type);
+       for(AttributeMap::const_iterator i=attributes.begin(); i!=attributes.end(); ++i)
+               require_type(i->second.type);
+}
+
+void Program::require_type(GLenum t)
+{
+       switch(t)
+       {
+       case GL_FLOAT_MAT2x3:
+       case GL_FLOAT_MAT2x4:
+       case GL_FLOAT_MAT3x2:
+       case GL_FLOAT_MAT3x4:
+       case GL_FLOAT_MAT4x2:
+       case GL_FLOAT_MAT4x3:
+               { static Require _req(NV_non_square_matrices); }
+               break;
+       }
 }
 
 void Program::query_uniforms()
@@ -173,8 +183,6 @@ void Program::query_uniforms()
                        info.type = type;
                        uniforms_by_index[i] = &info;
                }
-               else
-                       legacy_vars = true;
        }
 
        if(ARB_uniform_buffer_object)
@@ -283,8 +291,17 @@ void Program::query_attributes()
                int size;
                GLenum type;
                glGetActiveAttrib(id, i, sizeof(name), &len, &size, &type, name);
-               if(len && !strncmp(name, "gl_", 3))
-                       legacy_vars = true;
+               if(len && strncmp(name, "gl_", 3))
+               {
+                       if(len>3 && !strcmp(name+len-3, "[0]"))
+                               name[len-3] = 0;
+
+                       AttributeInfo &info = attributes[name];
+                       info.name = name;
+                       info.location = glGetAttribLocation(id, name);
+                       info.size = size;
+                       info.type = type;
+               }
        }
 }
 
@@ -304,10 +321,9 @@ bool Program::uniform_location_compare(const UniformInfo *uni1, const UniformInf
 string Program::get_info_log() const
 {
        GLsizei len = get_program_i(id, GL_INFO_LOG_LENGTH);
-       char *buf = new char[len+1];
-       glGetProgramInfoLog(id, len+1, &len, buf);
-       string log(buf, len);
-       delete[] buf;
+       string log(len+1, 0);
+       glGetProgramInfoLog(id, len+1, &len, &log[0]);
+       log.erase(len);
        return log;
 }
 
@@ -333,6 +349,20 @@ int Program::get_uniform_location(const string &n) const
        return i->second.block->bind_point<0 ? i->second.location : -1;
 }
 
+const Program::AttributeInfo &Program::get_attribute_info(const string &name) const
+{
+       return get_item(attributes, name);
+}
+
+int Program::get_attribute_location(const string &n) const
+{
+       if(n[n.size()-1]==']')
+               throw invalid_argument("Program::get_attribute_location");
+
+       AttributeMap::const_iterator i = attributes.find(n);
+       return i!=attributes.end() ? i->second.location : -1;
+}
+
 void Program::bind() const
 {
        if(!linked)
@@ -359,7 +389,6 @@ Program::Loader::Loader(Program &p):
        add("attribute",       &Loader::attribute);
        add("fragment_shader", &Loader::fragment_shader);
        add("geometry_shader", &Loader::geometry_shader);
-       add("standard",        &Loader::standard);
        add("vertex_shader",   &Loader::vertex_shader);
 }
 
@@ -383,14 +412,6 @@ void Program::Loader::geometry_shader(const string &src)
        obj.attach_shader_owned(new GeometryShader(src));
 }
 
-void Program::Loader::standard()
-{
-       ProgramBuilder::StandardFeatures feat;
-       load_sub(feat);
-       ProgramBuilder builder(feat);
-       builder.add_shaders(obj);
-}
-
 void Program::Loader::vertex_shader(const string &src)
 {
        obj.attach_shader_owned(new VertexShader(src));