From bdc890f647a27e50c21a2a9710e0d570c026ba52 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Tue, 29 Sep 2026 23:17:06 -0400 Subject: [PATCH] quick test to add pointer range management on buffer binding from indirect draws --- src/video_core/buffer_cache/buffer_cache.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 5ab5a6f4f3..39b79ed97e 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -123,8 +123,6 @@ void BufferCache

::TickFrame() { if (total_used_memory >= minimum_memory || heap_pressure) { RunGarbageCollector(); } - std::erase_if(pointer_ranges, - [this](const PointerRange& range) { return range.frame + 2 < frame_tick; }); ++frame_tick; delayed_destruction_ring.Tick(); @@ -958,6 +956,7 @@ void BufferCache

::BindHostDrawIndirectBuffers() { Buffer& buffer = slot_buffers[binding.buffer_id]; TouchBuffer(buffer, binding.buffer_id); SynchronizeBuffer(buffer, binding.device_addr, binding.size); + RecordPointerRange(binding); }; if (current_draw_indirect->include_count) { bind_buffer(channel_state->count_buffer_binding); @@ -1459,6 +1458,7 @@ void BufferCache

::UpdateDrawIndirect() { } binding = Binding{ .device_addr = *device_addr, + .gpu_addr = gpu_addr, .size = static_cast(size), .buffer_id = FindBuffer(*device_addr, static_cast(size), false), }; @@ -1517,7 +1517,7 @@ void BufferCache

::UpdatePointerRanges() { template void BufferCache

::RecordPointerRange(const Binding& binding) { - if (!record_pointer_ranges) { + if (!record_pointer_ranges || binding.size == 0) { return; } const auto it = std::ranges::find(pointer_ranges, binding.gpu_addr, &PointerRange::gpu_addr); @@ -1527,10 +1527,13 @@ void BufferCache

::RecordPointerRange(const Binding& binding) { it->frame = frame_tick; return; } + const PointerRange range{binding.gpu_addr, binding.device_addr, binding.size, frame_tick, + NULL_BUFFER_ID}; if (pointer_ranges.size() < MAX_POINTER_RANGES) { - pointer_ranges.push_back({binding.gpu_addr, binding.device_addr, binding.size, frame_tick, - NULL_BUFFER_ID}); + pointer_ranges.push_back(range); + return; } + *std::ranges::min_element(pointer_ranges, {}, &PointerRange::frame) = range; } template