[PATCH 4/5] ddraw: Thunk to surface1, not surface7 in flip.

Stefan Dösinger stefan at codeweavers.com
Tue Jun 23 06:39:25 CDT 2015


---
 dlls/ddraw/surface.c | 64 +++++++++++++++++++++++++++-------------------------
 1 file changed, 33 insertions(+), 31 deletions(-)

diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index ae3a91f..2de2944 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -1196,16 +1196,18 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Unlock(IDirectDrawSurface
     return ddraw_surface1_Unlock(&surface->IDirectDrawSurface_iface, data);
 }
 
-static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 *iface,
-        IDirectDrawSurface7 *src, DWORD flags)
+/* Note that we thunk to version 1 here. Fraps depends on this, as it hooks only methods from
+ * IDirectDrawSurface and expects later versions to call through version 1. */
+static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface *iface,
+        IDirectDrawSurface *src, DWORD flags)
 {
-    struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface7(iface);
-    struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface7(src);
+    struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface(iface);
+    struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface(src);
     struct wined3d_rendertarget_view *tmp_rtv, *src_rtv, *rtv;
     struct ddraw_texture *ddraw_texture, *prev_ddraw_texture;
-    DDSCAPS2 caps = {DDSCAPS_FLIP, 0, 0, {0}};
+    DDSCAPS caps = {DDSCAPS_FLIP};
     struct wined3d_texture *texture;
-    IDirectDrawSurface7 *current;
+    IDirectDrawSurface *current;
     struct wined3d_surface *tmp;
     HRESULT hr;
 
@@ -1214,7 +1216,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7
     if (src == iface || !(dst_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_OVERLAY)))
         return DDERR_NOTFLIPPABLE;
 
-    if (IDirectDrawSurface7_IsLost(iface) == DDERR_SURFACELOST)
+    if (IDirectDrawSurface_IsLost(iface) == DDERR_SURFACELOST)
         return DDERR_SURFACELOST;
 
     wined3d_mutex_lock();
@@ -1229,13 +1231,13 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7
     {
         for (current = iface; current != src;)
         {
-            if (FAILED(hr = ddraw_surface7_GetAttachedSurface(current, &caps, &current)))
+            if (FAILED(hr = ddraw_surface1_GetAttachedSurface(current, &caps, &current)))
             {
                 WARN("Surface %p is not on the same flip chain as surface %p.\n", src, iface);
                 wined3d_mutex_unlock();
                 return DDERR_NOTFLIPPABLE;
             }
-            ddraw_surface7_Release(current);
+            ddraw_surface1_Release(current);
             if (current == iface)
             {
                 WARN("Surface %p is not on the same flip chain as surface %p.\n", src, iface);
@@ -1260,20 +1262,20 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7
     {
         for (current = iface;;)
         {
-            if (FAILED(hr = ddraw_surface7_GetAttachedSurface(current, &caps, &current)))
+            if (FAILED(hr = ddraw_surface1_GetAttachedSurface(current, &caps, &current)))
             {
                 ERR("Can't find a flip target\n");
                 wined3d_mutex_unlock();
                 return DDERR_NOTFLIPPABLE; /* Unchecked */
             }
-            ddraw_surface7_Release(current);
+            ddraw_surface1_Release(current);
             if (current == iface)
             {
-                dst_impl = impl_from_IDirectDrawSurface7(iface);
+                dst_impl = impl_from_IDirectDrawSurface(iface);
                 break;
             }
 
-            src_impl = impl_from_IDirectDrawSurface7(current);
+            src_impl = impl_from_IDirectDrawSurface(current);
             src_rtv = ddraw_surface_get_rendertarget_view(src_impl);
             if (rtv == dst_impl->wined3d_rtv)
                 wined3d_device_set_rendertarget_view(dst_impl->ddraw->wined3d_device, 0, src_rtv, FALSE);
@@ -1319,6 +1321,18 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7
     return hr;
 }
 
+static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 *iface,
+        IDirectDrawSurface7 *dst, DWORD flags)
+{
+    struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
+    struct ddraw_surface *dst_impl = unsafe_impl_from_IDirectDrawSurface7(dst);
+
+    TRACE("iface %p, dst %p, flags %#x.\n", iface, dst, flags);
+
+    return ddraw_surface1_Flip(&surface->IDirectDrawSurface_iface,
+            dst_impl ? &dst_impl->IDirectDrawSurface_iface : NULL, flags);
+}
+
 static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_Flip(IDirectDrawSurface4 *iface,
         IDirectDrawSurface4 *dst, DWORD flags)
 {
@@ -1327,8 +1341,8 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_Flip(IDirectDrawSurface4
 
     TRACE("iface %p, dst %p, flags %#x.\n", iface, dst, flags);
 
-    return ddraw_surface7_Flip(&surface->IDirectDrawSurface7_iface,
-            dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, flags);
+    return ddraw_surface1_Flip(&surface->IDirectDrawSurface_iface,
+            dst_impl ? &dst_impl->IDirectDrawSurface_iface : NULL, flags);
 }
 
 static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Flip(IDirectDrawSurface3 *iface,
@@ -1339,8 +1353,8 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Flip(IDirectDrawSurface3
 
     TRACE("iface %p, dst %p, flags %#x.\n", iface, dst, flags);
 
-    return ddraw_surface7_Flip(&surface->IDirectDrawSurface7_iface,
-            dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, flags);
+    return ddraw_surface1_Flip(&surface->IDirectDrawSurface_iface,
+            dst_impl ? &dst_impl->IDirectDrawSurface_iface : NULL, flags);
 }
 
 static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Flip(IDirectDrawSurface2 *iface,
@@ -1351,20 +1365,8 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Flip(IDirectDrawSurface2
 
     TRACE("iface %p, dst %p, flags %#x.\n", iface, dst, flags);
 
-    return ddraw_surface7_Flip(&surface->IDirectDrawSurface7_iface,
-            dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, flags);
-}
-
-static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface *iface,
-        IDirectDrawSurface *dst, DWORD flags)
-{
-    struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
-    struct ddraw_surface *dst_impl = unsafe_impl_from_IDirectDrawSurface(dst);
-
-    TRACE("iface %p, dst %p, flags %#x.\n", iface, dst, flags);
-
-    return ddraw_surface7_Flip(&surface->IDirectDrawSurface7_iface,
-            dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, flags);
+    return ddraw_surface1_Flip(&surface->IDirectDrawSurface_iface,
+            dst_impl ? &dst_impl->IDirectDrawSurface_iface : NULL, flags);
 }
 
 static HRESULT ddraw_surface_blt_clipped(struct ddraw_surface *dst_surface, const RECT *dst_rect_in,
-- 
2.3.6




More information about the wine-patches mailing list