wined3d: Track overlay surfaces in the overlayed surface.
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index dab4b38..49a72eb 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -660,6 +660,7 @@
object->currentDesc.MultiSampleType = MultiSample;
object->currentDesc.MultiSampleQuality = MultisampleQuality;
object->glDescription.level = Level;
+ list_init(&object->overlays);
/* Flags */
object->Flags = SFLAG_NORMCOORD; /* Default to normalized coords */
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 1ea221c..07c7076 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -474,6 +474,10 @@
if(iface == device->ddraw_primary)
device->ddraw_primary = NULL;
+ if(This->overlay_dest) {
+ list_remove(&This->overlay_entry);
+ }
+
TRACE("(%p) Released\n", This);
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index 3816329..bace476 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -450,9 +450,15 @@
This->overlay_destrect.bottom = Dst ? Dst->currentDesc.Height : 0;
}
- if(Flags & WINEDDOVER_SHOW) {
- This->overlay_dest = Dst;
+ if(This->overlay_dest && (This->overlay_dest != Dst || Flags & WINEDDOVER_HIDE)) {
+ list_remove(&This->overlay_entry);
+ }
+ if(Flags & WINEDDOVER_SHOW) {
+ if(This->overlay_dest != Dst) {
+ This->overlay_dest = Dst;
+ list_add_tail(&Dst->overlays, &This->overlay_entry);
+ }
} else if(Flags & WINEDDOVER_HIDE) {
/* tests show that the rectangles are erased on hide */
This->overlay_srcrect.left = 0; This->overlay_srcrect.top = 0;
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c
index 60564b4..1b1e5db 100644
--- a/dlls/wined3d/surface_gdi.c
+++ b/dlls/wined3d/surface_gdi.c
@@ -160,6 +160,10 @@
if(iface == device->ddraw_primary)
device->ddraw_primary = NULL;
+ if(This->overlay_dest) {
+ list_remove(&This->overlay_entry);
+ }
+
TRACE("(%p) Released\n", This);
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 669e865..91617e8 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1331,6 +1331,8 @@
RECT overlay_srcrect;
RECT overlay_destrect;
IWineD3DSurfaceImpl *overlay_dest;
+ struct list overlays;
+ struct list overlay_entry;
};
extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;