[PATCH 1/1] opengl32: Don't prioritize low bit depth formats with non-matching stencil.

Paul Gofman wine at gitlab.winehq.org
Wed May 25 20:20:23 CDT 2022


From: Paul Gofman <pgofman at codeweavers.com>

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/opengl32/tests/opengl.c | 21 +++++++++++++++++++++
 dlls/opengl32/wgl.c          | 16 +++++++++++++---
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c
index 8b0e70ccf9c..0a37223ab80 100644
--- a/dlls/opengl32/tests/opengl.c
+++ b/dlls/opengl32/tests/opengl.c
@@ -342,6 +342,27 @@ static void test_choosepixelformat(void)
     pfd.cDepthBits = 0;
     pfd.cStencilBits = 0;
     pfd.dwFlags &= ~PFD_DEPTH_DONTCARE;
+
+    pfd.cDepthBits = 16;
+    ok( test_pfd(&pfd, &ret_fmt), "depth 16 failed.\n" );
+    ok( ret_fmt.cDepthBits >= 16, "Got unexpected cDepthBits %u.\n", ret_fmt.cDepthBits );
+    pfd.cDepthBits = 0;
+
+    pfd.cDepthBits = 16;
+    pfd.cStencilBits = 8;
+    ok( test_pfd(&pfd, &ret_fmt), "depth 16, stencil 8 failed.\n" );
+    ok( ret_fmt.cDepthBits >= 16, "Got unexpected cDepthBits %u.\n", ret_fmt.cDepthBits );
+    ok( ret_fmt.cStencilBits == 8, "Got unexpected cStencilBits %u.\n", ret_fmt.cStencilBits );
+    pfd.cDepthBits = 0;
+    pfd.cStencilBits = 0;
+
+    pfd.cDepthBits = 8;
+    pfd.cStencilBits = 8;
+    ok( test_pfd(&pfd, &ret_fmt), "depth 8, stencil 8 failed.\n" );
+    ok( ret_fmt.cDepthBits >= 16, "Got unexpected cDepthBits %u.\n", ret_fmt.cDepthBits );
+    ok( ret_fmt.cStencilBits == 8, "Got unexpected cStencilBits %u.\n", ret_fmt.cStencilBits );
+    pfd.cDepthBits = 0;
+    pfd.cStencilBits = 0;
 }
 
 static void WINAPI gl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity,
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index bd7f7d22e98..a2845a08ca8 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -454,6 +454,7 @@ INT WINAPI wglChoosePixelFormat(HDC hdc, const PIXELFORMATDESCRIPTOR* ppfd)
     PIXELFORMATDESCRIPTOR format, best;
     int i, count, best_format;
     int bestDBuffer = -1, bestStereo = -1;
+    BYTE cDepthBits;
 
     TRACE_(wgl)( "%p %p: size %u version %u flags %u type %u color %u %u,%u,%u,%u "
                  "accum %u depth %u stencil %u aux %u\n",
@@ -464,6 +465,15 @@ INT WINAPI wglChoosePixelFormat(HDC hdc, const PIXELFORMATDESCRIPTOR* ppfd)
     count = wglDescribePixelFormat( hdc, 0, 0, NULL );
     if (!count) return 0;
 
+    cDepthBits = ppfd->cDepthBits;
+    if (ppfd->dwFlags & PFD_DEPTH_DONTCARE) cDepthBits = 0;
+    else if (ppfd->cStencilBits && cDepthBits <= 16)
+    {
+        /* Even if, e. g., depth 16, stencil 8 is available Window / AMD may return 24x8 (and not 16x0).
+         * Adjust to 24 as 24x8 is universally available and we won't end up without stencil. */
+        cDepthBits = 24;
+    }
+
     best_format = 0;
     best.dwFlags = 0;
     best.cAlphaBits = -1;
@@ -564,10 +574,10 @@ INT WINAPI wglChoosePixelFormat(HDC hdc, const PIXELFORMATDESCRIPTOR* ppfd)
                 continue;
             }
         }
-        if (ppfd->cDepthBits && !(ppfd->dwFlags & PFD_DEPTH_DONTCARE))
+        if (cDepthBits)
         {
-            if (((ppfd->cDepthBits > best.cDepthBits) && (format.cDepthBits > best.cDepthBits)) ||
-                ((format.cDepthBits >= ppfd->cDepthBits) && (format.cDepthBits < best.cDepthBits)))
+            if (((cDepthBits > best.cDepthBits) && (format.cDepthBits > best.cDepthBits)) ||
+                ((format.cDepthBits >= cDepthBits) && (format.cDepthBits < best.cDepthBits)))
                 goto found;
 
             if (best.cDepthBits != format.cDepthBits)
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/132



More information about the wine-devel mailing list