static CVReturn OutputCallback(IntPtr displayLink, ref CVTimeStamp inNow, ref CVTimeStamp inOutputTime, CVOptionFlags flagsIn, ref CVOptionFlags flagsOut, IntPtr displayLinkContext) { GCHandle callbackHandle = GCHandle.FromIntPtr(displayLinkContext); DisplayLinkOutputCallback func = (DisplayLinkOutputCallback)callbackHandle.Target; CVDisplayLink delegateDisplayLink = new CVDisplayLink(displayLink, false); return(func(delegateDisplayLink, ref inNow, ref inOutputTime, flagsIn, ref flagsOut)); }
private void SetupDisplayLink() { if (displayLink != null) return; // Create a display link capable of being used with all active displays displayLink = new CVDisplayLink (); // Set the renderer output callback function displayLink.SetOutputCallback (MyDisplayLinkOutputCallback); // Set the display link for the current renderer CGLContext cglContext = openGLContext.CGLContext; CGLPixelFormat cglPixelFormat = PixelFormat.CGLPixelFormat; displayLink.SetCurrentDisplay (cglContext, cglPixelFormat); }
// Private Callback function for CVDisplayLink private CVReturn MyDisplayLinkOutputCallback(CVDisplayLink displayLink, ref CVTimeStamp inNow, ref CVTimeStamp inOutputTime, CVOptionFlags flagsIn, ref CVOptionFlags flagsOut) { //CVReturn result = GetFrameForTime (inOutputTime); CVReturn result = CVReturn.Error; // There is no autorelease pool when this method is called because it will be called from a background thread // It's important to create one or you will leak objects using (NSAutoreleasePool pool = new NSAutoreleasePool ()) { // Update the animation BeginInvokeOnMainThread (RenderScene); result = CVReturn.Success; } return result; }
// Clean up the notifications private void DeAllocate() { Stop (); displayLink = null; NSNotificationCenter.DefaultCenter.RemoveObserver (notificationProxy); }
static CVReturn OutputCallback (IntPtr displayLink, ref CVTimeStamp inNow, ref CVTimeStamp inOutputTime, CVOptionFlags flagsIn, ref CVOptionFlags flagsOut, IntPtr displayLinkContext) { GCHandle callbackHandle = GCHandle.FromIntPtr (displayLinkContext); DisplayLinkOutputCallback func = (DisplayLinkOutputCallback) callbackHandle.Target; CVDisplayLink delegateDisplayLink = new CVDisplayLink(displayLink, false); return func (delegateDisplayLink, ref inNow, ref inOutputTime, flagsIn, ref flagsOut); }