wined3d: Add two functions for GL context activation/restore.

This commit is contained in:
Matteo Bruni 2011-04-12 22:26:21 +02:00 committed by Alexandre Julliard
parent 894f892b93
commit edebabc2ec
1 changed files with 29 additions and 37 deletions

View File

@ -793,6 +793,29 @@ static BOOL context_set_pixel_format(const struct wined3d_gl_info *gl_info, HDC
return TRUE; return TRUE;
} }
static BOOL context_set_gl_context(struct wined3d_context *ctx)
{
if (!pwglMakeCurrent(ctx->hdc, ctx->glCtx))
{
WARN("Failed to make GL context %p current on device context %p, last error %#x.\n",
ctx->glCtx, ctx->hdc, GetLastError());
ctx->valid = 0;
context_set_current(NULL);
return FALSE;
}
return TRUE;
}
static void context_restore_gl_context(HDC dc, HGLRC gl_ctx)
{
if (!pwglMakeCurrent(dc, gl_ctx))
{
ERR("Failed to restore GL context %p on device context %p, last error %#x.\n",
gl_ctx, dc, GetLastError());
context_set_current(NULL);
}
}
static void context_update_window(struct wined3d_context *context) static void context_update_window(struct wined3d_context *context)
{ {
if (context->win_handle == context->swapchain->win_handle) if (context->win_handle == context->swapchain->win_handle)
@ -826,12 +849,7 @@ static void context_update_window(struct wined3d_context *context)
goto err; goto err;
} }
if (!pwglMakeCurrent(context->hdc, context->glCtx)) context_set_gl_context(context);
{
ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
context->glCtx, context->hdc, GetLastError());
goto err;
}
return; return;
@ -855,7 +873,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
context_update_window(context); context_update_window(context);
if (context->valid && restore_ctx != context->glCtx) if (context->valid && restore_ctx != context->glCtx)
context->valid = !!pwglMakeCurrent(context->hdc, context->glCtx); context_set_gl_context(context);
else restore_ctx = NULL; else restore_ctx = NULL;
ENTER_GL(); ENTER_GL();
@ -937,12 +955,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
if (restore_ctx) if (restore_ctx)
{ {
if (!pwglMakeCurrent(restore_dc, restore_ctx)) context_restore_gl_context(restore_dc, restore_ctx);
{
DWORD err = GetLastError();
ERR("Failed to restore GL context %p on device context %p, last error %#x.\n",
restore_ctx, restore_dc, err);
}
} }
else if (pwglGetCurrentContext() && !pwglMakeCurrent(NULL, NULL)) else if (pwglGetCurrentContext() && !pwglMakeCurrent(NULL, NULL))
{ {
@ -1007,16 +1020,8 @@ BOOL context_set_current(struct wined3d_context *ctx)
} }
TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc); TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc);
if (!pwglMakeCurrent(ctx->hdc, ctx->glCtx)) if (!context_set_gl_context(ctx))
{
DWORD err = GetLastError();
ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
ctx->glCtx, ctx->hdc, err);
ctx->valid = 0;
pwglMakeCurrent(NULL, NULL);
TlsSetValue(wined3d_context_tls_idx, NULL);
return FALSE; return FALSE;
}
ctx->current = 1; ctx->current = 1;
} }
else if(pwglGetCurrentContext()) else if(pwglGetCurrentContext())
@ -1049,13 +1054,7 @@ void context_release(struct wined3d_context *context)
if (!--context->level && context->restore_ctx) if (!--context->level && context->restore_ctx)
{ {
TRACE("Restoring GL context %p on device context %p.\n", context->restore_ctx, context->restore_dc); TRACE("Restoring GL context %p on device context %p.\n", context->restore_ctx, context->restore_dc);
if (!pwglMakeCurrent(context->restore_dc, context->restore_ctx)) context_restore_gl_context(context->restore_dc, context->restore_ctx);
{
DWORD err = GetLastError();
ERR("Failed to restore GL context %p on device context %p, last error %#x.\n",
context->restore_ctx, context->restore_dc, err);
context_set_current(NULL);
}
context->restore_ctx = NULL; context->restore_ctx = NULL;
context->restore_dc = NULL; context->restore_dc = NULL;
} }
@ -2324,14 +2323,7 @@ struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurf
} }
else if (context->restore_ctx) else if (context->restore_ctx)
{ {
if (!pwglMakeCurrent(context->hdc, context->glCtx)) context_set_gl_context(context);
{
DWORD err = GetLastError();
ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
context->glCtx, context->hdc, err);
context->valid = 0;
pwglMakeCurrent(NULL, NULL);
}
} }
return context; return context;