From: Henri Verbeet Subject: [PATCH 5/5] wined3d: Keep a reference to the backbuffer textures instead of the surfaces in the swapchain. Message-Id: <1408533603-30259-5-git-send-email-hverbeet@codeweavers.com> Date: Wed, 20 Aug 2014 13:20:03 +0200 --- dlls/wined3d/context.c | 2 +- dlls/wined3d/device.c | 12 ++++++++---- dlls/wined3d/surface.c | 7 ++++--- dlls/wined3d/swapchain.c | 29 +++++++++++++++++------------ dlls/wined3d/wined3d_private.h | 2 +- 5 files changed, 31 insertions(+), 21 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index bd8de7b..f62b962 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -3102,7 +3102,7 @@ struct wined3d_context *context_acquire(const struct wined3d_device *device, str { struct wined3d_swapchain *swapchain = device->swapchains[0]; if (swapchain->back_buffers) - target = swapchain->back_buffers[0]; + target = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); else target = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); } diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index fc754b3..1f5a46c 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -854,7 +854,8 @@ static void device_init_swapchain_state(struct wined3d_device *device, struct wi wined3d_device_set_render_target(device, i, NULL, FALSE); } if (swapchain->back_buffers && swapchain->back_buffers[0]) - wined3d_device_set_render_target(device, 0, swapchain->back_buffers[0], TRUE); + wined3d_device_set_render_target(device, 0, + surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)), TRUE); } wined3d_device_set_depth_stencil(device, ds_enable ? device->auto_depth_stencil : NULL); @@ -4170,7 +4171,8 @@ static HRESULT create_primary_opengl_context(struct wined3d_device *device, stru return E_OUTOFMEMORY; } - target = swapchain->back_buffers ? swapchain->back_buffers[0] + target = swapchain->back_buffers + ? surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)) : surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); if (!(context = context_create(swapchain, target, swapchain->ds_format))) { @@ -4233,7 +4235,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, wined3d_device_set_render_target(device, i, NULL, FALSE); } if (swapchain->back_buffers && swapchain->back_buffers[0]) - wined3d_device_set_render_target(device, 0, swapchain->back_buffers[0], FALSE); + wined3d_device_set_render_target(device, 0, + surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)), FALSE); } wined3d_device_set_depth_stencil(device, NULL); @@ -4411,7 +4414,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, for (i = 0; i < swapchain->desc.backbuffer_count; ++i) { - if (FAILED(hr = wined3d_surface_update_desc(swapchain->back_buffers[i], swapchain->desc.backbuffer_width, + if (FAILED(hr = wined3d_surface_update_desc(surface_from_resource( + wined3d_texture_get_sub_resource(swapchain->back_buffers[i], 0)), swapchain->desc.backbuffer_width, swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format, swapchain->desc.multisample_type, swapchain->desc.multisample_quality, NULL, 0))) return hr; diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 9be4ac2..20b36f2 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1985,7 +1985,7 @@ GLenum surface_get_gl_buffer(const struct wined3d_surface *surface) return GL_NONE; } - if (swapchain->back_buffers && swapchain->back_buffers[0] == surface) + if (swapchain->back_buffers && swapchain->back_buffers[0] == surface->container) { if (swapchain->render_to_fbo) { @@ -3676,7 +3676,8 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st wined3d_gl_min_mip_filter(minMipLookup, filter, WINED3D_TEXF_NONE)); checkGLcall("glTexParameteri"); - if (!src_surface->container->swapchain || src_surface == src_surface->container->swapchain->back_buffers[0]) + if (!src_surface->container->swapchain + || src_surface->container == src_surface->container->swapchain->back_buffers[0]) { src = backup ? backup : src_surface->container->texture_rgb.name; } @@ -5832,7 +5833,7 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC * applications can't blit directly to the frontbuffer. */ if (dst_swapchain && dst_swapchain->back_buffers && dst_surface->container == dst_swapchain->front_buffer - && src_surface == dst_swapchain->back_buffers[0]) + && src_surface->container == dst_swapchain->back_buffers[0]) { enum wined3d_swap_effect swap_effect = dst_swapchain->desc.swap_effect; diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index fb9bfa8..a816d6f 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -52,8 +52,8 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain) while (i--) { - wined3d_texture_set_swapchain(swapchain->back_buffers[i]->container, NULL); - if (wined3d_surface_decref(swapchain->back_buffers[i])) + wined3d_texture_set_swapchain(swapchain->back_buffers[i], NULL); + if (wined3d_texture_decref(swapchain->back_buffers[i])) WARN("Something's still holding back buffer %u (%p).\n", i, swapchain->back_buffers[i]); } HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); @@ -198,7 +198,7 @@ struct wined3d_surface * CDECL wined3d_swapchain_get_back_buffer(const struct wi TRACE("Returning back buffer %p.\n", swapchain->back_buffers[back_buffer_idx]); - return swapchain->back_buffers[back_buffer_idx]; + return surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[back_buffer_idx], 0)); } HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain *swapchain, @@ -282,7 +282,8 @@ HRESULT CDECL wined3d_swapchain_get_gamma_ramp(const struct wined3d_swapchain *s static void swapchain_blit(const struct wined3d_swapchain *swapchain, struct wined3d_context *context, const RECT *src_rect, const RECT *dst_rect) { - struct wined3d_surface *backbuffer = swapchain->back_buffers[0]; + struct wined3d_surface *backbuffer = surface_from_resource( + wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); UINT src_w = src_rect->right - src_rect->left; UINT src_h = src_rect->bottom - src_rect->top; GLenum gl_filter; @@ -345,7 +346,7 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain, float tex_right = src_rect->right; float tex_bottom = src_rect->bottom; - context2 = context_acquire(device, swapchain->back_buffers[0]); + context2 = context_acquire(device, backbuffer); context_apply_blit_state(context2, device); if (backbuffer->flags & SFLAG_NORMCOORD) @@ -418,7 +419,8 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain, static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in, const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags) { - struct wined3d_surface *back_buffer = swapchain->back_buffers[0]; + struct wined3d_surface *back_buffer = surface_from_resource( + wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); const struct wined3d_fb_state *fb = &swapchain->device->fb; const struct wined3d_gl_info *gl_info; struct wined3d_context *context; @@ -670,7 +672,7 @@ static void swapchain_gdi_present(struct wined3d_swapchain *swapchain, const REC struct wined3d_surface *front, *back; front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); - back = swapchain->back_buffers[0]; + back = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); /* Flip the DC. */ { @@ -961,15 +963,18 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3 surface_desc.usage |= WINED3DUSAGE_RENDERTARGET; for (i = 0; i < swapchain->desc.backbuffer_count; ++i) { + struct wined3d_surface *back_buffer; + TRACE("Creating back buffer %u.\n", i); if (FAILED(hr = device->device_parent->ops->create_swapchain_surface(device->device_parent, - parent, &surface_desc, &swapchain->back_buffers[i]))) + parent, &surface_desc, &back_buffer))) { WARN("Failed to create back buffer %u, hr %#x.\n", i, hr); swapchain->desc.backbuffer_count = i; goto err; } - wined3d_texture_set_swapchain(swapchain->back_buffers[i]->container, swapchain); + swapchain->back_buffers[i] = back_buffer->container; + wined3d_texture_set_swapchain(swapchain->back_buffers[i], swapchain); } } @@ -1010,8 +1015,8 @@ err: { if (swapchain->back_buffers[i]) { - wined3d_texture_set_swapchain(swapchain->back_buffers[i]->container, NULL); - wined3d_surface_decref(swapchain->back_buffers[i]); + wined3d_texture_set_swapchain(swapchain->back_buffers[i], NULL); + wined3d_texture_decref(swapchain->back_buffers[i]); } } HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); @@ -1155,6 +1160,6 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) for (i = 0; i < swapchain->desc.backbuffer_count; ++i) { - wined3d_resource_update_draw_binding(&swapchain->back_buffers[i]->container->resource); + wined3d_resource_update_draw_binding(&swapchain->back_buffers[i]->resource); } } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b517d4e..f4d8815 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2621,7 +2621,7 @@ struct wined3d_swapchain const struct wined3d_swapchain_ops *swapchain_ops; struct wined3d_device *device; - struct wined3d_surface **back_buffers; + struct wined3d_texture **back_buffers; struct wined3d_texture *front_buffer; struct wined3d_swapchain_desc desc; struct wined3d_display_mode original_mode; -- 1.7.10.4