public void Update(IWindowInfo window) { SetDrawable(window); SetBufferRect(window); Agl.aglUpdateContext(Handle.Handle); }
GraphicsMode GetGraphicsModeFromPixelFormat(IntPtr pixelformat) { int r, g, b, a; Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_RED_SIZE, out r); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_GREEN_SIZE, out g); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_BLUE_SIZE, out b); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_ALPHA_SIZE, out a); int ar, ag, ab, aa; Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_ACCUM_ALPHA_SIZE, out aa); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_ACCUM_RED_SIZE, out ar); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_ACCUM_GREEN_SIZE, out ag); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_ACCUM_BLUE_SIZE, out ab); int depth, stencil, samples, buffers, stereo; Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_DEPTH_SIZE, out depth); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_STENCIL_SIZE, out stencil); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_SAMPLES_ARB, out samples); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_DOUBLEBUFFER, out buffers); Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_STEREO, out stereo); return(new GraphicsMode(new ColorFormat(r, g, b, a), depth, stencil, samples, new ColorFormat(ar, ag, ab, aa), buffers + 1, stereo != 0)); }
public void MakeCurrent(IWindowInfo window) { if (Agl.aglSetCurrentContext(Handle.Handle) == false) { MyAGLReportError("aglSetCurrentContext"); } }
void SetBufferRect(IWindowInfo carbonWindow) { Rect rect = API.GetControlBounds(carbonWindow.Handle); Debug.Print("Setting buffer_rect for control."); Debug.Print("MacOS Coordinate Rect: {0}", rect); int[] glrect = new int[4]; if (XOffset != null) { glrect[0] = rect.X + XOffset(); } else { glrect[0] = rect.X; } if (YOffset != null) { glrect[1] = rect.Y + YOffset(); } else { glrect[1] = rect.Y; } glrect[2] = rect.Width; glrect[3] = rect.Height; Agl.aglSetInteger(Handle.Handle, Agl.ParameterNames.AGL_BUFFER_RECT, glrect); MyAGLReportError("aglSetInteger"); Agl.aglEnable(Handle.Handle, Agl.ParameterNames.AGL_BUFFER_RECT); MyAGLReportError("aglEnable"); }
void SetDrawable(IWindowInfo carbonWindow) { IntPtr windowPort = GetWindowPortForWindowInfo(carbonWindow); //Debug.Print("Setting drawable for context {0} to window port: {1}", Handle.Handle, windowPort); Agl.aglSetDrawable(Handle.Handle, windowPort); MyAGLReportError("aglSetDrawable"); }
void MyAGLReportError(string function) { Agl.AglError err = Agl.GetError(); if (err != Agl.AglError.NoError) { throw new Exception(String.Format( "AGL Error from function {0}: {1} {2}", function, err, Agl.ErrorString(err))); } }
public void SwapBuffers() { // this is part of the hack to avoid dropping the first frame when // using multiple GLControls. if (firstSwap) { Debug.WriteLine("--> Resetting drawable. <--"); firstSwap = false; SetDrawable(carbonWindow); Update(carbonWindow); } Agl.aglSwapBuffers(Handle.Handle); MyAGLReportError("aglSwapBuffers"); }
void Dispose(bool disposing) { if (IsDisposed || Handle.Handle == IntPtr.Zero) { return; } Debug.Print("Disposing of AGL context."); Agl.aglSetCurrentContext(IntPtr.Zero); //Debug.Print("Setting drawable to null for context {0}.", Handle.Handle); //Agl.aglSetDrawable(Handle.Handle, IntPtr.Zero); // I do not know MacOS allows us to destroy a context from a separate thread, // like the finalizer thread. It's untested, but worst case is probably // an exception on application exit, which would be logged to the console. // Actually, it seems to crash the mono runtime. -AMK 2013 Debug.Print("Destroying context"); if (Agl.aglDestroyContext(Handle.Handle) == true) { Debug.Print("Context destruction completed successfully."); Handle = ContextHandle.Zero; return; } // failed to destroy context. Debug.WriteLine("Failed to destroy context."); Debug.WriteLine(Agl.ErrorString(Agl.GetError())); // don't throw an exception from the finalizer thread. if (disposing) { throw new Exception(Agl.ErrorString(Agl.GetError())); } disposed = true; }
void CreateContext(GraphicsMode mode, IWindowInfo carbonWindow, IntPtr shareContextRef, bool fullscreen) { Debug.Print("AGL pixel format attributes:"); // Choose a pixel format with the attributes we specified. AGLPixelFormat pixelformat; AglGraphicsMode selector = new AglGraphicsMode(); Mode = selector.SelectGraphicsMode( mode.ColorFormat, mode.Depth, mode.Stencil, mode.Samples, mode.AccumulatorFormat, mode.Buffers, mode.Stereo, out pixelformat); MyAGLReportError("aglChoosePixelFormat"); Debug.Print("Creating AGL context. Sharing with {0}", shareContextRef); // create the context and share it with the share reference. Handle = new ContextHandle(Agl.aglCreateContext(pixelformat, shareContextRef)); MyAGLReportError("aglCreateContext"); // Free the pixel format from memory. Agl.aglDestroyPixelFormat(pixelformat); MyAGLReportError("aglDestroyPixelFormat"); SetDrawable(carbonWindow); SetBufferRect(carbonWindow); Update(carbonWindow); MakeCurrent(carbonWindow); Debug.Print("context: {0}", Handle.Handle); dummyContext = new GraphicsContext(Handle, GetAddress, delegate() { return(new ContextHandle(Agl.aglGetCurrentContext())); }); }
public GraphicsMode SelectGraphicsMode(ColorFormat color, int depth, int stencil, int samples, ColorFormat accum, int buffers, bool stereo, out IntPtr pixelformat) { do { pixelformat = SelectPixelFormat( color, depth, stencil, samples, accum, buffers, stereo); if (pixelformat == IntPtr.Zero) { if (!RelaxGraphicsMode( ref color, ref depth, ref stencil, ref samples, ref accum, ref buffers, ref stereo)) { throw new GraphicsModeException("Requested GraphicsMode not available, error: " + Agl.GetError()); } } }while (pixelformat == IntPtr.Zero); return(GetGraphicsModeFromPixelFormat(pixelformat)); }
IntPtr SelectPixelFormat(ColorFormat color, int depth, int stencil, int samples, ColorFormat accum, int buffers, bool stereo) { List <int> attribs = new List <int>(); Debug.Print("Bits per pixel: {0}", color.BitsPerPixel); if (color.BitsPerPixel > 0) { if (!color.IsIndexed) { attribs.Add((int)Agl.PixelFormatAttribute.AGL_RGBA); } attribs.Add((int)Agl.PixelFormatAttribute.AGL_RED_SIZE); attribs.Add(color.Red); attribs.Add((int)Agl.PixelFormatAttribute.AGL_GREEN_SIZE); attribs.Add(color.Green); attribs.Add((int)Agl.PixelFormatAttribute.AGL_BLUE_SIZE); attribs.Add(color.Blue); attribs.Add((int)Agl.PixelFormatAttribute.AGL_ALPHA_SIZE); attribs.Add(color.Alpha); } Debug.Print("Depth: {0}", depth); if (depth > 0) { attribs.Add((int)Agl.PixelFormatAttribute.AGL_DEPTH_SIZE); attribs.Add(depth); } if (buffers > 1) { attribs.Add((int)Agl.PixelFormatAttribute.AGL_DOUBLEBUFFER); } if (stencil > 0) { attribs.Add((int)Agl.PixelFormatAttribute.AGL_STENCIL_SIZE); attribs.Add(stencil); } if (accum.BitsPerPixel > 0) { attribs.Add((int)Agl.PixelFormatAttribute.AGL_ACCUM_ALPHA_SIZE); attribs.Add(accum.Alpha); attribs.Add((int)Agl.PixelFormatAttribute.AGL_ACCUM_BLUE_SIZE); attribs.Add(accum.Blue); attribs.Add((int)Agl.PixelFormatAttribute.AGL_ACCUM_GREEN_SIZE); attribs.Add(accum.Green); attribs.Add((int)Agl.PixelFormatAttribute.AGL_ACCUM_RED_SIZE); attribs.Add(accum.Red); } if (samples > 0) { attribs.Add((int)Agl.PixelFormatAttribute.AGL_SAMPLE_BUFFERS_ARB); attribs.Add(1); attribs.Add((int)Agl.PixelFormatAttribute.AGL_SAMPLES_ARB); attribs.Add(samples); } if (stereo) { attribs.Add((int)Agl.PixelFormatAttribute.AGL_STEREO); } attribs.Add(0); attribs.Add(0); IntPtr pixelformat = Agl.aglChoosePixelFormat(IntPtr.Zero, 0, attribs.ToArray()); return(pixelformat); }