Ken Thomases : wined3d: Track if a context' s hdc is private so we never need to restore its pixel format.

Alexandre Julliard julliard at winehq.org
Mon Mar 24 15:59:47 CDT 2014


Module: wine
Branch: master
Commit: 272873823e9beff91ea1a62845fc7e5f94a9636f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=272873823e9beff91ea1a62845fc7e5f94a9636f

Author: Ken Thomases <ken at codeweavers.com>
Date:   Sun Mar 23 22:46:18 2014 -0500

wined3d: Track if a context's hdc is private so we never need to restore its pixel format.

This currently only applies to the swapchain backup DC, but it will soon be
used for surfaces created using the WGL_WINE_surface extension.  Also, there
are a couple of cases where ddraw creates private windows and passes them in.
It could be extended to those.

---

 dlls/wined3d/context.c         |   21 +++++++++++++--------
 dlls/wined3d/wined3d_private.h |    3 ++-
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 8dbe001..34c0637 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -750,7 +750,7 @@ static BOOL context_restore_pixel_format(struct wined3d_context *ctx)
     return ret;
 }
 
-static BOOL context_set_pixel_format(struct wined3d_context *context, HDC dc, int format)
+static BOOL context_set_pixel_format(struct wined3d_context *context, HDC dc, BOOL private, int format)
 {
     const struct wined3d_gl_info *gl_info = context->gl_info;
     int current = GetPixelFormat(dc);
@@ -768,7 +768,7 @@ static BOOL context_set_pixel_format(struct wined3d_context *context, HDC dc, in
         }
 
         context->restore_pf = 0;
-        context->restore_pf_win = WindowFromDC(dc);
+        context->restore_pf_win = private ? NULL : WindowFromDC(dc);
         return TRUE;
     }
 
@@ -787,12 +787,12 @@ static BOOL context_set_pixel_format(struct wined3d_context *context, HDC dc, in
             return FALSE;
         }
 
-        win = WindowFromDC(dc);
+        win = private ? NULL : WindowFromDC(dc);
         if (win != context->restore_pf_win)
         {
             context_restore_pixel_format(context);
 
-            context->restore_pf = current;
+            context->restore_pf = private ? 0 : current;
             context->restore_pf_win = win;
         }
 
@@ -813,7 +813,7 @@ static BOOL context_set_gl_context(struct wined3d_context *ctx)
     struct wined3d_swapchain *swapchain = ctx->swapchain;
     BOOL backup = FALSE;
 
-    if (!context_set_pixel_format(ctx, ctx->hdc, ctx->pixel_format))
+    if (!context_set_pixel_format(ctx, ctx->hdc, ctx->hdc_is_private, ctx->pixel_format))
     {
         WARN("Failed to set pixel format %d on device context %p.\n",
                 ctx->pixel_format, ctx->hdc);
@@ -846,7 +846,7 @@ static BOOL context_set_gl_context(struct wined3d_context *ctx)
             return FALSE;
         }
 
-        if (!context_set_pixel_format(ctx, dc, ctx->pixel_format))
+        if (!context_set_pixel_format(ctx, dc, TRUE, ctx->pixel_format))
         {
             ERR("Failed to set pixel format %d on device context %p.\n",
                     ctx->pixel_format, dc);
@@ -890,6 +890,7 @@ static void context_update_window(struct wined3d_context *context)
         wined3d_release_dc(context->win_handle, context->hdc);
 
     context->win_handle = context->swapchain->win_handle;
+    context->hdc_is_private = FALSE;
     context->needs_set = 1;
     context->valid = 1;
 
@@ -1328,6 +1329,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     int swap_interval;
     DWORD state;
     HDC hdc;
+    BOOL hdc_is_private = FALSE;
 
     TRACE("swapchain %p, target %p, window %p.\n", swapchain, target, swapchain->win_handle);
 
@@ -1388,7 +1390,9 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     {
         WARN("Failed to retireve device context, trying swapchain backup.\n");
 
-        if (!(hdc = swapchain_get_backup_dc(swapchain)))
+        if ((hdc = swapchain_get_backup_dc(swapchain)))
+            hdc_is_private = TRUE;
+        else
         {
             ERR("Failed to retrieve a device context.\n");
             goto out;
@@ -1439,7 +1443,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
 
     ret->gl_info = gl_info;
 
-    if (!context_set_pixel_format(ret, hdc, pixel_format))
+    if (!context_set_pixel_format(ret, hdc, hdc_is_private, pixel_format))
     {
         ERR("Failed to set pixel format %d on device context %p.\n", pixel_format, hdc);
         context_release(ret);
@@ -1516,6 +1520,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     ret->glCtx = ctx;
     ret->win_handle = swapchain->win_handle;
     ret->hdc = hdc;
+    ret->hdc_is_private = hdc_is_private;
     ret->pixel_format = pixel_format;
     ret->needs_set = 1;
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0199ef8..69630b1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1086,7 +1086,8 @@ struct wined3d_context
     DWORD lowest_disabled_stage : 4;    /* Max MAX_TEXTURES, 8 */
     DWORD rebind_fbo : 1;
     DWORD needs_set : 1;
-    DWORD padding : 18;
+    DWORD hdc_is_private : 1;
+    DWORD padding : 17;
     DWORD shader_update_mask;
     DWORD constant_update_mask;
     DWORD                   numbered_array_mask;




More information about the wine-cvs mailing list