From 7e55045d108e6dc22b2a3d5476de7a5a275d181a Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 14 Nov 2015 22:13:56 -0800 Subject: [PATCH] [Renderer] Lots of clean up for OpenGLView.renderAtTime() Lock and unlock and make current the view's context. Do some weak error handling. --- Renderer/OpenGLView.swift | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Renderer/OpenGLView.swift b/Renderer/OpenGLView.swift index f5d8a9f..c6e43ff 100644 --- a/Renderer/OpenGLView.swift +++ b/Renderer/OpenGLView.swift @@ -11,11 +11,14 @@ import Cocoa import OpenGL import CoreVideo -class OpenGLView: NSOpenGLView { +public class OpenGLView: NSOpenGLView { private var didSetupOpenGL = false private var displayLink: CVDisplayLink? = nil - override func viewWillMoveToSuperview(newSuperview: NSView?) { + // TODO: Should this be weak? + public var renderer: FrameRenderer? = nil + + override public func viewWillMoveToSuperview(newSuperview: NSView?) { if newSuperview != nil { setupOpenGL() startRenderingLoop() @@ -70,7 +73,7 @@ class OpenGLView: NSOpenGLView { optionsOut: UnsafeMutablePointer) -> CVReturn in var result = kCVReturnSuccess autoreleasepool { - result = self._renderAtTime(currentTime.memory) + result = self.renderAtTime(currentTime.memory) } return result } @@ -95,7 +98,28 @@ class OpenGLView: NSOpenGLView { displayLink = nil } - private func _renderAtTime(time: CVTimeStamp) -> CVReturn { + private func renderAtTime(time: CVTimeStamp) -> CVReturn { + let context: NSOpenGLContext! = self.openGLContext + + guard context != nil else { + // TODO: Throw an error? Log something? + return kCVReturnError + } + guard renderer != nil else { + // This is actually okay, we just don't render anything. + return kCVReturnSuccess + } + + context.makeCurrentContext() + // TODO: OpenGLContext.clearCurrentContext()? + + CGLLockContext(context.CGLContextObj) + defer { CGLUnlockContext(context.CGLContextObj) } + + // Render the frame. + renderer!.renderAtTime(time) + context.flushBuffer() + return kCVReturnSuccess } } \ No newline at end of file