Mesa (mesa_7_5_branch): wgl: Use the right pixel format.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Sun May 31 03:29:36 UTC 2009


Module: Mesa
Branch: mesa_7_5_branch
Commit: fe69b6bdc7bbde2cefec856ff338788d7be20f4e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fe69b6bdc7bbde2cefec856ff338788d7be20f4e

Author: José Fonseca <jfonseca at vmware.com>
Date:   Sat May 30 19:58:50 2009 -0700

wgl: Use the right pixel format.

There is no current pixel format. Each HDC has its pixelformat which is
kept by gdi and set/get via the SetPixelFormat/GetPixelFormat functions.

Now the HDC's pixelformat is kept in the stw_framebuffer, which is
created during the SetPixelFormat.

---

 .../state_trackers/wgl/shared/stw_context.c        |  176 ++++++----------
 .../state_trackers/wgl/shared/stw_context.h        |    3 +-
 src/gallium/state_trackers/wgl/shared/stw_device.c |    2 +
 .../state_trackers/wgl/shared/stw_framebuffer.c    |  223 ++++++++++++++++----
 .../state_trackers/wgl/shared/stw_framebuffer.h    |   26 ++-
 .../state_trackers/wgl/shared/stw_pixelformat.c    |   65 +++----
 .../state_trackers/wgl/shared/stw_pixelformat.h    |    5 +
 src/gallium/state_trackers/wgl/shared/stw_tls.c    |    2 -
 src/gallium/state_trackers/wgl/shared/stw_tls.h    |    1 -
 9 files changed, 301 insertions(+), 202 deletions(-)

diff --git a/src/gallium/state_trackers/wgl/shared/stw_context.c b/src/gallium/state_trackers/wgl/shared/stw_context.c
index 09dba61..662b5fb 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_context.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_context.c
@@ -90,7 +90,7 @@ stw_share_lists(
    ctx2 = stw_lookup_context_locked( hglrc2 );
 
    if (ctx1 && ctx2 &&
-       ctx1->pfi == ctx2->pfi) { 
+       ctx1->iPixelFormat == ctx2->iPixelFormat) { 
       ret = _mesa_share_state(ctx2->st->ctx, ctx1->st->ctx);
    }
 
@@ -104,51 +104,32 @@ stw_create_layer_context(
    HDC hdc,
    int iLayerPlane )
 {
-   uint pfi;
-   const struct stw_pixelformat_info *pf = NULL;
+   int iPixelFormat;
+   const struct stw_pixelformat_info *pfi;
+   GLvisual visual;
    struct stw_context *ctx = NULL;
-   GLvisual *visual = NULL;
    struct pipe_screen *screen = NULL;
    struct pipe_context *pipe = NULL;
-
+   
    if(!stw_dev)
       return 0;
    
    if (iLayerPlane != 0)
       return 0;
 
-   pfi = stw_pixelformat_get( hdc );
-   if (pfi == 0)
+   iPixelFormat = GetPixelFormat(hdc);
+   if(!iPixelFormat)
       return 0;
-
-   pf = stw_pixelformat_get_info( pfi - 1 );
-
+   
+   pfi = stw_pixelformat_get_info( iPixelFormat - 1 );
+   stw_pixelformat_visual(&visual, pfi);
+   
    ctx = CALLOC_STRUCT( stw_context );
    if (ctx == NULL)
       goto no_ctx;
 
    ctx->hdc = hdc;
-
-   /* Create visual based on flags
-    */
-   visual = _mesa_create_visual(
-      (pf->pfd.iPixelType == PFD_TYPE_RGBA) ? GL_TRUE : GL_FALSE,
-      (pf->pfd.dwFlags & PFD_DOUBLEBUFFER) ? GL_TRUE : GL_FALSE,
-      (pf->pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE,
-      pf->pfd.cRedBits,
-      pf->pfd.cGreenBits,
-      pf->pfd.cBlueBits,
-      pf->pfd.cAlphaBits,
-      (pf->pfd.iPixelType == PFD_TYPE_COLORINDEX) ? pf->pfd.cColorBits : 0,
-      pf->pfd.cDepthBits,
-      pf->pfd.cStencilBits,
-      pf->pfd.cAccumRedBits,
-      pf->pfd.cAccumGreenBits,
-      pf->pfd.cAccumBlueBits,
-      pf->pfd.cAccumAlphaBits,
-      pf->numSamples );
-   if (visual == NULL) 
-      goto no_visual;
+   ctx->iPixelFormat = iPixelFormat;
 
    screen = stw_dev->screen;
 
@@ -168,15 +149,15 @@ stw_create_layer_context(
       pipe = trace_context_create(stw_dev->screen, pipe);
 #endif
 
+   /* pass to stw_flush_frontbuffer as context_private */
    assert(!pipe->priv);
    pipe->priv = hdc;
 
-   ctx->st = st_create_context( pipe, visual, NULL );
+   ctx->st = st_create_context( pipe, &visual, NULL );
    if (ctx->st == NULL) 
       goto no_st_ctx;
 
    ctx->st->ctx->DriverCtx = ctx;
-   ctx->pfi = pf;
 
    pipe_mutex_lock( stw_dev->mutex );
    ctx->hglrc = handle_table_add(stw_dev->ctx_table, ctx);
@@ -192,9 +173,7 @@ no_hglrc:
 no_st_ctx:
    pipe->destroy( pipe );
 no_pipe:
-   _mesa_destroy_visual( visual );
-no_visual:
-   FREE( ctx );
+   FREE(ctx);
 no_ctx:
    return 0;
 }
@@ -217,20 +196,11 @@ stw_delete_context(
    if (ctx) {
       GLcontext *glctx = ctx->st->ctx;
       GET_CURRENT_CONTEXT( glcurctx );
-      struct stw_framebuffer *fb;
 
-      /* Unbind current if deleting current context.
-       */
+      /* Unbind current if deleting current context. */
       if (glcurctx == glctx)
          st_make_current( NULL, NULL, NULL );
 
-      fb = stw_framebuffer_from_hdc( ctx->hdc );
-      if (fb)
-         stw_framebuffer_destroy( fb );
-
-      if (WindowFromDC( ctx->hdc ) != NULL)
-         ReleaseDC( WindowFromDC( ctx->hdc ), ctx->hdc );
-
       st_destroy_context(ctx->st);
       FREE(ctx);
 
@@ -274,34 +244,6 @@ stw_release_context(
    return TRUE;
 }
 
-/* Find the width and height of the window named by hdc.
- */
-static void
-stw_get_window_size( HDC hdc, GLuint *pwidth, GLuint *pheight )
-{
-   GLuint width, height;
-   HWND hwnd;
-
-   hwnd = WindowFromDC( hdc );
-   if (hwnd) {
-      RECT rect;
-      GetClientRect( hwnd, &rect );
-      width = rect.right - rect.left;
-      height = rect.bottom - rect.top;
-   }
-   else {
-      width = GetDeviceCaps( hdc, HORZRES );
-      height = GetDeviceCaps( hdc, VERTRES );
-   }
-
-   if(width < 1)
-      width = 1;
-   if(height < 1)
-      height = 1;
-
-   *pwidth = width; 
-   *pheight = height; 
-}
 
 UINT_PTR
 stw_get_current_context( void )
@@ -345,64 +287,68 @@ stw_make_current(
    struct stw_context *ctx;
    GET_CURRENT_CONTEXT( glcurctx );
    struct stw_framebuffer *fb;
-   GLuint width = 0;
-   GLuint height = 0;
-   struct stw_context *curctx = NULL;
 
    if (!stw_dev)
-      return FALSE;
-
-   pipe_mutex_lock( stw_dev->mutex ); 
-   ctx = stw_lookup_context_locked( hglrc );
-   pipe_mutex_unlock( stw_dev->mutex );
+      goto fail;
 
    if (glcurctx != NULL) {
+      struct stw_context *curctx;
       curctx = (struct stw_context *) glcurctx->DriverCtx;
 
-      if (curctx != ctx)
+      if (curctx->hglrc != hglrc)
 	 st_flush(glcurctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
+      
+      /* Return if already current. */
+      if (curctx->hglrc == hglrc && curctx->hdc == hdc)
+         return TRUE;
    }
 
    if (hdc == NULL || hglrc == 0) {
-      st_make_current( NULL, NULL, NULL );
-      return TRUE;
+      return st_make_current( NULL, NULL, NULL );
    }
 
-   /* Return if already current.
-    */
-   if (glcurctx != NULL) {
-      if (curctx != NULL && curctx == ctx && ctx->hdc == hdc)
-         return TRUE;
-   }
-
-   fb = stw_framebuffer_from_hdc( hdc );
-
-   if (hdc != NULL)
-      stw_get_window_size( hdc, &width, &height );
+   pipe_mutex_lock( stw_dev->mutex ); 
 
-   /* Lazy creation of stw_framebuffers.
-    */
-   if (fb == NULL && ctx != NULL && hdc != NULL) {
-      GLvisual *visual = &ctx->st->ctx->Visual;
+   ctx = stw_lookup_context_locked( hglrc );
+   if(!ctx)
+      goto fail;
 
-      fb = stw_framebuffer_create( hdc, visual, ctx->pfi, width, height );
-      if (fb == NULL)
-         return FALSE;
+   fb = stw_framebuffer_from_hdc_locked( hdc );
+   if(!fb) { 
+      /* Applications should call SetPixelFormat before creating a context,
+       * but not all do, and the opengl32 runtime seems to use a default pixel
+       * format in some cases, so we must create a framebuffer for those here
+       */
+      int iPixelFormat = GetPixelFormat(hdc);
+      if(iPixelFormat)
+         fb = stw_framebuffer_create_locked( hdc, iPixelFormat );
+      if(!fb) 
+         goto fail;
    }
+   
+   pipe_mutex_unlock( stw_dev->mutex );
 
-   if (ctx && fb) {
-      pipe_mutex_lock( fb->mutex );
-      st_make_current( ctx->st, fb->stfb, fb->stfb );
-      st_resize_framebuffer( fb->stfb, width, height );
-      pipe_mutex_unlock( fb->mutex );
+   if(fb->iPixelFormat != ctx->iPixelFormat)
+      goto fail;
 
-      ctx->hdc = hdc;
-      ctx->st->pipe->priv = hdc;
-   }
-   else {
-      /* Detach */
-      st_make_current( NULL, NULL, NULL );
-   }
+   /* Lazy allocation of the frame buffer */
+   if(!stw_framebuffer_allocate(fb))
+      goto fail;
 
+   /* Bind the new framebuffer */
+   ctx->hdc = hdc;
+   
+   /* pass to stw_flush_frontbuffer as context_private */
+   ctx->st->pipe->priv = hdc;
+   
+   if(!st_make_current( ctx->st, fb->stfb, fb->stfb ))
+      goto fail;
+
+   stw_framebuffer_resize(fb);
+   
    return TRUE;
+
+fail:
+   st_make_current( NULL, NULL, NULL );
+   return FALSE;
 }
diff --git a/src/gallium/state_trackers/wgl/shared/stw_context.h b/src/gallium/state_trackers/wgl/shared/stw_context.h
index 92df7e6..166471d 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_context.h
+++ b/src/gallium/state_trackers/wgl/shared/stw_context.h
@@ -31,14 +31,13 @@
 #include <windows.h>
 
 struct st_context;
-struct stw_pixelformat_info;
 
 struct stw_context
 {
    struct st_context *st;
    UINT_PTR hglrc;
+   int iPixelFormat;
    HDC hdc;
-   const struct stw_pixelformat_info *pfi;
 };
 
 #endif /* STW_CONTEXT_H */
diff --git a/src/gallium/state_trackers/wgl/shared/stw_device.c b/src/gallium/state_trackers/wgl/shared/stw_device.c
index ada2511..1a6b298 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_device.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_device.c
@@ -173,6 +173,8 @@ stw_cleanup(void)
    }
    pipe_mutex_unlock( stw_dev->mutex );
 
+   stw_framebuffer_cleanup();
+   
    pipe_mutex_destroy( stw_dev->mutex );
    
    stw_dev->screen->destroy(stw_dev->screen);
diff --git a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
index f66f429..45ac347 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
@@ -94,32 +94,16 @@ stw_call_window_proc(
 }
 
 
-/* Create a new framebuffer object which will correspond to the given HDC.
+/**
+ * Create a new framebuffer object which will correspond to the given HDC.
  */
 struct stw_framebuffer *
-stw_framebuffer_create(
+stw_framebuffer_create_locked(
    HDC hdc,
-   GLvisual *visual,
-   const struct stw_pixelformat_info *pfi,
-   GLuint width,
-   GLuint height )
+   int iPixelFormat )
 {
-   enum pipe_format colorFormat, depthFormat, stencilFormat;
    struct stw_framebuffer *fb;
-
-   colorFormat = pfi->color_format;
-   
-   assert(pf_layout( pfi->depth_stencil_format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
-
-   if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_Z ))
-      depthFormat = pfi->depth_stencil_format;
-   else
-      depthFormat = PIPE_FORMAT_NONE;
-
-   if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_S ))
-      stencilFormat = pfi->depth_stencil_format;
-   else
-      stencilFormat = PIPE_FORMAT_NONE;
+   const struct stw_pixelformat_info *pfi;
 
    fb = CALLOC_STRUCT( stw_framebuffer );
    if (fb == NULL)
@@ -127,31 +111,102 @@ stw_framebuffer_create(
 
    fb->hDC = hdc;
    fb->hWnd = WindowFromDC( hdc );
+   fb->iPixelFormat = iPixelFormat;
 
-   pipe_mutex_init( fb->mutex );
+   fb->pfi = pfi = stw_pixelformat_get_info( iPixelFormat - 1 );
 
-   fb->stfb = st_create_framebuffer(
-      visual,
-      colorFormat,
-      depthFormat,
-      stencilFormat,
-      width,
-      height,
-      (void *) fb );
-   if(!fb->stfb) {
-      FREE(fb);
-      return NULL;
-   }
+   stw_pixelformat_visual(&fb->visual, pfi);
+   
+   pipe_mutex_init( fb->mutex );
 
-   pipe_mutex_lock( stw_dev->mutex );
    fb->next = stw_dev->fb_head;
    stw_dev->fb_head = fb;
-   pipe_mutex_unlock( stw_dev->mutex );
 
    return fb;
 }
 
+
+static void
+stw_framebuffer_get_size( struct stw_framebuffer *fb, GLuint *pwidth, GLuint *pheight )
+{
+   GLuint width, height;
+
+   if (fb->hWnd) {
+      RECT rect;
+      GetClientRect( fb->hWnd, &rect );
+      width = rect.right - rect.left;
+      height = rect.bottom - rect.top;
+   }
+   else {
+      width = GetDeviceCaps( fb->hDC, HORZRES );
+      height = GetDeviceCaps( fb->hDC, VERTRES );
+   }
+
+   if(width < 1)
+      width = 1;
+   if(height < 1)
+      height = 1;
+
+   *pwidth = width; 
+   *pheight = height; 
+}
+
+
+BOOL
+stw_framebuffer_allocate(
+   struct stw_framebuffer *fb)
+{
+   pipe_mutex_lock( fb->mutex );
+
+   if(!fb->stfb) {
+      const struct stw_pixelformat_info *pfi = fb->pfi;
+      enum pipe_format colorFormat, depthFormat, stencilFormat;
+      GLuint width, height; 
+
+      colorFormat = pfi->color_format;
+      
+      assert(pf_layout( pfi->depth_stencil_format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
+   
+      if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_Z ))
+         depthFormat = pfi->depth_stencil_format;
+      else
+         depthFormat = PIPE_FORMAT_NONE;
+   
+      if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_S ))
+         stencilFormat = pfi->depth_stencil_format;
+      else
+         stencilFormat = PIPE_FORMAT_NONE;
+   
+      stw_framebuffer_get_size(fb, &width, &height);
+      
+      fb->stfb = st_create_framebuffer(
+         &fb->visual,
+         colorFormat,
+         depthFormat,
+         stencilFormat,
+         width,
+         height,
+         (void *) fb );
+   }
+   
+   pipe_mutex_unlock( fb->mutex );
+
+   return fb->stfb ? TRUE : FALSE;
+}
+
+
 void
+stw_framebuffer_resize(
+   struct stw_framebuffer *fb)
+{
+   GLuint width, height; 
+   assert(fb->stfb);
+   stw_framebuffer_get_size(fb, &width, &height);
+   st_resize_framebuffer(fb->stfb, width, height);
+}                      
+
+
+static INLINE void
 stw_framebuffer_destroy(
    struct stw_framebuffer *fb )
 {
@@ -176,19 +231,55 @@ stw_framebuffer_destroy(
    FREE( fb );
 }
 
+
+void
+stw_framebuffer_cleanup( void )
+{
+   struct stw_framebuffer *fb;
+   struct stw_framebuffer *next;
+
+   pipe_mutex_lock( stw_dev->mutex );
+
+   fb = stw_dev->fb_head;
+   while (fb) {
+      next = fb->next;
+      stw_framebuffer_destroy(fb);
+      fb = next;
+   }
+   stw_dev->fb_head = NULL;
+   
+   pipe_mutex_unlock( stw_dev->mutex );
+}
+
+
 /**
  * Given an hdc, return the corresponding stw_framebuffer.
  */
 struct stw_framebuffer *
-stw_framebuffer_from_hdc(
+stw_framebuffer_from_hdc_locked(
    HDC hdc )
 {
    struct stw_framebuffer *fb;
 
-   pipe_mutex_lock( stw_dev->mutex );
    for (fb = stw_dev->fb_head; fb != NULL; fb = fb->next)
       if (fb->hDC == hdc)
          break;
+
+   return fb;
+}
+
+
+/**
+ * Given an hdc, return the corresponding stw_framebuffer.
+ */
+struct stw_framebuffer *
+stw_framebuffer_from_hdc(
+   HDC hdc )
+{
+   struct stw_framebuffer *fb;
+
+   pipe_mutex_lock( stw_dev->mutex );
+   fb = stw_framebuffer_from_hdc_locked(hdc);
    pipe_mutex_unlock( stw_dev->mutex );
 
    return fb;
@@ -196,6 +287,62 @@ stw_framebuffer_from_hdc(
 
 
 BOOL
+stw_pixelformat_set(
+   HDC hdc,
+   int iPixelFormat )
+{
+   uint count;
+   uint index;
+   struct stw_framebuffer *fb;
+
+   index = (uint) iPixelFormat - 1;
+   count = stw_pixelformat_get_extended_count();
+   if (index >= count)
+      return FALSE;
+
+   pipe_mutex_lock( stw_dev->mutex );
+   
+   fb = stw_framebuffer_from_hdc_locked(hdc);
+   if(fb) {
+      /* SetPixelFormat must be called only once */
+      pipe_mutex_unlock( stw_dev->mutex );
+      return FALSE;
+   }
+
+   fb = stw_framebuffer_create_locked(hdc, iPixelFormat);
+   if(!fb) {
+      pipe_mutex_unlock( stw_dev->mutex );
+      return FALSE;
+   }
+      
+   pipe_mutex_unlock( stw_dev->mutex );
+
+   /* Some applications mistakenly use the undocumented wglSetPixelFormat 
+    * function instead of SetPixelFormat, so we call SetPixelFormat here to 
+    * avoid opengl32.dll's wglCreateContext to fail */
+   if (GetPixelFormat(hdc) == 0) {
+        SetPixelFormat(hdc, iPixelFormat, NULL);
+   }
+   
+   return TRUE;
+}
+
+
+int
+stw_pixelformat_get(
+   HDC hdc )
+{
+   struct stw_framebuffer *fb;
+
+   fb = stw_framebuffer_from_hdc(hdc);
+   if(!fb)
+      return 0;
+   
+   return fb->iPixelFormat;
+}
+
+
+BOOL
 stw_swap_buffers(
    HDC hdc )
 {
diff --git a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h
index f5b48db..e7fa51c 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h
+++ b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h
@@ -44,6 +44,10 @@ struct stw_framebuffer
    HDC hDC;
    HWND hWnd;
 
+   int iPixelFormat;
+   const struct stw_pixelformat_info *pfi;
+   GLvisual visual;
+
    pipe_mutex mutex;
    struct st_framebuffer *stfb;
    
@@ -52,17 +56,25 @@ struct stw_framebuffer
 };
 
 struct stw_framebuffer *
-stw_framebuffer_create(
+stw_framebuffer_create_locked(
    HDC hdc,
-   GLvisual *visual,
-   const struct stw_pixelformat_info *pfi,
-   GLuint width,
-   GLuint height );
+   int iPixelFormat );
 
-void
-stw_framebuffer_destroy(
+BOOL
+stw_framebuffer_allocate(
    struct stw_framebuffer *fb );
 
+void
+stw_framebuffer_resize(
+   struct stw_framebuffer *fb);
+
+void
+stw_framebuffer_cleanup(void);
+
+struct stw_framebuffer *
+stw_framebuffer_from_hdc_locked(
+   HDC hdc );
+
 struct stw_framebuffer *
 stw_framebuffer_from_hdc(
    HDC hdc );
diff --git a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c
index b81d2b5..c296744 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c
@@ -25,12 +25,14 @@
  * 
  **************************************************************************/
 
+#include "main/mtypes.h"
+#include "main/context.h"
+
 #include "pipe/p_format.h"
 #include "pipe/p_defines.h"
 #include "pipe/p_screen.h"
 
 #include "util/u_debug.h"
-#include "util/u_memory.h"
 
 #include "stw_device.h"
 #include "stw_pixelformat.h"
@@ -261,6 +263,31 @@ stw_pixelformat_get_info( uint index )
 }
 
 
+void
+stw_pixelformat_visual(GLvisual *visual, 
+                       const struct stw_pixelformat_info *pfi )
+{
+   memset(visual, 0, sizeof *visual);
+   _mesa_initialize_visual(
+      visual,
+      (pfi->pfd.iPixelType == PFD_TYPE_RGBA) ? GL_TRUE : GL_FALSE,
+      (pfi->pfd.dwFlags & PFD_DOUBLEBUFFER) ? GL_TRUE : GL_FALSE,
+      (pfi->pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE,
+      pfi->pfd.cRedBits,
+      pfi->pfd.cGreenBits,
+      pfi->pfd.cBlueBits,
+      pfi->pfd.cAlphaBits,
+      (pfi->pfd.iPixelType == PFD_TYPE_COLORINDEX) ? pfi->pfd.cColorBits : 0,
+      pfi->pfd.cDepthBits,
+      pfi->pfd.cStencilBits,
+      pfi->pfd.cAccumRedBits,
+      pfi->pfd.cAccumGreenBits,
+      pfi->pfd.cAccumBlueBits,
+      pfi->pfd.cAccumAlphaBits,
+      pfi->numSamples );
+}
+
+
 int
 stw_pixelformat_describe(
    HDC hdc,
@@ -341,39 +368,3 @@ int stw_pixelformat_choose( HDC hdc,
 
    return bestindex + 1;
 }
-
-
-int
-stw_pixelformat_get(
-   HDC hdc )
-{
-   return stw_tls_get_data()->currentPixelFormat;
-}
-
-
-BOOL
-stw_pixelformat_set(
-   HDC hdc,
-   int iPixelFormat )
-{
-   uint count;
-   uint index;
-
-   (void) hdc;
-
-   index = (uint) iPixelFormat - 1;
-   count = stw_pixelformat_get_extended_count();
-   if (index >= count)
-      return FALSE;
-
-   stw_tls_get_data()->currentPixelFormat = iPixelFormat;
-
-   /* Some applications mistakenly use the undocumented wglSetPixelFormat 
-    * function instead of SetPixelFormat, so we call SetPixelFormat here to 
-    * avoid opengl32.dll's wglCreateContext to fail */
-   if (GetPixelFormat(hdc) == 0) {
-        SetPixelFormat(hdc, iPixelFormat, NULL);
-   }
-   
-   return TRUE;
-}
diff --git a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h
index 34522eb..bec4292 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h
+++ b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h
@@ -30,6 +30,8 @@
 
 #include <windows.h>
 
+#include "main/mtypes.h"
+
 #include "pipe/p_compiler.h"
 #include "pipe/p_format.h"
 
@@ -56,5 +58,8 @@ stw_pixelformat_get_extended_count( void );
 const struct stw_pixelformat_info *
 stw_pixelformat_get_info( uint index );
 
+void
+stw_pixelformat_visual(GLvisual *visual, 
+                       const struct stw_pixelformat_info *pfi );
 
 #endif /* STW_PIXELFORMAT_H */
diff --git a/src/gallium/state_trackers/wgl/shared/stw_tls.c b/src/gallium/state_trackers/wgl/shared/stw_tls.c
index 95863ca..0c18a52 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_tls.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_tls.c
@@ -53,8 +53,6 @@ stw_tls_data_create()
    if (!data)
       return NULL;
 
-   data->currentPixelFormat = 0;
-   
    return data;
 }
 
diff --git a/src/gallium/state_trackers/wgl/shared/stw_tls.h b/src/gallium/state_trackers/wgl/shared/stw_tls.h
index 6cfb089..6af8be7 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_tls.h
+++ b/src/gallium/state_trackers/wgl/shared/stw_tls.h
@@ -32,7 +32,6 @@
 
 struct stw_tls_data
 {
-   uint currentPixelFormat;
    HHOOK hCallWndProcHook;
 };
 




More information about the mesa-commit mailing list