From afb40985eb7cf963eae50f9eaa2e6f486c86ae59 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 3 Apr 2011 18:33:32 -0500 Subject: [PATCH] iOS: Correctly resize renderbuffers when rotating orientation. Fixes strange rendering after rotating the device. --- src/video/uikit/SDL_uikitopengles.m | 1 + src/video/uikit/SDL_uikitopenglview.h | 6 ++++- src/video/uikit/SDL_uikitopenglview.m | 32 ++++++++++++++++++++++++--- src/video/uikit/SDL_uikitview.h | 2 +- src/video/uikit/SDL_uikitwindow.h | 1 - src/video/uikit/SDL_uikitwindow.m | 6 ++++- 6 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/video/uikit/SDL_uikitopengles.m b/src/video/uikit/SDL_uikitopengles.m index d4ac4dc7c..1d87c01a8 100644 --- a/src/video/uikit/SDL_uikitopengles.m +++ b/src/video/uikit/SDL_uikitopengles.m @@ -132,6 +132,7 @@ SDL_GLContext UIKit_GL_CreateContext(_THIS, SDL_Window * window) } /* Make this window the current mouse focus for touch input */ + /* !!! FIXME: only do this if this is the primary screen. */ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); diff --git a/src/video/uikit/SDL_uikitopenglview.h b/src/video/uikit/SDL_uikitopenglview.h index f00dcfee4..21e74920d 100644 --- a/src/video/uikit/SDL_uikitopenglview.h +++ b/src/video/uikit/SDL_uikitopenglview.h @@ -45,7 +45,9 @@ /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */ GLuint depthRenderbuffer; - + + /* format of depthRenderbuffer */ + GLenum depthBufferFormat; } @property (nonatomic, retain, readonly) EAGLContext *context; @@ -62,6 +64,8 @@ depthBits:(int)depthBits \ majorVersion:(int)majorVersion; +- (void)updateFrame; + @end /* *INDENT-ON* */ diff --git a/src/video/uikit/SDL_uikitopenglview.m b/src/video/uikit/SDL_uikitopenglview.m index 612de55bc..6dbfb545a 100644 --- a/src/video/uikit/SDL_uikitopenglview.m +++ b/src/video/uikit/SDL_uikitopenglview.m @@ -50,7 +50,6 @@ - (id)initWithFrame:(CGRect)frame \ majorVersion:(int)majorVersion \ { NSString *colorFormat=nil; - GLuint depthBufferFormat; BOOL useDepthBuffer; if (rBits == 8 && gBits == 8 && bBits == 8) { @@ -62,6 +61,8 @@ - (id)initWithFrame:(CGRect)frame \ colorFormat = kEAGLColorFormatRGB565; } + depthBufferFormat = 0; + if (depthBits == 24) { useDepthBuffer = YES; depthBufferFormat = GL_DEPTH_COMPONENT24_OES; @@ -108,7 +109,7 @@ - (id)initWithFrame:(CGRect)frame \ glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); - + if (useDepthBuffer) { glGenRenderbuffersOES(1, &depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); @@ -126,11 +127,36 @@ - (id)initWithFrame:(CGRect)frame \ if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) self.contentScaleFactor = [UIScreen mainScreen].scale; - self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + self.autoresizingMask = 0; // don't allow autoresize, since we need to do some magic in -(void)updateFrame. } return self; } +- (void)updateFrame { + glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, 0); + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, 0); + glDeleteRenderbuffersOES(1, &viewRenderbuffer); + + glGenRenderbuffersOES(1, &viewRenderbuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); + [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); + + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); + + if (depthRenderbuffer != 0) { + glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); + glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthBufferFormat, backingWidth, backingHeight); + } + + // !!! FIXME: use the screen this is on! + /* Use the main screen scale (for retina display support) */ + if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) + self.contentScaleFactor = [UIScreen mainScreen].scale; +} + - (void)setCurrentContext { [EAGLContext setCurrentContext:context]; } diff --git a/src/video/uikit/SDL_uikitview.h b/src/video/uikit/SDL_uikitview.h index e7de78e49..f3bd79976 100644 --- a/src/video/uikit/SDL_uikitview.h +++ b/src/video/uikit/SDL_uikitview.h @@ -37,7 +37,7 @@ - (id)initWithSDLWindow:(SDL_Window *)_window; - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient; - (void)loadView; -- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; +- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; @end /* *INDENT-OFF* */ diff --git a/src/video/uikit/SDL_uikitwindow.h b/src/video/uikit/SDL_uikitwindow.h index b39bdae78..43fa5aec2 100644 --- a/src/video/uikit/SDL_uikitwindow.h +++ b/src/video/uikit/SDL_uikitwindow.h @@ -43,7 +43,6 @@ struct SDL_WindowData SDL_uikitviewcontroller *viewcontroller; }; - #endif /* _SDL_uikitwindow_h */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m index 256bf6ee7..53751f883 100644 --- a/src/video/uikit/SDL_uikitwindow.m +++ b/src/video/uikit/SDL_uikitwindow.m @@ -55,7 +55,8 @@ - (void)loadView { } // Send a resized event when the orientation changes. -- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { +- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { + const UIInterfaceOrientation toInterfaceOrientation = [self interfaceOrientation]; SDL_WindowData *data = self->window->driverdata; UIWindow *uiwindow = data->uiwindow; CGRect frame = [uiwindow frame]; @@ -79,8 +80,11 @@ - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrie SDL_assert(0 && "Unexpected interface orientation!"); return; } + frame.size.width = w; frame.size.height = h; + [uiwindow setFrame:frame]; + [data->view updateFrame]; SDL_SendWindowEvent(self->window, SDL_WINDOWEVENT_RESIZED, w, h); }