[gtk/mesa.win32-3.24] gdkglcontext-win32.c: Fix running with Mesa drivers




commit 1b1dee86a53889bd9f02105dc867a5fbc96b03dd
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Thu Apr 29 12:04:42 2021 +0800

    gdkglcontext-win32.c: Fix running with Mesa drivers
    
    Some GL drivers such as Mesa-D3D12 do not allow one to call SetPixelFormat() on
    a given HDC if one pixel format has been already set for it, so first check the
    HDC with GetPixelFormat() to see whether a pixel format has already been set
    with the HDC, and only attempt to acquire the pixel format if one has not been
    set.
    
    This will fix running with GL on Windows using the Mesa drivers.

 gdk/win32/gdkglcontext-win32.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)
---
diff --git a/gdk/win32/gdkglcontext-win32.c b/gdk/win32/gdkglcontext-win32.c
index 539d096715..e1683511e1 100644
--- a/gdk/win32/gdkglcontext-win32.c
+++ b/gdk/win32/gdkglcontext-win32.c
@@ -855,19 +855,30 @@ _set_pixformat_for_hdc (HDC              hdc,
                         const gboolean   need_alpha_bits,
                         GdkWin32Display *display)
 {
-  PIXELFORMATDESCRIPTOR pfd;
-  gboolean set_pixel_format_result = FALSE;
+  gboolean already_checked = TRUE;
+  *best_idx = GetPixelFormat (hdc);
 
   /* one is only allowed to call SetPixelFormat(), and so ChoosePixelFormat()
    * one single time per window HDC
    */
-  *best_idx = _get_wgl_pfd (hdc, need_alpha_bits, &pfd, display);
-  if (*best_idx != 0)
-    set_pixel_format_result = SetPixelFormat (hdc, *best_idx, &pfd);
+  if (*best_idx == 0)
+    {
+      PIXELFORMATDESCRIPTOR pfd;
+      gboolean set_pixel_format_result = FALSE;
 
-  /* ChoosePixelFormat() or SetPixelFormat() failed, bail out */
-  if (*best_idx == 0 || !set_pixel_format_result)
-    return FALSE;
+      GDK_NOTE (OPENGL, g_print ("requesting pixel format...\n"));
+         already_checked = FALSE;
+      *best_idx = _get_wgl_pfd (hdc, need_alpha_bits, &pfd, display);
+
+      if (*best_idx != 0)
+        set_pixel_format_result = SetPixelFormat (hdc, *best_idx, &pfd);
+
+      /* ChoosePixelFormat() or SetPixelFormat() failed, bail out */
+      if (*best_idx == 0 || !set_pixel_format_result)
+        return FALSE;
+    }
+
+  GDK_NOTE (OPENGL, g_print ("%s""requested and set pixel format: %d\n", already_checked ? "already " : "", 
*best_idx));
 
   return TRUE;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]