// loadVolatile will create the framebuffer and return true if successful func (canvas *Canvas) loadVolatile() bool { canvas.status = gl.FRAMEBUFFER_COMPLETE // glTexImage2D is guaranteed to error in this case. if canvas.width > maxTextureSize || canvas.height > maxTextureSize { canvas.status = gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT return false } canvas.Texture = newTexture(canvas.width, canvas.height, false) //NULL means reserve texture memory, but texels are undefined gl.TexImage2D(gl.TEXTURE_2D, 0, int(canvas.width), int(canvas.height), gl.RGBA, gl.UNSIGNED_BYTE, nil) if gl.GetError() != gl.NO_ERROR { canvas.Texture.Release() canvas.status = gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT return false } canvas.fbo, canvas.status = newFBO(canvas.getHandle()) if canvas.status != gl.FRAMEBUFFER_COMPLETE { if canvas.fbo.Valid() { gl.DeleteFramebuffer(canvas.fbo) canvas.fbo = gl.Framebuffer{} } return false } return true }
// unLoadVolatile will release the texture, framebuffer and depth buffer func (canvas *Canvas) unLoadVolatile() { if gl_state.currentCanvas == canvas { canvas.stopGrab(false) } gl.DeleteFramebuffer(canvas.fbo) gl.DeleteRenderbuffer(canvas.depth_stencil) canvas.fbo = gl.Framebuffer{} canvas.depth_stencil = gl.Renderbuffer{} canvas.attachedCanvases = []*Canvas{} canvas.Texture.Release() }