From ddedf596250b0de4742322435d45df57ee6981cd Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Sat, 4 Sep 2021 08:00:07 -0700 Subject: [PATCH] wgl: Add an explicit iPixelFormat for context creation If it's 0, then it's looked up from the framebuffer for the specified HDC Reviewed-by: Charmaine Lee Reviewed By: Bill Kristiansen Acked-by: Roland Scheidegger Part-of: --- src/gallium/frontends/wgl/stw_context.c | 46 +++++++++++---------- src/gallium/frontends/wgl/stw_context.h | 3 +- src/gallium/frontends/wgl/stw_ext_context.c | 2 +- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/gallium/frontends/wgl/stw_context.c b/src/gallium/frontends/wgl/stw_context.c index 2a690208ae7..a7e57c107b7 100644 --- a/src/gallium/frontends/wgl/stw_context.c +++ b/src/gallium/frontends/wgl/stw_context.c @@ -127,7 +127,8 @@ DHGLRC APIENTRY DrvCreateLayerContext(HDC hdc, INT iLayerPlane) { struct stw_context *ctx = stw_create_context_attribs(hdc, iLayerPlane, 0, 1, 0, 0, - WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB); + WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, + 0); if (!ctx) return 0; @@ -165,10 +166,9 @@ get_matching_pixel_format(HDC hdc) struct stw_context * stw_create_context_attribs(HDC hdc, INT iLayerPlane, struct stw_context *shareCtx, int majorVersion, int minorVersion, - int contextFlags, int profileMask) + int contextFlags, int profileMask, + int iPixelFormat) { - int iPixelFormat; - struct stw_framebuffer *fb; const struct stw_pixelformat_info *pfi; struct st_context_attribs attribs; struct stw_context *ctx = NULL; @@ -180,24 +180,28 @@ stw_create_context_attribs(HDC hdc, INT iLayerPlane, struct stw_context *shareCt if (iLayerPlane != 0) return 0; - /* - * GDI only knows about displayable pixel formats, so determine the pixel - * format from the framebuffer. - * - * This also allows to use a OpenGL DLL / ICD without installing. - */ - fb = stw_framebuffer_from_hdc( hdc ); - if (fb) { - iPixelFormat = fb->iPixelFormat; - stw_framebuffer_unlock(fb); - } else { - /* Applications should call SetPixelFormat before creating a context, - * but not all do, and the opengl32 runtime seems to use a default - * pixel format in some cases, so use that. + if (!iPixelFormat) { + /* + * GDI only knows about displayable pixel formats, so determine the pixel + * format from the framebuffer. + * + * This also allows to use a OpenGL DLL / ICD without installing. */ - iPixelFormat = get_matching_pixel_format(hdc); - if (!iPixelFormat) - return 0; + struct stw_framebuffer *fb; + fb = stw_framebuffer_from_hdc(hdc); + if (fb) { + iPixelFormat = fb->iPixelFormat; + stw_framebuffer_unlock(fb); + } + else { + /* Applications should call SetPixelFormat before creating a context, + * but not all do, and the opengl32 runtime seems to use a default + * pixel format in some cases, so use that. + */ + iPixelFormat = get_matching_pixel_format(hdc); + if (!iPixelFormat) + return 0; + } } pfi = stw_pixelformat_get_info( iPixelFormat ); diff --git a/src/gallium/frontends/wgl/stw_context.h b/src/gallium/frontends/wgl/stw_context.h index 9685fe0c197..d61efe881a4 100644 --- a/src/gallium/frontends/wgl/stw_context.h +++ b/src/gallium/frontends/wgl/stw_context.h @@ -52,7 +52,8 @@ struct stw_context struct stw_context *stw_create_context_attribs(HDC hdc, INT iLayerPlane, struct stw_context *shareCtx, int majorVersion, int minorVersion, - int contextFlags, int profileMask); + int contextFlags, int profileMask, + int iPixelFormat); DHGLRC stw_create_context_handle(struct stw_context *context, DHGLRC handle); diff --git a/src/gallium/frontends/wgl/stw_ext_context.c b/src/gallium/frontends/wgl/stw_ext_context.c index 709d691f2c3..a549c8cd2c4 100644 --- a/src/gallium/frontends/wgl/stw_ext_context.c +++ b/src/gallium/frontends/wgl/stw_ext_context.c @@ -201,7 +201,7 @@ wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList) struct stw_context *stw_ctx = stw_create_context_attribs(hDC, layerPlane, share_stw, majorVersion, minorVersion, - contextFlags, profileMask); + contextFlags, profileMask, 0); if (!stw_ctx) { wglDeleteContext_func(context);