From 3fc8ac554629c794b75faa69c8b08333ddc808fa Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 2 Aug 2007 19:03:12 -0700 Subject: [PATCH] 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 efb1cd621a8..6ef1d25c867 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 44a543e1a58..806f7e9bd2a 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) { -- 2.11.4.GIT