iOS: Also do the Dictation crash workaround before executing the animation callback.

This commit is contained in:
Alex Szpakowski 2016-04-02 13:21:01 -03:00
parent 88372277b7
commit 6cfa71a10e
4 changed files with 27 additions and 13 deletions

View File

@ -26,6 +26,7 @@
#include "SDL_uikitvideo.h" #include "SDL_uikitvideo.h"
#include "SDL_uikitevents.h" #include "SDL_uikitevents.h"
#include "SDL_uikitopengles.h"
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@ -63,19 +64,8 @@ UIKit_PumpEvents(_THIS)
result = CFRunLoopRunInMode((CFStringRef)UITrackingRunLoopMode, seconds, TRUE); result = CFRunLoopRunInMode((CFStringRef)UITrackingRunLoopMode, seconds, TRUE);
} while(result == kCFRunLoopRunHandledSource); } while(result == kCFRunLoopRunHandledSource);
@autoreleasepool { /* See the comment in the function definition. */
/* Some iOS system functionality (such as Dictation on the on-screen UIKit_GL_RestoreCurrentContext();
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 */ #endif /* SDL_VIDEO_DRIVER_UIKIT */

View File

@ -33,6 +33,8 @@ extern void UIKit_GL_DeleteContext(_THIS, SDL_GLContext context);
extern void *UIKit_GL_GetProcAddress(_THIS, const char *proc); extern void *UIKit_GL_GetProcAddress(_THIS, const char *proc);
extern int UIKit_GL_LoadLibrary(_THIS, const char *path); extern int UIKit_GL_LoadLibrary(_THIS, const char *path);
extern void UIKit_GL_RestoreCurrentContext();
#endif #endif
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -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 */ #endif /* SDL_VIDEO_DRIVER_UIKIT */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -33,6 +33,7 @@
#include "SDL_uikitvideo.h" #include "SDL_uikitvideo.h"
#include "SDL_uikitmodes.h" #include "SDL_uikitmodes.h"
#include "SDL_uikitwindow.h" #include "SDL_uikitwindow.h"
#include "SDL_uikitopengles.h"
#if SDL_IPHONE_KEYBOARD #if SDL_IPHONE_KEYBOARD
#include "keyinfotable.h" #include "keyinfotable.h"
@ -102,6 +103,9 @@
{ {
/* Don't run the game loop while a messagebox is up */ /* Don't run the game loop while a messagebox is up */
if (!UIKit_ShowingMessageBox()) { if (!UIKit_ShowingMessageBox()) {
/* See the comment in the function definition. */
UIKit_GL_RestoreCurrentContext();
animationCallback(animationCallbackParam); animationCallback(animationCallbackParam);
} }
} }