wgl: Destroy the framebuffer when the window is destroyed.
authorJosé Fonseca <jfonseca@vmware.com>
Tue, 2 Jun 2009 03:20:48 +0000 (20:20 -0700)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 2 Jun 2009 03:20:48 +0000 (20:20 -0700)
src/gallium/state_trackers/wgl/shared/stw_framebuffer.c

index 768cef3db6cc041e10c108b85b46e502a4c80bc4..de37d135dfe4bd1451831940519a711ca56245cd 100644 (file)
 #include "stw_tls.h"
 
 
+struct stw_framebuffer *
+stw_framebuffer_from_hwnd_locked(
+   HWND hwnd )
+{
+   struct stw_framebuffer *fb;
+
+   for (fb = stw_dev->fb_head; fb != NULL; fb = fb->next)
+      if (fb->hWnd == hwnd)
+         break;
+
+   return fb;
+}
+
+
+static INLINE void
+stw_framebuffer_destroy_locked(
+   struct stw_framebuffer *fb )
+{
+   struct stw_framebuffer **link;
+
+   link = &stw_dev->fb_head;
+   while (*link != fb)
+      link = &(*link)->next;
+   assert(*link);
+   *link = fb->next;
+   fb->next = NULL;
+
+   st_unreference_framebuffer(fb->stfb);
+   
+   pipe_mutex_destroy( fb->mutex );
+   
+   FREE( fb );
+}
+
+
 /**
  * @sa http://msdn.microsoft.com/en-us/library/ms644975(VS.85).aspx
  * @sa http://msdn.microsoft.com/en-us/library/ms644960(VS.85).aspx
@@ -69,9 +104,7 @@ stw_call_window_proc(
       struct stw_framebuffer *fb;
 
       pipe_mutex_lock( stw_dev->mutex );
-      for (fb = stw_dev->fb_head; fb != NULL; fb = fb->next)
-         if (fb->hWnd == pParams->hwnd)
-            break;
+      fb = stw_framebuffer_from_hwnd_locked( pParams->hwnd );
       pipe_mutex_unlock( stw_dev->mutex );
       
       if(fb) {
@@ -90,6 +123,18 @@ stw_call_window_proc(
       }
    }
 
+   if (pParams->message == WM_DESTROY) {
+      struct stw_framebuffer *fb;
+
+      pipe_mutex_lock( stw_dev->mutex );
+      
+      fb = stw_framebuffer_from_hwnd_locked( pParams->hwnd );
+      if(fb)
+         stw_framebuffer_destroy_locked(fb);
+      
+      pipe_mutex_unlock( stw_dev->mutex );
+   }
+
    return CallNextHookEx(tls_data->hCallWndProcHook, nCode, wParam, lParam);
 }
 
@@ -212,27 +257,6 @@ stw_framebuffer_resize(
 }                      
 
 
-static INLINE void
-stw_framebuffer_destroy_locked(
-   struct stw_framebuffer *fb )
-{
-   struct stw_framebuffer **link;
-
-   link = &stw_dev->fb_head;
-   while (*link != fb)
-      link = &(*link)->next;
-   assert(*link);
-   *link = fb->next;
-   fb->next = NULL;
-
-   st_unreference_framebuffer(fb->stfb);
-   
-   pipe_mutex_destroy( fb->mutex );
-   
-   FREE( fb );
-}
-
-
 void
 stw_framebuffer_cleanup( void )
 {