Chris Robinson : wgl: WGL_COLOR_BITS_ARB does include alpha.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 6 08:03:31 CDT 2007


Module: wine
Branch: master
Commit: 3fc8ac554629c794b75faa69c8b08333ddc808fa
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3fc8ac554629c794b75faa69c8b08333ddc808fa

Author: Chris Robinson <chris.kcat at gmail.com>
Date:   Thu Aug  2 19:03:12 2007 -0700

wgl: WGL_COLOR_BITS_ARB does include alpha.

---

 dlls/opengl32/tests/opengl.c |   38 +++++++++++++++++++++++++++++++
 dlls/winex11.drv/opengl.c    |   51 ++++-------------------------------------
 2 files changed, 43 insertions(+), 46 deletions(-)

diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c
index efb1cd6..6ef1d25 100644
--- a/dlls/opengl32/tests/opengl.c
+++ b/dlls/opengl32/tests/opengl.c
@@ -30,7 +30,13 @@ static const char* (WINAPI *pwglGetExtensionsStringARB)(HDC);
 static int (WINAPI *pwglReleasePbufferDCARB)(HPBUFFERARB, HDC);
 
 /* WGL_ARB_pixel_format */
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_RED_BITS_ARB   0x2015
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_BLUE_BITS_ARB  0x2019
+#define WGL_ALPHA_BITS_ARB 0x201B
 static BOOL (WINAPI *pwglChoosePixelFormatARB)(HDC, const int *, const FLOAT *, UINT, int *, UINT *);
+static BOOL (WINAPI *pwglGetPixelFormatAttribivARB)(HDC, int, int, UINT, const int *, int *);
 
 /* WGL_ARB_pbuffer */
 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D
@@ -46,6 +52,7 @@ static void init_functions(void)
 
     /* WGL_ARB_pixel_format */
     pwglChoosePixelFormatARB = (void*)wglGetProcAddress("wglChoosePixelFormatARB");
+    pwglGetPixelFormatAttribivARB = (void*)wglGetProcAddress("wglGetPixelFormatAttribivARB");
 
     /* WGL_ARB_pbuffer */
     pwglCreatePbufferARB = (void*)wglGetProcAddress("wglCreatePbufferARB");
@@ -188,6 +195,36 @@ static void test_setpixelformat(void)
     ok(res == 0, "SetPixelFormat on main device context should fail\n");
 }
 
+static void test_colorbits(HDC hdc)
+{
+    const int iAttribList[] = { WGL_COLOR_BITS_ARB, WGL_RED_BITS_ARB, WGL_GREEN_BITS_ARB,
+                                WGL_BLUE_BITS_ARB, WGL_ALPHA_BITS_ARB };
+    int iAttribRet[sizeof(iAttribList)/sizeof(iAttribList[0])];
+    const int iAttribs[] = { WGL_ALPHA_BITS_ARB, 1, 0 };
+    unsigned int nFormats;
+    int res;
+    int iPixelFormat = 0;
+
+    /* We need a pixel format with at least one bit of alpha */
+    res = pwglChoosePixelFormatARB(hdc, iAttribs, NULL, 1, &iPixelFormat, &nFormats);
+    if(res == FALSE || nFormats == 0)
+    {
+        skip("No suitable pixel formats found\n");
+        return;
+    }
+
+    res = pwglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0,
+              sizeof(iAttribList)/sizeof(iAttribList[0]), iAttribList, iAttribRet);
+    if(res == FALSE)
+    {
+        skip("wglGetPixelFormatAttribivARB failed\n");
+        return;
+    }
+    iAttribRet[1] += iAttribRet[2]+iAttribRet[3]+iAttribRet[4];
+    ok(iAttribRet[0] == iAttribRet[1], "WGL_COLOR_BITS_ARB (%d) does not equal R+G+B+A (%d)!\n",
+                                       iAttribRet[0], iAttribRet[1]);
+}
+
 START_TEST(opengl)
 {
     HWND hwnd;
@@ -236,6 +273,7 @@ START_TEST(opengl)
         init_functions();
 
         test_setpixelformat();
+        test_colorbits(hdc);
 
         wgl_extensions = pwglGetExtensionsStringARB(hdc);
         if(wgl_extensions == NULL) skip("Skipping opengl32 tests because this OpenGL implementation doesn't support WGL extensions!\n");
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 44a543e..806f7e9 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -619,9 +619,6 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
   int drawattrib = 0;
   int nvfloatattrib = GLX_DONT_CARE;
   int pixelattrib = 0;
-  int isColor = 0;
-  int wantColorBits = 0;
-  int sz_alpha = 0;
 
   /* The list of WGL attributes is allowed to be NULL. We don't return here for NULL
    * because we need to do fixups for GLX_DRAWABLE_TYPE/GLX_RENDER_TYPE/GLX_FLOAT_COMPONENTS_NV. */
@@ -631,7 +628,8 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
     switch (iWGLAttr[cur]) {
     case WGL_COLOR_BITS_ARB:
       pop = iWGLAttr[++cur];
-      wantColorBits = pop; /** see end */
+      PUSH2(oGLXAttr, GLX_BUFFER_SIZE, pop);
+      TRACE("pAttr[%d] = GLX_BUFFER_SIZE: %d\n", cur, pop);
       break;
     case WGL_BLUE_BITS_ARB:
       pop = iWGLAttr[++cur];
@@ -650,7 +648,6 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
       break;
     case WGL_ALPHA_BITS_ARB:
       pop = iWGLAttr[++cur];
-      sz_alpha = pop;
       PUSH2(oGLXAttr, GLX_ALPHA_SIZE, pop);
       TRACE("pAttr[%d] = GLX_ALPHA_SIZE: %d\n", cur, pop);
       break;
@@ -674,7 +671,7 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
       pop = iWGLAttr[++cur];
       TRACE("pAttr[%d] = WGL_PIXEL_TYPE_ARB: %d\n", cur, pop);
       switch (pop) {
-      case WGL_TYPE_COLORINDEX_ARB: pixelattrib = GLX_COLOR_INDEX_BIT; isColor = 1; break ;
+      case WGL_TYPE_COLORINDEX_ARB: pixelattrib = GLX_COLOR_INDEX_BIT; break ;
       case WGL_TYPE_RGBA_ARB: pixelattrib = GLX_RGBA_BIT; break ;
       /* This is the same as WGL_TYPE_RGBA_FLOAT_ATI but the GLX constants differ, only the ARB GLX one is widely supported so use that */
       case WGL_TYPE_RGBA_FLOAT_ATI: pixelattrib = GLX_RGBA_FLOAT_BIT; break ;
@@ -787,36 +784,6 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf
     ++cur;
   }
 
-  /**
-   * Trick as WGL_COLOR_BITS_ARB != GLX_BUFFER_SIZE
-   *    WGL_COLOR_BITS_ARB + WGL_ALPHA_BITS_ARB == GLX_BUFFER_SIZE
-   *
-   *  WGL_COLOR_BITS_ARB
-   *     The number of color bitplanes in each color buffer. For RGBA
-   *     pixel types, it is the size of the color buffer, excluding the
-   *     alpha bitplanes. For color-index pixels, it is the size of the
-   *     color index buffer.
-   *
-   *  GLX_BUFFER_SIZE   
-   *     This attribute defines the number of bits per color buffer. 
-   *     For GLX FBConfigs that correspond to a PseudoColor or StaticColor visual, 
-   *     this is equal to the depth value reported in the X11 visual. 
-   *     For GLX FBConfigs that correspond to TrueColor or DirectColor visual, 
-   *     this is the sum of GLX_RED_SIZE, GLX_GREEN_SIZE, GLX_BLUE_SIZE, and GLX_ALPHA_SIZE.
-   * 
-   */
-  if (0 < wantColorBits) {
-    if (!isColor) { 
-      wantColorBits += sz_alpha; 
-    }
-    if (32 < wantColorBits) {
-      ERR("buggy %d GLX_BUFFER_SIZE default to 32\n", wantColorBits);
-      wantColorBits = 32;
-    }
-    PUSH2(oGLXAttr, GLX_BUFFER_SIZE, wantColorBits);
-    TRACE("pAttr[%d] = WGL_COLOR_BITS_ARB: %d\n", cur, wantColorBits);
-  }
-
   /* Apply the OR'd drawable type bitmask now EVEN when WGL_DRAW_TO* is unset.
    * It is needed in all cases because GLX_DRAWABLE_TYPE default to GLX_WINDOW_BIT. */
   PUSH2(oGLXAttr, GLX_DRAWABLE_TYPE, drawattrib);
@@ -2595,16 +2562,8 @@ static GLboolean WINAPI X11DRV_wglGetPixelFormatAttribivARB(HDC hdc, int iPixelF
                 continue;
 
             case WGL_COLOR_BITS_ARB:
-                /** see ConvertAttribWGLtoGLX for explain */
-                if (!fmt) goto pix_error;
-                hTest = pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_BUFFER_SIZE, piValues + i);
-                if (hTest) goto get_error;
-                TRACE("WGL_COLOR_BITS_ARB: GLX_BUFFER_SIZE = %d\n", piValues[i]);
-                hTest = pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_ALPHA_SIZE, &tmp);
-                if (hTest) goto get_error;
-                TRACE("WGL_COLOR_BITS_ARB: GLX_ALPHA_SIZE = %d\n", tmp);
-                piValues[i] = piValues[i] - tmp;
-                continue;
+                curGLXAttr = GLX_BUFFER_SIZE;
+                break;
 
             case WGL_BIND_TO_TEXTURE_RGB_ARB:
                 if (use_render_texture_ati) {




More information about the wine-cvs mailing list