Module: wine Branch: master Commit: f3aa4812382caa459b9b612f66998c6ea8257594 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3aa4812382caa459b9b612f66...
Author: Ken Thomases ken@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;