src/video/cocoa/SDL_cocoaopengl.m
author Sam Lantinga <slouken@libsdl.org>
Mon, 10 Mar 2014 19:59:06 -0700
changeset 8604 459bd7365e9d
parent 8601 4c04c7785cba
child 8986 1c81316ac642
permissions -rw-r--r--
Fixed Mac OS X OpenGL context creation to match other backends, where we only care about the actual version we request if it's 3.0 or newer or a special profile context.
Eventually we'll probably move the version checking to higher level code and report the actual version of context that got created, but to avoid breakage we'll leave it like this for now.
slouken@1936
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@8149
     3
  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
slouken@1936
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@1936
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@1936
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@1936
    20
*/
icculus@8093
    21
#include "../../SDL_internal.h"
slouken@1936
    22
slouken@1936
    23
/* NSOpenGL implementation of SDL OpenGL support */
slouken@1936
    24
slouken@1952
    25
#if SDL_VIDEO_OPENGL_CGL
slouken@6044
    26
#include "SDL_cocoavideo.h"
jorgen@7594
    27
#include "SDL_cocoaopengl.h"
slouken@6044
    28
slouken@1936
    29
#include <OpenGL/CGLTypes.h>
slouken@2738
    30
#include <OpenGL/OpenGL.h>
slouken@3570
    31
#include <OpenGL/CGLRenderers.h>
slouken@1936
    32
slouken@1936
    33
#include "SDL_loadso.h"
slouken@1936
    34
#include "SDL_opengl.h"
slouken@1936
    35
icculus@6567
    36
#define DEFAULT_OPENGL  "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib"
slouken@1936
    37
icculus@8276
    38
#ifndef NSOpenGLPFAOpenGLProfile
icculus@8276
    39
#define NSOpenGLPFAOpenGLProfile 99
slouken@6952
    40
#endif
icculus@8276
    41
#ifndef NSOpenGLProfileVersionLegacy
icculus@8276
    42
#define NSOpenGLProfileVersionLegacy 0x1000
slouken@6952
    43
#endif
icculus@8276
    44
#ifndef NSOpenGLProfileVersion3_2Core
icculus@8276
    45
#define NSOpenGLProfileVersion3_2Core 0x3200
icculus@6567
    46
#endif
icculus@6567
    47
jorgen@7594
    48
@implementation SDLOpenGLContext : NSOpenGLContext
jorgen@7594
    49
jorgen@7594
    50
- (id)initWithFormat:(NSOpenGLPixelFormat *)format
jorgen@7594
    51
        shareContext:(NSOpenGLContext *)share
jorgen@7594
    52
{
jorgen@7595
    53
    self = [super initWithFormat:format shareContext:share];
jorgen@7595
    54
    if (self) {
jorgen@7595
    55
        SDL_AtomicSet(&self->dirty, 0);
jorgen@7595
    56
        self->window = NULL;
jorgen@7595
    57
    }
jorgen@7595
    58
    return self;
jorgen@7594
    59
}
jorgen@7594
    60
jorgen@7594
    61
- (void)scheduleUpdate
jorgen@7594
    62
{
jorgen@7594
    63
    SDL_AtomicAdd(&self->dirty, 1);
jorgen@7594
    64
}
jorgen@7594
    65
jorgen@7594
    66
/* This should only be called on the thread on which a user is using the context. */
jorgen@7594
    67
- (void)updateIfNeeded
jorgen@7594
    68
{
jorgen@7594
    69
    int value = SDL_AtomicSet(&self->dirty, 0);
jorgen@7594
    70
    if (value > 0) {
jorgen@7594
    71
        /* We call the real underlying update here, since -[SDLOpenGLContext update] just calls us. */
jorgen@7594
    72
        [super update];
jorgen@7594
    73
    }
jorgen@7594
    74
}
jorgen@7594
    75
jorgen@7594
    76
/* This should only be called on the thread on which a user is using the context. */
jorgen@7594
    77
- (void)update
jorgen@7594
    78
{
jorgen@7594
    79
    /* This ensures that regular 'update' calls clear the atomic dirty flag. */
jorgen@7594
    80
    [self scheduleUpdate];
jorgen@7594
    81
    [self updateIfNeeded];
jorgen@7594
    82
}
jorgen@7594
    83
jorgen@7595
    84
/* Updates the drawable for the contexts and manages related state. */
jorgen@7595
    85
- (void)setWindow:(SDL_Window *)newWindow
jorgen@7595
    86
{
jorgen@7595
    87
    if (self->window) {
jorgen@7595
    88
        SDL_WindowData *oldwindowdata = (SDL_WindowData *)self->window->driverdata;
jorgen@7595
    89
jorgen@7595
    90
        /* Make sure to remove us from the old window's context list, or we'll get scheduled updates from it too. */
jorgen@7595
    91
        NSMutableArray *contexts = oldwindowdata->nscontexts;
jorgen@7595
    92
        @synchronized (contexts) {
jorgen@7595
    93
            [contexts removeObject:self];
jorgen@7595
    94
        }
jorgen@7595
    95
    }
jorgen@7595
    96
jorgen@7595
    97
    self->window = newWindow;
jorgen@7595
    98
jorgen@7595
    99
    if (newWindow) {
jorgen@7595
   100
        SDL_WindowData *windowdata = (SDL_WindowData *)newWindow->driverdata;
jorgen@7595
   101
jorgen@7595
   102
        /* Now sign up for scheduled updates for the new window. */
jorgen@7595
   103
        NSMutableArray *contexts = windowdata->nscontexts;
jorgen@7595
   104
        @synchronized (contexts) {
jorgen@7595
   105
            [contexts addObject:self];
jorgen@7595
   106
        }
jorgen@7595
   107
jorgen@7595
   108
        if ([self view] != [windowdata->nswindow contentView]) {
jorgen@7595
   109
            [self setView:[windowdata->nswindow contentView]];
jorgen@8258
   110
            if (self == [NSOpenGLContext currentContext]) {
jorgen@8258
   111
                [self update];
jorgen@8258
   112
            } else {
jorgen@8258
   113
                [self scheduleUpdate];
jorgen@8258
   114
            }
jorgen@7595
   115
        }
jorgen@7595
   116
    } else {
jorgen@7595
   117
        [self clearDrawable];
jorgen@8258
   118
        if (self == [NSOpenGLContext currentContext]) {
jorgen@8258
   119
            [self update];
jorgen@8258
   120
        } else {
jorgen@8258
   121
            [self scheduleUpdate];
jorgen@8258
   122
        }
jorgen@7595
   123
    }
jorgen@7595
   124
}
jorgen@7595
   125
jorgen@7594
   126
@end
jorgen@7594
   127
slouken@1936
   128
slouken@1936
   129
int
slouken@1936
   130
Cocoa_GL_LoadLibrary(_THIS, const char *path)
slouken@1936
   131
{
slouken@3057
   132
    /* Load the OpenGL library */
slouken@1936
   133
    if (path == NULL) {
slouken@1952
   134
        path = SDL_getenv("SDL_OPENGL_LIBRARY");
slouken@1952
   135
    }
slouken@1952
   136
    if (path == NULL) {
slouken@1952
   137
        path = DEFAULT_OPENGL;
slouken@1936
   138
    }
slouken@1936
   139
    _this->gl_config.dll_handle = SDL_LoadObject(path);
slouken@1936
   140
    if (!_this->gl_config.dll_handle) {
slouken@1936
   141
        return -1;
slouken@1936
   142
    }
slouken@1936
   143
    SDL_strlcpy(_this->gl_config.driver_path, path,
slouken@1936
   144
                SDL_arraysize(_this->gl_config.driver_path));
slouken@1936
   145
    return 0;
slouken@1936
   146
}
slouken@1936
   147
slouken@1936
   148
void *
slouken@1936
   149
Cocoa_GL_GetProcAddress(_THIS, const char *proc)
slouken@1936
   150
{
slouken@1936
   151
    return SDL_LoadFunction(_this->gl_config.dll_handle, proc);
slouken@1936
   152
}
slouken@1936
   153
slouken@3057
   154
void
slouken@1936
   155
Cocoa_GL_UnloadLibrary(_THIS)
slouken@1936
   156
{
slouken@3057
   157
    SDL_UnloadObject(_this->gl_config.dll_handle);
slouken@3057
   158
    _this->gl_config.dll_handle = NULL;
slouken@1936
   159
}
slouken@1936
   160
slouken@1936
   161
SDL_GLContext
slouken@1936
   162
Cocoa_GL_CreateContext(_THIS, SDL_Window * window)
slouken@1936
   163
{
icculus@6567
   164
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
slouken@6848
   165
    NSAutoreleasePool *pool;
slouken@5246
   166
    SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
slouken@1936
   167
    SDL_DisplayData *displaydata = (SDL_DisplayData *)display->driverdata;
slouken@1936
   168
    NSOpenGLPixelFormatAttribute attr[32];
slouken@1936
   169
    NSOpenGLPixelFormat *fmt;
jorgen@7594
   170
    SDLOpenGLContext *context;
flibitijibibo@7152
   171
    NSOpenGLContext *share_context = nil;
slouken@1936
   172
    int i = 0;
icculus@8276
   173
    const char *glversion;
icculus@8276
   174
    int glversion_major;
icculus@8276
   175
    int glversion_minor;
slouken@1936
   176
icculus@6567
   177
    if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
icculus@7894
   178
        SDL_SetError ("OpenGL ES is not supported on this platform");
icculus@6567
   179
        return NULL;
icculus@6567
   180
    }
icculus@8276
   181
    if ((_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) && (data->osversion < 0x1070)) {
icculus@8276
   182
        SDL_SetError ("OpenGL Core Profile is not supported on this platform version");
icculus@6567
   183
        return NULL;
icculus@6567
   184
    }
icculus@6567
   185
slouken@6848
   186
    pool = [[NSAutoreleasePool alloc] init];
slouken@6848
   187
slouken@6848
   188
    /* specify a profile if we're on Lion (10.7) or later. */
slouken@6848
   189
    if (data->osversion >= 0x1070) {
icculus@8276
   190
        NSOpenGLPixelFormatAttribute profile = NSOpenGLProfileVersionLegacy;
slouken@6848
   191
        if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) {
icculus@8276
   192
            profile = NSOpenGLProfileVersion3_2Core;
alexey@6832
   193
        }
icculus@8276
   194
        attr[i++] = NSOpenGLPFAOpenGLProfile;
slouken@6848
   195
        attr[i++] = profile;
slouken@6848
   196
    }
slouken@1936
   197
slouken@6848
   198
    attr[i++] = NSOpenGLPFAColorSize;
slouken@6848
   199
    attr[i++] = SDL_BYTESPERPIXEL(display->current_mode.format)*8;
slouken@6848
   200
slouken@6848
   201
    attr[i++] = NSOpenGLPFADepthSize;
slouken@6848
   202
    attr[i++] = _this->gl_config.depth_size;
slouken@6848
   203
slouken@6848
   204
    if (_this->gl_config.double_buffer) {
slouken@6848
   205
        attr[i++] = NSOpenGLPFADoubleBuffer;
slouken@6848
   206
    }
slouken@6848
   207
slouken@6848
   208
    if (_this->gl_config.stereo) {
slouken@6848
   209
        attr[i++] = NSOpenGLPFAStereo;
slouken@6848
   210
    }
slouken@6848
   211
slouken@6848
   212
    if (_this->gl_config.stencil_size) {
slouken@6848
   213
        attr[i++] = NSOpenGLPFAStencilSize;
slouken@6848
   214
        attr[i++] = _this->gl_config.stencil_size;
slouken@6848
   215
    }
slouken@6848
   216
slouken@6848
   217
    if ((_this->gl_config.accum_red_size +
slouken@6848
   218
         _this->gl_config.accum_green_size +
slouken@6848
   219
         _this->gl_config.accum_blue_size +
slouken@6848
   220
         _this->gl_config.accum_alpha_size) > 0) {
slouken@6848
   221
        attr[i++] = NSOpenGLPFAAccumSize;
slouken@6848
   222
        attr[i++] = _this->gl_config.accum_red_size + _this->gl_config.accum_green_size + _this->gl_config.accum_blue_size + _this->gl_config.accum_alpha_size;
slouken@6848
   223
    }
slouken@6848
   224
slouken@6848
   225
    if (_this->gl_config.multisamplebuffers) {
slouken@6848
   226
        attr[i++] = NSOpenGLPFASampleBuffers;
slouken@6848
   227
        attr[i++] = _this->gl_config.multisamplebuffers;
slouken@6848
   228
    }
slouken@6848
   229
slouken@6848
   230
    if (_this->gl_config.multisamplesamples) {
slouken@6848
   231
        attr[i++] = NSOpenGLPFASamples;
slouken@6848
   232
        attr[i++] = _this->gl_config.multisamplesamples;
slouken@6848
   233
        attr[i++] = NSOpenGLPFANoRecovery;
slouken@6848
   234
    }
slouken@6848
   235
slouken@6848
   236
    if (_this->gl_config.accelerated >= 0) {
slouken@6848
   237
        if (_this->gl_config.accelerated) {
slouken@6848
   238
            attr[i++] = NSOpenGLPFAAccelerated;
slouken@6848
   239
        } else {
slouken@6848
   240
            attr[i++] = NSOpenGLPFARendererID;
slouken@6848
   241
            attr[i++] = kCGLRendererGenericFloatID;
alexey@6832
   242
        }
slouken@6848
   243
    }
slouken@6848
   244
slouken@6848
   245
    attr[i++] = NSOpenGLPFAScreenMask;
slouken@6848
   246
    attr[i++] = CGDisplayIDToOpenGLDisplayMask(displaydata->display);
slouken@6848
   247
    attr[i] = 0;
slouken@6848
   248
slouken@6848
   249
    fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr];
slouken@6848
   250
    if (fmt == nil) {
slouken@8601
   251
        SDL_SetError("Failed creating OpenGL pixel format");
slouken@6848
   252
        [pool release];
slouken@6848
   253
        return NULL;
slouken@6848
   254
    }
slouken@6848
   255
flibitijibibo@7152
   256
    if (_this->gl_config.share_with_current_context) {
slouken@7412
   257
        share_context = (NSOpenGLContext*)SDL_GL_GetCurrentContext();
flibitijibibo@7152
   258
    }
flibitijibibo@7152
   259
jorgen@7594
   260
    context = [[SDLOpenGLContext alloc] initWithFormat:fmt shareContext:share_context];
slouken@6848
   261
slouken@6848
   262
    [fmt release];
slouken@6848
   263
slouken@6848
   264
    if (context == nil) {
slouken@8601
   265
        SDL_SetError("Failed creating OpenGL context");
slouken@6848
   266
        [pool release];
slouken@6848
   267
        return NULL;
slouken@6848
   268
    }
slouken@6848
   269
slouken@6848
   270
    [pool release];
slouken@1936
   271
slouken@2178
   272
    if ( Cocoa_GL_MakeCurrent(_this, window, context) < 0 ) {
slouken@2178
   273
        Cocoa_GL_DeleteContext(_this, context);
slouken@8601
   274
        SDL_SetError("Failed making OpenGL context current");
slouken@2178
   275
        return NULL;
slouken@2178
   276
    }
slouken@2178
   277
slouken@8604
   278
    if (_this->gl_config.major_version < 3 &&
slouken@8604
   279
        _this->gl_config.profile_mask == 0 &&
slouken@8604
   280
        _this->gl_config.flags == 0) {
slouken@8604
   281
        /* This is a legacy profile, so to match other backends, we're done. */
slouken@8604
   282
    } else {
slouken@8604
   283
        const GLubyte *(APIENTRY * glGetStringFunc)(GLenum);
slouken@8601
   284
slouken@8604
   285
        glGetStringFunc = (const GLubyte *(APIENTRY *)(GLenum)) SDL_GL_GetProcAddress("glGetString");
slouken@8604
   286
        if (!glGetStringFunc) {
slouken@8604
   287
            Cocoa_GL_DeleteContext(_this, context);
slouken@8604
   288
            SDL_SetError ("Failed getting OpenGL glGetString entry point");
slouken@8604
   289
            return NULL;
slouken@8604
   290
        }
slouken@8601
   291
slouken@8604
   292
        glversion = (const char *)glGetStringFunc(GL_VERSION);
slouken@8604
   293
        if (glversion == NULL) {
slouken@8604
   294
            Cocoa_GL_DeleteContext(_this, context);
slouken@8604
   295
            SDL_SetError ("Failed getting OpenGL context version");
slouken@8604
   296
            return NULL;
slouken@8604
   297
        }
slouken@8604
   298
slouken@8604
   299
        if (SDL_sscanf(glversion, "%d.%d", &glversion_major, &glversion_minor) != 2) {
slouken@8604
   300
            Cocoa_GL_DeleteContext(_this, context);
slouken@8604
   301
            SDL_SetError ("Failed parsing OpenGL context version");
slouken@8604
   302
            return NULL;
slouken@8604
   303
        }
slouken@8604
   304
slouken@8604
   305
        if ((glversion_major < _this->gl_config.major_version) ||
slouken@8604
   306
           ((glversion_major == _this->gl_config.major_version) && (glversion_minor < _this->gl_config.minor_version))) {
slouken@8604
   307
            Cocoa_GL_DeleteContext(_this, context);
slouken@8604
   308
            SDL_SetError ("Failed creating OpenGL context at version requested");
slouken@8604
   309
            return NULL;
slouken@8604
   310
        }
slouken@8604
   311
slouken@8604
   312
        /* In the future we'll want to do this, but to match other platforms
slouken@8604
   313
           we'll leave the OpenGL version the way it is for now
slouken@8604
   314
         */
slouken@8604
   315
        /*_this->gl_config.major_version = glversion_major;*/
slouken@8604
   316
        /*_this->gl_config.minor_version = glversion_minor;*/
icculus@8278
   317
    }
slouken@2178
   318
    return context;
slouken@1936
   319
}
slouken@1936
   320
slouken@1936
   321
int
slouken@1936
   322
Cocoa_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
slouken@1936
   323
{
slouken@6848
   324
    NSAutoreleasePool *pool;
slouken@1936
   325
slouken@6848
   326
    pool = [[NSAutoreleasePool alloc] init];
slouken@6848
   327
slouken@6848
   328
    if (context) {
jorgen@7594
   329
        SDLOpenGLContext *nscontext = (SDLOpenGLContext *)context;
jorgen@7595
   330
        [nscontext setWindow:window];
jorgen@7594
   331
        [nscontext updateIfNeeded];
slouken@6848
   332
        [nscontext makeCurrentContext];
slouken@6848
   333
    } else {
slouken@6848
   334
        [NSOpenGLContext clearCurrentContext];
slouken@1936
   335
    }
slouken@1936
   336
slouken@6848
   337
    [pool release];
slouken@1936
   338
    return 0;
slouken@1936
   339
}
slouken@1936
   340
urkle@7746
   341
void
urkle@7746
   342
Cocoa_GL_GetDrawableSize(_THIS, SDL_Window * window, int * w, int * h)
urkle@7746
   343
{
urkle@7746
   344
    SDL_WindowData *windata = (SDL_WindowData *) window->driverdata;
urkle@7746
   345
    NSView *contentView = [windata->nswindow contentView];
urkle@7746
   346
    NSRect viewport = [contentView bounds];
urkle@7746
   347
urkle@7746
   348
    /* This gives us the correct viewport for a Retina-enabled view, only
urkle@7746
   349
     * supported on 10.7+. */
urkle@7746
   350
    if ([contentView respondsToSelector:@selector(convertRectToBacking:)]) {
urkle@7746
   351
        viewport = [contentView convertRectToBacking:viewport];
urkle@7746
   352
    }
urkle@7746
   353
urkle@7746
   354
    if (w) {
urkle@7746
   355
        *w = viewport.size.width;
urkle@7746
   356
    }
urkle@7746
   357
urkle@7746
   358
    if (h) {
urkle@7746
   359
        *h = viewport.size.height;
urkle@7746
   360
    }
urkle@7746
   361
}
urkle@7746
   362
slouken@1936
   363
int
slouken@1936
   364
Cocoa_GL_SetSwapInterval(_THIS, int interval)
slouken@1936
   365
{
slouken@6848
   366
    NSAutoreleasePool *pool;
slouken@1936
   367
    NSOpenGLContext *nscontext;
slouken@2703
   368
    GLint value;
slouken@1936
   369
    int status;
slouken@1936
   370
icculus@7743
   371
    if (interval < 0) {  /* no extension for this on Mac OS X at the moment. */
icculus@7743
   372
        return SDL_SetError("Late swap tearing currently unsupported");
icculus@7743
   373
    }
icculus@7743
   374
slouken@6848
   375
    pool = [[NSAutoreleasePool alloc] init];
slouken@6848
   376
jorgen@7594
   377
    nscontext = (NSOpenGLContext*)SDL_GL_GetCurrentContext();
slouken@6848
   378
    if (nscontext != nil) {
slouken@6848
   379
        value = interval;
slouken@6848
   380
        [nscontext setValues:&value forParameter:NSOpenGLCPSwapInterval];
slouken@6848
   381
        status = 0;
slouken@6848
   382
    } else {
icculus@7037
   383
        status = SDL_SetError("No current OpenGL context");
slouken@1936
   384
    }
slouken@1936
   385
slouken@6848
   386
    [pool release];
slouken@1936
   387
    return status;
slouken@1936
   388
}
slouken@1936
   389
slouken@1936
   390
int
slouken@1936
   391
Cocoa_GL_GetSwapInterval(_THIS)
slouken@1936
   392
{
slouken@6848
   393
    NSAutoreleasePool *pool;
slouken@1936
   394
    NSOpenGLContext *nscontext;
slouken@2703
   395
    GLint value;
icculus@6382
   396
    int status = 0;
slouken@1936
   397
slouken@6848
   398
    pool = [[NSAutoreleasePool alloc] init];
slouken@6848
   399
jorgen@7594
   400
    nscontext = (NSOpenGLContext*)SDL_GL_GetCurrentContext();
slouken@6848
   401
    if (nscontext != nil) {
slouken@6848
   402
        [nscontext getValues:&value forParameter:NSOpenGLCPSwapInterval];
slouken@6848
   403
        status = (int)value;
slouken@1936
   404
    }
slouken@1936
   405
slouken@6848
   406
    [pool release];
slouken@1936
   407
    return status;
slouken@1936
   408
}
slouken@1936
   409
slouken@1936
   410
void
slouken@1936
   411
Cocoa_GL_SwapWindow(_THIS, SDL_Window * window)
slouken@1936
   412
{
slouken@6848
   413
    NSAutoreleasePool *pool;
slouken@1936
   414
slouken@6848
   415
    pool = [[NSAutoreleasePool alloc] init];
slouken@6848
   416
slouken@7738
   417
    SDLOpenGLContext* nscontext = (SDLOpenGLContext*)SDL_GL_GetCurrentContext();
slouken@7408
   418
    [nscontext flushBuffer];
jorgen@7594
   419
    [nscontext updateIfNeeded];
slouken@6848
   420
slouken@6848
   421
    [pool release];
slouken@1936
   422
}
slouken@1936
   423
slouken@1936
   424
void
slouken@1936
   425
Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context)
slouken@1936
   426
{
slouken@6848
   427
    NSAutoreleasePool *pool;
jorgen@7595
   428
    SDLOpenGLContext *nscontext = (SDLOpenGLContext *)context;
slouken@1936
   429
slouken@6848
   430
    pool = [[NSAutoreleasePool alloc] init];
slouken@6848
   431
jorgen@7595
   432
    [nscontext setWindow:NULL];
slouken@6848
   433
    [nscontext release];
slouken@6848
   434
slouken@6848
   435
    [pool release];
slouken@1936
   436
}
slouken@1936
   437
slouken@1952
   438
#endif /* SDL_VIDEO_OPENGL_CGL */
slouken@1936
   439
slouken@1936
   440
/* vi: set ts=4 sw=4 expandtab: */