4 #include <ivorium_config.hpp>
19 if( this->_program_id )
22 this->_program_id = glCreateProgram();
24 if( this->_program_id == 0 )
33 #if IV_ENABLE_TRANSFORM_FEEDBACK
34 glTransformFeedbackVaryings( this->_program_id, 1, &name, GL_INTERLEAVED_ATTRIBS );
41 if( !this->_program_id )
50 if( this->_vertex_id )
60 constexpr
size_t bufcap = 256;
62 in.read( buf, bufcap );
63 source.append( buf, in.gcount() );
66 char const * src_dta = source.c_str();
67 int const src_len = source.size();
70 this->_vertex_id = glCreateShader( GL_VERTEX_SHADER );
73 glShaderSource( this->_vertex_id, 1, &src_dta, &src_len );
76 glCompileShader( this->_vertex_id );
80 glGetShaderiv( this->_vertex_id, GL_COMPILE_STATUS, &compiled );
81 if( compiled == GL_FALSE )
84 glDeleteShader( this->_vertex_id );
89 glAttachShader( this->_program_id, this->_vertex_id );
97 if( !this->_program_id )
106 if( this->_fragment_id )
116 constexpr
size_t bufcap = 256;
118 in.read( buf, bufcap );
119 source.append( buf, in.gcount() );
122 char const * src_dta = source.c_str();
123 int const src_len = source.size();
126 this->_fragment_id = glCreateShader( GL_FRAGMENT_SHADER );
129 glShaderSource( this->_fragment_id, 1, &src_dta, &src_len );
132 glCompileShader( this->_fragment_id );
136 glGetShaderiv( this->_fragment_id, GL_COMPILE_STATUS, &compiled );
137 if( compiled == GL_FALSE )
140 glDeleteShader( this->_fragment_id );
141 this->_fragment_id = 0;
145 glAttachShader( this->_program_id, this->_fragment_id );
153 if( !this->_program_id )
165 glBindAttribLocation( this->_program_id, location, attrib_name );
173 if( !this->_program_id )
183 glLinkProgram( this->_program_id );
187 glGetProgramiv( this->_program_id, GL_LINK_STATUS, &linked );
188 if( linked == GL_FALSE )
192 glDeleteProgram( this->_program_id );
193 this->_program_id = 0;
194 this->_linked =
false;
196 if( this->_vertex_id )
197 glDeleteShader( this->_vertex_id ),
198 this->_vertex_id = 0;
200 if( this->_fragment_id )
201 glDeleteShader( this->_fragment_id ),
202 this->_fragment_id = 0;
206 if( this->_vertex_id )
207 glDetachShader( this->_program_id, this->_vertex_id ),
208 glDeleteShader( this->_vertex_id ),
209 this->_vertex_id = 0;
211 if( this->_fragment_id )
212 glDetachShader( this->_program_id, this->_fragment_id ),
213 glDeleteShader( this->_fragment_id ),
214 this->_fragment_id = 0;
217 this->_linked =
true;
225 if( !this->_program_id )
228 if( this->_vertex_id )
229 glDetachShader( this->_program_id, this->_vertex_id ),
230 glDeleteShader( this->_vertex_id ),
231 this->_vertex_id = 0;
233 if( this->_fragment_id )
234 glDetachShader( this->_program_id, this->_fragment_id ),
235 glDeleteShader( this->_fragment_id ),
236 this->_fragment_id = 0;
238 glDeleteProgram( this->_program_id );
239 this->_program_id = 0;
240 this->_linked =
false;
248 this->_vertex_id = 0;
249 this->_fragment_id = 0;
250 this->_program_id = 0;
251 this->_linked =
false;
254 std::string GlProgram::ExtractShaderInfoLog( GLuint shader )
257 glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &msg_len );
258 GLchar * msg =
new GLchar[ msg_len ];
259 glGetShaderInfoLog( shader, msg_len,
nullptr, msg );
260 std::string message( msg, msg_len );
265 std::string GlProgram::ExtractProgramInfoLog( GLuint program )
268 glGetProgramiv( program, GL_INFO_LOG_LENGTH, &msg_len );
269 GLchar * msg =
new GLchar[ msg_len ];
270 glGetProgramInfoLog( program, msg_len,
nullptr, msg );
271 std::string message( msg );
278 if( this->_program_id && this->_linked )
279 return this->_program_id;
286 auto result = glGetUniformLocation( this->_program_id, name );