def test_freeing(self): " Test if the shaders are freed correctly" vert_obj = ShaderObject.vertex() # Warning, borrowed_obj do not own the underlying shader so it will not be freed automatically borrowed_obj = ShaderObject(glCreateShader(GL_VERTEX_SHADER), owned=False) borrowed_sid = borrowed_obj.sid sid = vert_obj.sid del vert_obj del borrowed_obj gc.collect() self.assertEqual(GL_FALSE, glIsShader(sid), 'shader object is still valid') self.assertEqual(GL_TRUE, glIsShader(borrowed_sid), 'shader object was deleted') #Free the shader object glDeleteShader(borrowed_sid)
def check_shader_or_program_status(obj): '''checks if the given shader or program object has been compiled or linked successfully. Raises an exception if not and deletes the object. Returns the object otherwise''' if gl.glIsShader(obj): getiv = gl.glGetShaderiv getlog = gl.glGetShaderInfoLog statusflag = gl.GL_COMPILE_STATUS delete = gl.glDeleteShader ErrorClass = ShaderCompileError elif gl.glIsProgram(obj): getiv = gl.glGetProgramiv getlog = gl.glGetProgramInfoLog statusflag = gl.GL_LINK_STATUS delete = gl.glDeleteProgram ErrorClass = ProgramLinkError else: raise ValueError('object {} neither shader nor prorgam'.format(obj)) ok = c_int(0) getiv(obj, statusflag, byref(ok)) if not ok: errlen = c_int(0) getiv(obj, gl.GL_INFO_LOG_LENGTH, byref(errlen)) errlen = errlen.value if errlen <= 0: error = 'unknown error' else: log = ctypes.create_string_buffer('', errlen) getlog(obj, errlen, None, log) error = log.value delete(obj) raise ErrorClass(error) else: return obj
def valid(self): """ Check if the underlying shader is valid. Return True if it is, False otherwise. """ return glIsShader(self.sid) == GL_TRUE