modules/graphics/src/main/native-glass/mac/GlassFrameBufferObject.m
Print this page
@@ -188,10 +188,11 @@
{
self->_width = 0;
self->_height = 0;
self->_texture = 0;
self->_fbo = 0;
+ self->_isSwPipe = NO;
[self _assertContext];
if ([self _supportsFbo] == NO)
{
[super dealloc];
@@ -227,17 +228,57 @@
LOG(" context:%p", CGLGetCurrentContext());
[self _assertContext];
{
if ((width > 0) && (height > 0))
{
+ if(self->_isSwPipe)
+ {
+ self->_fboToRestore = 0; // default to screen
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, (GLint*)&self->_fboToRestore);
+ LOG(" will need to restore to FBO: %d", self->_fboToRestore);
+ }
+
[self _createFboIfNeededForWidth:width andHeight:height];
+
+ if (self->_isSwPipe && (self->_fbo != 0))
+ {
+ GLuint framebufferToBind = self->_fbo; // our own FBO
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferToBind);
+ LOG(" bounded to FBO: %d", self->_fbo);
+ }
}
}
LOG(" BOUND");
LOG(" glGetError(): %d", glGetError());
}
+- (void)unbind
+{
+ if (self->_isSwPipe)
+ {
+ LOG(" GlassFrameBufferObject unbind");
+ [self _assertContext];
+ {
+ GLint framebufferCurrent = 0;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &framebufferCurrent);
+
+ if ((GLuint)framebufferCurrent != self->_fbo)
+ {
+ fprintf(stderr, "ERROR: unexpected fbo is bound! Expected %d, but found %d\n", self->_fbo, framebufferCurrent);
+ }
+
+ if (![GlassApplication syncRenderingDisabled]) {
+ glFinish();
+ }
+ GLuint framebufferToRevertTo = self->_fboToRestore;
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferToRevertTo);
+ LOG(" restored to FBO: %d", framebufferToRevertTo);
+ LOG(" glGetError(): %d", glGetError());
+ }
+ }
+}
+
- (void)blitForWidth:(GLuint)width andHeight:(GLuint)height
{
LOG(" GlassFrameBufferObject blitForWidth:%d andHeight:%d [%p]", width, height, self);
if (self->_texture != 0)
{
@@ -292,6 +333,11 @@
- (GLuint)fbo
{
return self->_fbo;
}
+- (void)setIsSwPipe:(BOOL)isSwPipe
+{
+ self->_isSwPipe = isSwPipe;
+}
+
@end