[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