Ken Thomases : wined3d: Track if a context' s private hdc has had its pixel format set, so we don't need to check it.

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


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

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

wined3d: Track if a context's private hdc has had its pixel format set, so we don't need to check it.

---

 dlls/wined3d/context.c         |   22 +++++++++++++++++-----
 dlls/wined3d/wined3d_private.h |    3 ++-
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 34c0637..00ab25f 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -753,9 +753,13 @@ static BOOL context_restore_pixel_format(struct wined3d_context *ctx)
 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);
+    int current;
 
-    if (current == format) return TRUE;
+    if (dc == context->hdc && context->hdc_is_private && context->hdc_has_format)
+        return TRUE;
+
+    current = GetPixelFormat(dc);
+    if (current == format) goto success;
 
     if (!current)
     {
@@ -769,7 +773,7 @@ static BOOL context_set_pixel_format(struct wined3d_context *context, HDC dc, BO
 
         context->restore_pf = 0;
         context->restore_pf_win = private ? NULL : WindowFromDC(dc);
-        return TRUE;
+        goto success;
     }
 
     /* By default WGL doesn't allow pixel format adjustments but we need it
@@ -796,7 +800,7 @@ static BOOL context_set_pixel_format(struct wined3d_context *context, HDC dc, BO
             context->restore_pf_win = win;
         }
 
-        return TRUE;
+        goto success;
     }
 
     /* OpenGL doesn't allow pixel format adjustments. Print an error and
@@ -806,6 +810,11 @@ static BOOL context_set_pixel_format(struct wined3d_context *context, HDC dc, BO
     ERR("Unable to set pixel format %d on device context %p. Already using format %d.\n",
             format, dc, current);
     return TRUE;
+
+success:
+    if (dc == context->hdc && context->hdc_is_private)
+        context->hdc_has_format = TRUE;
+    return TRUE;
 }
 
 static BOOL context_set_gl_context(struct wined3d_context *ctx)
@@ -891,6 +900,7 @@ static void context_update_window(struct wined3d_context *context)
 
     context->win_handle = context->swapchain->win_handle;
     context->hdc_is_private = FALSE;
+    context->hdc_has_format = FALSE;
     context->needs_set = 1;
     context->valid = 1;
 
@@ -1120,7 +1130,8 @@ static void context_enter(struct wined3d_context *context)
             context->restore_dc = wglGetCurrentDC();
             context->needs_set = 1;
         }
-        else if (!context->needs_set && context->pixel_format != GetPixelFormat(context->hdc))
+        else if (!context->needs_set && !(context->hdc_is_private && context->hdc_has_format)
+                    && context->pixel_format != GetPixelFormat(context->hdc))
             context->needs_set = 1;
     }
 }
@@ -1521,6 +1532,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     ret->win_handle = swapchain->win_handle;
     ret->hdc = hdc;
     ret->hdc_is_private = hdc_is_private;
+    ret->hdc_has_format = TRUE;
     ret->pixel_format = pixel_format;
     ret->needs_set = 1;
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 69630b1..7abcc8a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1087,7 +1087,8 @@ struct wined3d_context
     DWORD rebind_fbo : 1;
     DWORD needs_set : 1;
     DWORD hdc_is_private : 1;
-    DWORD padding : 17;
+    DWORD hdc_has_format : 1;           /* only meaningful if hdc_is_private */
+    DWORD padding : 16;
     DWORD shader_update_mask;
     DWORD constant_update_mask;
     DWORD                   numbered_array_mask;




More information about the wine-cvs mailing list