diff options
author | Frank Richter <frank.richter@dynardo.de> | 2017-10-17 10:34:27 +0200 |
---|---|---|
committer | Emil Velikov <emil.l.velikov@gmail.com> | 2017-11-29 19:46:17 +0000 |
commit | c846d72523215261a0bd2dfbbd8875c7809b93bc (patch) | |
tree | 6995ca8205a751b14db66489eeba5019eea42f1c | |
parent | 56993f4b8a40e4fa55e97788091aaf09a8d22482 (diff) | |
download | mesa-c846d72523215261a0bd2dfbbd8875c7809b93bc.tar.gz |
gallium/wgl: fix default pixel format issue
When creating a context without SetPixelFormat() don't blindly take the
pixel format reported by GDI. Instead, look for our own closest pixel
format.
Minor clean-ups added by Brian Paul.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103412
Reviewed-by: Brian Paul <brianp@vmware.com>
Tested-by: Brian Paul <brianp@vmware.com>
(cherry picked from commit bf41b2b2627aa3790d380092c28c5d3395cc9cde)
-rw-r--r-- | src/gallium/state_trackers/wgl/stw_context.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/wgl/stw_context.c b/src/gallium/state_trackers/wgl/stw_context.c index 58fe3b0b6e6..939ffd56832 100644 --- a/src/gallium/state_trackers/wgl/stw_context.c +++ b/src/gallium/state_trackers/wgl/stw_context.c @@ -133,6 +133,25 @@ DrvCreateLayerContext(HDC hdc, INT iLayerPlane) /** + * Return the stw pixel format that most closely matches the pixel format + * on HDC. + * Used to get a pixel format when SetPixelFormat() hasn't been called before. + */ +static int +get_matching_pixel_format(HDC hdc) +{ + int iPixelFormat = GetPixelFormat(hdc); + PIXELFORMATDESCRIPTOR pfd; + + if (!iPixelFormat) + return 0; + if (!DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd)) + return 0; + return stw_pixelformat_choose(hdc, &pfd); +} + + +/** * Called via DrvCreateContext(), DrvCreateLayerContext() and * wglCreateContextAttribsARB() to actually create a rendering context. * \param handle the desired DHGLRC handle to use for the context, or zero @@ -174,7 +193,7 @@ stw_create_context_attribs(HDC hdc, INT iLayerPlane, DHGLRC hShareContext, * but not all do, and the opengl32 runtime seems to use a default * pixel format in some cases, so use that. */ - iPixelFormat = GetPixelFormat(hdc); + iPixelFormat = get_matching_pixel_format(hdc); if (!iPixelFormat) return 0; } @@ -458,7 +477,7 @@ stw_make_current(HDC hDrawDC, HDC hReadDC, DHGLRC dhglrc) * pixel format in some cases, so we must create a framebuffer for * those here. */ - int iPixelFormat = GetPixelFormat(hDrawDC); + int iPixelFormat = get_matching_pixel_format(hDrawDC); if (iPixelFormat) fb = stw_framebuffer_create( hDrawDC, iPixelFormat ); if (!fb) |