[PATCH] WineD3D: Track overlay surfaces in the overlayed surface=0A=

Stefan Doesinger stefan at codeweavers.com
Wed Jul 30 15:28:25 CDT 2008


=0A=
This list is needed to update the overlay emulation after the GL=0A=
front buffer has been modified(unlocking, blitting, drawing,=0A=
flipping, signaled via a ModifyLocation call), as well as to=0A=
implement a proper Z order for multiple overlays=0A=
---=0A=
 dlls/wined3d/device.c          |    1 +=0A=
 dlls/wined3d/surface.c         |    4 ++++=0A=
 dlls/wined3d/surface_base.c    |   10 ++++++++--=0A=
 dlls/wined3d/surface_gdi.c     |    4 ++++=0A=
 dlls/wined3d/wined3d_private.h |    2 ++=0A=
 5 files changed, 19 insertions(+), 2 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c=0A=
index e6b7b50..026ddc1 100644=0A=
--- a/dlls/wined3d/device.c=0A=
+++ b/dlls/wined3d/device.c=0A=
@@ -660,6 +660,7 @@ static HRESULT  WINAPI =
IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U=0A=
     object->currentDesc.MultiSampleType    =3D MultiSample;=0A=
     object->currentDesc.MultiSampleQuality =3D MultisampleQuality;=0A=
     object->glDescription.level            =3D Level;=0A=
+    list_init(&object->overlays);=0A=
 =0A=
     /* Flags */=0A=
     object->Flags      =3D SFLAG_NORMCOORD; /* Default to normalized =
coords */=0A=
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c=0A=
index 1ea221c..07c7076 100644=0A=
--- a/dlls/wined3d/surface.c=0A=
+++ b/dlls/wined3d/surface.c=0A=
@@ -474,6 +474,10 @@ ULONG WINAPI =
IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) {=0A=
         if(iface =3D=3D device->ddraw_primary)=0A=
             device->ddraw_primary =3D NULL;=0A=
 =0A=
+        if(This->overlay_dest) {=0A=
+            list_remove(&This->overlay_entry);=0A=
+        }=0A=
+=0A=
         TRACE("(%p) Released\n", This);=0A=
         HeapFree(GetProcessHeap(), 0, This);=0A=
 =0A=
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c=0A=
index 3fd55a8..107c25c 100644=0A=
--- a/dlls/wined3d/surface_base.c=0A=
+++ b/dlls/wined3d/surface_base.c=0A=
@@ -450,9 +450,15 @@ HRESULT WINAPI =
IWineD3DBaseSurfaceImpl_UpdateOverlay(IWineD3DSurface *iface, REC=0A=
         This->overlay_destrect.bottom =3D Dst ? Dst->currentDesc.Height =
: 0;=0A=
     }=0A=
 =0A=
-    if(Flags & WINEDDOVER_SHOW) {=0A=
-        This->overlay_dest =3D Dst;=0A=
+    if(This->overlay_dest && (This->overlay_dest !=3D Dst || Flags & =
WINEDDOVER_HIDE)) {=0A=
+        list_remove(&This->overlay_entry);=0A=
+    }=0A=
 =0A=
+    if(Flags & WINEDDOVER_SHOW) {=0A=
+        if(This->overlay_dest !=3D Dst) {=0A=
+            This->overlay_dest =3D Dst;=0A=
+            list_add_tail(&Dst->overlays, &This->overlay_entry);=0A=
+        }=0A=
     } else if(Flags & WINEDDOVER_HIDE) {=0A=
         /* tests show that the rectangles are erased on hide */=0A=
         This->overlay_srcrect.left   =3D 0; This->overlay_srcrect.top   =
  =3D 0;=0A=
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c=0A=
index 60564b4..1b1e5db 100644=0A=
--- a/dlls/wined3d/surface_gdi.c=0A=
+++ b/dlls/wined3d/surface_gdi.c=0A=
@@ -160,6 +160,10 @@ ULONG WINAPI =
IWineGDISurfaceImpl_Release(IWineD3DSurface *iface) {=0A=
         if(iface =3D=3D device->ddraw_primary)=0A=
             device->ddraw_primary =3D NULL;=0A=
 =0A=
+        if(This->overlay_dest) {=0A=
+            list_remove(&This->overlay_entry);=0A=
+        }=0A=
+=0A=
         TRACE("(%p) Released\n", This);=0A=
         HeapFree(GetProcessHeap(), 0, This);=0A=
 =0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 27d070e..87b6f8c 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -1331,6 +1331,8 @@ struct IWineD3DSurfaceImpl=0A=
     RECT                      overlay_srcrect;=0A=
     RECT                      overlay_destrect;=0A=
     IWineD3DSurfaceImpl       *overlay_dest;=0A=
+    struct list               overlays;=0A=
+    struct list               overlay_entry;=0A=
 };=0A=
 =0A=
 extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0021_01C8F640.860455B0--




More information about the wine-patches mailing list