From 6cfa71a10e4f2a2d5eddaf9cd428faabaeb3f660 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sat, 2 Apr 2016 13:21:01 -0300 Subject: [PATCH] iOS: Also do the Dictation crash workaround before executing the animation callback. --- src/video/uikit/SDL_uikitevents.m | 16 +++------------- src/video/uikit/SDL_uikitopengles.h | 2 ++ src/video/uikit/SDL_uikitopengles.m | 18 ++++++++++++++++++ src/video/uikit/SDL_uikitviewcontroller.m | 4 ++++ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/video/uikit/SDL_uikitevents.m b/src/video/uikit/SDL_uikitevents.m index 398d497b2..7083e204b 100644 --- a/src/video/uikit/SDL_uikitevents.m +++ b/src/video/uikit/SDL_uikitevents.m @@ -26,6 +26,7 @@ #include "SDL_uikitvideo.h" #include "SDL_uikitevents.h" +#include "SDL_uikitopengles.h" #import @@ -63,19 +64,8 @@ UIKit_PumpEvents(_THIS) result = CFRunLoopRunInMode((CFStringRef)UITrackingRunLoopMode, seconds, TRUE); } while(result == kCFRunLoopRunHandledSource); - @autoreleasepool { - /* Some iOS system functionality (such as Dictation on the on-screen - keyboard) uses its own OpenGL ES context but doesn't restore the - previous one when it's done. This is a workaround to make sure the - expected SDL-created OpenGL ES context is active after the OS is - finished running its own code for the frame. If this isn't done, the - app may crash or have other nasty symptoms when Dictation is used. - */ - EAGLContext *context = (__bridge EAGLContext *) SDL_GL_GetCurrentContext(); - if (context != NULL && [EAGLContext currentContext] != context) { - [EAGLContext setCurrentContext:context]; - } - } + /* See the comment in the function definition. */ + UIKit_GL_RestoreCurrentContext(); } #endif /* SDL_VIDEO_DRIVER_UIKIT */ diff --git a/src/video/uikit/SDL_uikitopengles.h b/src/video/uikit/SDL_uikitopengles.h index 10697610d..b52e42913 100644 --- a/src/video/uikit/SDL_uikitopengles.h +++ b/src/video/uikit/SDL_uikitopengles.h @@ -33,6 +33,8 @@ extern void UIKit_GL_DeleteContext(_THIS, SDL_GLContext context); extern void *UIKit_GL_GetProcAddress(_THIS, const char *proc); extern int UIKit_GL_LoadLibrary(_THIS, const char *path); +extern void UIKit_GL_RestoreCurrentContext(); + #endif /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/uikit/SDL_uikitopengles.m b/src/video/uikit/SDL_uikitopengles.m index a2ea4ab67..4bca17817 100644 --- a/src/video/uikit/SDL_uikitopengles.m +++ b/src/video/uikit/SDL_uikitopengles.m @@ -217,6 +217,24 @@ UIKit_GL_DeleteContext(_THIS, SDL_GLContext context) } } +void +UIKit_GL_RestoreCurrentContext() +{ + @autoreleasepool { + /* Some iOS system functionality (such as Dictation on the on-screen + keyboard) uses its own OpenGL ES context but doesn't restore the + previous one when it's done. This is a workaround to make sure the + expected SDL-created OpenGL ES context is active after the OS is + finished running its own code for the frame. If this isn't done, the + app may crash or have other nasty symptoms when Dictation is used. + */ + EAGLContext *context = (__bridge EAGLContext *) SDL_GL_GetCurrentContext(); + if (context != NULL && [EAGLContext currentContext] != context) { + [EAGLContext setCurrentContext:context]; + } + } +} + #endif /* SDL_VIDEO_DRIVER_UIKIT */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/uikit/SDL_uikitviewcontroller.m b/src/video/uikit/SDL_uikitviewcontroller.m index 58cdf1ac5..62af310c2 100644 --- a/src/video/uikit/SDL_uikitviewcontroller.m +++ b/src/video/uikit/SDL_uikitviewcontroller.m @@ -33,6 +33,7 @@ #include "SDL_uikitvideo.h" #include "SDL_uikitmodes.h" #include "SDL_uikitwindow.h" +#include "SDL_uikitopengles.h" #if SDL_IPHONE_KEYBOARD #include "keyinfotable.h" @@ -102,6 +103,9 @@ { /* Don't run the game loop while a messagebox is up */ if (!UIKit_ShowingMessageBox()) { + /* See the comment in the function definition. */ + UIKit_GL_RestoreCurrentContext(); + animationCallback(animationCallbackParam); } }