[PATCH 5/5] wined3d: Keep a reference to the backbuffer textures instead of the surfaces in the swapchain.
Henri Verbeet
hverbeet at codeweavers.com
Wed Aug 20 06:20:03 CDT 2014
---
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
More information about the wine-patches
mailing list