diff options
author | Kenneth Russel <[email protected]> | 2005-06-01 16:13:43 +0000 |
---|---|---|
committer | Kenneth Russel <[email protected]> | 2005-06-01 16:13:43 +0000 |
commit | 2c06e5f46292ee7e3e4824527e1fe6cf6708df7b (patch) | |
tree | 91378332a81fa07594cacba2793f7bc93985bd4b /src/native | |
parent | d40e883325b81c5003e664611f72db4a6b8f6220 (diff) |
Cleaned up Mac OS X context handling. Removed incorrect retain call on
NSOpenGLContext. Removed NSOpenGLPFANoRecovery and
NSOpenGLPFAAccelerated flags from pixel format. Added
NSAutoreleasePools around Cocoa calls. Added stereo support.
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@292 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/native')
-rw-r--r-- | src/native/jogl/MacOSXWindowSystemInterface.m | 295 |
1 files changed, 144 insertions, 151 deletions
diff --git a/src/native/jogl/MacOSXWindowSystemInterface.m b/src/native/jogl/MacOSXWindowSystemInterface.m index 40a95986f..0b68ee5d4 100644 --- a/src/native/jogl/MacOSXWindowSystemInterface.m +++ b/src/native/jogl/MacOSXWindowSystemInterface.m @@ -14,10 +14,9 @@ typedef int Bool; -NSAutoreleasePool* gAutoreleasePool = NULL; - void* createContext(void* shareContext, void* view, int doubleBuffer, + int stereo, int redBits, int greenBits, int blueBits, @@ -32,164 +31,163 @@ void* createContext(void* shareContext, void* view, int numSamples, int* viewNotReady) { - int colorSize = redBits + greenBits + blueBits; - int accumSize = accumRedBits + accumGreenBits + accumBlueBits; + int colorSize = redBits + greenBits + blueBits; + int accumSize = accumRedBits + accumGreenBits + accumBlueBits; - NSOpenGLContext *nsChareCtx = (NSOpenGLContext*)shareContext; - NSView *nsView = (NSView*)view; - - if (nsView != NULL) - { - if ([nsView lockFocusIfCanDraw] == NO) - { - if (viewNotReady != NULL) { - *viewNotReady = 1; - } - - // the view is not ready yet - return NULL; - } - } + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + + NSOpenGLContext *nsChareCtx = (NSOpenGLContext*)shareContext; + NSView *nsView = (NSView*)view; + + if (nsView != NULL) { + if ([nsView lockFocusIfCanDraw] == NO) { + if (viewNotReady != NULL) { + *viewNotReady = 1; + } + + // the view is not ready yet + [pool release]; + return NULL; + } + } - if (gAutoreleasePool == NULL) - { - gAutoreleasePool = [[NSAutoreleasePool alloc] init]; - } - - NSOpenGLPixelFormatAttribute attribs[] = - { - NSOpenGLPFANoRecovery, YES, - NSOpenGLPFAAccelerated, YES, - NSOpenGLPFADoubleBuffer, YES, - NSOpenGLPFAColorSize, colorSize, - NSOpenGLPFAAlphaSize, alphaBits, - NSOpenGLPFADepthSize, depthBits, - NSOpenGLPFAStencilSize, stencilBits, - NSOpenGLPFAAccumSize, accumSize, - NSOpenGLPFASampleBuffers, sampleBuffers, - NSOpenGLPFASamples, numSamples, - 0 - }; - - - - NSOpenGLPixelFormat* fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs]; - - NSOpenGLContext* nsContext = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nsChareCtx]; - - [fmt release]; + NSOpenGLPixelFormatAttribute attribs[256]; + int idx = 0; + if (doubleBuffer) attribs[idx++] = NSOpenGLPFADoubleBuffer; + if (stereo) attribs[idx++] = NSOpenGLPFAStereo; + attribs[idx++] = NSOpenGLPFAColorSize; attribs[idx++] = colorSize; + attribs[idx++] = NSOpenGLPFAAlphaSize; attribs[idx++] = alphaBits; + attribs[idx++] = NSOpenGLPFADepthSize; attribs[idx++] = depthBits; + attribs[idx++] = NSOpenGLPFAStencilSize; attribs[idx++] = stencilBits; + attribs[idx++] = NSOpenGLPFAAccumSize; attribs[idx++] = accumSize; + attribs[idx++] = NSOpenGLPFASampleBuffers; attribs[idx++] = sampleBuffers; + attribs[idx++] = NSOpenGLPFASamples; attribs[idx++] = numSamples; + attribs[idx++] = 0; + + NSOpenGLPixelFormat* fmt = [[NSOpenGLPixelFormat alloc] + initWithAttributes:attribs]; + NSOpenGLContext* nsContext = [[NSOpenGLContext alloc] + initWithFormat:fmt + shareContext:nsChareCtx]; + [fmt release]; - if (nsView != nil) - { - [nsContext setView:nsView]; - - [nsView unlockFocus]; - } - - [nsContext retain]; - -//fprintf(stderr, " nsContext=%p\n", nsContext); - return nsContext; + if (nsView != nil) { + [nsContext setView:nsView]; + [nsView unlockFocus]; + } + + [pool release]; + return nsContext; } -Bool makeCurrentContext(void* context, void* view) -{ -//fprintf(stderr, "makeCurrentContext context=%p, view=%p\n", context, view); - NSOpenGLContext *nsContext = (NSOpenGLContext*)context; +Bool makeCurrentContext(void* context, void* view) { + NSOpenGLContext *nsContext = (NSOpenGLContext*)context; - [nsContext makeCurrentContext]; - return true; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [nsContext makeCurrentContext]; + [pool release]; + return true; } -Bool clearCurrentContext(void* context, void* view) -{ -//fprintf(stderr, "clearCurrentContext context=%p, view=%p\n", context, view); - [NSOpenGLContext clearCurrentContext]; - return true; +Bool clearCurrentContext(void* context, void* view) { + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [NSOpenGLContext clearCurrentContext]; + [pool release]; + return true; } -Bool deleteContext(void* context, void* view) -{ -//fprintf(stderr, "deleteContext context=%p, view=%p\n", context, view); - NSOpenGLContext *nsContext = (NSOpenGLContext*)context; +Bool deleteContext(void* context, void* view) { + NSOpenGLContext *nsContext = (NSOpenGLContext*)context; - [nsContext clearDrawable]; - [nsContext release]; - return true; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [nsContext clearDrawable]; + [nsContext release]; + [pool release]; + return true; } -Bool flushBuffer(void* context, void* view) -{ -//fprintf(stderr, "flushBuffer context=%p, view=%p\n", context, view); - NSOpenGLContext *nsContext = (NSOpenGLContext*)context; +Bool flushBuffer(void* context, void* view) { + NSOpenGLContext *nsContext = (NSOpenGLContext*)context; - [nsContext flushBuffer]; - return true; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [nsContext flushBuffer]; + [pool release]; + return true; } -void updateContext(void* context, void* view) -{ -//fprintf(stderr, "updateContext context=%p, view=%p\n", context, view); - NSOpenGLContext *nsContext = (NSOpenGLContext*)context; +void updateContext(void* context, void* view) { + NSOpenGLContext *nsContext = (NSOpenGLContext*)context; - [nsContext update]; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [nsContext update]; + [pool release]; } -void* updateContextRegister(void* context, void* view) -{ -//fprintf(stderr, "updateContextRegister context=%p, view=%p\n", context, view); - NSOpenGLContext *nsContext = (NSOpenGLContext*)context; - NSView *nsView = (NSView*)view; +void* updateContextRegister(void* context, void* view) { + NSOpenGLContext *nsContext = (NSOpenGLContext*)context; + NSView *nsView = (NSView*)view; - ContextUpdater *contextUpdater = [[ContextUpdater alloc] init]; - [contextUpdater registerFor:nsContext with:nsView]; - return NULL; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + ContextUpdater *contextUpdater = [[ContextUpdater alloc] init]; + [contextUpdater registerFor:nsContext with:nsView]; + [pool release]; + return NULL; } -void updateContextUnregister(void* context, void* view, void* updater) -{ -//fprintf(stderr, "updateContextUnregister context=%p, view=%p\n", context, view); - ContextUpdater *contextUpdater = (ContextUpdater *)updater; +void updateContextUnregister(void* context, void* view, void* updater) { + ContextUpdater *contextUpdater = (ContextUpdater *)updater; - [contextUpdater release]; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [contextUpdater release]; + [pool release]; } -void* createPBuffer(int renderTarget, int internalFormat, int width, int height) -{ - // fprintf(stderr, "createPBuffer renderTarget=%d internalFormat=%d width=%d height=%d\n", renderTarget, internalFormat, width, height); - - NSOpenGLPixelBuffer* pBuffer = [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:renderTarget textureInternalFormat:internalFormat textureMaxMipMapLevel:0 pixelsWide:width pixelsHigh:height]; - +void* createPBuffer(int renderTarget, int internalFormat, int width, int height) { + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + NSOpenGLPixelBuffer* pBuffer = [[NSOpenGLPixelBuffer alloc] + initWithTextureTarget:renderTarget + textureInternalFormat:internalFormat + textureMaxMipMapLevel:0 + pixelsWide:width + pixelsHigh:height]; + [pool release]; return pBuffer; } -Bool destroyPBuffer(void* context, void* buffer) -{ -//fprintf(stderr, "destroyPBuffer context=%p, buffer=%p\n", context, buffer); - NSOpenGLContext *nsContext = (NSOpenGLContext*)context; - NSOpenGLPixelBuffer *pBuffer = (NSOpenGLPixelBuffer*)buffer; +Bool destroyPBuffer(void* context, void* buffer) { + NSOpenGLContext *nsContext = (NSOpenGLContext*)context; + NSOpenGLPixelBuffer *pBuffer = (NSOpenGLPixelBuffer*)buffer; - if (nsContext != NULL) - { - [nsContext clearDrawable]; - } - [pBuffer release]; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + if (nsContext != NULL) { + [nsContext clearDrawable]; + } + [pBuffer release]; + [pool release]; - return true; + return true; } void setContextPBuffer(void* context, void* buffer) { NSOpenGLContext *nsContext = (NSOpenGLContext*)context; NSOpenGLPixelBuffer *pBuffer = (NSOpenGLPixelBuffer*)buffer; - [nsContext setPixelBuffer: pBuffer cubeMapFace: 0 mipMapLevel: 0 currentVirtualScreen: [nsContext currentVirtualScreen]]; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [nsContext setPixelBuffer: pBuffer + cubeMapFace: 0 + mipMapLevel: 0 + currentVirtualScreen: [nsContext currentVirtualScreen]]; + [pool release]; } void setContextTextureImageToPBuffer(void* context, void* buffer, int colorBuffer) { NSOpenGLContext *nsContext = (NSOpenGLContext*)context; NSOpenGLPixelBuffer *pBuffer = (NSOpenGLPixelBuffer*)buffer; - [nsContext setTextureImageToPixelBuffer: pBuffer colorBuffer: (unsigned long) colorBuffer]; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + [nsContext setTextureImageToPixelBuffer: pBuffer + colorBuffer: (unsigned long) colorBuffer]; + [pool release]; } #include <mach-o/dyld.h> @@ -198,39 +196,34 @@ static char libGLStr[] = "/System/Library/Frameworks/OpenGL.framework/Libraries/ static char libGLUStr[] = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib"; static const struct mach_header *libGLImage; static const struct mach_header *libGLUImage; -void* getProcAddress(const char *procname) -{ - if (imagesInitialized == false) - { - imagesInitialized = true; - unsigned long options = NSADDIMAGE_OPTION_RETURN_ON_ERROR; - libGLImage = NSAddImage(libGLStr, options); - libGLUImage = NSAddImage(libGLUStr, options); - } - - unsigned long options = NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR; - char underscoreName[512] = "_"; - strcat(underscoreName, procname); - - if (NSIsSymbolNameDefinedInImage(libGLImage, underscoreName) == YES) - { - NSSymbol sym = NSLookupSymbolInImage(libGLImage, underscoreName, options); - return NSAddressOfSymbol(sym); - } - - if (NSIsSymbolNameDefinedInImage(libGLUImage, underscoreName) == YES) - { - NSSymbol sym = NSLookupSymbolInImage(libGLUImage, underscoreName, options); - return NSAddressOfSymbol(sym); - } - - if (NSIsSymbolNameDefinedWithHint(underscoreName, "GL")) - { - NSSymbol sym = NSLookupAndBindSymbol(underscoreName); - return NSAddressOfSymbol(sym); - } - - return NULL; +void* getProcAddress(const char *procname) { + if (imagesInitialized == false) { + imagesInitialized = true; + unsigned long options = NSADDIMAGE_OPTION_RETURN_ON_ERROR; + libGLImage = NSAddImage(libGLStr, options); + libGLUImage = NSAddImage(libGLUStr, options); + } + + unsigned long options = NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR; + char underscoreName[512] = "_"; + strcat(underscoreName, procname); + + if (NSIsSymbolNameDefinedInImage(libGLImage, underscoreName) == YES) { + NSSymbol sym = NSLookupSymbolInImage(libGLImage, underscoreName, options); + return NSAddressOfSymbol(sym); + } + + if (NSIsSymbolNameDefinedInImage(libGLUImage, underscoreName) == YES) { + NSSymbol sym = NSLookupSymbolInImage(libGLUImage, underscoreName, options); + return NSAddressOfSymbol(sym); + } + + if (NSIsSymbolNameDefinedWithHint(underscoreName, "GL")) { + NSSymbol sym = NSLookupAndBindSymbol(underscoreName); + return NSAddressOfSymbol(sym); + } + + return NULL; } void setSwapInterval(void* context, int interval) { |