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