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