[Mono-osx] [MonoMac] OpenGL OpenTK proposal / compromise

kjpou kjpou at pt.lu
Sun Feb 13 09:47:58 EST 2011


Hello all

Have spent the last two days working on the OpenTK.  Ended in 
frustration basically.

Here is what I have:

OpenTK.Graphics.CoreOpenGL

Basically all the mappings, delegates, helper methods, ErrorHelper.  It 
was a copy from the windows OpenTK.Graphics.OpenGL.  The bindings are 
all there and can load them all from a CglContext which is a new 
Platform backend OpenGL context I created.

There are something like 2700 method bindings that are delivered with 
the Windows OpenGL implementation of which only about 600 are used on 
the mac.

I have a platform backend hacked together.  When I say hacked I mean 
hacked but it all loads fine.  No GUI implementation as it uses the 
current context created from NSOpenGLContext.  That part works.

OpenTK.Platform.MacOS

-> CocoaBindings
---> Cgl

-> CglContext
-> CocoaApplication
-> CocoaGLNative
-> CocoaWindowInfo

You can create a context.

                         OpenTK.Platform.IWindowInfo windowInfo
                                 = 
OpenTK.Platform.Utilities.CreateMacOSCocoaWindowInfo( mGLContext.Handle );

                         OpenTK.ContextHandle handle = new 
OpenTK.ContextHandle( mGLContext.Handle );

                         OpenTK.Graphics.GraphicsContext context =
                                 new 
OpenTK.Graphics.GraphicsContext(handle, windowInfo);

                        context.MakeCurrent( windowInfo );

When it starts calling the Delegates for example.

                         ErrorCode theError = ErrorCode.NoError;
                         theError = GL.GetError ();
                         GL.ReadBuffer (ReadBufferMode.Front);

It is erroring out with errors for the native bindings which I can not 
figure out because of the all the Delegate calls.  If you call the 
GLCore methods directly it all works fine but using the OpenTK Delegate 
way it is not working.

If someone wants to take what I have and try to get it all working you 
are more than welcome.  Either way those 600 +/- OpenGL calls are going 
to have to be gone through and culled out.

In about one hour I ripped all the mappings from the OpenTK for Cocoa 
that I wrote and placed them in a separate project with some small 
modifications and got two MonoMac OpenGL samples working.  One hour vs 
two days hummmm really a no brainer there for where I would prefer to 
spend my time.

I am in the process of going through by hand and only implementing those 
600 or so methods by hand to get a MonoMac.CoreOpenGL bindings working 
based on that one hours work.  Basing it on what I learned from the 
OpenTK I can have it mapping exactly the same way so if someone gets the 
OpenTK working it should be just a change of library.  What I mean by 
that is that all one would have to do to use the OpenTK is include it in 
the project because the naming of the parameters will be exactly the 
same as those you will already be using for the MonoMac.CoreOpenGL bindings.

So the following code below would work with OpenTK as well as the 
MonoMac.CoreOpenGL bindings.  Technically the same code would work for 
any other OpenTK based program as well.

                         ErrorCode theError = ErrorCode.NoError;

                         // select front buffer as our source for pixel data
                         GL.ReadBuffer (ReadBufferMode.Front);

                         //Read OpenGL context pixels directly.

                         // For extra safety, save & restore OpenGL 
states that are changed
                         GL.PushClientAttrib 
(ClientAttribMask.ClientPixelStoreBit);

                         GL.PixelStore 
(PixelStoreParameter.PackAlignment, 4); /* Force 4-byte alignment */
                         GL.PixelStore 
(PixelStoreParameter.PackRowLength, 0);
                         GL.PixelStore 
(PixelStoreParameter.PackSkipRows, 0);
                         GL.PixelStore 
(PixelStoreParameter.PackSkipPixels, 0);
                         // Read a block of pixels from the frame buffer
                         GL.ReadPixels (0, 0, bufferWidth, bufferHeight, 
PixelFormat.Bgra, PixelType.UnsignedInt8888Reversed, buffer);

                         GL.PopClientAttrib ();

                         theError = GL.GetError ();
                         if (theError != ErrorCode.NoError)
                                 Console.WriteLine ("OpenGL error {0}", 
theError);


Now before I go through with this would like to know if this is an 
acceptable compromise and would it be worth the effort to be included 
within the MonoMac bindings.

If you want the code that I have begun for OpenTK let me know.

Kenneth










More information about the Mono-osx mailing list