From e681f5678c3df6d2e1779cb824615517ddae46d7 Mon Sep 17 00:00:00 2001
From: Kelebek1 <eeeedddccc@hotmail.co.uk>
Date: Fri, 16 Jun 2023 22:47:38 +0100
Subject: [PATCH] Synchronize vertex buffer even when it doesn't require
 binding

---
 src/video_core/buffer_cache/buffer_cache.h    |  9 ++++++---
 .../renderer_vulkan/vk_buffer_cache.cpp       | 20 +++++++++----------
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 9bafd8cc0e..45977d578a 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -719,9 +719,15 @@ void BufferCache<P>::BindHostVertexBuffers() {
     bool any_valid{false};
     auto& flags = maxwell3d->dirty.flags;
     for (u32 index = 0; index < NUM_VERTEX_BUFFERS; ++index) {
+        const Binding& binding = channel_state->vertex_buffers[index];
+        Buffer& buffer = slot_buffers[binding.buffer_id];
+        TouchBuffer(buffer, binding.buffer_id);
+        SynchronizeBuffer(buffer, binding.cpu_addr, binding.size);
         if (!flags[Dirty::VertexBuffer0 + index]) {
             continue;
         }
+        flags[Dirty::VertexBuffer0 + index] = false;
+
         host_bindings.min_index = std::min(host_bindings.min_index, index);
         host_bindings.max_index = std::max(host_bindings.max_index, index);
         any_valid = true;
@@ -735,9 +741,6 @@ void BufferCache<P>::BindHostVertexBuffers() {
             const Binding& binding = channel_state->vertex_buffers[index];
             Buffer& buffer = slot_buffers[binding.buffer_id];
 
-            TouchBuffer(buffer, binding.buffer_id);
-            SynchronizeBuffer(buffer, binding.cpu_addr, binding.size);
-
             const u32 stride = maxwell3d->regs.vertex_streams[index].stride;
             const u32 offset = buffer.Offset(binding.cpu_addr);
 
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
index 8c33722d31..e30fcb1ed9 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -516,15 +516,15 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi
         buffer_handles.push_back(handle);
     }
     if (device.IsExtExtendedDynamicStateSupported()) {
-        scheduler.Record([bindings = bindings,
-                          buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
+        scheduler.Record([bindings = std::move(bindings),
+                          buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
             cmdbuf.BindVertexBuffers2EXT(
                 bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(),
                 bindings.offsets.data(), bindings.sizes.data(), bindings.strides.data());
         });
     } else {
-        scheduler.Record([bindings = bindings,
-                          buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
+        scheduler.Record([bindings = std::move(bindings),
+                          buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
             cmdbuf.BindVertexBuffers(bindings.min_index, bindings.max_index - bindings.min_index,
                                      buffer_handles.data(), bindings.offsets.data());
         });
@@ -561,12 +561,12 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<
     for (u32 index = 0; index < bindings.buffers.size(); ++index) {
         buffer_handles.push_back(bindings.buffers[index]->Handle());
     }
-    scheduler.Record(
-        [bindings = bindings, buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
-            cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles.size()),
-                                                   buffer_handles.data(), bindings.offsets.data(),
-                                                   bindings.sizes.data());
-        });
+    scheduler.Record([bindings = std::move(bindings),
+                      buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
+        cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles.size()),
+                                               buffer_handles.data(), bindings.offsets.data(),
+                                               bindings.sizes.data());
+    });
 }
 
 void BufferCacheRuntime::ReserveNullBuffer() {