summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Richter <frank.richter@dynardo.de>2017-10-17 10:34:27 +0200
committerEmil Velikov <emil.l.velikov@gmail.com>2017-11-29 19:46:17 +0000
commitc846d72523215261a0bd2dfbbd8875c7809b93bc (patch)
tree6995ca8205a751b14db66489eeba5019eea42f1c
parent56993f4b8a40e4fa55e97788091aaf09a8d22482 (diff)
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.c23
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)