quick test to add pointer range management on buffer binding from indirect draws

This commit is contained in:
CamilleLaVey
2026-09-29 23:17:06 -04:00
parent 08917afe0e
commit bdc890f647
+8 -5
View File
@@ -123,8 +123,6 @@ void BufferCache<P>::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<P>::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<P>::UpdateDrawIndirect() {
}
binding = Binding{
.device_addr = *device_addr,
.gpu_addr = gpu_addr,
.size = static_cast<u32>(size),
.buffer_id = FindBuffer(*device_addr, static_cast<u32>(size), false),
};
@@ -1517,7 +1517,7 @@ void BufferCache<P>::UpdatePointerRanges() {
template <class P>
void BufferCache<P>::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<P>::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 <class P>