Ken Thomases : winemac: Clear OpenGL views to black the first time a context is attached.

Alexandre Julliard julliard at winehq.org
Fri Nov 29 13:24:27 CST 2013


Module: wine
Branch: master
Commit: 4124478b8526d04b0049aae980c0674230136cc7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4124478b8526d04b0049aae980c0674230136cc7

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Nov 27 15:33:19 2013 -0600

winemac: Clear OpenGL views to black the first time a context is attached.

This prevents VRAM garbage from being displayed before the program draws.

---

 dlls/winemac.drv/cocoa_opengl.h |    2 ++
 dlls/winemac.drv/cocoa_opengl.m |   33 ++++++++++++++++++++++++++++++++-
 dlls/winemac.drv/cocoa_window.m |   13 +++++++++++++
 3 files changed, 47 insertions(+), 1 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_opengl.h b/dlls/winemac.drv/cocoa_opengl.h
index 60e8c16..2cdcdbd 100644
--- a/dlls/winemac.drv/cocoa_opengl.h
+++ b/dlls/winemac.drv/cocoa_opengl.h
@@ -25,8 +25,10 @@
 {
     NSView* latentView;
     BOOL needsUpdate;
+    BOOL shouldClearToBlack;
 }
 
 @property BOOL needsUpdate;
+ at property BOOL shouldClearToBlack;
 
 @end
diff --git a/dlls/winemac.drv/cocoa_opengl.m b/dlls/winemac.drv/cocoa_opengl.m
index 85b3639..13b9ea3 100644
--- a/dlls/winemac.drv/cocoa_opengl.m
+++ b/dlls/winemac.drv/cocoa_opengl.m
@@ -30,7 +30,7 @@
 
 
 @implementation WineOpenGLContext
- at synthesize latentView, needsUpdate;
+ at synthesize latentView, needsUpdate, shouldClearToBlack;
 
     - (void) dealloc
     {
@@ -63,6 +63,32 @@
         [self clearDrawable];
     }
 
+    - (void) clearToBlackIfNeeded
+    {
+        if (shouldClearToBlack)
+        {
+            NSOpenGLContext* origContext = [NSOpenGLContext currentContext];
+
+            [self makeCurrentContext];
+
+            glPushAttrib(GL_COLOR_BUFFER_BIT | GL_SCISSOR_BIT);
+            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();
+            glFlush();
+
+            if (origContext)
+                [origContext makeCurrentContext];
+            else
+                [NSOpenGLContext clearCurrentContext];
+
+            shouldClearToBlack = FALSE;
+        }
+    }
+
 @end
 
 
@@ -135,6 +161,9 @@ void macdrv_make_context_current(macdrv_opengl_context c, macdrv_view v)
                 [context setLatentView:view];
 
             [context makeCurrentContext];
+
+            if ([context view])
+                [context clearToBlackIfNeeded];
         }
         else
         {
@@ -163,6 +192,8 @@ void macdrv_update_opengl_context(macdrv_opengl_context c)
         {
             [context setView:context.latentView];
             context.latentView = nil;
+
+            [context clearToBlackIfNeeded];
         }
         else
             [context update];
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 74fa191..6fa6ee8 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -154,6 +154,7 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
 {
     NSMutableArray* glContexts;
     NSMutableArray* pendingGlContexts;
+    BOOL clearedGlSurface;
 
     NSMutableAttributedString* markedText;
     NSRange markedTextSelection;
@@ -221,7 +222,14 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
         WineWindow* window = (WineWindow*)[self window];
 
         for (WineOpenGLContext* context in pendingGlContexts)
+        {
+            if (!clearedGlSurface)
+            {
+                context.shouldClearToBlack = TRUE;
+                clearedGlSurface = TRUE;
+            }
             context.needsUpdate = TRUE;
+        }
         [glContexts addObjectsFromArray:pendingGlContexts];
         [pendingGlContexts removeAllObjects];
 
@@ -298,6 +306,11 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
         if ([[self window] windowNumber] > 0 && !NSIsEmptyRect([self visibleRect]))
         {
             [glContexts addObject:context];
+            if (!clearedGlSurface)
+            {
+                context.shouldClearToBlack = TRUE;
+                clearedGlSurface = TRUE;
+            }
             context.needsUpdate = TRUE;
         }
         else




More information about the wine-cvs mailing list