def _compile(self): if self.shader: return if self.compiling: return self.compiling = True self.shader = gl.glCreateShaderObjectARB(self.shaderType()) if self.shader == 0: raise GLSLException('faled to create shader object') prog = c_char_p(self.prog) length = c_int(-1) gl.glShaderSourceARB(self.shader, 1, cast(byref(prog), POINTER(POINTER(c_char))), byref(length)) gl.glCompileShaderARB(self.shader) self.compiling = False compile_status = c_int(0) gl.glGetObjectParameterivARB(self.shader, gl.GL_OBJECT_COMPILE_STATUS_ARB, byref(compile_status)) if not compile_status.value: err = glsl_log(self.shader) gl.glDeleteObjectARB(self.shader) self.shader = 0 raise GLSLException('failed to compile shader', err)
def link(self): if self.vertex_shader is not None: self.vertex_shader.compileFlat() if self.fragment_shader is not None: self.fragment_shader.compileFlat() self.program = gl.glCreateProgramObjectARB() if self.program == 0: raise GLSLException('failed to create program object') if self.vertex_shader is not None: self.vertex_shader.attachFlat(self.program) if self.fragment_shader is not None: self.fragment_shader.attachFlat(self.program) gl.glLinkProgramARB(self.program) link_status = c_int(0) gl.glGetObjectParameterivARB(self.program, gl.GL_OBJECT_LINK_STATUS_ARB, byref(link_status)) if link_status.value == 0: err = glsl_log(self.program) gl.glDeleteObjectARB(self.program) self.program = 0 raise GLSLException('failed to link shader', err) self.__class__._uloc_ = {} self.__class__._vloc_ = {} return self.program
def compileFlat(self): if self.isCompiled(): return self.shader = gl.glCreateShaderObjectARB(self.shaderType()) if self.shader == 0: raise GLSLException('faled to create shader object') all_source = [b'\n'.join(self._source())] prog = (c_char_p * len(all_source))(*all_source) length = (c_int * len(all_source))(-1) gl.glShaderSourceARB(self.shader, len(all_source), cast(prog, POINTER(POINTER(c_char))), length) gl.glCompileShaderARB(self.shader) compile_status = c_int(0) gl.glGetObjectParameterivARB(self.shader, gl.GL_OBJECT_COMPILE_STATUS_ARB, byref(compile_status)) if not compile_status.value: err = glsl_log(self.shader) gl.glDeleteObjectARB(self.shader) self.shader = 0 raise GLSLException('failed to compile shader', err)
def _compile(self): if self.shader: return if self.compiling: return self.compiling = True self.shader = gl.glCreateShaderObjectARB(self.shaderType()) if self.shader == 0: raise GLSLException('faled to create shader object') prog = c_char_p(self.prog) length = c_int(-1) gl.glShaderSourceARB(self.shader, 1, cast(byref(prog), POINTER(POINTER(c_char))), byref(length)) gl.glCompileShaderARB(self.shader) self.compiling = False compile_status = c_int(0) gl.glGetObjectParameterivARB(self.shader, gl.GL_OBJECT_COMPILE_STATUS_ARB, byref(compile_status)) if not compile_status.value: err = glsl_log(self.shader) gl.glDeleteObjectARB(self.shader) self.shader = 0 raise GLSLException('failed to compile shader', err)
def link(self): if self.vertex_shader is not None: self.vertex_shader.compileFlat() if self.fragment_shader is not None: self.fragment_shader.compileFlat() self.program = gl.glCreateProgramObjectARB() if self.program == 0: raise GLSLException('failed to create program object') if self.vertex_shader is not None: self.vertex_shader.attachFlat(self.program) if self.fragment_shader is not None: self.fragment_shader.attachFlat(self.program) gl.glLinkProgramARB(self.program) link_status = c_int(0) gl.glGetObjectParameterivARB(self.program, gl.GL_OBJECT_LINK_STATUS_ARB, byref(link_status)) if link_status.value == 0: err = glsl_log(self.program) gl.glDeleteObjectARB(self.program) self.program = 0 raise GLSLException('failed to link shader', err) self.__class__._uloc_ = {} self.__class__._vloc_ = {} return self.program
def compileFlat(self): if self.isCompiled(): return self.shader = gl.glCreateShaderObjectARB(self.shaderType()) if self.shader == 0: raise GLSLException('faled to create shader object') all_source = [b'\n'.join(self._source())] prog = (c_char_p * len(all_source))(*all_source) length = (c_int * len(all_source))(-1) gl.glShaderSourceARB(self.shader, len(all_source), cast(prog, POINTER(POINTER(c_char))), length) gl.glCompileShaderARB(self.shader) compile_status = c_int(0) gl.glGetObjectParameterivARB(self.shader, gl.GL_OBJECT_COMPILE_STATUS_ARB, byref(compile_status)) if not compile_status.value: err = glsl_log(self.shader) gl.glDeleteObjectARB(self.shader) self.shader = 0 raise GLSLException('failed to compile shader', err)
def glsl_log(handle): if handle == 0: return '' log_len = c_int(0) gl.glGetObjectParameterivARB(handle, gl.GL_OBJECT_INFO_LOG_LENGTH_ARB, byref(log_len)) if log_len.value == 0: return '' log = create_string_buffer(log_len.value) # does log_len include the NUL? chars_written = c_int(0) gl.glGetInfoLogARB(handle, log_len.value, byref(chars_written), log) return log.value
def glsl_log(handle): if handle == 0: return '' log_len = c_int(0) gl.glGetObjectParameterivARB(handle, gl.GL_OBJECT_INFO_LOG_LENGTH_ARB, byref(log_len)) if log_len.value == 0: return '' log = create_string_buffer(log_len.value) # does log_len include the NUL? chars_written = c_int(0) gl.glGetInfoLogARB(handle, log_len.value, byref(chars_written), log) return log.value