From 41855c4e8984235a811bee68a217c91d8ee42964 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 23 Jul 2014 15:14:02 -0400 Subject: [PATCH] add GLProgram#link --- src/GLProgram.cc | 62 ++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/src/GLProgram.cc b/src/GLProgram.cc index b59eae2..328cb6e 100644 --- a/src/GLProgram.cc +++ b/src/GLProgram.cc @@ -58,41 +58,51 @@ static VALUE GLProgram_bind_attribute(VALUE self, VALUE attr_name, VALUE index) return Qnil; } +static VALUE GLProgram_link(VALUE self) +{ + GLProgram * glprogram; + Data_Get_Struct(self, GLProgram, glprogram); + + glLinkProgram(glprogram->id); + + GLint link_status; + glGetProgramiv(glprogram->id, GL_LINK_STATUS, &link_status); + if (link_status != GL_TRUE) + { + GLint log_length; + glGetProgramiv(glprogram->id, GL_INFO_LOG_LENGTH, &log_length); + if (log_length > 0) + { + char log[log_length + 1]; + glGetProgramInfoLog(glprogram->id, log_length, &log_length, log); + log[log_length] = '\0'; + glDeleteProgram(glprogram->id); + rb_raise(rb_eRuntimeError, + "Error linking program:\n%s\n%s\n%s\n", + "--------------------", + log, + "--------------------"); + } + else + { + glDeleteProgram(glprogram->id); + rb_raise(rb_eRuntimeError, "Error linking program"); + } + } + + return Qnil; +} + void GLProgram_Init() { ruby_class = rb_define_class("GLProgram", rb_cObject); rb_define_singleton_method(ruby_class, "new", (VALUE(*)(...))GLProgram_new, -1); rb_define_method(ruby_class, "attach_shader", (VALUE(*)(...))GLProgram_attach_shader, 1); rb_define_method(ruby_class, "bind_attribute", (VALUE(*)(...))GLProgram_bind_attribute, 2); + rb_define_method(ruby_class, "link", (VALUE(*)(...))GLProgram_link, 0); } #if 0 -bool GLProgram::link() -{ - if (m_id == 0u) - return false; - - glLinkProgram(m_id); - - GLint link_status; - glGetProgramiv(m_id, GL_LINK_STATUS, &link_status); - if (link_status != GL_TRUE) - { - GLint log_length; - glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &log_length); - if (log_length > 0) - { - char *log = new char[log_length]; - glGetProgramInfoLog(m_id, log_length, &log_length, log); - cerr << "Program log:" << endl << log << endl; - delete[] log; - } - return false; - } - - return true; -} - GLint GLProgram::get_uniform(const std::string & uniform_name) { if (m_id > 0u)