Stefan Dösinger : ddraw: Make the surface list a standard wine list.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Oct 16 05:28:58 CDT 2006
Module: wine
Branch: master
Commit: 2e5628df3fba1c3991b9f3bbf3bf88a19238e827
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e5628df3fba1c3991b9f3bbf3bf88a19238e827
Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date: Sat Oct 14 21:57:09 2006 +0200
ddraw: Make the surface list a standard wine list.
---
dlls/ddraw/ddraw.c | 27 +++++++++++----------------
dlls/ddraw/ddraw_private.h | 11 +++++------
dlls/ddraw/main.c | 2 ++
dlls/ddraw/surface.c | 10 +---------
4 files changed, 19 insertions(+), 31 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index fc80517..11de3ef 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1904,12 +1904,7 @@ IDirectDrawImpl_CreateNewSurface(IDirect
/* Increase the surface counter, and attach the surface */
InterlockedIncrement(&This->surfaces);
- if(This->surface_list)
- {
- This->surface_list->prev = *ppSurf;
- }
- (*ppSurf)->next = This->surface_list;
- This->surface_list = *ppSurf;
+ list_add_head(&This->surface_list, &(*ppSurf)->surface_list_entry);
/* Here we could store all created surfaces in the DirectDrawImpl structure,
* But this could also be delegated to WineDDraw, as it keeps track of all its
@@ -2375,23 +2370,20 @@ IDirectDrawImpl_CreateSurface(IDirectDra
if( (This->ImplType == SURFACE_OPENGL) && !(This->d3d_initialized) &&
desc2.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE) )
{
- IDirectDrawSurfaceImpl *target = This->surface_list;
+ IDirectDrawSurfaceImpl *target = object, *surface;
+ struct list *entry;
/* Search for the primary to use as render target */
- while(target)
+ LIST_FOR_EACH(entry, &This->surface_list)
{
- if(target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
+ surface = LIST_ENTRY(entry, IDirectDrawSurfaceImpl, surface_list_entry);
+ if(surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
{
/* found */
+ target = surface;
TRACE("Using primary %p as render target\n", target);
break;
}
- target = target->next;
- }
- /* If it's not found, use the just created DDSCAPS_3DDEVICE surface */
- if(!target)
- {
- target = object;
}
TRACE("(%p) Attaching a D3DDevice, rendertarget = %p\n", This, target);
@@ -2601,6 +2593,7 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw
IDirectDrawSurfaceImpl *surf;
BOOL all, nomatch;
DDSURFACEDESC2 desc;
+ struct list *entry, *entry2;
all = Flags & DDENUMSURFACES_ALL;
nomatch = Flags & DDENUMSURFACES_NOMATCH;
@@ -2610,8 +2603,10 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw
if(!Callback)
return DDERR_INVALIDPARAMS;
- for(surf = This->surface_list; surf; surf = surf->next)
+ /* Use the _SAFE enumeration, the app may destroy enumerated surfaces */
+ LIST_FOR_EACH_SAFE(entry, entry2, &This->surface_list)
{
+ surf = LIST_ENTRY(entry, IDirectDrawSurfaceImpl, surface_list_entry);
if (all || (nomatch != IDirectDrawImpl_DDSD_Match(DDSD, &surf->surface_desc)))
{
desc = surf->surface_desc;
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index f70da21..7181997 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -130,10 +130,6 @@ struct IDirectDrawImpl
/* The surface type to request */
WINED3DSURFTYPE ImplType;
- /* The surface list - can't relay this to WineD3D
- * because of IParent
- */
- IDirectDrawSurfaceImpl *surface_list;
/* Our private window class */
char classname[32];
@@ -145,6 +141,10 @@ struct IDirectDrawImpl
/* For the dll unload cleanup code */
struct list ddraw_list_entry;
+ /* The surface list - can't relay this to WineD3D
+ * because of IParent
+ */
+ struct list surface_list;
LONG surfaces;
};
@@ -233,8 +233,7 @@ struct IDirectDrawSurfaceImpl
IDirectDrawClipperImpl *clipper;
/* For the ddraw surface list */
- IDirectDrawSurfaceImpl *next;
- IDirectDrawSurfaceImpl *prev;
+ struct list surface_list_entry;
DWORD Handle;
};
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index 8865fe5..eec98f1 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -315,6 +315,8 @@ #undef BLIT_CAPS
#undef CKEY_CAPS
#undef FX_CAPS
+ list_init(&This->surface_list);
+
EnterCriticalSection(&ddraw_list_cs);
list_add_head(&global_ddraw_list, &This->ddraw_list_entry);
LeaveCriticalSection(&ddraw_list_cs);
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 0ce28da..d7940bd 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -238,15 +238,7 @@ static void IDirectDrawSurfaceImpl_Destr
/* Reduce the ddraw surface count */
InterlockedDecrement(&This->ddraw->surfaces);
- if(This->prev)
- This->prev->next = This->next;
- else
- {
- assert(This->ddraw->surface_list == This);
- This->ddraw->surface_list = This->next;
- }
- if(This->next)
- This->next->prev = This->prev;
+ list_remove(&This->surface_list_entry);
HeapFree(GetProcessHeap(), 0, This);
}
More information about the wine-cvs
mailing list