wined3d: Use standard wine lists for the resource list.
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index eb656bb..30ac0b7 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -179,9 +179,9 @@
/* NOTE: You must release the parent if the object was created via a callback
** ***************************/
- if (This->resources != NULL ) {
+ if (!list_empty(&This->resources)) {
FIXME("(%p) Device released with resources still bound, acceptable but unexpected\n", This);
- dumpResources(This->resources);
+ dumpResources(&This->resources);
}
if(This->contexts) ERR("Context array not freed!\n");
@@ -6622,18 +6622,18 @@
static HRESULT WINAPI IWineD3DDeviceImpl_TestCooperativeLevel(IWineD3DDevice* iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+ IWineD3DResourceImpl *resource;
TRACE("(%p) : state (%u)\n", This, This->state);
+
/* TODO: Implement wrapping of the WndProc so that mimimize and maxamise can be monitored and the states adjusted. */
switch (This->state) {
case WINED3D_OK:
return WINED3D_OK;
case WINED3DERR_DEVICELOST:
{
- ResourceList *resourceList = This->resources;
- while (NULL != resourceList) {
- if (((IWineD3DResourceImpl *)resourceList->resource)->resource.pool == WINED3DPOOL_DEFAULT /* TODO: IWineD3DResource_GetPool(resourceList->resource)*/)
- return WINED3DERR_DEVICENOTRESET;
- resourceList = resourceList->next;
+ LIST_FOR_EACH_ENTRY(resource, &This->resources, IWineD3DResourceImpl, resource.resource_list_entry) {
+ if (resource->resource.pool == WINED3DPOOL_DEFAULT)
+ return WINED3DERR_DEVICENOTRESET;
}
return WINED3DERR_DEVICELOST;
}
@@ -6876,51 +6876,17 @@
*****************************************************/
static void WINAPI IWineD3DDeviceImpl_AddResource(IWineD3DDevice *iface, IWineD3DResource *resource){
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- ResourceList* resourceList;
- TRACE("(%p) : resource %p\n", This, resource);
- /* add a new texture to the frot of the linked list */
- resourceList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ResourceList));
- resourceList->resource = resource;
-
- /* Get the old head */
- resourceList->next = This->resources;
-
- This->resources = resourceList;
- TRACE("Added resource %p with element %p pointing to %p\n", resource, resourceList, resourceList->next);
-
- return;
+ TRACE("(%p) : Adding Resource %p\n", This, resource);
+ list_add_head(&This->resources, &((IWineD3DResourceImpl *) resource)->resource.resource_list_entry);
}
static void WINAPI IWineD3DDeviceImpl_RemoveResource(IWineD3DDevice *iface, IWineD3DResource *resource){
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- ResourceList* resourceList = NULL;
- ResourceList* previousResourceList = NULL;
-
- TRACE("(%p) : resource %p\n", This, resource);
- resourceList = This->resources;
+ TRACE("(%p) : Removing resource %p\n", This, resource);
- while (resourceList != NULL) {
- if(resourceList->resource == resource) break;
- previousResourceList = resourceList;
- resourceList = resourceList->next;
- }
-
- if (resourceList == NULL) {
- FIXME("Attempted to remove resource %p that hasn't been stored\n", resource);
- return;
- } else {
- TRACE("Found resource %p with element %p pointing to %p (previous %p)\n", resourceList->resource, resourceList, resourceList->next, previousResourceList);
- }
- /* make sure we don't leave a hole in the list */
- if (previousResourceList != NULL) {
- previousResourceList->next = resourceList->next;
- } else {
- This->resources = resourceList->next;
- }
-
- return;
+ list_remove(&((IWineD3DResourceImpl *) resource)->resource.resource_list_entry);
}
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8ed2d92..696ce10 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2695,6 +2695,7 @@
object->adapter = numAdapters ? &Adapters[Adapter] : NULL;
IWineD3D_AddRef(object->wineD3D);
object->parent = parent;
+ list_init(&object->resources);
if(This->dxVersion == 7) {
object->surface_alignment = 8;
diff --git a/dlls/wined3d/palette.c b/dlls/wined3d/palette.c
index a1dcc9f..506b4fe 100644
--- a/dlls/wined3d/palette.c
+++ b/dlls/wined3d/palette.c
@@ -107,7 +107,7 @@
static HRESULT WINAPI IWineD3DPaletteImpl_SetEntries(IWineD3DPalette *iface, DWORD Flags, DWORD Start, DWORD Count, PALETTEENTRY *PalEnt)
{
IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface;
- ResourceList *res;
+ IWineD3DResourceImpl *res;
TRACE("(%p)->(%08x,%d,%d,%p)\n",This,Flags,Start,Count,PalEnt);
@@ -134,11 +134,11 @@
/* If the palette is attached to the render target, update all render targets */
- for(res = This->wineD3DDevice->resources; res != NULL; res=res->next) {
- if(IWineD3DResource_GetType(res->resource) == WINED3DRTYPE_SURFACE) {
- IWineD3DSurfaceImpl *impl = (IWineD3DSurfaceImpl *) res->resource;
+ LIST_FOR_EACH_ENTRY(res, &This->wineD3DDevice->resources, IWineD3DResourceImpl, resource.resource_list_entry) {
+ if(IWineD3DResource_GetType((IWineD3DResource *) res) == WINED3DRTYPE_SURFACE) {
+ IWineD3DSurfaceImpl *impl = (IWineD3DSurfaceImpl *) res;
if(impl->palette == This)
- IWineD3DSurface_RealizePalette( (IWineD3DSurface *) res->resource);
+ IWineD3DSurface_RealizePalette((IWineD3DSurface *) res);
}
}
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 9faaea5..151af2c 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -248,12 +248,11 @@
return WINED3D_OK;
}
-void dumpResources(ResourceList *resources) {
- ResourceList *iterator = resources;
+void dumpResources(struct list *list) {
+ IWineD3DResourceImpl *resource;
- while(iterator) {
- FIXME("Leftover resource %p with type %d,%s\n", iterator->resource, IWineD3DResource_GetType(iterator->resource), debug_d3dresourcetype(IWineD3DResource_GetType(iterator->resource)));
- iterator = iterator->next;
+ LIST_FOR_EACH_ENTRY(resource, list, IWineD3DResourceImpl, resource.resource_list_entry) {
+ FIXME("Leftover resource %p with type %d,%s\n", resource, IWineD3DResource_GetType((IWineD3DResource *) resource), debug_d3dresourcetype(IWineD3DResource_GetType((IWineD3DResource *) resource)));
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index dbcff48..c77d2af 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -625,13 +625,8 @@
/* allocate one pbuffer per surface */
extern BOOL pbuffer_per_surface;
-typedef struct ResourceList {
- IWineD3DResource *resource;
- struct ResourceList *next;
-} ResourceList;
-
/* A helper function that dumps a resource list */
-void dumpResources(ResourceList *resources);
+void dumpResources(struct list *list);
/*****************************************************************************
* IWineD3DDevice implementation structure
@@ -681,7 +676,7 @@
IWineD3DSwapChain **swapchains;
UINT NumberOfSwapChains;
- ResourceList *resources; /* a linked list to track resources created by the device */
+ struct list resources; /* a linked list to track resources created by the device */
/* Render Target Support */
IWineD3DSurface **render_targets;
@@ -821,6 +816,7 @@
BYTE *allocatedMemory; /* Pointer to the real data location */
BYTE *heapMemory; /* Pointer to the HeapAlloced block of memory */
struct list privateData;
+ struct list resource_list_entry;
} IWineD3DResourceClass;