///////////////////////////////////////////////////////////////////////////////
-// Name: src/mac/carbon/glcanvas.cpp
+// Name: src/osx/carbon/glcanvas.cpp
// Purpose: wxGLCanvas, for using OpenGL with wxWidgets under Macintosh
// Author: Stefan Csomor
// Modified by:
// Created: 1998-01-01
-// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
}
}
-void WXGLSwapBuffers( WXGLContext context )
-{
- aglSwapBuffers(context);
-}
-
WXGLContext WXGLGetCurrentContext()
{
return aglGetCurrentContext();
if ( !attribList[arg++] )
break;
- return false;
+ return NULL;
}
data[p++] = AGL_SAMPLE_BUFFERS_ARB;
if ( !attribList[arg++] )
break;
- return false;
+ return NULL;
}
data[p++] = AGL_SAMPLES_ARB;
if ( !m_glContext )
return false;
- AGLDrawable drawable = (AGLDrawable)GetWindowPort(
- MAC_WXHWND(win.MacGetTopLevelWindowRef()));
-
GLint bufnummer = win.GetAglBufferName();
aglSetInteger(m_glContext, AGL_BUFFER_NAME, &bufnummer);
//win.SetLastContext(m_glContext);
-
+
const_cast<wxGLCanvas&>(win).SetViewport();
- if ( !aglSetDrawable(m_glContext, drawable) )
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if ( UMAGetSystemVersion() >= 0x1050 )
{
- wxLogAGLError("aglSetDrawable");
- return false;
+ aglSetWindowRef(m_glContext, win.MacGetTopLevelWindowRef());
+ }
+ else
+#endif
+ {
+ AGLDrawable drawable = (AGLDrawable)GetWindowPort(
+ MAC_WXHWND(win.MacGetTopLevelWindowRef()));
+
+ if ( !aglSetDrawable(m_glContext, drawable) )
+ {
+ wxLogAGLError("aglSetDrawable");
+ return false;
+ }
}
return WXGLSetCurrentContext(m_glContext);
/*
-sharing contexts under AGL is not straightforward, to quote from
+sharing contexts under AGL is not straightforward, to quote from
http://lists.apple.com/archives/mac-opengl/2003/Jan/msg00402.html :
-In Carbon OpenGL (AGL) you would use call aglSetInteger to setup a
-buffer name and attached each context to that same name. From AGL
+In Carbon OpenGL (AGL) you would use call aglSetInteger to setup a
+buffer name and attached each context to that same name. From AGL
you can do:
GLint id = 1;
ctx1 = aglCreateContext...
aglSetInteger(ctx1, AGL_BUFFER_NAME, &id); // create name
-aglAttachDrawable (ctx1,...); // create surface with associated with
+aglAttachDrawable (ctx1,...); // create surface with associated with
name (first time)
ctx2 = aglCreateContext...
aglSetInteger(ctx2, AGL_BUFFER_NAME, &id); // uses previously created name
new surface is created) and the subsequent call to aglSetDrawable will
attach that surface. This allows multiple contexts to be attached to a single
surface. Using the default buffer name zero, returns to one surface per
-context behavior.
+context behaviour.
*/
/*
-so what I'm doing is to have a dummy aglContext attached to a wxGLCanvas,
+so what I'm doing is to have a dummy aglContext attached to a wxGLCanvas,
assign it a buffer number
*/
static GLint gCurrentBufferName = 1;
m_bufferName = gCurrentBufferName++;
- aglSetInteger (m_dummyContext, AGL_BUFFER_NAME, &m_bufferName);
-
- AGLDrawable drawable = (AGLDrawable)GetWindowPort(MAC_WXHWND(MacGetTopLevelWindowRef()));
- aglSetDrawable(m_dummyContext, drawable);
+ aglSetInteger (m_dummyContext, AGL_BUFFER_NAME, &m_bufferName);
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if ( UMAGetSystemVersion() >= 0x1050 )
+ {
+ aglSetWindowRef(m_dummyContext, MacGetTopLevelWindowRef());
+ }
+ else
+#endif
+ {
+ AGLDrawable drawable = (AGLDrawable)GetWindowPort(MAC_WXHWND(MacGetTopLevelWindowRef()));
+ aglSetDrawable(m_dummyContext, drawable);
+ }
m_macCanvasIsShown = true;
{
if ( m_glFormat )
WXGLDestroyPixelFormat(m_glFormat);
-
+
if ( m_dummyContext )
WXGLDestroyContext(m_dummyContext);
}
+bool wxGLCanvas::SwapBuffers()
+{
+ WXGLContext context = WXGLGetCurrentContext();
+ wxCHECK_MSG(context, false, wxT("should have current context"));
+
+ aglSwapBuffers(context);
+ return true;
+}
+
void wxGLCanvas::SetViewport()
{
if ( !m_needsUpdate )