Mesa (master): gallium/wgl: fix default pixel format issue

Brian Paul brianp at kemper.freedesktop.org
Wed Nov 15 23:15:25 UTC 2017


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

Author: Frank Richter <frank.richter at dynardo.de>
Date:   Tue Oct 17 10:34:27 2017 +0200

gallium/wgl: fix default pixel format issue

When creating a context without SetPixelFormat() don't blindly take the
pixel format reported by GDI. Instead, look for our own closest pixel
format.

Minor clean-ups added by Brian Paul.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103412
Reviewed-by: Brian Paul <brianp at vmware.com>
Tested-by: Brian Paul <brianp at vmware.com>

---

 src/gallium/state_trackers/wgl/stw_context.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/wgl/stw_context.c b/src/gallium/state_trackers/wgl/stw_context.c
index 58fe3b0b6e..939ffd5683 100644
--- a/src/gallium/state_trackers/wgl/stw_context.c
+++ b/src/gallium/state_trackers/wgl/stw_context.c
@@ -133,6 +133,25 @@ DrvCreateLayerContext(HDC hdc, INT iLayerPlane)
 
 
 /**
+ * Return the stw pixel format that most closely matches the pixel format
+ * on HDC.
+ * Used to get a pixel format when SetPixelFormat() hasn't been called before.
+ */
+static int
+get_matching_pixel_format(HDC hdc)
+{
+   int iPixelFormat = GetPixelFormat(hdc);
+   PIXELFORMATDESCRIPTOR pfd;
+
+   if (!iPixelFormat)
+      return 0;
+   if (!DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd))
+      return 0;
+   return stw_pixelformat_choose(hdc, &pfd);
+}
+
+
+/**
  * Called via DrvCreateContext(), DrvCreateLayerContext() and
  * wglCreateContextAttribsARB() to actually create a rendering context.
  * \param handle  the desired DHGLRC handle to use for the context, or zero
@@ -174,7 +193,7 @@ stw_create_context_attribs(HDC hdc, INT iLayerPlane, DHGLRC hShareContext,
        * but not all do, and the opengl32 runtime seems to use a default
        * pixel format in some cases, so use that.
        */
-      iPixelFormat = GetPixelFormat(hdc);
+      iPixelFormat = get_matching_pixel_format(hdc);
       if (!iPixelFormat)
          return 0;
    }
@@ -458,7 +477,7 @@ stw_make_current(HDC hDrawDC, HDC hReadDC, DHGLRC dhglrc)
           * pixel format in some cases, so we must create a framebuffer for
           * those here.
           */
-         int iPixelFormat = GetPixelFormat(hDrawDC);
+         int iPixelFormat = get_matching_pixel_format(hDrawDC);
          if (iPixelFormat)
             fb = stw_framebuffer_create( hDrawDC, iPixelFormat );
          if (!fb)




More information about the mesa-commit mailing list