aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPavelBARABANOV <pavelbarabanov94@gmail.com>2026-10-26 17:25:24 +0100
committercrueter <crueter@eden-emu.dev>2026-10-26 17:25:24 +0100
commita3debcf731143aabd6eefee406d511551d3c9a73 (patch)
tree4e00a265498573d9c7cafc7a70ff07521c3ff185 /src
parent5239cbe2a78d6533e3541a71c4d3c723818dcb6e (diff)
[buffer_cashe] use old logic when Optimized Vertex Buffers is disabled (#4528)
- [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Fixes vertex explosions on Turnip. Fixes Celeste on QCOM. Fixes new issues discovered after #3579 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4528 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev>
Diffstat (limited to 'src')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h82
1 files changed, 55 insertions, 27 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 53addb5dec..f30c85911f 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -1738,36 +1738,64 @@ void BufferCache<P>::TouchBuffer(Buffer& buffer, BufferId buffer_id) noexcept {
template <class P>
bool BufferCache<P>::SynchronizeBuffer(Buffer& buffer, DAddr device_addr, u32 size) {
- upload_copies.clear();
- u64 total_size_bytes = 0;
- u64 largest_copy = 0;
- const DAddr buffer_start = buffer.cpu_addr_cached;
- const auto add_upload = [&](DAddr start, DAddr end) {
- if (start == end) return;
- const u64 range_size = end - start;
- upload_copies.push_back(BufferCopy{
- .src_offset = total_size_bytes,
- .dst_offset = start - buffer_start,
- .size = range_size,
+#ifdef __ANDROID__
+ const bool use_optimized_vertex_buffers = Settings::values.use_optimized_vertex_buffers.GetValue();
+#else
+ constexpr bool use_optimized_vertex_buffers = true;
+#endif
+
+ if (use_optimized_vertex_buffers) {
+ upload_copies.clear();
+ u64 total_size_bytes = 0;
+ u64 largest_copy = 0;
+ const DAddr buffer_start = buffer.cpu_addr_cached;
+ const auto add_upload = [&](DAddr start, DAddr end) {
+ if (start == end) return;
+ const u64 range_size = end - start;
+ upload_copies.push_back(BufferCopy{
+ .src_offset = total_size_bytes,
+ .dst_offset = start - buffer_start,
+ .size = range_size,
+ });
+ total_size_bytes += range_size;
+ largest_copy = (std::max)(largest_copy, range_size);
+ };
+ memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) {
+ DAddr upload_start = device_addr_out;
+ gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, [&](DAddr gpu_start, DAddr gpu_end) {
+ add_upload(upload_start, gpu_start);
+ upload_start = gpu_end;
+ });
+ add_upload(upload_start, device_addr_out + range_size);
});
- total_size_bytes += range_size;
- largest_copy = (std::max)(largest_copy, range_size);
- };
- memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) {
- DAddr upload_start = device_addr_out;
- gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, [&](DAddr gpu_start, DAddr gpu_end) {
- add_upload(upload_start, gpu_start);
- upload_start = gpu_end;
+ if (total_size_bytes == 0) {
+ return true;
+ }
+ const std::span<BufferCopy> copies_span(upload_copies.data(), upload_copies.size());
+ UploadMemory(buffer, total_size_bytes, largest_copy, copies_span);
+ any_buffer_uploaded = true;
+ return false;
+ } else {
+ boost::container::small_vector<BufferCopy, 4> copies;
+ u64 total_size_bytes = 0;
+ u64 largest_copy = 0;
+ DAddr buffer_start = buffer.CpuAddr();
+ memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) {
+ copies.push_back(BufferCopy{
+ .src_offset = total_size_bytes,
+ .dst_offset = device_addr_out - buffer_start,
+ .size = range_size,
+ });
+ total_size_bytes += range_size;
+ largest_copy = (std::max)(largest_copy, range_size);
});
- add_upload(upload_start, device_addr_out + range_size);
- });
- if (total_size_bytes == 0) {
- return true;
+ if (total_size_bytes == 0) {
+ return true;
+ }
+ const std::span<BufferCopy> copies_span(copies.data(), copies.size());
+ UploadMemory(buffer, total_size_bytes, largest_copy, copies_span);
+ return false;
}
- const std::span<BufferCopy> copies_span(upload_copies.data(), upload_copies.size());
- UploadMemory(buffer, total_size_bytes, largest_copy, copies_span);
- any_buffer_uploaded = true;
- return false;
}
template <class P>