[PATCH 1/5] winemac: Make the implementation of clearToBlackIfNeeded compatible with core contexts.
Matteo Bruni
mbruni at codeweavers.com
Mon Jan 5 10:17:51 CST 2015
---
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 32d182f..ed8ac02 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);
+ sscanf(gl_version, "%u", &major);
+ /* 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)
--
2.0.5
More information about the wine-patches
mailing list