[PATCH 2/5] wined3d: Move the "dummy_arbfp_prog" field from struct wined3d_context to struct wined3d_context_gl.

Henri Verbeet hverbeet at codeweavers.com
Wed May 8 08:21:35 CDT 2019


Signed-off-by: Henri Verbeet <hverbeet at 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)
-- 
2.11.0




More information about the wine-devel mailing list