CircularBuffer remove Discard functionality and allow rotation
This commit is contained in:
parent
50f72b4e42
commit
f9a634ad25
|
@ -139,7 +139,6 @@ CircularBuffer::Allocation* CircularBuffer::Acquire(
|
||||||
assert(read_head_ == write_head_);
|
assert(read_head_ == write_head_);
|
||||||
assert(capacity_ > aligned_length);
|
assert(capacity_ > aligned_length);
|
||||||
|
|
||||||
read_head_ = 0;
|
|
||||||
write_head_ = length;
|
write_head_ = length;
|
||||||
|
|
||||||
auto alloc = new Allocation();
|
auto alloc = new Allocation();
|
||||||
|
@ -200,19 +199,6 @@ CircularBuffer::Allocation* CircularBuffer::Acquire(
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CircularBuffer::Discard(Allocation* allocation) {
|
|
||||||
// TODO: Revert write_head_ (only if this is the last alloc though)
|
|
||||||
// Or maybe just disallow discards.
|
|
||||||
for (auto it = allocations_.begin(); it != allocations_.end(); ++it) {
|
|
||||||
if (*it == allocation) {
|
|
||||||
allocations_.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete allocation;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CircularBuffer::Flush(Allocation* allocation) {
|
void CircularBuffer::Flush(Allocation* allocation) {
|
||||||
VkMappedMemoryRange range;
|
VkMappedMemoryRange range;
|
||||||
range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
|
range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
|
||||||
|
@ -239,7 +225,13 @@ void CircularBuffer::Scavenge() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
read_head_ = (read_head_ + (*it)->aligned_length) % capacity_;
|
if (capacity_ - read_head_ < (*it)->aligned_length) {
|
||||||
|
// This allocation is stored at the beginning of the buffer.
|
||||||
|
read_head_ = (*it)->aligned_length;
|
||||||
|
} else {
|
||||||
|
read_head_ += (*it)->aligned_length;
|
||||||
|
}
|
||||||
|
|
||||||
delete *it;
|
delete *it;
|
||||||
it = allocations_.erase(it);
|
it = allocations_.erase(it);
|
||||||
}
|
}
|
||||||
|
@ -247,9 +239,6 @@ void CircularBuffer::Scavenge() {
|
||||||
if (allocations_.empty()) {
|
if (allocations_.empty()) {
|
||||||
// Reset R/W heads.
|
// Reset R/W heads.
|
||||||
read_head_ = write_head_ = 0;
|
read_head_ = write_head_ = 0;
|
||||||
} else {
|
|
||||||
// FIXME: Haven't verified this works correctly when actually rotating :P
|
|
||||||
assert_always();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,8 +52,10 @@ class CircularBuffer {
|
||||||
uint8_t* host_base() const { return host_base_; }
|
uint8_t* host_base() const { return host_base_; }
|
||||||
|
|
||||||
bool CanAcquire(VkDeviceSize length);
|
bool CanAcquire(VkDeviceSize length);
|
||||||
|
|
||||||
|
// Acquires space to hold memory. This allocation is only freed when the fence
|
||||||
|
// reaches the signaled state.
|
||||||
Allocation* Acquire(VkDeviceSize length, std::shared_ptr<Fence> fence);
|
Allocation* Acquire(VkDeviceSize length, std::shared_ptr<Fence> fence);
|
||||||
void Discard(Allocation* allocation);
|
|
||||||
void Flush(Allocation* allocation);
|
void Flush(Allocation* allocation);
|
||||||
|
|
||||||
// Clears all allocations, regardless of whether they've been consumed or not.
|
// Clears all allocations, regardless of whether they've been consumed or not.
|
||||||
|
|
Loading…
Reference in New Issue