wgl: Do not provide DllMain inside the state tracker.
authorJosé Fonseca <jfonseca@vmware.com>
Tue, 6 Jan 2009 16:45:12 +0000 (16:45 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 6 Jan 2009 18:23:17 +0000 (18:23 +0000)
MS CRT libraries already provide a default DllMain entrypoint, and
MS Linker will complain if it finds the same symbol in two different
libraries. Therefore the DllMain has to be in (each) winsys.

src/gallium/winsys/gdi/gdi_softpipe_winsys.c
src/mesa/state_tracker/wgl/stw_device.c
src/mesa/state_tracker/wgl/stw_device.h
src/mesa/state_tracker/wgl/stw_wgl_context.c
src/mesa/state_tracker/wgl/stw_wgl_swapbuffers.c
src/mesa/state_tracker/wgl/stw_winsys.h

index cb74b54742aee39a31b7d5d1cba885f117084b34..e981b4c5cd3607437353dc43f5d97580b0c297de 100644 (file)
@@ -337,8 +337,23 @@ gdi_softpipe_flush_frontbuffer(struct pipe_winsys *winsys,
 }
 
 
-const struct stw_winsys stw_winsys = {
+static const struct stw_winsys stw_winsys = {
    &gdi_softpipe_screen_create,
    &gdi_softpipe_context_create,
    &gdi_softpipe_flush_frontbuffer
 };
+
+
+BOOL WINAPI
+DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
+{
+   switch (fdwReason) {
+   case DLL_PROCESS_ATTACH:
+      return st_init(&stw_winsys);
+
+   case DLL_PROCESS_DETACH:
+      st_cleanup();
+      break;
+   }
+   return TRUE;
+}
\ No newline at end of file
index 52907f1a792f5c60d28af6862fbcfa56f49dcb3a..e2a17d83ac63f5b7dcbb149f82398c41e85a87d2 100644 (file)
@@ -37,8 +37,8 @@
 struct stw_device *stw_dev = NULL;
 
 
-static BOOL
-st_init(void)
+boolean
+st_init(const struct stw_winsys *stw_winsys)
 {
    static struct stw_device stw_dev_storage;
 
@@ -47,7 +47,9 @@ st_init(void)
    stw_dev = &stw_dev_storage;
    memset(stw_dev, 0, sizeof(*stw_dev));
 
-   stw_dev->screen = stw_winsys.create_screen();
+   stw_dev->stw_winsys = stw_winsys;
+
+   stw_dev->screen = stw_winsys->create_screen();
    if(!stw_dev->screen)
       goto error1;
 
@@ -61,7 +63,7 @@ error1:
 }
 
 
-static void
+void
 st_cleanup(void)
 {
    DHGLRC dhglrc;
@@ -76,18 +78,3 @@ st_cleanup(void)
 
    stw_dev = NULL;
 }
-
-
-BOOL WINAPI
-DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
-{
-   switch (fdwReason) {
-   case DLL_PROCESS_ATTACH:
-      return st_init();
-
-   case DLL_PROCESS_DETACH:
-      st_cleanup();
-      break;
-   }
-   return TRUE;
-}
index 49f79ac9c70121d219ec62a83bd731c90c62666e..e2020bf055444b419415a57e487b5862d369ceb0 100644 (file)
@@ -44,6 +44,8 @@ struct drv_context
 
 struct stw_device
 {
+   const struct stw_winsys *stw_winsys;
+   
    struct pipe_screen *screen;
 
    struct drv_context ctx_array[DRV_CONTEXT_MAX];
index d087b63507c08ee258527e4935ec5b9fb0ab32d8..0c13c6b68ab291cc41e1af2a722f0084ab8641f8 100644 (file)
@@ -105,7 +105,7 @@ wglCreateContext(
       return NULL;
    }
 
-   pipe = stw_winsys.create_context( stw_dev->screen );
+   pipe = stw_dev->stw_winsys->create_context( stw_dev->screen );
    if (!pipe) {
       _mesa_destroy_visual( visual );
       FREE( ctx );
index 794259123a172e8ddb0f8b1cc335f86a78e8ea1b..bd86501ac04598e22a63a04dccd60f7887ff15ec 100644 (file)
@@ -55,9 +55,9 @@ wglSwapBuffers(
 
    surf = st_get_framebuffer_surface( fb->stfb, ST_SURFACE_BACK_LEFT );
 
-   stw_winsys.flush_frontbuffer(stw_dev->screen->winsys,
-                               surf,
-                               hdc );
+   stw_dev->stw_winsys->flush_frontbuffer(stw_dev->screen->winsys,
+                                          surf,
+                                          hdc );
 
    return TRUE;
 }
index e61f65f70e155e0c45019bf764f4421086c97902..8557327ccddb0d21840bd06f5bf0ecab04793780 100644 (file)
@@ -30,6 +30,8 @@
 
 #include <windows.h> /* for HDC */
 
+#include "pipe/p_compiler.h"
+
 struct pipe_screen;
 struct pipe_context;
 struct pipe_winsys;
@@ -49,6 +51,10 @@ struct stw_winsys
                          HDC hDC );
 };
 
-extern const struct stw_winsys stw_winsys;
+boolean
+st_init(const struct stw_winsys *stw_winsys);
+
+void
+st_cleanup(void);
 
 #endif /* STW_WINSYS_H */