=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Return a texture from wined3d_swapchain_get_back_buffer.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Sep 3 07:34:28 CDT 2015


Module: wine
Branch: master
Commit: f010e5d88a91f0c6a66ff51d9b26930f1fa0753d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f010e5d88a91f0c6a66ff51d9b26930f1fa0753d

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu Sep  3 12:52:52 2015 +0200

wined3d: Return a texture from wined3d_swapchain_get_back_buffer.

---

 dlls/d3d8/swapchain.c    | 15 ++++++++++++---
 dlls/d3d9/swapchain.c    | 19 ++++++++++++++-----
 dlls/dxgi/swapchain.c    | 12 ++++++------
 dlls/wined3d/device.c    |  6 +++++-
 dlls/wined3d/swapchain.c |  4 ++--
 include/wine/wined3d.h   |  2 +-
 6 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/dlls/d3d8/swapchain.c b/dlls/d3d8/swapchain.c
index 44fc02a..70b7fb0 100644
--- a/dlls/d3d8/swapchain.c
+++ b/dlls/d3d8/swapchain.c
@@ -112,23 +112,32 @@ 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 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)))
     {
-        surface_impl = wined3d_surface_get_parent(wined3d_surface);
+        wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0);
+        surface_impl = wined3d_resource_get_parent(wined3d_resource);
         *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..b26a482 100644
--- a/dlls/d3d9/swapchain.c
+++ b/dlls/d3d9/swapchain.c
@@ -152,23 +152,32 @@ 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 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);
+        surface_impl = wined3d_resource_get_parent(wined3d_resource);
+        *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..10ae26d 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -143,7 +143,7 @@ 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_surface *backbuffer;
+    struct wined3d_texture *texture;
     IUnknown *parent;
     HRESULT hr;
 
@@ -152,14 +152,14 @@ 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;
     }
 
-    parent = wined3d_surface_get_parent(backbuffer);
+    parent = wined3d_texture_get_parent(texture);
     hr = IUnknown_QueryInterface(parent, riid, surface);
     LeaveCriticalSection(&dxgi_cs);
 
@@ -220,7 +220,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_ResizeBuffers(IDXGISwapChain *if
 {
     struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface);
     struct wined3d_swapchain_desc wined3d_desc;
-    struct wined3d_surface *surface;
+    struct wined3d_texture *texture;
     IUnknown *parent;
     unsigned int i;
     HRESULT hr;
@@ -235,9 +235,9 @@ 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);
-        parent = wined3d_surface_get_parent(surface);
+        parent = wined3d_texture_get_parent(texture);
         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,




More information about the wine-cvs mailing list