Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/arb_program_shader.c | 2 +- dlls/wined3d/context.c | 240 +++++++++++++++++--------------------- dlls/wined3d/glsl_shader.c | 2 +- dlls/wined3d/surface.c | 10 +- dlls/wined3d/swapchain.c | 6 +- dlls/wined3d/wined3d_private.h | 31 ++--- 6 files changed, 135 insertions(+), 156 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index dadeafd8e98..e4a0b42de68 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -7879,7 +7879,7 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl if (dst_location == WINED3D_LOCATION_DRAWABLE) { d = *dst_rect; - wined3d_texture_translate_drawable_coords(dst_texture, context->win_handle, &d); + wined3d_texture_translate_drawable_coords(dst_texture, context_gl->window, &d); dst_rect = &d; }
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 2f3ed39a750..9dbdd945f09 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1125,45 +1125,45 @@ static BOOL wined3d_context_gl_restore_pixel_format(struct wined3d_context_gl *c const struct wined3d_gl_info *gl_info = context_gl->c.gl_info; BOOL ret = FALSE;
- if (context_gl->c.restore_pf && IsWindow(context_gl->c.restore_pf_win)) + if (context_gl->restore_pf && IsWindow(context_gl->restore_pf_win)) { if (context_gl->c.gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH]) { - HDC dc = GetDCEx(context_gl->c.restore_pf_win, 0, DCX_USESTYLE | DCX_CACHE); + HDC dc = GetDCEx(context_gl->restore_pf_win, 0, DCX_USESTYLE | DCX_CACHE); if (dc) { - if (!(ret = GL_EXTCALL(wglSetPixelFormatWINE(dc, context_gl->c.restore_pf)))) + if (!(ret = GL_EXTCALL(wglSetPixelFormatWINE(dc, context_gl->restore_pf)))) { ERR("Failed to restore pixel format %d on window %p.\n", - context_gl->c.restore_pf, context_gl->c.restore_pf_win); + context_gl->restore_pf, context_gl->restore_pf_win); } - ReleaseDC(context_gl->c.restore_pf_win, dc); + ReleaseDC(context_gl->restore_pf_win, dc); } } else { ERR("Unable to restore pixel format %d on window %p.\n", - context_gl->c.restore_pf, context_gl->c.restore_pf_win); + context_gl->restore_pf, context_gl->restore_pf_win); } }
- context_gl->c.restore_pf = 0; - context_gl->c.restore_pf_win = NULL; + context_gl->restore_pf = 0; + context_gl->restore_pf_win = NULL; return ret; }
static BOOL wined3d_context_gl_set_pixel_format(struct wined3d_context_gl *context_gl) { const struct wined3d_gl_info *gl_info = context_gl->c.gl_info; - BOOL private = context_gl->c.hdc_is_private; - int format = context_gl->c.pixel_format; - HDC dc = context_gl->c.hdc; + BOOL private = context_gl->dc_is_private; + int format = context_gl->pixel_format; + HDC dc = context_gl->dc; int current;
- if (private && context_gl->c.hdc_has_format) + if (private && context_gl->dc_has_format) return TRUE;
- if (!private && WindowFromDC(dc) != context_gl->c.win_handle) + if (!private && WindowFromDC(dc) != context_gl->window) return FALSE;
current = gl_info->gl_ops.wgl.p_wglGetPixelFormat(dc); @@ -1179,8 +1179,8 @@ static BOOL wined3d_context_gl_set_pixel_format(struct wined3d_context_gl *conte return FALSE; }
- context_gl->c.restore_pf = 0; - context_gl->c.restore_pf_win = private ? NULL : WindowFromDC(dc); + context_gl->restore_pf = 0; + context_gl->restore_pf_win = private ? NULL : WindowFromDC(dc); goto success; }
@@ -1200,12 +1200,12 @@ static BOOL wined3d_context_gl_set_pixel_format(struct wined3d_context_gl *conte }
win = private ? NULL : WindowFromDC(dc); - if (win != context_gl->c.restore_pf_win) + if (win != context_gl->restore_pf_win) { wined3d_context_gl_restore_pixel_format(context_gl);
- context_gl->c.restore_pf = private ? 0 : current; - context_gl->c.restore_pf_win = win; + context_gl->restore_pf = private ? 0 : current; + context_gl->restore_pf_win = win; }
goto success; @@ -1221,7 +1221,7 @@ static BOOL wined3d_context_gl_set_pixel_format(struct wined3d_context_gl *conte
success: if (private) - context_gl->c.hdc_has_format = TRUE; + context_gl->dc_has_format = TRUE; return TRUE; }
@@ -1233,14 +1233,14 @@ static BOOL wined3d_context_gl_set_gl_context(struct wined3d_context_gl *context if (!wined3d_context_gl_set_pixel_format(context_gl)) { WARN("Failed to set pixel format %d on device context %p.\n", - context_gl->c.pixel_format, context_gl->c.hdc); + context_gl->pixel_format, context_gl->dc); backup = TRUE; }
- if (backup || !wglMakeCurrent(context_gl->c.hdc, context_gl->c.glCtx)) + if (backup || !wglMakeCurrent(context_gl->dc, context_gl->gl_ctx)) { WARN("Failed to make GL context %p current on device context %p, last error %#x.\n", - context_gl->c.glCtx, context_gl->c.hdc, GetLastError()); + context_gl->gl_ctx, context_gl->dc, GetLastError()); context_gl->c.valid = 0; WARN("Trying fallback to the backup window.\n");
@@ -1255,27 +1255,27 @@ static BOOL wined3d_context_gl_set_gl_context(struct wined3d_context_gl *context return FALSE; }
- if (!(context_gl->c.hdc = swapchain_get_backup_dc(swapchain))) + if (!(context_gl->dc = swapchain_get_backup_dc(swapchain))) { context_set_current(NULL); return FALSE; }
- context_gl->c.hdc_is_private = TRUE; - context_gl->c.hdc_has_format = FALSE; + context_gl->dc_is_private = TRUE; + context_gl->dc_has_format = FALSE;
if (!wined3d_context_gl_set_pixel_format(context_gl)) { ERR("Failed to set pixel format %d on device context %p.\n", - context_gl->c.pixel_format, context_gl->c.hdc); + context_gl->pixel_format, context_gl->dc); context_set_current(NULL); return FALSE; }
- if (!wglMakeCurrent(context_gl->c.hdc, context_gl->c.glCtx)) + if (!wglMakeCurrent(context_gl->dc, context_gl->gl_ctx)) { ERR("Fallback to backup window (dc %p) failed too, last error %#x.\n", - context_gl->c.hdc, GetLastError()); + context_gl->dc, GetLastError()); context_set_current(NULL); return FALSE; } @@ -1302,60 +1302,30 @@ static void wined3d_context_gl_update_window(struct wined3d_context_gl *context_ if (!context_gl->c.swapchain) return;
- if (context_gl->c.win_handle == context_gl->c.swapchain->win_handle) + if (context_gl->window == context_gl->c.swapchain->win_handle) return;
TRACE("Updating context %p window from %p to %p.\n", - context_gl, context_gl->c.win_handle, context_gl->c.swapchain->win_handle); + context_gl, context_gl->window, context_gl->c.swapchain->win_handle);
- if (context_gl->c.hdc) - wined3d_release_dc(context_gl->c.win_handle, context_gl->c.hdc); + if (context_gl->dc) + wined3d_release_dc(context_gl->window, context_gl->dc);
- context_gl->c.win_handle = context_gl->c.swapchain->win_handle; - context_gl->c.hdc_is_private = FALSE; - context_gl->c.hdc_has_format = FALSE; + context_gl->window = context_gl->c.swapchain->win_handle; + context_gl->dc_is_private = FALSE; + context_gl->dc_has_format = FALSE; context_gl->c.needs_set = 1; context_gl->c.valid = 1;
- if (!(context_gl->c.hdc = GetDCEx(context_gl->c.win_handle, 0, DCX_USESTYLE | DCX_CACHE))) + if (!(context_gl->dc = GetDCEx(context_gl->window, 0, DCX_USESTYLE | DCX_CACHE))) { - ERR("Failed to get a device context for window %p.\n", context_gl->c.win_handle); + ERR("Failed to get a device context for window %p.\n", context_gl->window); context_gl->c.valid = 0; } }
void wined3d_context_cleanup(struct wined3d_context *context) { - struct wined3d_context_gl *context_gl = wined3d_context_gl(context); - const struct wined3d_gl_info *gl_info = context->gl_info; - HGLRC restore_ctx; - HDC restore_dc; - - restore_ctx = wglGetCurrentContext(); - restore_dc = wglGetCurrentDC(); - - if (restore_ctx == context->glCtx) - restore_ctx = NULL; - else if (context->valid) - wined3d_context_gl_set_gl_context(context_gl); - - wined3d_context_gl_restore_pixel_format(context_gl); - if (restore_ctx) - { - context_restore_gl_context(gl_info, restore_dc, restore_ctx); - } - else if (wglGetCurrentContext() && !wglMakeCurrent(NULL, NULL)) - { - ERR("Failed to disable GL context.\n"); - } - - wined3d_release_dc(context->win_handle, context->hdc); - - if (!wglDeleteContext(context->glCtx)) - { - DWORD err = GetLastError(); - ERR("wglDeleteContext(%p) failed, last error %#x.\n", context->glCtx, err); - } }
void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl) @@ -1374,7 +1344,7 @@ void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl) restore_ctx = wglGetCurrentContext(); restore_dc = wglGetCurrentDC();
- if (restore_ctx == context_gl->c.glCtx) + if (restore_ctx == context_gl->gl_ctx) restore_ctx = NULL; else if (context_gl->c.valid) wined3d_context_gl_set_gl_context(context_gl); @@ -1505,6 +1475,16 @@ void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl) wined3d_context_gl_restore_pixel_format(context_gl); if (restore_ctx) context_restore_gl_context(gl_info, restore_dc, restore_ctx); + else if (wglGetCurrentContext() && !wglMakeCurrent(NULL, NULL)) + ERR("Failed to disable GL context.\n"); + + wined3d_release_dc(context_gl->window, context_gl->dc); + + if (!wglDeleteContext(context_gl->gl_ctx)) + { + DWORD err = GetLastError(); + ERR("Failed to delete GL context %p, last error %#x.\n", context_gl->gl_ctx, err); + }
wined3d_context_cleanup(&context_gl->c); } @@ -1565,7 +1545,8 @@ BOOL context_set_current(struct wined3d_context *ctx) return FALSE; }
- TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc); + TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", + context_gl, context_gl->gl_ctx, context_gl->dc); if (!wined3d_context_gl_set_gl_context(context_gl)) return FALSE; ctx->current = 1; @@ -1589,7 +1570,7 @@ void context_release(struct wined3d_context *context) { struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
- TRACE("Releasing context %p, level %u.\n", context, context->level); + TRACE("Releasing context %p, level %u.\n", context_gl, context->level);
if (WARN_ON(d3d)) { @@ -1603,12 +1584,12 @@ void context_release(struct wined3d_context *context) { if (wined3d_context_gl_restore_pixel_format(context_gl)) context->needs_set = 1; - if (context->restore_ctx) + if (context_gl->restore_ctx) { - TRACE("Restoring GL context %p on device context %p.\n", context->restore_ctx, context->restore_dc); - context_restore_gl_context(context->gl_info, context->restore_dc, context->restore_ctx); - context->restore_ctx = NULL; - context->restore_dc = NULL; + TRACE("Restoring GL context %p on device context %p.\n", context_gl->restore_ctx, context_gl->restore_dc); + context_restore_gl_context(context_gl->c.gl_info, context_gl->restore_dc, context_gl->restore_ctx); + context_gl->restore_ctx = NULL; + context_gl->restore_dc = NULL; }
if (context->destroy_delayed) @@ -1642,16 +1623,16 @@ static void wined3d_context_gl_enter(struct wined3d_context_gl *context_gl) const struct wined3d_context *current_context = context_get_current(); HGLRC current_gl = wglGetCurrentContext();
- if (current_gl && (!current_context || current_context->glCtx != current_gl)) + if (current_gl && (!current_context || wined3d_context_gl_const(current_context)->gl_ctx != current_gl)) { TRACE("Another GL context (%p on device context %p) is already current.\n", current_gl, wglGetCurrentDC()); - context_gl->c.restore_ctx = current_gl; - context_gl->c.restore_dc = wglGetCurrentDC(); + context_gl->restore_ctx = current_gl; + context_gl->restore_dc = wglGetCurrentDC(); context_gl->c.needs_set = 1; } - else if (!context_gl->c.needs_set && !(context_gl->c.hdc_is_private && context_gl->c.hdc_has_format) - && context_gl->c.pixel_format != context_gl->c.gl_info->gl_ops.wgl.p_wglGetPixelFormat(context_gl->c.hdc)) + else if (!context_gl->c.needs_set && !(context_gl->dc_is_private && context_gl->dc_has_format) + && context_gl->pixel_format != context_gl->c.gl_info->gl_ops.wgl.p_wglGetPixelFormat(context_gl->dc)) context_gl->c.needs_set = 1; } } @@ -1915,24 +1896,11 @@ HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, return ctx; }
-static BOOL wined3d_context_init(struct wined3d_context *context, struct wined3d_swapchain *swapchain) +static void wined3d_context_init(struct wined3d_context *context, struct wined3d_swapchain *swapchain) { struct wined3d_device *device = swapchain->device; DWORD state;
- if (!(context->hdc = GetDCEx(swapchain->win_handle, 0, DCX_USESTYLE | DCX_CACHE))) - { - WARN("Failed to retrieve device context, trying swapchain backup.\n"); - - if (!(context->hdc = swapchain_get_backup_dc(swapchain))) - { - ERR("Failed to retrieve a device context.\n"); - return FALSE; - } - context->hdc_is_private = TRUE; - } - - context->win_handle = swapchain->win_handle; context->gl_info = &device->adapter->gl_info; context->d3d_info = &device->adapter->d3d_info; context->state_table = device->state_table; @@ -1957,16 +1925,13 @@ static BOOL wined3d_context_init(struct wined3d_context *context, struct wined3d | (1u << WINED3D_SHADER_TYPE_HULL) | (1u << WINED3D_SHADER_TYPE_DOMAIN) | (1u << WINED3D_SHADER_TYPE_COMPUTE); - - return TRUE; }
HRESULT wined3d_context_no3d_init(struct wined3d_context *context_no3d, struct wined3d_swapchain *swapchain) { TRACE("context_no3d %p, swapchain %p.\n", context_no3d, swapchain);
- if (!wined3d_context_init(context_no3d, swapchain)) - return E_FAIL; + wined3d_context_init(context_no3d, swapchain);
return WINED3D_OK; } @@ -1985,13 +1950,25 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi
TRACE("context_gl %p, swapchain %p.\n", context_gl, swapchain);
- if (!wined3d_context_init(&context_gl->c, swapchain)) - return E_FAIL; + wined3d_context_init(&context_gl->c, swapchain);
device = context->device; gl_info = context->gl_info; d3d_info = context->d3d_info;
+ context_gl->window = context->swapchain->win_handle; + if (!(context_gl->dc = GetDCEx(context_gl->window, 0, DCX_USESTYLE | DCX_CACHE))) + { + WARN("Failed to retrieve device context, trying swapchain backup.\n"); + + if (!(context_gl->dc = swapchain_get_backup_dc(context->swapchain))) + { + ERR("Failed to retrieve a device context.\n"); + return E_FAIL; + } + context_gl->dc_is_private = TRUE; + } + list_init(&context_gl->fbo_list); list_init(&context_gl->fbo_destroy_list);
@@ -2014,7 +1991,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi if (base + WINED3D_MAX_FRAGMENT_SAMPLERS > ARRAY_SIZE(context_gl->rev_tex_unit_map)) { ERR("Unexpected texture unit base index %u.\n", base); - return E_FAIL; + goto fail; } for (i = 0; i < min(count, WINED3D_MAX_FRAGMENT_SAMPLERS); ++i) { @@ -2026,7 +2003,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi if (base + WINED3D_MAX_VERTEX_SAMPLERS > ARRAY_SIZE(context_gl->rev_tex_unit_map)) { ERR("Unexpected texture unit base index %u.\n", base); - return E_FAIL; + goto fail; } for (i = 0; i < min(count, WINED3D_MAX_VERTEX_SAMPLERS); ++i) { @@ -2037,7 +2014,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi
if (!(context_gl->texture_type = heap_calloc(gl_info->limits.combined_samplers, sizeof(*context_gl->texture_type)))) - return E_FAIL; + goto fail;
target = &context->current_rt.texture->resource; target_bind_flags = target->bind_flags; @@ -2077,8 +2054,8 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi for (i = 0; i < ARRAY_SIZE(ds_formats); ++i) { ds_format = wined3d_get_format(device->adapter, ds_formats[i], WINED3D_BIND_DEPTH_STENCIL); - if ((context->pixel_format = context_choose_pixel_format(device, - context->hdc, color_format, ds_format, TRUE))) + if ((context_gl->pixel_format = context_choose_pixel_format(device, + context_gl->dc, color_format, ds_format, TRUE))) { swapchain->ds_format = ds_format; break; @@ -2090,8 +2067,8 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi } else { - context->pixel_format = context_choose_pixel_format(device, - context->hdc, color_format, swapchain->ds_format, TRUE); + context_gl->pixel_format = context_choose_pixel_format(device, + context_gl->dc, color_format, swapchain->ds_format, TRUE); } } else @@ -2106,41 +2083,38 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi * conflicting pixel formats. */ color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags); ds_format = wined3d_get_format(device->adapter, WINED3DFMT_UNKNOWN, WINED3D_BIND_DEPTH_STENCIL); - context->pixel_format = context_choose_pixel_format(device, - context->hdc, color_format, ds_format, FALSE); + context_gl->pixel_format = context_choose_pixel_format(device, + context_gl->dc, color_format, ds_format, FALSE); }
- if (!context->pixel_format) - return E_FAIL; + if (!context_gl->pixel_format) + goto fail;
wined3d_context_gl_enter(context_gl);
if (!wined3d_context_gl_set_pixel_format(context_gl)) { - ERR("Failed to set pixel format %d on device context %p.\n", context->pixel_format, context->hdc); + ERR("Failed to set pixel format %d on device context %p.\n", context_gl->pixel_format, context_gl->dc); context_release(context); - heap_free(context_gl->texture_type); - return E_FAIL; + goto fail; }
- share_ctx = device->context_count ? device->contexts[0]->glCtx : NULL; + share_ctx = device->context_count ? wined3d_context_gl(device->contexts[0])->gl_ctx : NULL; if (gl_info->p_wglCreateContextAttribsARB) { - if (!(ctx = context_create_wgl_attribs(gl_info, context->hdc, share_ctx))) + if (!(ctx = context_create_wgl_attribs(gl_info, context_gl->dc, share_ctx))) { context_release(context); - heap_free(context_gl->texture_type); - return E_FAIL; + goto fail; } } else { - if (!(ctx = wglCreateContext(context->hdc))) + if (!(ctx = wglCreateContext(context_gl->dc))) { ERR("Failed to create a WGL context.\n"); context_release(context); - heap_free(context_gl->texture_type); - return E_FAIL; + goto fail; }
if (share_ctx && !wglShareLists(share_ctx, ctx)) @@ -2149,8 +2123,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi context_release(context); if (!wglDeleteContext(ctx)) ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, GetLastError()); - heap_free(context_gl->texture_type); - return E_FAIL; + goto fail; } }
@@ -2158,8 +2131,8 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi context_gl->draw_buffers_mask = context_generate_rt_mask(GL_BACK); context->valid = 1;
- context->glCtx = ctx; - context->hdc_has_format = TRUE; + context_gl->gl_ctx = ctx; + context_gl->dc_has_format = TRUE; context->needs_set = 1;
/* Set up the context defaults */ @@ -2169,8 +2142,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi context_release(context); if (!wglDeleteContext(ctx)) ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, GetLastError()); - heap_free(context_gl->texture_type); - return E_FAIL; + goto fail; }
if (context_debug_output_enabled(gl_info)) @@ -2201,7 +2173,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi }
if (gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]) - gl_info->gl_ops.gl.p_glGetIntegerv(GL_AUX_BUFFERS, &context->aux_buffers); + gl_info->gl_ops.gl.p_glGetIntegerv(GL_AUX_BUFFERS, &context_gl->aux_buffers);
TRACE("Setting up the screen\n");
@@ -2314,14 +2286,18 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi checkGLcall("glScissor");
return WINED3D_OK; + +fail: + heap_free(context_gl->texture_type); + wined3d_release_dc(context_gl->window, context_gl->dc); + return E_FAIL; }
HRESULT wined3d_context_vk_init(struct wined3d_context *context_vk, struct wined3d_swapchain *swapchain) { TRACE("context_vk %p, swapchain %p.\n", context_vk, swapchain);
- if (!wined3d_context_init(context_vk, swapchain)) - return E_FAIL; + wined3d_context_init(context_vk, swapchain);
return WINED3D_OK; } @@ -2422,7 +2398,7 @@ static void wined3d_context_gl_get_rt_size(const struct wined3d_context_gl *cont { RECT window_size;
- GetClientRect(context_gl->c.win_handle, &window_size); + GetClientRect(context_gl->window, &window_size); size->cx = window_size.right - window_size.left; size->cy = window_size.bottom - window_size.top;
@@ -2739,7 +2715,7 @@ GLenum wined3d_context_gl_get_offscreen_gl_buffer(const struct wined3d_context_g return GL_COLOR_ATTACHMENT0;
case ORM_BACKBUFFER: - return context_gl->c.aux_buffers > 0 ? GL_AUX0 : GL_BACK; + return context_gl->aux_buffers > 0 ? GL_AUX0 : GL_BACK;
default: FIXME("Unhandled offscreen rendering mode %#x.\n", wined3d_settings.offscreen_rendering_mode); diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index baafaf8e3c3..54dfd964cd9 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -13015,7 +13015,7 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli if (dst_location == WINED3D_LOCATION_DRAWABLE) { d = *dst_rect; - wined3d_texture_translate_drawable_coords(dst_texture, context->win_handle, &d); + wined3d_texture_translate_drawable_coords(dst_texture, context_gl->window, &d); dst_rect = &d; }
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 40e8bc17f24..a30605b912a 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -239,7 +239,7 @@ static void texture2d_blt_fbo(const struct wined3d_device *device, struct wined3 TRACE("Source texture %p is onscreen.\n", src_texture); buffer = wined3d_texture_get_gl_buffer(src_texture); s = *src_rect; - wined3d_texture_translate_drawable_coords(src_texture, context->win_handle, &s); + wined3d_texture_translate_drawable_coords(src_texture, context_gl->window, &s); src_rect = &s; } else @@ -259,7 +259,7 @@ static void texture2d_blt_fbo(const struct wined3d_device *device, struct wined3 TRACE("Destination texture %p is onscreen.\n", dst_texture); buffer = wined3d_texture_get_gl_buffer(dst_texture); d = *dst_rect; - wined3d_texture_translate_drawable_coords(dst_texture, context->win_handle, &d); + wined3d_texture_translate_drawable_coords(dst_texture, context_gl->window, &d); dst_rect = &d; } else @@ -1056,12 +1056,12 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture_gl *dst_texture, /* Try to use an aux buffer for drawing the rectangle. This way it doesn't need restoring. * This way we don't have to wait for the 2nd readback to finish to leave this function. */ - if (context->aux_buffers >= 2) + if (context_gl->aux_buffers >= 2) { /* Got more than one aux buffer? Use the 2nd aux buffer */ drawBuffer = GL_AUX1; } - else if ((!src_offscreen || offscreen_buffer == GL_BACK) && context->aux_buffers >= 1) + else if ((!src_offscreen || offscreen_buffer == GL_BACK) && context_gl->aux_buffers >= 1) { /* Only one aux buffer, but it isn't used (Onscreen rendering, or non-aux orm)? Use it! */ drawBuffer = GL_AUX0; @@ -2241,7 +2241,7 @@ static DWORD ffp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit if (dst_location == WINED3D_LOCATION_DRAWABLE) { r = *dst_rect; - wined3d_texture_translate_drawable_coords(dst_texture, context->win_handle, &r); + wined3d_texture_translate_drawable_coords(dst_texture, context_gl->window, &r); dst_rect = &r; }
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index fbedd7470df..4cefd80f802 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -428,6 +428,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const struct wined3d_fb_state *fb = &swapchain->device->cs->fb; struct wined3d_rendertarget_view *dsv = fb->depth_stencil; const struct wined3d_gl_info *gl_info; + struct wined3d_context_gl *context_gl; struct wined3d_texture *logo_texture; struct wined3d_context *context; BOOL render_to_fbo; @@ -439,6 +440,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, WARN("Invalid context, skipping present.\n"); return; } + context_gl = wined3d_context_gl(context);
gl_info = context->gl_info;
@@ -481,7 +483,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, WINED3D_BLT_ALPHA_TEST, NULL, WINED3D_TEXF_POINT); }
- TRACE("Presenting HDC %p.\n", context->hdc); + TRACE("Presenting DC %p.\n", context_gl->dc);
if (!(render_to_fbo = swapchain->render_to_fbo) && (src_rect->left || src_rect->top @@ -518,7 +520,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, gl_info->gl_ops.gl.p_glFinish();
/* call wglSwapBuffers through the gl table to avoid confusing the Steam overlay */ - gl_info->gl_ops.wgl.p_wglSwapBuffers(context->hdc); + gl_info->gl_ops.wgl.p_wglSwapBuffers(context_gl->dc);
wined3d_swapchain_gl_rotate(swapchain, context);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index c945d9b4daf..a373cc97b9b 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1927,8 +1927,7 @@ struct wined3d_context DWORD lowest_disabled_stage : 4; /* Max WINED3D_MAX_TEXTURES, 8 */ DWORD use_immediate_mode_draw : 1; DWORD needs_set : 1; - DWORD hdc_is_private : 1; - DWORD hdc_has_format : 1; /* only meaningful if hdc_is_private */ + DWORD num_untracked_materials : 2; /* Max value 2 */
DWORD update_shader_resource_bindings : 1; DWORD update_compute_shader_resource_bindings : 1; @@ -1939,8 +1938,7 @@ struct wined3d_context DWORD transform_feedback_paused : 1; DWORD shader_update_mask : 6; /* WINED3D_SHADER_TYPE_COUNT, 6 */ DWORD clip_distance_mask : 8; /* WINED3D_MAX_CLIP_DISTANCES, 8 */ - DWORD num_untracked_materials : 2; /* Max value 2 */ - DWORD padding : 9; + DWORD padding : 11;
DWORD constant_update_mask; DWORD numbered_array_mask; @@ -1952,17 +1950,7 @@ struct wined3d_context
UINT instance_count;
- /* The actual opengl context */ UINT level; - HGLRC restore_ctx; - HDC restore_dc; - int restore_pf; - HWND restore_pf_win; - HGLRC glCtx; - HWND win_handle; - HDC hdc; - int pixel_format; - GLint aux_buffers;
void *shader_backend_data; void *fragment_pipe_data; @@ -1986,15 +1974,28 @@ struct wined3d_context_gl { struct wined3d_context c;
+ uint32_t dc_is_private : 1; + uint32_t dc_has_format : 1; /* Only meaningful for private DCs. */ uint32_t fog_enabled : 1; uint32_t diffuse_attrib_to_1 : 1; uint32_t rebind_fbo : 1; - uint32_t padding : 29; + uint32_t padding : 27;
uint32_t default_attrib_value_set;
GLenum *texture_type;
+ /* The WGL context. */ + HGLRC restore_ctx; + HDC restore_dc; + int restore_pf; + HWND restore_pf_win; + HGLRC gl_ctx; + HDC dc; + int pixel_format; + HWND window; + GLint aux_buffers; + /* FBOs. */ unsigned int fbo_entry_count; struct list fbo_list;