[PATCH 3/3] wined3d: Just return the swapchain from wined3d_device_get_swapchain().

Henri Verbeet hverbeet at codeweavers.com
Tue Sep 4 13:15:10 CDT 2012


---
 dlls/d3d9/device.c        |    8 ++--
 dlls/ddraw/ddraw.c        |    8 ++--
 dlls/dxgi/factory.c       |    9 ++--
 dlls/wined3d/device.c     |  119 ++++++++++-----------------------------------
 dlls/wined3d/stateblock.c |    5 +--
 dlls/wined3d/wined3d.spec |    2 +-
 include/wine/wined3d.h    |    4 +-
 7 files changed, 42 insertions(+), 113 deletions(-)

diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index dff1ed0..8f8f177 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -506,24 +506,24 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_GetSwapChain(IDirect3DDevice
         UINT swapchain_idx, IDirect3DSwapChain9 **swapchain)
 {
     struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
-    struct wined3d_swapchain *wined3d_swapchain = NULL;
+    struct wined3d_swapchain *wined3d_swapchain;
     struct d3d9_swapchain *swapchain_impl;
     HRESULT hr;
 
     TRACE("iface %p, swapchain_idx %u, swapchain %p.\n", iface, swapchain_idx, swapchain);
 
     wined3d_mutex_lock();
-    hr = wined3d_device_get_swapchain(device->wined3d_device, swapchain_idx, &wined3d_swapchain);
-    if (SUCCEEDED(hr) && wined3d_swapchain)
+    if ((wined3d_swapchain = wined3d_device_get_swapchain(device->wined3d_device, swapchain_idx)))
     {
        swapchain_impl = wined3d_swapchain_get_parent(wined3d_swapchain);
        *swapchain = &swapchain_impl->IDirect3DSwapChain9_iface;
        IDirect3DSwapChain9_AddRef(*swapchain);
-       wined3d_swapchain_decref(wined3d_swapchain);
+       hr = D3D_OK;
     }
     else
     {
         *swapchain = NULL;
+        hr = D3DERR_INVALIDCALL;
     }
     wined3d_mutex_unlock();
 
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 6a63d8a..0230b5d 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -695,13 +695,13 @@ static HRESULT ddraw_create_swapchain(struct ddraw *ddraw, HWND window, BOOL win
         return hr;
     }
 
-    if (FAILED(hr = wined3d_device_get_swapchain(ddraw->wined3d_device, 0, &ddraw->wined3d_swapchain)))
+    if (!(ddraw->wined3d_swapchain = wined3d_device_get_swapchain(ddraw->wined3d_device, 0)))
     {
-        ERR("Failed to get swapchain, hr %#x.\n", hr);
-        ddraw->wined3d_swapchain = NULL;
-        return hr;
+        ERR("Failed to get swapchain.\n");
+        return DDERR_INVALIDPARAMS;
     }
 
+    wined3d_swapchain_incref(ddraw->wined3d_swapchain);
     ddraw_set_swapchain_window(ddraw, window);
 
     return DD_OK;
diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c
index 045baf8..b339d0f 100644
--- a/dlls/dxgi/factory.c
+++ b/dlls/dxgi/factory.c
@@ -229,16 +229,15 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IWineDXGIFactory *
         return hr;
     }
 
-    hr = wined3d_device_get_swapchain(wined3d_device, 0, &wined3d_swapchain);
+    wined3d_swapchain = wined3d_device_get_swapchain(wined3d_device, 0);
     wined3d_device_decref(wined3d_device);
-    if (FAILED(hr))
+    if (!wined3d_swapchain)
     {
-        WARN("Failed to get swapchain, returning %#x\n", hr);
-        return hr;
+        WARN("Failed to get swapchain.\n");
+        return E_FAIL;
     }
 
     *swapchain = wined3d_swapchain_get_parent(wined3d_swapchain);
-    wined3d_swapchain_decref(wined3d_swapchain);
 
     /* FIXME? The swapchain is created with refcount 1 by the wined3d device,
      * but the wined3d device can't hold a real reference. */
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index ba8c4be..386fd25 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -897,26 +897,18 @@ UINT CDECL wined3d_device_get_swapchain_count(const struct wined3d_device *devic
     return device->swapchain_count;
 }
 
-HRESULT CDECL wined3d_device_get_swapchain(const struct wined3d_device *device,
-        UINT swapchain_idx, struct wined3d_swapchain **swapchain)
+struct wined3d_swapchain * CDECL wined3d_device_get_swapchain(const struct wined3d_device *device, UINT swapchain_idx)
 {
-    TRACE("device %p, swapchain_idx %u, swapchain %p.\n",
-            device, swapchain_idx, swapchain);
+    TRACE("device %p, swapchain_idx %u.\n", device, swapchain_idx);
 
     if (swapchain_idx >= device->swapchain_count)
     {
         WARN("swapchain_idx %u >= swapchain_count %u.\n",
                 swapchain_idx, device->swapchain_count);
-        *swapchain = NULL;
-
-        return WINED3DERR_INVALIDCALL;
+        return NULL;
     }
 
-    *swapchain = device->swapchains[swapchain_idx];
-    wined3d_swapchain_incref(*swapchain);
-    TRACE("Returning %p.\n", *swapchain);
-
-    return WINED3D_OK;
+    return device->swapchains[swapchain_idx];
 }
 
 static void device_load_logo(struct wined3d_device *device, const char *filename)
@@ -3677,27 +3669,14 @@ HRESULT CDECL wined3d_device_get_back_buffer(const struct wined3d_device *device
         UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type, struct wined3d_surface **backbuffer)
 {
     struct wined3d_swapchain *swapchain;
-    HRESULT hr;
 
     TRACE("device %p, swapchain_idx %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n",
             device, swapchain_idx, backbuffer_idx, backbuffer_type, backbuffer);
 
-    hr = wined3d_device_get_swapchain(device, swapchain_idx, &swapchain);
-    if (FAILED(hr))
-    {
-        WARN("Failed to get swapchain %u, hr %#x.\n", swapchain_idx, hr);
-        return hr;
-    }
-
-    hr = wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx, backbuffer_type, backbuffer);
-    wined3d_swapchain_decref(swapchain);
-    if (FAILED(hr))
-    {
-        WARN("Failed to get backbuffer %u, hr %#x.\n", backbuffer_idx, hr);
-        return hr;
-    }
+    if (!(swapchain = wined3d_device_get_swapchain(device, swapchain_idx)))
+        return WINED3DERR_INVALIDCALL;
 
-    return WINED3D_OK;
+    return wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx, backbuffer_type, backbuffer);
 }
 
 HRESULT CDECL wined3d_device_get_device_caps(const struct wined3d_device *device, WINED3DCAPS *caps)
@@ -3712,18 +3691,14 @@ HRESULT CDECL wined3d_device_get_display_mode(const struct wined3d_device *devic
         struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation)
 {
     struct wined3d_swapchain *swapchain;
-    HRESULT hr;
 
     TRACE("device %p, swapchain_idx %u, mode %p, rotation %p.\n",
             device, swapchain_idx, mode, rotation);
 
-    if (SUCCEEDED(hr = wined3d_device_get_swapchain(device, swapchain_idx, &swapchain)))
-    {
-        hr = wined3d_swapchain_get_display_mode(swapchain, mode, rotation);
-        wined3d_swapchain_decref(swapchain);
-    }
+    if (!(swapchain = wined3d_device_get_swapchain(device, swapchain_idx)))
+        return WINED3DERR_INVALIDCALL;
 
-    return hr;
+    return wined3d_swapchain_get_display_mode(swapchain, mode, rotation);
 }
 
 HRESULT CDECL wined3d_device_begin_stateblock(struct wined3d_device *device)
@@ -4251,17 +4226,13 @@ HRESULT CDECL wined3d_device_get_front_buffer_data(const struct wined3d_device *
         UINT swapchain_idx, struct wined3d_surface *dst_surface)
 {
     struct wined3d_swapchain *swapchain;
-    HRESULT hr;
 
     TRACE("device %p, swapchain_idx %u, dst_surface %p.\n", device, swapchain_idx, dst_surface);
 
-    hr = wined3d_device_get_swapchain(device, swapchain_idx, &swapchain);
-    if (FAILED(hr)) return hr;
-
-    hr = wined3d_swapchain_get_front_buffer_data(swapchain, dst_surface);
-    wined3d_swapchain_decref(swapchain);
+    if (!(swapchain = wined3d_device_get_swapchain(device, swapchain_idx)))
+        return WINED3DERR_INVALIDCALL;
 
-    return hr;
+    return wined3d_swapchain_get_front_buffer_data(swapchain, dst_surface);
 }
 
 HRESULT CDECL wined3d_device_validate_device(const struct wined3d_device *device, DWORD *num_passes)
@@ -4363,27 +4334,14 @@ HRESULT CDECL wined3d_device_get_raster_status(const struct wined3d_device *devi
         UINT swapchain_idx, struct wined3d_raster_status *raster_status)
 {
     struct wined3d_swapchain *swapchain;
-    HRESULT hr;
 
     TRACE("device %p, swapchain_idx %u, raster_status %p.\n",
             device, swapchain_idx, raster_status);
 
-    hr = wined3d_device_get_swapchain(device, swapchain_idx, &swapchain);
-    if (FAILED(hr))
-    {
-        WARN("Failed to get swapchain %u, hr %#x.\n", swapchain_idx, hr);
-        return hr;
-    }
-
-    hr = wined3d_swapchain_get_raster_status(swapchain, raster_status);
-    wined3d_swapchain_decref(swapchain);
-    if (FAILED(hr))
-    {
-        WARN("Failed to get raster status, hr %#x.\n", hr);
-        return hr;
-    }
+    if (!(swapchain = wined3d_device_get_swapchain(device, swapchain_idx)))
+        return WINED3DERR_INVALIDCALL;
 
-    return WINED3D_OK;
+    return wined3d_swapchain_get_raster_status(swapchain, raster_status);
 }
 
 HRESULT CDECL wined3d_device_set_npatch_mode(struct wined3d_device *device, float segments)
@@ -5142,10 +5100,10 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
 
     TRACE("device %p, swapchain_desc %p, mode %p, callback %p.\n", device, swapchain_desc, mode, callback);
 
-    if (FAILED(hr = wined3d_device_get_swapchain(device, 0, &swapchain)))
+    if (!(swapchain = wined3d_device_get_swapchain(device, 0)))
     {
         ERR("Failed to get the first implicit swapchain.\n");
-        return hr;
+        return WINED3DERR_INVALIDCALL;
     }
 
     stateblock_unbind_resources(device->stateBlock);
@@ -5172,10 +5130,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
     {
         TRACE("Enumerating resource %p.\n", resource);
         if (FAILED(hr = callback(resource)))
-        {
-            wined3d_swapchain_decref(swapchain);
             return hr;
-        }
     }
 
     /* Is it necessary to recreate the gl context? Actually every setting can be changed
@@ -5237,7 +5192,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
                 &device->auto_depth_stencil)))
         {
             ERR("Failed to create the depth stencil buffer, hr %#x.\n", hr);
-            wined3d_swapchain_decref(swapchain);
             return WINED3DERR_INVALIDCALL;
         }
     }
@@ -5300,36 +5254,24 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
     {
         UINT i;
 
-        hr = wined3d_surface_update_desc(swapchain->front_buffer, swapchain->desc.backbuffer_width,
+        if (FAILED(hr = wined3d_surface_update_desc(swapchain->front_buffer, swapchain->desc.backbuffer_width,
                 swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
-                swapchain->desc.multisample_type, swapchain->desc.multisample_quality);
-        if (FAILED(hr))
-        {
-            wined3d_swapchain_decref(swapchain);
+                swapchain->desc.multisample_type, swapchain->desc.multisample_quality)))
             return hr;
-        }
 
         for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
         {
-            hr = wined3d_surface_update_desc(swapchain->back_buffers[i], swapchain->desc.backbuffer_width,
+            if (FAILED(hr = wined3d_surface_update_desc(swapchain->back_buffers[i], swapchain->desc.backbuffer_width,
                     swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
-                    swapchain->desc.multisample_type, swapchain->desc.multisample_quality);
-            if (FAILED(hr))
-            {
-                wined3d_swapchain_decref(swapchain);
+                    swapchain->desc.multisample_type, swapchain->desc.multisample_quality)))
                 return hr;
-            }
         }
         if (device->auto_depth_stencil)
         {
-            hr = wined3d_surface_update_desc(device->auto_depth_stencil, swapchain->desc.backbuffer_width,
+            if (FAILED(hr = wined3d_surface_update_desc(device->auto_depth_stencil, swapchain->desc.backbuffer_width,
                     swapchain->desc.backbuffer_height, device->auto_depth_stencil->resource.format->id,
-                    swapchain->desc.multisample_type, swapchain->desc.multisample_quality);
-            if (FAILED(hr))
-            {
-                wined3d_swapchain_decref(swapchain);
+                    swapchain->desc.multisample_type, swapchain->desc.multisample_quality)))
                 return hr;
-            }
         }
     }
 
@@ -5339,7 +5281,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         if (FAILED(hr = wined3d_set_adapter_display_mode(device->wined3d, device->adapter->ordinal, &m)))
         {
             WARN("Failed to set display mode, hr %#x.\n", hr);
-            wined3d_swapchain_decref(swapchain);
             return WINED3DERR_INVALIDCALL;
         }
 
@@ -5353,7 +5294,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
                 if (FAILED(hr = wined3d_device_acquire_focus_window(device, focus_window)))
                 {
                     ERR("Failed to acquire focus window, hr %#x.\n", hr);
-                    wined3d_swapchain_decref(swapchain);
                     return hr;
                 }
 
@@ -5419,7 +5359,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
 
     if (device->d3d_initialized)
         hr = create_primary_opengl_context(device, swapchain);
-    wined3d_swapchain_decref(swapchain);
 
     /* All done. There is no need to reload resources or shaders, this will happen automatically on the
      * first use
@@ -5454,11 +5393,8 @@ void CDECL wined3d_device_set_gamma_ramp(const struct wined3d_device *device,
     TRACE("device %p, swapchain_idx %u, flags %#x, ramp %p.\n",
             device, swapchain_idx, flags, ramp);
 
-    if (SUCCEEDED(wined3d_device_get_swapchain(device, swapchain_idx, &swapchain)))
-    {
+    if ((swapchain = wined3d_device_get_swapchain(device, swapchain_idx)))
         wined3d_swapchain_set_gamma_ramp(swapchain, flags, ramp);
-        wined3d_swapchain_decref(swapchain);
-    }
 }
 
 void CDECL wined3d_device_get_gamma_ramp(const struct wined3d_device *device,
@@ -5469,11 +5405,8 @@ void CDECL wined3d_device_get_gamma_ramp(const struct wined3d_device *device,
     TRACE("device %p, swapchain_idx %u, ramp %p.\n",
             device, swapchain_idx, ramp);
 
-    if (SUCCEEDED(wined3d_device_get_swapchain(device, swapchain_idx, &swapchain)))
-    {
+    if ((swapchain = wined3d_device_get_swapchain(device, swapchain_idx)))
         wined3d_swapchain_get_gamma_ramp(swapchain, ramp);
-        wined3d_swapchain_decref(swapchain);
-    }
 }
 
 void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource)
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 9660f2e..3e1ecb2 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -1296,8 +1296,7 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
     }
 
     /* check the return values, because the GetBackBuffer call isn't valid for ddraw */
-    hr = wined3d_device_get_swapchain(device, 0, &swapchain);
-    if (SUCCEEDED(hr) && swapchain)
+    if ((swapchain = wined3d_device_get_swapchain(device, 0)))
     {
         hr = wined3d_swapchain_get_back_buffer(swapchain, 0, WINED3D_BACKBUFFER_TYPE_MONO, &backbuffer);
         if (SUCCEEDED(hr) && backbuffer)
@@ -1321,8 +1320,6 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
         state->viewport.height = swapchain->desc.backbuffer_height;
         state->viewport.min_z = 0.0f;
         state->viewport.max_z = 1.0f;
-
-        wined3d_swapchain_decref(swapchain);
     }
 
     TRACE("Done.\n");
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 6555ae8..aa0c186 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -83,7 +83,7 @@
 @ cdecl wined3d_device_get_stream_source(ptr long ptr ptr ptr)
 @ cdecl wined3d_device_get_stream_source_freq(ptr long ptr)
 @ cdecl wined3d_device_get_surface_from_dc(ptr ptr ptr)
-@ cdecl wined3d_device_get_swapchain(ptr long ptr)
+@ cdecl wined3d_device_get_swapchain(ptr long)
 @ cdecl wined3d_device_get_swapchain_count(ptr)
 @ cdecl wined3d_device_get_texture(ptr long ptr)
 @ cdecl wined3d_device_get_texture_stage_state(ptr long long ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 941bd8e..82a1c80 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2157,8 +2157,8 @@ HRESULT __cdecl wined3d_device_get_stream_source_freq(const struct wined3d_devic
         UINT stream_idx, UINT *divider);
 HRESULT __cdecl wined3d_device_get_surface_from_dc(const struct wined3d_device *device,
         HDC dc, struct wined3d_surface **surface);
-HRESULT __cdecl wined3d_device_get_swapchain(const struct wined3d_device *device,
-        UINT swapchain_idx, struct wined3d_swapchain **swapchain);
+struct wined3d_swapchain * __cdecl wined3d_device_get_swapchain(const struct wined3d_device *device,
+        UINT swapchain_idx);
 UINT __cdecl wined3d_device_get_swapchain_count(const struct wined3d_device *device);
 HRESULT __cdecl wined3d_device_get_texture(const struct wined3d_device *device,
         UINT stage, struct wined3d_texture **texture);
-- 
1.7.8.6




More information about the wine-patches mailing list