Stop changing their attributes in place. This is complex, somewhat brittle, and currently broken for the Vulkan backend.
Restrict wined3d_texture_update_desc() to changing user memory and pitch.
-- v3: https://gitlab.winehq.org/wine/wine/-/merge_requests/2535
From: Zebediah Figura zfigura@codeweavers.com
For ddraw. --- dlls/wined3d/swapchain.c | 7 +++++++ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 1 + 3 files changed, 9 insertions(+)
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 337c0410d39..c280c42e582 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -275,6 +275,13 @@ struct wined3d_texture * CDECL wined3d_swapchain_get_back_buffer(const struct wi return swapchain->back_buffers[back_buffer_idx]; }
+struct wined3d_texture * CDECL wined3d_swapchain_get_front_buffer(const struct wined3d_swapchain *swapchain) +{ + TRACE("swapchain %p.\n", swapchain); + + return swapchain->front_buffer; +} + struct wined3d_output * wined3d_swapchain_get_output(const struct wined3d_swapchain *swapchain) { TRACE("swapchain %p.\n", swapchain); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 8560c1a1bb6..18035d2cb16 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -270,6 +270,7 @@ @ cdecl wined3d_swapchain_get_desc(ptr ptr) @ cdecl wined3d_swapchain_get_device(ptr) @ cdecl wined3d_swapchain_get_display_mode(ptr ptr ptr) +@ cdecl wined3d_swapchain_get_front_buffer(ptr) @ cdecl wined3d_swapchain_get_front_buffer_data(ptr ptr long) @ cdecl wined3d_swapchain_get_gamma_ramp(ptr ptr) @ cdecl wined3d_swapchain_get_parent(ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 0e921a9a6ad..32a1a70b040 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2809,6 +2809,7 @@ struct wined3d_texture * __cdecl wined3d_swapchain_get_back_buffer(const struct struct wined3d_device * __cdecl wined3d_swapchain_get_device(const struct wined3d_swapchain *swapchain); HRESULT __cdecl wined3d_swapchain_get_display_mode(const struct wined3d_swapchain *swapchain, struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation); +struct wined3d_texture * __cdecl wined3d_swapchain_get_front_buffer(const struct wined3d_swapchain *swapchain); HRESULT __cdecl wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapchain *swapchain, struct wined3d_texture *dst_texture, unsigned int sub_resource_idx); HRESULT __cdecl wined3d_swapchain_get_gamma_ramp(const struct wined3d_swapchain *swapchain,
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/ddraw/ddraw.c | 24 ++---------------------- dlls/ddraw/ddraw_private.h | 1 - dlls/ddraw/surface.c | 2 +- 3 files changed, 3 insertions(+), 24 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index d6570739a51..c56226fb71d 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -938,7 +938,7 @@ static HRESULT ddraw_set_cooperative_level(struct ddraw *ddraw, HWND window, }
rtv = wined3d_device_context_get_rendertarget_view(ddraw->immediate_context, 0); - /* Rendering to ddraw->wined3d_frontbuffer. */ + /* Rendering to the wined3d frontbuffer. */ if (rtv && !wined3d_rendertarget_view_get_sub_resource_parent(rtv)) rtv = NULL; else if (rtv) @@ -5042,43 +5042,23 @@ static HRESULT CDECL device_parent_texture_sub_resource_created(struct wined3d_d return DD_OK; }
-static void STDMETHODCALLTYPE ddraw_frontbuffer_destroyed(void *parent) -{ - struct ddraw *ddraw = parent; - ddraw->wined3d_frontbuffer = NULL; -} - -static const struct wined3d_parent_ops ddraw_frontbuffer_parent_ops = -{ - ddraw_frontbuffer_destroyed, -}; - static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_device_parent *device_parent, void *container_parent, const struct wined3d_resource_desc *desc, DWORD texture_flags, struct wined3d_texture **texture) { struct ddraw *ddraw = ddraw_from_device_parent(device_parent); - const struct wined3d_parent_ops *parent_ops; HRESULT hr;
TRACE("device_parent %p, container_parent %p, desc %p, texture flags %#lx, texture %p.\n", device_parent, container_parent, desc, texture_flags, texture);
- if (!ddraw->wined3d_frontbuffer) - parent_ops = &ddraw_frontbuffer_parent_ops; - else - parent_ops = &ddraw_null_wined3d_parent_ops; - if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, desc, 1, 1, - texture_flags, NULL, ddraw, parent_ops, texture))) + texture_flags, NULL, ddraw, &ddraw_null_wined3d_parent_ops, texture))) { WARN("Failed to create texture, hr %#lx.\n", hr); return hr; }
- if (!ddraw->wined3d_frontbuffer) - ddraw->wined3d_frontbuffer = *texture; - return hr; }
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 1be3df5f2c9..a3f309f89f0 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -103,7 +103,6 @@ struct ddraw
struct ddraw_surface *primary; RECT primary_lock; - struct wined3d_texture *wined3d_frontbuffer; struct wined3d_texture *gdi_surface; struct wined3d_swapchain *wined3d_swapchain; struct wined3d_swapchain_state_parent state_parent; diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index b601104049f..52ca900441c 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -133,7 +133,7 @@ HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface, if (swap_interval) dst_texture = wined3d_swapchain_get_back_buffer(ddraw->wined3d_swapchain, 0); else - dst_texture = ddraw->wined3d_frontbuffer; + dst_texture = wined3d_swapchain_get_front_buffer(ddraw->wined3d_swapchain);
if (SUCCEEDED(hr = wined3d_device_context_blt(ddraw->immediate_context, dst_texture, 0, rect, ddraw_surface_get_any_texture(surface, DDRAW_SURFACE_READ), surface->sub_resource_idx, rect, 0,
While trying to implement Henri's suggestion I realized this patch series is leaking the old textures. Releasing them exposes some refcounting problems with the new implementation, and fixing these is going to be even more involved, so for the moment I'm just cutting this series down to the first two patches.
This merge request was approved by Jan Sikorski.