Henri Verbeet : ddraw: Verify the viewport belongs to the device on execute buffer execution.
Alexandre Julliard
julliard at winehq.org
Tue Apr 19 12:08:17 CDT 2011
Module: wine
Branch: master
Commit: d429aaa9e9d03e644914ae7fad4f3bef82f8f8c9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d429aaa9e9d03e644914ae7fad4f3bef82f8f8c9
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Tue Apr 19 00:08:00 2011 +0200
ddraw: Verify the viewport belongs to the device on execute buffer execution.
---
dlls/ddraw/ddraw_private.h | 4 ++--
dlls/ddraw/device.c | 5 +++--
dlls/ddraw/executebuffer.c | 16 +++++++++-------
3 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index a6cab70..5cc09dd 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -515,8 +515,8 @@ HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer,
IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) DECLSPEC_HIDDEN;
/* The execute function */
-void IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
- IDirect3DDeviceImpl *Device, IDirect3DViewportImpl *ViewportImpl) DECLSPEC_HIDDEN;
+HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *execute_buffer,
+ IDirect3DDeviceImpl *device, IDirect3DViewportImpl *viewport) DECLSPEC_HIDDEN;
/*****************************************************************************
* IDirect3DVertexBuffer
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 80ee926..984afc3 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -718,6 +718,7 @@ IDirect3DDeviceImpl_1_Execute(IDirect3DDevice *iface,
IDirect3DDeviceImpl *This = device_from_device1(iface);
IDirect3DExecuteBufferImpl *Direct3DExecuteBufferImpl = (IDirect3DExecuteBufferImpl *)ExecuteBuffer;
IDirect3DViewportImpl *Direct3DViewportImpl = (IDirect3DViewportImpl *)Viewport;
+ HRESULT hr;
TRACE("iface %p, buffer %p, viewport %p, flags %#x.\n", iface, ExecuteBuffer, Viewport, Flags);
@@ -726,10 +727,10 @@ IDirect3DDeviceImpl_1_Execute(IDirect3DDevice *iface,
/* Execute... */
EnterCriticalSection(&ddraw_cs);
- IDirect3DExecuteBufferImpl_Execute(Direct3DExecuteBufferImpl, This, Direct3DViewportImpl);
+ hr = d3d_execute_buffer_execute(Direct3DExecuteBufferImpl, This, Direct3DViewportImpl);
LeaveCriticalSection(&ddraw_cs);
- return D3D_OK;
+ return hr;
}
/*****************************************************************************
diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c
index d4d2dd0..070cdc7 100644
--- a/dlls/ddraw/executebuffer.c
+++ b/dlls/ddraw/executebuffer.c
@@ -68,10 +68,8 @@ static void _dump_D3DEXECUTEBUFFERDESC(const D3DEXECUTEBUFFERDESC *lpDesc) {
* Viewport: Viewport for this operation
*
*****************************************************************************/
-void
-IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
- IDirect3DDeviceImpl *lpDevice,
- IDirect3DViewportImpl *lpViewport)
+HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
+ IDirect3DDeviceImpl *lpDevice, IDirect3DViewportImpl *lpViewport)
{
/* DWORD bs = This->desc.dwBufferSize; */
DWORD vs = This->data.dwVertexOffset;
@@ -81,10 +79,14 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
char *instr = (char *)This->desc.lpData + is;
- /* Should check if the viewport was added or not to the device */
+ if (lpViewport->active_device != lpDevice)
+ {
+ WARN("Viewport %p active device is %p.\n",
+ lpViewport, lpViewport->active_device);
+ return DDERR_INVALIDPARAMS;
+ }
/* Activate the viewport */
- lpViewport->active_device = lpDevice;
viewport_activate(lpViewport, FALSE);
TRACE("ExecuteData :\n");
@@ -551,7 +553,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
}
end_of_buffer:
- ;
+ return D3D_OK;
}
/*****************************************************************************
More information about the wine-cvs
mailing list