From 6d85f52228eaf3dd7dd47672356f1442fe646970 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Fri, 21 Nov 2014 10:03:02 -0400 Subject: [PATCH] The iOS OpenGL ES context's color Renderbuffer Object is no longer completely destroyed and recreated in layoutSubviews. Its storage is now only reallocated when the actual size of the layer changes. The framebuffer object and renderbuffer object binding states are no longer clobbered by the storage reallocation code in layoutSubviews. --- src/video/uikit/SDL_uikitopenglview.m | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/video/uikit/SDL_uikitopenglview.m b/src/video/uikit/SDL_uikitopenglview.m index f0237cafbef66..0c2a6b10943d7 100644 --- a/src/video/uikit/SDL_uikitopenglview.m +++ b/src/video/uikit/SDL_uikitopenglview.m @@ -183,15 +183,11 @@ - (GLuint)drawableFramebuffer - (void)updateFrame { - glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); - glBindRenderbuffer(GL_RENDERBUFFER, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); - glDeleteRenderbuffers(1, &viewRenderbuffer); + GLint prevRenderbuffer = 0; + glGetIntegerv(GL_RENDERBUFFER_BINDING, &prevRenderbuffer); - glGenRenderbuffers(1, &viewRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); @@ -201,9 +197,7 @@ - (void)updateFrame glRenderbufferStorage(GL_RENDERBUFFER, depthBufferFormat, backingWidth, backingHeight); } - glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); - - [self setDebugLabels]; + glBindRenderbuffer(GL_RENDERBUFFER, prevRenderbuffer); } - (void)setDebugLabels @@ -278,8 +272,15 @@ - (void)layoutSubviews { [super layoutSubviews]; - [EAGLContext setCurrentContext:context]; - [self updateFrame]; + CGSize layersize = self.layer.bounds.size; + int width = (int) (layersize.width * self.layer.contentsScale); + int height = (int) (layersize.height * self.layer.contentsScale); + + /* Update the color and depth buffer storage if the layer size has changed. */ + if (width != backingWidth || height != backingHeight) { + [EAGLContext setCurrentContext:context]; + [self updateFrame]; + } } - (void)destroyFramebuffer