[PATCH 4/7] ddraw: Avoid redundant src vertex buffer discards.

Stefan Dösinger stefandoesinger at gmx.at
Sun Oct 30 09:02:24 CDT 2016


Signed-off-by: Stefan Dösinger <stefandoesinger at gmx.at>
---
 dlls/ddraw/ddraw_private.h |  2 +-
 dlls/ddraw/executebuffer.c | 15 +++++++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index e850ed1..08ab8a2 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -526,7 +526,7 @@ struct d3d_execute_buffer
     void                 *vertex_data;
     WORD                 *indices;
     unsigned int         index_size, index_pos;
-    unsigned int         vertex_size;
+    unsigned int         vertex_size, src_vertex_pos;
     struct wined3d_buffer *src_vertex_buffer, *dst_vertex_buffer, *index_buffer;
 
     /* This flags is set to TRUE if we allocated ourselves the
diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c
index c1192c0..da4d6dc 100644
--- a/dlls/ddraw/executebuffer.c
+++ b/dlls/ddraw/executebuffer.c
@@ -274,6 +274,7 @@ HRESULT d3d_execute_buffer_execute(struct d3d_execute_buffer *buffer,
                     DWORD op = ci->dwFlags & D3DPROCESSVERTICES_OPMASK;
                     /* D3DVERTEX, D3DLVERTEX and D3DTLVERTEX all have a size of 32 bytes. */
                     const D3DVERTEX *src = (const D3DVERTEX *)((char *)buffer->desc.lpData + vs) + ci->wStart;
+                    unsigned int vertex_pos = buffer->src_vertex_pos;
 
                     TRACE("  start %u, dest %u, count %u, flags %#x.\n",
                             ci->wStart, ci->wDest, ci->dwCount, ci->dwFlags);
@@ -287,17 +288,20 @@ HRESULT d3d_execute_buffer_execute(struct d3d_execute_buffer *buffer,
                     {
                         case D3DPROCESSVERTICES_TRANSFORMLIGHT:
                         case D3DPROCESSVERTICES_TRANSFORM:
-                            box.left = 0;
-                            box.right = ci->dwCount * sizeof(*src);
+                            if (buffer->vertex_size - ci->dwCount < vertex_pos)
+                                vertex_pos = 0;
+
+                            box.left = vertex_pos * sizeof(*src);
+                            box.right = (vertex_pos + ci->dwCount) * sizeof(*src);
                             hr = wined3d_resource_map(wined3d_buffer_get_resource(buffer->src_vertex_buffer), 0,
-                                    &map_desc, &box, WINED3D_MAP_DISCARD);
+                                    &map_desc, &box, vertex_pos ? WINED3D_MAP_NOOVERWRITE : WINED3D_MAP_DISCARD);
                             if (FAILED(hr))
                                 return hr;
                             memcpy(map_desc.data, src, ci->dwCount * sizeof(*src));
                             wined3d_resource_unmap(wined3d_buffer_get_resource(buffer->dst_vertex_buffer), 0);
 
                             wined3d_device_set_stream_source(device->wined3d_device, 0,
-                                    buffer->src_vertex_buffer, 0, sizeof(*src));
+                                    buffer->src_vertex_buffer, box.left, sizeof(*src));
                             if (op == D3DPROCESSVERTICES_TRANSFORMLIGHT)
                             {
                                 wined3d_device_set_vertex_declaration(device->wined3d_device,
@@ -315,6 +319,8 @@ HRESULT d3d_execute_buffer_execute(struct d3d_execute_buffer *buffer,
 
                             wined3d_device_process_vertices(device->wined3d_device, 0, ci->wDest,
                                     ci->dwCount, buffer->dst_vertex_buffer, NULL, 0, D3DFVF_TLVERTEX);
+
+                            buffer->src_vertex_pos = vertex_pos + ci->dwCount;
                             break;
 
                         case D3DPROCESSVERTICES_COPY:
@@ -601,6 +607,7 @@ static HRESULT WINAPI d3d_execute_buffer_SetExecuteData(IDirect3DExecuteBuffer *
         buffer->src_vertex_buffer = src_buffer;
         buffer->dst_vertex_buffer = dst_buffer;
         buffer->vertex_size = new_size;
+        buffer->src_vertex_pos = 0;
     }
 
     if (TRACE_ON(ddraw))
-- 
2.7.3




More information about the wine-patches mailing list