From: Stefan Dösinger Subject: [PATCH 2/7] wined3d: Return a texture from wined3d_swapchain_get_back_buffer. Message-Id: <1440973505-19247-2-git-send-email-stefan@codeweavers.com> Date: Mon, 31 Aug 2015 00:25:00 +0200 --- dlls/d3d8/swapchain.c | 15 +++++++++++++-- dlls/d3d9/swapchain.c | 21 ++++++++++++++++----- dlls/dxgi/swapchain.c | 12 ++++++++++-- dlls/wined3d/device.c | 6 +++++- dlls/wined3d/swapchain.c | 4 ++-- include/wine/wined3d.h | 2 +- 6 files changed, 47 insertions(+), 13 deletions(-) diff --git a/dlls/d3d8/swapchain.c b/dlls/d3d8/swapchain.c index 44fc02a..ec2c521 100644 --- a/dlls/d3d8/swapchain.c +++ b/dlls/d3d8/swapchain.c @@ -112,23 +112,34 @@ static HRESULT WINAPI d3d8_swapchain_GetBackBuffer(IDirect3DSwapChain8 *iface, UINT backbuffer_idx, D3DBACKBUFFER_TYPE backbuffer_type, IDirect3DSurface8 **backbuffer) { struct d3d8_swapchain *swapchain = impl_from_IDirect3DSwapChain8(iface); - struct wined3d_surface *wined3d_surface = NULL; + struct wined3d_resource *wined3d_resource; + struct wined3d_texture *wined3d_texture; + struct wined3d_surface *wined3d_surface; struct d3d8_surface *surface_impl; HRESULT hr = D3D_OK; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + if (!backbuffer) + { + WARN("The output pointer is NULL, returning D3DERR_INVALIDCALL.\n"); + return D3DERR_INVALIDCALL; + } + wined3d_mutex_lock(); - if ((wined3d_surface = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, + if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) { + wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); + wined3d_surface = wined3d_surface_from_resource(wined3d_resource); surface_impl = wined3d_surface_get_parent(wined3d_surface); *backbuffer = &surface_impl->IDirect3DSurface8_iface; IDirect3DSurface8_AddRef(*backbuffer); } else { + /* Do not set *backbuffer = NULL, see tests/device.c, test_swapchain(). */ hr = D3DERR_INVALIDCALL; } wined3d_mutex_unlock(); diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c index 5cf56d2..6890210 100644 --- a/dlls/d3d9/swapchain.c +++ b/dlls/d3d9/swapchain.c @@ -152,23 +152,34 @@ static HRESULT WINAPI d3d9_swapchain_GetBackBuffer(IDirect3DSwapChain9Ex *iface, UINT backbuffer_idx, D3DBACKBUFFER_TYPE backbuffer_type, IDirect3DSurface9 **backbuffer) { struct d3d9_swapchain *swapchain = impl_from_IDirect3DSwapChain9Ex(iface); - struct wined3d_surface *wined3d_surface = NULL; + struct wined3d_resource *wined3d_resource; + struct wined3d_texture *wined3d_texture; + struct wined3d_surface *wined3d_surface; struct d3d9_surface *surface_impl; HRESULT hr = D3D_OK; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + if (!backbuffer) + { + WARN("The output pointer is NULL, returning D3DERR_INVALIDCALL.\n"); + return D3DERR_INVALIDCALL; + } + wined3d_mutex_lock(); - if ((wined3d_surface = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, + if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) { - surface_impl = wined3d_surface_get_parent(wined3d_surface); - *backbuffer = &surface_impl->IDirect3DSurface9_iface; - IDirect3DSurface9_AddRef(*backbuffer); + wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); + wined3d_surface = wined3d_surface_from_resource(wined3d_resource); + surface_impl = wined3d_surface_get_parent(wined3d_surface); + *backbuffer = &surface_impl->IDirect3DSurface9_iface; + IDirect3DSurface9_AddRef(*backbuffer); } else { + /* Do not set *backbuffer = NULL, see tests/device.c, test_swapchain(). */ hr = D3DERR_INVALIDCALL; } wined3d_mutex_unlock(); diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index ce09450..cfc1a09 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -143,6 +143,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, UINT buffer_idx, REFIID riid, void **surface) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); + struct wined3d_texture *texture; + struct wined3d_resource *resource; struct wined3d_surface *backbuffer; IUnknown *parent; HRESULT hr; @@ -152,13 +154,15 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, EnterCriticalSection(&dxgi_cs); - if (!(backbuffer = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, + if (!(texture = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, buffer_idx, WINED3D_BACKBUFFER_TYPE_MONO))) { LeaveCriticalSection(&dxgi_cs); return DXGI_ERROR_INVALID_CALL; } + resource = wined3d_texture_get_sub_resource(texture, 0); + backbuffer = wined3d_surface_from_resource(resource); parent = wined3d_surface_get_parent(backbuffer); hr = IUnknown_QueryInterface(parent, riid, surface); LeaveCriticalSection(&dxgi_cs); @@ -220,6 +224,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_ResizeBuffers(IDXGISwapChain *if { struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface); struct wined3d_swapchain_desc wined3d_desc; + struct wined3d_texture *texture; + struct wined3d_resource *resource; struct wined3d_surface *surface; IUnknown *parent; unsigned int i; @@ -235,8 +241,10 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_ResizeBuffers(IDXGISwapChain *if wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &wined3d_desc); for (i = 0; i < wined3d_desc.backbuffer_count; ++i) { - surface = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, + texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, i, WINED3D_BACKBUFFER_TYPE_MONO); + resource = wined3d_texture_get_sub_resource(texture, 0); + surface = wined3d_surface_from_resource(resource); parent = wined3d_surface_get_parent(surface); IUnknown_AddRef(parent); if (IUnknown_Release(parent)) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f8b9666..dcc5d37 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3186,6 +3186,8 @@ struct wined3d_texture * CDECL wined3d_device_get_texture(const struct wined3d_d HRESULT CDECL wined3d_device_get_back_buffer(const struct wined3d_device *device, UINT swapchain_idx, UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type, struct wined3d_surface **backbuffer) { + struct wined3d_texture *texture; + struct wined3d_resource *resource; struct wined3d_swapchain *swapchain; TRACE("device %p, swapchain_idx %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", @@ -3194,8 +3196,10 @@ HRESULT CDECL wined3d_device_get_back_buffer(const struct wined3d_device *device if (!(swapchain = wined3d_device_get_swapchain(device, swapchain_idx))) return WINED3DERR_INVALIDCALL; - if (!(*backbuffer = wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx, backbuffer_type))) + if (!(texture = wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx, backbuffer_type))) return WINED3DERR_INVALIDCALL; + resource = wined3d_texture_get_sub_resource(texture, 0); + *backbuffer = wined3d_surface_from_resource(resource); return WINED3D_OK; } diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 70f5d5c..600c9bd 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -177,7 +177,7 @@ HRESULT CDECL wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapc return wined3d_surface_blt(dst_surface, &dst_rect, src_surface, &src_rect, 0, NULL, WINED3D_TEXF_POINT); } -struct wined3d_surface * CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, +struct wined3d_texture * CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, UINT back_buffer_idx, enum wined3d_backbuffer_type type) { TRACE("swapchain %p, back_buffer_idx %u, type %#x.\n", @@ -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 surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[back_buffer_idx], 0)); + return swapchain->back_buffers[back_buffer_idx]; } HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain *swapchain, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 8970cd5..41384b5 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2513,7 +2513,7 @@ HRESULT __cdecl wined3d_surface_update_overlay_z_order(struct wined3d_surface *s HRESULT __cdecl wined3d_swapchain_create(struct wined3d_device *device, struct wined3d_swapchain_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain); ULONG __cdecl wined3d_swapchain_decref(struct wined3d_swapchain *swapchain); -struct wined3d_surface * __cdecl wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, +struct wined3d_texture * __cdecl wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type); 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, -- 2.4.6