st/wgl: improve selection of pixel format
authorOlivier Lauffenburger <o.lauffenburger@topsolid.com>
Thu, 6 Jul 2017 15:08:00 +0000 (09:08 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 6 Jul 2017 23:25:58 +0000 (17:25 -0600)
Current selection of pixel format does not enforce the request of
stencil or depth buffer if the color depth is not the same as
requested.

For instance, GLUT requests a 32-bit color buffer with an 8-bit
stencil buffer, but because color buffers are only 24-bit, no
priority is given to creating a stencil buffer.

This patch gives more priority to the creation of requested buffers
and less priority to the difference in bit depth.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101703
Signed-off-by: Olivier Lauffenburger <o.lauffenburger@topsolid.com>
Tested-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/state_trackers/wgl/stw_pixelformat.c

index 7763f71..833308d 100644 (file)
@@ -432,17 +432,39 @@ stw_pixelformat_choose(HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd)
           !!(pfi->pfd.dwFlags & PFD_DOUBLEBUFFER))
          continue;
 
-      /* FIXME: Take in account individual channel bits */
-      if (ppfd->cColorBits != pfi->pfd.cColorBits)
-         delta += 8;
+      /* Selection logic:
+      * - Enabling a feature (depth, stencil...) is given highest priority.
+      * - Giving as many bits as requested is given medium priority.
+      * - Giving no more bits than requested is given lowest priority.
+      */
 
-      if (ppfd->cDepthBits != pfi->pfd.cDepthBits)
-         delta += 4;
+      /* FIXME: Take in account individual channel bits */
+      if (ppfd->cColorBits && !pfi->pfd.cColorBits)
+         delta += 10000;
+      else if (ppfd->cColorBits > pfi->pfd.cColorBits)
+         delta += 100;
+      else if (ppfd->cColorBits < pfi->pfd.cColorBits)
+         delta++;
 
-      if (ppfd->cStencilBits != pfi->pfd.cStencilBits)
+      if (ppfd->cDepthBits && !pfi->pfd.cDepthBits)
+         delta += 10000;
+      else if (ppfd->cDepthBits > pfi->pfd.cDepthBits)
+         delta += 200;
+      else if (ppfd->cDepthBits < pfi->pfd.cDepthBits)
          delta += 2;
 
-      if (ppfd->cAlphaBits != pfi->pfd.cAlphaBits)
+      if (ppfd->cStencilBits && !pfi->pfd.cStencilBits)
+         delta += 10000;
+      else if (ppfd->cStencilBits > pfi->pfd.cStencilBits)
+         delta += 400;
+      else if (ppfd->cStencilBits < pfi->pfd.cStencilBits)
+         delta++;
+
+      if (ppfd->cAlphaBits && !pfi->pfd.cAlphaBits)
+         delta += 10000;
+      else if (ppfd->cAlphaBits > pfi->pfd.cAlphaBits)
+         delta += 100;
+      else if (ppfd->cAlphaBits < pfi->pfd.cAlphaBits)
          delta++;
 
       if (delta < bestdelta) {