wgl: Implement WGL_ARB_create_context_robustness

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15002>
This commit is contained in:
Jesse Natalie 2022-02-11 07:55:14 -08:00 committed by Marge Bot
parent a2c9e1cb50
commit 06ae10bb92
6 changed files with 28 additions and 6 deletions

View File

@ -0,0 +1 @@
WGL_ARB_create_context_robustness

View File

@ -445,12 +445,16 @@ wgl_create_context(_EGLDisplay *disp, _EGLConfig *conf,
flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
if (wgl_ctx->base.Flags & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR)
flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
unsigned resetStrategy = WGL_NO_RESET_NOTIFICATION_ARB;
if (wgl_ctx->base.ResetNotificationStrategy != EGL_NO_RESET_NOTIFICATION)
resetStrategy = WGL_LOSE_CONTEXT_ON_RESET_ARB;
wgl_ctx->ctx = stw_create_context_attribs(disp->PlatformDisplay, 0, shared,
wgl_ctx->base.ClientMajorVersion,
wgl_ctx->base.ClientMinorVersion,
flags,
profile_mask,
stw_config->iPixelFormat);
stw_config->iPixelFormat,
resetStrategy);
if (!wgl_ctx->ctx)
goto cleanup;

View File

@ -128,7 +128,7 @@ 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,
0);
0, WGL_NO_RESET_NOTIFICATION_ARB);
if (!ctx)
return 0;
@ -167,7 +167,7 @@ struct stw_context *
stw_create_context_attribs(HDC hdc, INT iLayerPlane, struct stw_context *shareCtx,
int majorVersion, int minorVersion,
int contextFlags, int profileMask,
int iPixelFormat)
int iPixelFormat, int resetStrategy)
{
const struct stw_pixelformat_info *pfi;
struct st_context_attribs attribs;
@ -226,6 +226,10 @@ stw_create_context_attribs(HDC hdc, INT iLayerPlane, struct stw_context *shareCt
attribs.flags |= ST_CONTEXT_FLAG_FORWARD_COMPATIBLE;
if (contextFlags & WGL_CONTEXT_DEBUG_BIT_ARB)
attribs.flags |= ST_CONTEXT_FLAG_DEBUG;
if (contextFlags & WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB)
attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS;
if (resetStrategy != WGL_NO_RESET_NOTIFICATION_ARB)
attribs.flags |= ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED;
switch (profileMask) {
case WGL_CONTEXT_CORE_PROFILE_BIT_ARB:

View File

@ -53,7 +53,7 @@ struct stw_context *stw_create_context_attribs(HDC hdc, INT iLayerPlane,
struct stw_context *shareCtx,
int majorVersion, int minorVersion,
int contextFlags, int profileMask,
int iPixelFormat);
int iPixelFormat, int resetStrategy);
DHGLRC stw_create_context_handle(struct stw_context *context, DHGLRC handle);

View File

@ -76,10 +76,12 @@ wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList)
int majorVersion = 1, minorVersion = 0, layerPlane = 0;
int contextFlags = 0x0;
int profileMask = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
int resetStrategy = WGL_NO_RESET_NOTIFICATION_ARB;
int i;
BOOL done = FALSE;
const int contextFlagsAll = (WGL_CONTEXT_DEBUG_BIT_ARB |
WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB);
WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB |
WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB);
/* parse attrib_list */
if (attribList) {
@ -100,6 +102,9 @@ wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList)
case WGL_CONTEXT_PROFILE_MASK_ARB:
profileMask = attribList[++i];
break;
case WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB:
resetStrategy = attribList[++i];
break;
case 0:
/* end of list */
done = TRUE;
@ -150,6 +155,12 @@ wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList)
return 0;
}
if (resetStrategy != WGL_NO_RESET_NOTIFICATION_ARB &&
resetStrategy != WGL_LOSE_CONTEXT_ON_RESET_ARB) {
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
}
/* Get pointer to OPENGL32.DLL's wglCreate/DeleteContext() functions */
if (!wglCreateContext_func || !wglDeleteContext_func) {
/* Get the OPENGL32.DLL library */
@ -201,7 +212,8 @@ 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, 0);
contextFlags, profileMask, 0,
resetStrategy);
if (!stw_ctx) {
wglDeleteContext_func(context);

View File

@ -37,6 +37,7 @@
static const char *stw_extension_string =
"WGL_ARB_create_context "
"WGL_ARB_create_context_profile "
"WGL_ARB_create_context_robustness "
"WGL_ARB_extensions_string "
"WGL_ARB_make_current_read "
"WGL_ARB_multisample "