From e23f70b26698f5e6ba2236436482637bf9f1c3b0 Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Thu, 8 Jan 2015 15:07:47 +0100 Subject: [PATCH] winemac: Make the implementation of clearToBlackIfNeeded compatible with core contexts. --- dlls/winemac.drv/cocoa_opengl.m | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/dlls/winemac.drv/cocoa_opengl.m b/dlls/winemac.drv/cocoa_opengl.m index 32d182f3c56..2f46b87ba33 100644 --- a/dlls/winemac.drv/cocoa_opengl.m +++ b/dlls/winemac.drv/cocoa_opengl.m @@ -85,16 +85,41 @@ - (void) clearToBlackIfNeeded if (shouldClearToBlack) { NSOpenGLContext* origContext = [NSOpenGLContext currentContext]; + const char *gl_version; + unsigned int major; + GLint draw_framebuffer_binding, draw_buffer; + GLboolean scissor_test, color_mask[4]; + GLfloat clear_color[4]; [self makeCurrentContext]; - glPushAttrib(GL_COLOR_BUFFER_BIT | GL_SCISSOR_BIT); + gl_version = (const char *)glGetString(GL_VERSION); + major = gl_version[0] - '0'; + /* FIXME: Should check for GL_ARB_framebuffer_object and GL_EXT_framebuffer_object + * for older GL versions. */ + if (major >= 3) + { + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &draw_framebuffer_binding); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + } + glGetIntegerv(GL_DRAW_BUFFER, &draw_buffer); + scissor_test = glIsEnabled(GL_SCISSOR_TEST); + glGetBooleanv(GL_COLOR_WRITEMASK, color_mask); + glGetFloatv(GL_COLOR_CLEAR_VALUE, clear_color); glDrawBuffer(GL_FRONT_AND_BACK); glDisable(GL_SCISSOR_TEST); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); - glPopAttrib(); + + glClearColor(clear_color[0], clear_color[1], clear_color[2], clear_color[3]); + glColorMask(color_mask[0], color_mask[1], color_mask[2], color_mask[3]); + if (scissor_test) + glEnable(GL_SCISSOR_TEST); + glDrawBuffer(draw_buffer); + if (major >= 3) + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, draw_framebuffer_binding); glFlush(); if (origContext)