Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/context.c | 33 ++++++++++++++++++++++++++------- dlls/wined3d/wined3d_private.h | 3 ++- 2 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 1a45ecad554..eb64f14f480 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1398,11 +1398,6 @@ void wined3d_context_cleanup(struct wined3d_context *context)
if (context->valid) { - if (context->dummy_arbfp_prog) - { - GL_EXTCALL(glDeleteProgramsARB(1, &context->dummy_arbfp_prog)); - } - if (gl_info->supported[WINED3D_GL_PRIMITIVE_QUERY]) { for (i = 0; i < context->free_so_statistics_query_count; ++i) @@ -1482,8 +1477,32 @@ void wined3d_context_cleanup(struct wined3d_context *context)
void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl) { + const struct wined3d_gl_info *gl_info = context_gl->c.gl_info; + HGLRC restore_ctx; + HDC restore_dc; + + restore_ctx = wglGetCurrentContext(); + restore_dc = wglGetCurrentDC(); + + if (restore_ctx == context_gl->c.glCtx) + restore_ctx = NULL; + else if (context_gl->c.valid) + context_set_gl_context(&context_gl->c); + + if (context_gl->c.valid) + { + if (context_gl->dummy_arbfp_prog) + GL_EXTCALL(glDeleteProgramsARB(1, &context_gl->dummy_arbfp_prog)); + + checkGLcall("context cleanup"); + } + heap_free(context_gl->texture_type);
+ context_restore_pixel_format(&context_gl->c); + if (restore_ctx) + context_restore_gl_context(gl_info, restore_dc, restore_ctx); + wined3d_context_cleanup(&context_gl->c); }
@@ -2232,8 +2251,8 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi "!!ARBfp1.0\n" "MOV result.color, fragment.color.primary;\n" "END\n"; - GL_EXTCALL(glGenProgramsARB(1, &context->dummy_arbfp_prog)); - GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, context->dummy_arbfp_prog)); + GL_EXTCALL(glGenProgramsARB(1, &context_gl->dummy_arbfp_prog)); + GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, context_gl->dummy_arbfp_prog)); GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(dummy_program), dummy_program)); } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b8edf684cc5..b649a479f71 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2023,7 +2023,6 @@ struct wined3d_context GLint gl_fog_source; GLfloat fog_coord_value; GLfloat color[4], fogstart, fogend, fogcolor[4]; - GLuint dummy_arbfp_prog;
unsigned int viewport_count; unsigned int scissor_rect_count; @@ -2039,6 +2038,8 @@ struct wined3d_context_gl struct wined3d_context c;
GLenum *texture_type; + + GLuint dummy_arbfp_prog; };
static inline struct wined3d_context_gl *wined3d_context_gl(struct wined3d_context *context)