wgl: split device structs, move swapbuffers to shared
authorKeith Whitwell <keithw@vmware.com>
Wed, 28 Jan 2009 16:11:46 +0000 (16:11 +0000)
committerKeith Whitwell <keithw@vmware.com>
Wed, 28 Jan 2009 16:11:46 +0000 (16:11 +0000)
Each of icd, shared and wgl now have the opportunity to maintain their
own per-device structs, which should reduce the need for these
modules to be looking into each others structures.

12 files changed:
src/gallium/state_trackers/wgl/SConscript
src/gallium/state_trackers/wgl/icd/stw_icd.c
src/gallium/state_trackers/wgl/shared/stw_device.c
src/gallium/state_trackers/wgl/shared/stw_device.h
src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
src/gallium/state_trackers/wgl/shared/stw_pixelformat.h
src/gallium/state_trackers/wgl/stw.c [new file with mode: 0644]
src/gallium/state_trackers/wgl/stw.h [new file with mode: 0644]
src/gallium/state_trackers/wgl/wgl/stw_wgl.c
src/gallium/state_trackers/wgl/wgl/stw_wgl_arbpixelformat.c
src/gallium/state_trackers/wgl/wgl/stw_wgl_pixelformat.c
src/gallium/state_trackers/wgl/wgl/stw_wgl_swapbuffers.c

index 37eb650c87fdfca37c72c204fa77bed42b5a133e..1accc26d395dd13d358d4340e710b0ef27229332 100644 (file)
@@ -19,6 +19,7 @@ if env['platform'] in ['windows']:
     ])
      
     sources = [
+        'stw.c',
         'icd/stw_icd.c',
         'shared/stw_context.c',
         'shared/stw_device.c',
index 9c28442c1f9ad55d09184e67f38fdaa63dbd75ab..8cc0932de9b7a1f64e77dd796d7b10bb4c0e3b75 100644 (file)
 
 #include "pipe/p_debug.h"
 
-#include "shared/stw_device.h"
-#include "shared/stw_context.h"
-#include "shared/stw_pixelformat.h"
+#include "shared/stw_public.h"
 #include "icd/stw_icd.h"
 #include "wgl/stw_wgl.h"
+#include "stw.h"
+
+
+#define DRV_CONTEXT_MAX 32
+
+struct stw_icd
+{
+   struct {
+      HGLRC hglrc;
+   } ctx_array[DRV_CONTEXT_MAX];
+
+   DHGLRC ctx_current;
+};
+
+
+static struct stw_icd *stw_icd = NULL;
+
+
+boolean
+stw_icd_init( void )
+{
+   static struct stw_icd stw_icd_storage;
+
+   assert(!stw_icd);
+
+   stw_icd = &stw_icd_storage;
+   memset(stw_icd, 0, sizeof(*stw_icd));
+
+   return TRUE;
+}
+
+void
+stw_icd_cleanup(void)
+{
+   DHGLRC dhglrc;
+
+   if(!stw_icd)
+      return;
+
+   /* Ensure all contexts are destroyed */
+   for (dhglrc = 1; dhglrc <= DRV_CONTEXT_MAX; dhglrc++)
+      if (stw_icd->ctx_array[dhglrc - 1].hglrc)
+         DrvDeleteContext( dhglrc );
+
+   stw_icd = NULL;
+}
 
 
 static HGLRC
@@ -46,7 +90,7 @@ lookup_hglrc( DHGLRC dhglrc )
        dhglrc >= DRV_CONTEXT_MAX)
       return NULL;
 
-   return stw_dev->ctx_array[dhglrc - 1].hglrc;
+   return stw_icd->ctx_array[dhglrc - 1].hglrc;
 }
 
 BOOL APIENTRY
@@ -73,7 +117,7 @@ DrvCreateLayerContext(
    DWORD i;
    
    for (i = 0; i < DRV_CONTEXT_MAX; i++) {
-      if (stw_dev->ctx_array[i].hglrc == NULL)
+      if (stw_icd->ctx_array[i].hglrc == NULL)
          goto found_slot;
    }
    
@@ -82,8 +126,8 @@ DrvCreateLayerContext(
    return 0;
 
 found_slot:
-   stw_dev->ctx_array[i].hglrc = stw_create_context( hdc, iLayerPlane );
-   if (stw_dev->ctx_array[i].hglrc == NULL)
+   stw_icd->ctx_array[i].hglrc = stw_create_context( hdc, iLayerPlane );
+   if (stw_icd->ctx_array[i].hglrc == NULL)
       return 0;
 
    return (DHGLRC) i + 1;
@@ -106,7 +150,7 @@ DrvDeleteContext(
    if (hglrc != NULL) {
       success = stw_delete_context( hglrc );
       if (success)
-         stw_dev->ctx_array[dhglrc - 1].hglrc = NULL;
+         stw_icd->ctx_array[dhglrc - 1].hglrc = NULL;
    }
 
    debug_printf( "%s( %u ) = %s\n", __FUNCTION__, dhglrc, success ? "TRUE" : "FALSE" );
@@ -187,13 +231,13 @@ DrvReleaseContext(
 {
    BOOL success = FALSE;
 
-   if (dhglrc == stw_dev->ctx_current) {
+   if (dhglrc == stw_icd->ctx_current) {
       HGLRC hglrc = lookup_hglrc( dhglrc );
 
       if (hglrc != NULL) {
          success = wglMakeCurrent( NULL, NULL );
          if (success)
-            stw_dev->ctx_current = 0;
+            stw_icd->ctx_current = 0;
       }
    }
 
index 63ee066824e8185b401e297eddc5ea0a55da2f5e..88eeae7de7ce08a58b5c74ee11ec9b89c3d82aa8 100644 (file)
@@ -34,6 +34,8 @@
 #include "shared/stw_device.h"
 #include "shared/stw_winsys.h"
 #include "shared/stw_pixelformat.h"
+#include "shared/stw_public.h"
+#include "stw.h"
 
 
 struct stw_device *stw_dev = NULL;
@@ -57,7 +59,7 @@ st_flush_frontbuffer(struct pipe_winsys *ws,
 
 
 boolean
-st_init(const struct stw_winsys *stw_winsys)
+stw_shared_init(const struct stw_winsys *stw_winsys)
 {
    static struct stw_device stw_dev_storage;
 
@@ -86,17 +88,7 @@ error1:
 
 
 void
-st_cleanup(void)
+stw_shared_cleanup(void)
 {
-   DHGLRC dhglrc;
-
-   if(!stw_dev)
-      return;
-
-   /* Ensure all contexts are destroyed */
-   for (dhglrc = 1; dhglrc <= DRV_CONTEXT_MAX; dhglrc++)
-      if (stw_dev->ctx_array[dhglrc - 1].hglrc)
-         DrvDeleteContext( dhglrc );
-
    stw_dev = NULL;
 }
index 2babc654daf722358c6efd3e23c747cb2b4b04c9..bc0bce37c6e3a2a9022997a372dc195437021727 100644 (file)
 #define ST_DEVICE_H_
 
 
-#include "icd/stw_icd.h"
-
 struct pipe_screen;
 
-
-struct drv_context
-{
-   HGLRC hglrc;
-};
-
-#define DRV_CONTEXT_MAX 32
-
-
 struct stw_device
 {
    const struct stw_winsys *stw_winsys;
-   
    struct pipe_screen *screen;
-
-   struct drv_context ctx_array[DRV_CONTEXT_MAX];
-
-   DHGLRC ctx_current;
 };
 
 
index 1ecafa451ee8b825d5a6f14884cb2ca5dac8ef91..50edf7306d6d59da2d3d2a190b7faa3464340992 100644 (file)
 
 #include "main/context.h"
 #include "pipe/p_format.h"
+#include "pipe/p_screen.h"
 #include "state_tracker/st_context.h"
 #include "state_tracker/st_public.h"
 #include "stw_framebuffer.h"
+#include "stw_device.h"
+#include "stw_public.h"
+#include "stw_winsys.h"
+
 
 void
 framebuffer_resize(
@@ -179,3 +184,29 @@ framebuffer_from_hdc(
          return fb;
    return NULL;
 }
+
+
+BOOL
+stw_swap_buffers(
+   HDC hdc )
+{
+   struct stw_framebuffer *fb;
+   struct pipe_surface *surf;
+
+   fb = framebuffer_from_hdc( hdc );
+   if (fb == NULL)
+      return FALSE;
+
+   /* If we're swapping the buffer associated with the current context
+    * we have to flush any pending rendering commands first.
+    */
+   st_notify_swapbuffers( fb->stfb );
+
+   st_get_framebuffer_surface( fb->stfb, ST_SURFACE_BACK_LEFT, &surf );
+
+   stw_dev->stw_winsys->flush_frontbuffer(stw_dev->screen->winsys,
+                                          surf,
+                                          hdc );
+
+   return TRUE;
+}
index 982de2266646e30cfd16c418faa6025263e26e83..ab5dcfc6726186405c8741d17ebff7c99b8bddeb 100644 (file)
@@ -29,6 +29,7 @@
 #define PIXELFORMAT_H
 
 #include <windows.h>
+#include "pipe/p_compiler.h"
 
 #define PF_FLAG_DOUBLEBUFFER  0x00000001
 #define PF_FLAG_MULTISAMPLED  0x00000002
diff --git a/src/gallium/state_trackers/wgl/stw.c b/src/gallium/state_trackers/wgl/stw.c
new file mode 100644 (file)
index 0000000..8bccdad
--- /dev/null
@@ -0,0 +1,57 @@
+/**************************************************************************
+ *
+ * Copyright 2009, VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#include "stw.h"
+#include "shared/stw_winsys.h"
+
+boolean
+st_init(const struct stw_winsys *stw_winsys)
+{
+   if (!stw_shared_init( stw_winsys ))
+      goto fail;
+
+   if (!stw_icd_init())
+      goto fail;
+
+   if (!stw_wgl_init())
+      goto fail;
+
+   return TRUE;
+
+fail:
+   st_cleanup();
+   return FALSE;
+}
+
+
+void
+st_cleanup(void)
+{
+   stw_icd_cleanup();
+   stw_shared_cleanup();
+   stw_wgl_cleanup();
+}
diff --git a/src/gallium/state_trackers/wgl/stw.h b/src/gallium/state_trackers/wgl/stw.h
new file mode 100644 (file)
index 0000000..450af4c
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#ifndef STW_H
+#define STW_H
+
+#include "pipe/p_compiler.h"
+
+struct stw_winsys;
+
+/* Public interface:
+ */
+boolean stw_init( const struct stw_winsys *stw_winsys );
+void stw_cleanup( void );
+
+
+
+/* Internal functions
+ */
+boolean stw_shared_init( const struct stw_winsys *stw_winsys );
+boolean stw_icd_init( void ); 
+boolean stw_wgl_init( void );
+
+void stw_shared_cleanup( void );
+void stw_icd_cleanup( void ); 
+void stw_wgl_cleanup( void );
+
+
+#endif /* STW_H */
index f6a4f66dd7d1b38adcbc1bfb6bd56a0538852d8d..8f7ec8ddd48688d63d981cc3a9cff35c38910f5f 100644 (file)
 #include <windows.h>
 
 #include "pipe/p_debug.h"
-#include "shared/stw_context.h"
+#include "shared/stw_public.h"
 #include "stw_wgl.h"
+#include "stw.h"
+
+boolean stw_wgl_init( void )
+{
+   debug_printf("%s\n", __FUNCTION__);
+   return TRUE;
+}
+
+void stw_wgl_cleanup( void )
+{
+}
 
 
 WINGDIAPI BOOL APIENTRY
index a1e6fc2ca4b6383e9758ff31dd6090148e4fd917..6adb05ea1fc1ada228a5fecbe2805708cd2cafdc 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "pipe/p_compiler.h"
 #include "util/u_memory.h"
-#include "shared/stw_pixelformat.h"
+#include "shared/stw_public.h"
 #include "stw_wgl_arbmultisample.h"
 #include "stw_wgl_arbpixelformat.h"
 
index 40c6eaf59428a3aa844631385069266b0599d287..11438172e696e669d500f10cb2a3ce26677fd8e4 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "pipe/p_compiler.h"
 #include "pipe/p_debug.h"
-#include "shared/stw_pixelformat.h"
+#include "shared/stw_public.h"
 #include "stw_wgl.h"
 
 WINGDIAPI int APIENTRY
index c0af8bc4f6ffaeafd2a2dffb47d64ceb8cef0308..9984f9860c251b81eea01f4073c5e724974ab352 100644 (file)
 
 #include <windows.h>
 
-#include "pipe/p_winsys.h"
-#include "pipe/p_screen.h"
-#include "pipe/p_context.h"
-#include "state_tracker/st_context.h"
-#include "state_tracker/st_public.h"
-#include "shared/stw_winsys.h"
-#include "shared/stw_device.h"
-#include "shared/stw_framebuffer.h"
+#include "shared/stw_public.h"
 #include "stw_wgl.h"
 
 WINGDIAPI BOOL APIENTRY
 wglSwapBuffers(
    HDC hdc )
 {
-   struct stw_framebuffer *fb;
-   struct pipe_surface *surf;
-
-   fb = framebuffer_from_hdc( hdc );
-   if (fb == NULL)
-      return FALSE;
-
-   /* If we're swapping the buffer associated with the current context
-    * we have to flush any pending rendering commands first.
-    */
-   st_notify_swapbuffers( fb->stfb );
-
-   st_get_framebuffer_surface( fb->stfb, ST_SURFACE_BACK_LEFT, &surf );
-
-   stw_dev->stw_winsys->flush_frontbuffer(stw_dev->screen->winsys,
-                                          surf,
-                                          hdc );
-
-   return TRUE;
+   return stw_swap_buffers( hdc );
 }
 
 WINGDIAPI BOOL APIENTRY