Before, we always reported zeros in the multisample columns of the format list. Since PIXELFORMATDESCRIPTOR doesn't have fields for multisample, we use a new format_info structure to extend that type. --- src/wgl/wglinfo.c | 145 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 54 deletions(-)
diff --git a/src/wgl/wglinfo.c b/src/wgl/wglinfo.c index 2b2c921..76478e2 100644 --- a/src/wgl/wglinfo.c +++ b/src/wgl/wglinfo.c @@ -50,6 +50,18 @@ typedef enum } InfoMode; +static GLboolean have_WGL_ARB_pixel_format; +static GLboolean have_WGL_ARB_multisample; + + +/** + * An extension of PIXELFORMATDESCRIPTOR to handle multisample, etc. + */ +struct format_info { + PIXELFORMATDESCRIPTOR pfd; + unsigned sampleBuffers, numSamples; +}; + static LRESULT CALLBACK WndProc(HWND hWnd, @@ -159,6 +171,12 @@ print_screen_info(HDC _hdc, GLboolean limits, GLboolean singleLine) printf("WGL extensions:\n"); print_extension_list(wglExtensions, singleLine); } + if (extension_supported("WGL_ARB_pixel_format", wglExtensions)) { + have_WGL_ARB_pixel_format = GL_TRUE; + } + if (extension_supported("WGL_ARB_multisample", wglExtensions)) { + have_WGL_ARB_multisample = GL_TRUE; + } } #endif printf("OpenGL vendor string: %s\n", glVendor); @@ -208,27 +226,27 @@ visual_render_type_name(BYTE iPixelType) } static void -print_visual_attribs_verbose(int iPixelFormat, LPPIXELFORMATDESCRIPTOR ppfd) +print_visual_attribs_verbose(int iPixelFormat, const struct format_info *info) { printf("Visual ID: %x generic=%d native=%d\n", iPixelFormat, - ppfd->dwFlags & PFD_GENERIC_FORMAT ? 1 : 0, - ppfd->dwFlags & PFD_DRAW_TO_WINDOW ? 1 : 0); + info->pfd.dwFlags & PFD_GENERIC_FORMAT ? 1 : 0, + info->pfd.dwFlags & PFD_DRAW_TO_WINDOW ? 1 : 0); printf(" bufferSize=%d level=%d renderType=%s doubleBuffer=%d stereo=%d\n", - 0 /* ppfd->bufferSize */, 0 /* ppfd->level */, - visual_render_type_name(ppfd->iPixelType), - ppfd->dwFlags & PFD_DOUBLEBUFFER ? 1 : 0, - ppfd->dwFlags & PFD_STEREO ? 1 : 0); + 0 /* info->pfd.bufferSize */, 0 /* info->pfd.level */, + visual_render_type_name(info->pfd.iPixelType), + info->pfd.dwFlags & PFD_DOUBLEBUFFER ? 1 : 0, + info->pfd.dwFlags & PFD_STEREO ? 1 : 0); printf(" rgba: cRedBits=%d cGreenBits=%d cBlueBits=%d cAlphaBits=%d\n", - ppfd->cRedBits, ppfd->cGreenBits, - ppfd->cBlueBits, ppfd->cAlphaBits); + info->pfd.cRedBits, info->pfd.cGreenBits, + info->pfd.cBlueBits, info->pfd.cAlphaBits); printf(" cAuxBuffers=%d cDepthBits=%d cStencilBits=%d\n", - ppfd->cAuxBuffers, ppfd->cDepthBits, ppfd->cStencilBits); + info->pfd.cAuxBuffers, info->pfd.cDepthBits, info->pfd.cStencilBits); printf(" accum: cRedBits=%d cGreenBits=%d cBlueBits=%d cAlphaBits=%d\n", - ppfd->cAccumRedBits, ppfd->cAccumGreenBits, - ppfd->cAccumBlueBits, ppfd->cAccumAlphaBits); + info->pfd.cAccumRedBits, info->pfd.cAccumGreenBits, + info->pfd.cAccumBlueBits, info->pfd.cAccumAlphaBits); printf(" multiSample=%d multiSampleBuffers=%d\n", - 0 /* ppfd->numSamples */, 0 /* ppfd->numMultisample */); + info->numSamples, info->sampleBuffers); } @@ -242,32 +260,32 @@ print_visual_attribs_short_header(void) static void -print_visual_attribs_short(int iPixelFormat, LPPIXELFORMATDESCRIPTOR ppfd) +print_visual_attribs_short(int iPixelFormat, const struct format_info *info) { char *caveat = "None"; printf("0x%02x %2d %2d %2d %2d %2d %c%c %c %c %2d %2d %2d %2d %2d %2d %2d", iPixelFormat, - ppfd->dwFlags & PFD_GENERIC_FORMAT ? 1 : 0, - ppfd->dwFlags & PFD_DRAW_TO_WINDOW ? 1 : 0, + info->pfd.dwFlags & PFD_GENERIC_FORMAT ? 1 : 0, + info->pfd.dwFlags & PFD_DRAW_TO_WINDOW ? 1 : 0, 0, - 0 /* ppfd->bufferSize */, - 0 /* ppfd->level */, - ppfd->iPixelType == PFD_TYPE_RGBA ? 'r' : ' ', - ppfd->iPixelType == PFD_TYPE_COLORINDEX ? 'c' : ' ', - ppfd->dwFlags & PFD_DOUBLEBUFFER ? 'y' : '.', - ppfd->dwFlags & PFD_STEREO ? 'y' : '.', - ppfd->cRedBits, ppfd->cGreenBits, - ppfd->cBlueBits, ppfd->cAlphaBits, - ppfd->cAuxBuffers, - ppfd->cDepthBits, - ppfd->cStencilBits + 0 /* info->pfd.bufferSize */, + 0 /* info->pfd.level */, + info->pfd.iPixelType == PFD_TYPE_RGBA ? 'r' : ' ', + info->pfd.iPixelType == PFD_TYPE_COLORINDEX ? 'c' : ' ', + info->pfd.dwFlags & PFD_DOUBLEBUFFER ? 'y' : '.', + info->pfd.dwFlags & PFD_STEREO ? 'y' : '.', + info->pfd.cRedBits, info->pfd.cGreenBits, + info->pfd.cBlueBits, info->pfd.cAlphaBits, + info->pfd.cAuxBuffers, + info->pfd.cDepthBits, + info->pfd.cStencilBits ); printf(" %2d %2d %2d %2d %2d %1d %s\n", - ppfd->cAccumRedBits, ppfd->cAccumGreenBits, - ppfd->cAccumBlueBits, ppfd->cAccumAlphaBits, - 0 /* ppfd->numSamples */, 0 /* ppfd->numMultisample */, + info->pfd.cAccumRedBits, info->pfd.cAccumGreenBits, + info->pfd.cAccumBlueBits, info->pfd.cAccumAlphaBits, + info->sampleBuffers, info->numSamples, caveat ); } @@ -283,29 +301,29 @@ print_visual_attribs_long_header(void) static void -print_visual_attribs_long(int iPixelFormat, LPPIXELFORMATDESCRIPTOR ppfd) +print_visual_attribs_long(int iPixelFormat, const struct format_info *info) { printf("0x%2x %2d %11d %2d %2d %2d %4s %3d %3d %3d %3d %3d %3d", iPixelFormat, - ppfd->dwFlags & PFD_GENERIC_FORMAT ? 1 : 0, - ppfd->dwFlags & PFD_DRAW_TO_WINDOW ? 1 : 0, + info->pfd.dwFlags & PFD_GENERIC_FORMAT ? 1 : 0, + info->pfd.dwFlags & PFD_DRAW_TO_WINDOW ? 1 : 0, 0, - 0 /* ppfd->bufferSize */, - 0 /* ppfd->level */, - visual_render_type_name(ppfd->iPixelType), - ppfd->dwFlags & PFD_DOUBLEBUFFER ? 1 : 0, - ppfd->dwFlags & PFD_STEREO ? 1 : 0, - ppfd->cRedBits, ppfd->cGreenBits, - ppfd->cBlueBits, ppfd->cAlphaBits + 0 /* info->pfd.bufferSize */, + 0 /* info->pfd.level */, + visual_render_type_name(info->pfd.iPixelType), + info->pfd.dwFlags & PFD_DOUBLEBUFFER ? 1 : 0, + info->pfd.dwFlags & PFD_STEREO ? 1 : 0, + info->pfd.cRedBits, info->pfd.cGreenBits, + info->pfd.cBlueBits, info->pfd.cAlphaBits ); printf(" %3d %4d %2d %3d %3d %3d %3d %2d %2d\n", - ppfd->cAuxBuffers, - ppfd->cDepthBits, - ppfd->cStencilBits, - ppfd->cAccumRedBits, ppfd->cAccumGreenBits, - ppfd->cAccumBlueBits, ppfd->cAccumAlphaBits, - 0 /* ppfd->numSamples */, 0 /* ppfd->numMultisample */ + info->pfd.cAuxBuffers, + info->pfd.cDepthBits, + info->pfd.cStencilBits, + info->pfd.cAccumRedBits, info->pfd.cAccumGreenBits, + info->pfd.cAccumBlueBits, info->pfd.cAccumAlphaBits, + info->sampleBuffers, info->numSamples ); } @@ -313,20 +331,25 @@ print_visual_attribs_long(int iPixelFormat, LPPIXELFORMATDESCRIPTOR ppfd) static void print_visual_info(HDC hdc, InfoMode mode) { - PIXELFORMATDESCRIPTOR pfd; + PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB_func; + struct format_info info; int numVisuals, numWglVisuals; int i; + wglGetPixelFormatAttribivARB_func = + (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) + wglGetProcAddress("wglGetPixelFormatAttribivARB"); + numVisuals = DescribePixelFormat(hdc, 1, sizeof(PIXELFORMATDESCRIPTOR), NULL); if (numVisuals == 0) return; numWglVisuals = 0; for (i = 0; i < numVisuals; i++) { - if(!DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd)) + if(!DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &info.pfd)) continue; - //if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL)) + //if(!(info.pfd.dwFlags & PFD_SUPPORT_OPENGL)) // continue; ++numWglVisuals; @@ -340,18 +363,32 @@ print_visual_info(HDC hdc, InfoMode mode) print_visual_attribs_long_header(); for (i = 0; i < numVisuals; i++) { - if(!DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd)) + if(!DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &info.pfd)) continue; - //if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL)) + //if(!(info.pfd.dwFlags & PFD_SUPPORT_OPENGL)) // continue; + if (have_WGL_ARB_pixel_format && have_WGL_ARB_multisample) { + int attribs[] = { WGL_SAMPLE_BUFFERS_ARB, WGL_SAMPLES_ARB }; + int values[2], layer = 0; + if (wglGetPixelFormatAttribivARB_func(hdc, i, layer, + 2, attribs, values)) { + info.sampleBuffers = values[0]; + info.numSamples = values[1]; + } + else { + info.sampleBuffers = 0; + info.numSamples = 0; + } + } + if (mode == Verbose) - print_visual_attribs_verbose(i, &pfd); + print_visual_attribs_verbose(i, &info); else if (mode == Normal) - print_visual_attribs_short(i, &pfd); + print_visual_attribs_short(i, &info); else if (mode == Wide) - print_visual_attribs_long(i, &pfd); + print_visual_attribs_long(i, &info); } printf("\n"); } -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev