Module: wine Branch: master Commit: fd1aac3e7556b119954687f453bba79f431764ed URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd1aac3e7556b119954687f453...
Author: Henri Verbeet hverbeet@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)) {