Stefan Dösinger : wined3d: Invalidate streamsrc, vdecl and indexbuffer after strided draws.

Alexandre Julliard julliard at winehq.org
Mon Aug 22 13:29:15 CDT 2011


Module: wine
Branch: master
Commit: 0fc7cd5ad72b813bfbd99951e4c649f8514e1de4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0fc7cd5ad72b813bfbd99951e4c649f8514e1de4

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Aug 19 00:55:14 2011 +0200

wined3d: Invalidate streamsrc, vdecl and indexbuffer after strided draws.

---

 dlls/wined3d/device.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 51a6c39..819e481 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4242,11 +4242,21 @@ HRESULT CDECL wined3d_device_draw_primitive_strided(struct wined3d_device *devic
      * baseVertexIndex because that call is only called by ddraw which does
      * not need that value. */
     device_invalidate_state(device, STATE_VDECL);
+    device_invalidate_state(device, STATE_STREAMSRC);
     device_invalidate_state(device, STATE_INDEXBUFFER);
+
     device->stateBlock->state.base_vertex_index = 0;
     device->up_strided = strided_data;
     drawPrimitive(device, vertex_count, 0, 0, NULL);
     device->up_strided = NULL;
+
+    /* Invalidate the states again to make sure the values from the stateblock
+     * are properly applied in the next regular draw. Note that the application-
+     * provided strided data has ovwritten pretty much the entire vertex and
+     * and index stream related states */
+    device_invalidate_state(device, STATE_VDECL);
+    device_invalidate_state(device, STATE_STREAMSRC);
+    device_invalidate_state(device, STATE_INDEXBUFFER);
     return WINED3D_OK;
 }
 
@@ -4261,12 +4271,18 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive_strided(struct wined3d_devic
      * that value.
      */
     device_invalidate_state(device, STATE_VDECL);
+    device_invalidate_state(device, STATE_STREAMSRC);
     device_invalidate_state(device, STATE_INDEXBUFFER);
+
     device->stateBlock->state.user_stream = TRUE;
     device->stateBlock->state.base_vertex_index = 0;
     device->up_strided = strided_data;
     drawPrimitive(device, index_count, 0, index_size, index_data);
     device->up_strided = NULL;
+
+    device_invalidate_state(device, STATE_VDECL);
+    device_invalidate_state(device, STATE_STREAMSRC);
+    device_invalidate_state(device, STATE_INDEXBUFFER);
     return WINED3D_OK;
 }
 




More information about the wine-cvs mailing list