From 47e574b1230fcb3961f56fbe9d6fc1c90ead1a02 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 2 Jan 2012 21:25:34 -0800 Subject: [PATCH] Quartz: Restore 1.2.14 behaviour of letting apps draw from background thread. Strictly speaking, this isn't encouraged, but it's a regression. --HG-- branch : SDL-1.2 extra : rebase_source : a75c40b16b7f8f83ef36a66114de1e27e2435eb3 --- src/video/quartz/SDL_QuartzVideo.h | 2 ++ src/video/quartz/SDL_QuartzVideo.m | 13 ++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/video/quartz/SDL_QuartzVideo.h b/src/video/quartz/SDL_QuartzVideo.h index 708d7c92e..7506e0cd1 100644 --- a/src/video/quartz/SDL_QuartzVideo.h +++ b/src/video/quartz/SDL_QuartzVideo.h @@ -93,6 +93,7 @@ typedef struct SDL_PrivateVideoData { const void *save_mode; /* original mode of the display */ CGDirectPaletteRef palette; /* palette of an 8-bit display */ NSOpenGLContext *gl_context; /* OpenGL rendering context */ + NSGraphicsContext *nsgfx_context; /* Cocoa graphics context */ Uint32 width, height, bpp; /* frequently used data about the display */ Uint32 flags; /* flags for current mode, for teardown purposes */ Uint32 video_set; /* boolean; indicates if video was set correctly */ @@ -132,6 +133,7 @@ typedef struct SDL_PrivateVideoData { #define allow_screensaver (this->hidden->allow_screensaver) #define palette (this->hidden->palette) #define gl_context (this->hidden->gl_context) +#define nsgfx_context (this->hidden->nsgfx_context) #define device_width (this->hidden->width) #define device_height (this->hidden->height) #define device_bpp (this->hidden->bpp) diff --git a/src/video/quartz/SDL_QuartzVideo.m b/src/video/quartz/SDL_QuartzVideo.m index 2961ed527..86b1856c2 100644 --- a/src/video/quartz/SDL_QuartzVideo.m +++ b/src/video/quartz/SDL_QuartzVideo.m @@ -1149,9 +1149,8 @@ static SDL_Surface* QZ_SetVideoModeInternal (_THIS, SDL_Surface *current, } if (qz_window != nil) { - NSGraphicsContext *ctx; - ctx = [NSGraphicsContext graphicsContextWithWindow:qz_window]; - [NSGraphicsContext setCurrentContext:ctx]; + nsgfx_context = [NSGraphicsContext graphicsContextWithWindow:qz_window]; + [NSGraphicsContext setCurrentContext:nsgfx_context]; } /* Setup the new pixel format */ @@ -1507,8 +1506,12 @@ static void QZ_UpdateRects (_THIS, int numRects, SDL_Rect *rects) } else { - CGContextRef cgc = (CGContextRef) - [[NSGraphicsContext currentContext] graphicsPort]; + NSGraphicsContext *ctx = [NSGraphicsContext currentContext]; + if (ctx != nsgfx_context) { /* uhoh, you might be rendering from another thread... */ + [NSGraphicsContext setCurrentContext:nsgfx_context]; + ctx = nsgfx_context; + } + CGContextRef cgc = (CGContextRef) [ctx graphicsPort]; QZ_DrawResizeIcon (this); CGContextFlush (cg_context); CGImageRef image = CGBitmapContextCreateImage (cg_context);