Henri Verbeet : ddraw: Replace the viewport list with a standard Wine list.
Alexandre Julliard
julliard at winehq.org
Wed Apr 20 11:05:16 CDT 2011
Module: wine
Branch: master
Commit: fd1aac3e7556b119954687f453bba79f431764ed
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd1aac3e7556b119954687f453bba79f431764ed
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Tue Apr 19 20:05:52 2011 +0200
ddraw: Replace the viewport list with a standard Wine list.
---
dlls/ddraw/ddraw_private.h | 5 +--
dlls/ddraw/device.c | 73 ++++++++++++++++++-------------------------
2 files changed, 33 insertions(+), 45 deletions(-)
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 4c5d4cb..988d127 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -290,7 +290,7 @@ struct IDirect3DDeviceImpl
IDirectDrawSurfaceImpl *target;
/* Viewport management */
- IDirect3DViewportImpl *viewport_list;
+ struct list viewport_list;
IDirect3DViewportImpl *current_viewport;
D3DVIEWPORT7 active_viewport;
@@ -471,8 +471,7 @@ struct IDirect3DViewportImpl
D3DVIEWPORT2 vp2;
} viewports;
- /* Field used to chain viewports together */
- IDirect3DViewportImpl *next;
+ struct list entry;
/* Lights list */
IDirect3DLightImpl *lights;
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 11ac291..b1b4cf6 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -764,8 +764,7 @@ IDirect3DDeviceImpl_3_AddViewport(IDirect3DDevice3 *iface,
return DDERR_INVALIDPARAMS;
EnterCriticalSection(&ddraw_cs);
- vp->next = This->viewport_list;
- This->viewport_list = vp;
+ list_add_head(&This->viewport_list, &vp->entry);
vp->active_device = This; /* Viewport must be usable for Clear() after AddViewport,
so set active_device here. */
LeaveCriticalSection(&ddraw_cs);
@@ -811,35 +810,27 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_AddViewport(IDirect3DDevice *iface,
* DDERR_INVALIDPARAMS if the viewport wasn't found in the list
*
*****************************************************************************/
-static HRESULT WINAPI
-IDirect3DDeviceImpl_3_DeleteViewport(IDirect3DDevice3 *iface,
- IDirect3DViewport3 *Viewport)
+static HRESULT WINAPI IDirect3DDeviceImpl_3_DeleteViewport(IDirect3DDevice3 *iface, IDirect3DViewport3 *viewport)
{
- IDirect3DDeviceImpl *This = device_from_device3(iface);
- IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *) Viewport;
- IDirect3DViewportImpl *cur_viewport, *prev_viewport = NULL;
+ IDirect3DDeviceImpl *device = device_from_device3(iface);
+ IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)viewport;
- TRACE("iface %p, viewport %p.\n", iface, Viewport);
+ TRACE("iface %p, viewport %p.\n", iface, viewport);
EnterCriticalSection(&ddraw_cs);
- cur_viewport = This->viewport_list;
- while (cur_viewport != NULL)
+
+ if (vp->active_device != device)
{
- if (cur_viewport == vp)
- {
- if (prev_viewport == NULL) This->viewport_list = cur_viewport->next;
- else prev_viewport->next = cur_viewport->next;
- vp->active_device = NULL;
- /* TODO : add desactivate of the viewport and all associated lights... */
- LeaveCriticalSection(&ddraw_cs);
- return D3D_OK;
- }
- prev_viewport = cur_viewport;
- cur_viewport = cur_viewport->next;
+ WARN("Viewport %p active device is %p.\n", vp, vp->active_device);
+ LeaveCriticalSection(&ddraw_cs);
+ return DDERR_INVALIDPARAMS;
}
+ vp->active_device = NULL;
+ list_remove(&vp->entry);
+
LeaveCriticalSection(&ddraw_cs);
- return DDERR_INVALIDPARAMS;
+ return D3D_OK;
}
static HRESULT WINAPI IDirect3DDeviceImpl_2_DeleteViewport(IDirect3DDevice2 *iface,
@@ -890,7 +881,7 @@ IDirect3DDeviceImpl_3_NextViewport(IDirect3DDevice3 *iface,
{
IDirect3DDeviceImpl *This = device_from_device3(iface);
IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport3;
- IDirect3DViewportImpl *res = NULL;
+ struct list *entry;
TRACE("iface %p, viewport %p, next %p, flags %#x.\n",
iface, Viewport3, lplpDirect3DViewport3, Flags);
@@ -906,32 +897,29 @@ IDirect3DDeviceImpl_3_NextViewport(IDirect3DDevice3 *iface,
switch (Flags)
{
case D3DNEXT_NEXT:
- {
- res = vp->next;
- }
- break;
+ entry = list_next(&This->viewport_list, &vp->entry);
+ break;
+
case D3DNEXT_HEAD:
- {
- res = This->viewport_list;
- }
- break;
+ entry = list_head(&This->viewport_list);
+ break;
+
case D3DNEXT_TAIL:
- {
- IDirect3DViewportImpl *cur_viewport = This->viewport_list;
- if (cur_viewport != NULL)
- {
- while (cur_viewport->next != NULL) cur_viewport = cur_viewport->next;
- }
- res = cur_viewport;
- }
- break;
+ entry = list_tail(&This->viewport_list);
+ break;
+
default:
+ WARN("Invalid flags %#x.\n", Flags);
*lplpDirect3DViewport3 = NULL;
LeaveCriticalSection(&ddraw_cs);
return DDERR_INVALIDPARAMS;
}
- *lplpDirect3DViewport3 = (IDirect3DViewport3 *)res;
+ if (entry)
+ *lplpDirect3DViewport3 = (IDirect3DViewport3 *)LIST_ENTRY(entry, IDirect3DViewportImpl, entry);
+ else
+ *lplpDirect3DViewport3 = NULL;
+
LeaveCriticalSection(&ddraw_cs);
return D3D_OK;
}
@@ -6785,6 +6773,7 @@ HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDi
device->ref = 1;
device->ddraw = ddraw;
device->target = target;
+ list_init(&device->viewport_list);
if (!ddraw_handle_table_init(&device->handle_table, 64))
{
More information about the wine-cvs
mailing list