mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-27 01:38:05 +00:00
[vulkan] Added tracker for reused uploads
This commit is contained in:
@@ -84,7 +84,7 @@ vk::Buffer CreateBuffer(const Device& device, const MemoryAllocator& memory_allo
|
|||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
Buffer::Buffer(BufferCacheRuntime& runtime, VideoCommon::NullBufferParams null_params)
|
Buffer::Buffer(BufferCacheRuntime& runtime, VideoCommon::NullBufferParams null_params)
|
||||||
: VideoCommon::BufferBase(null_params), tracker{4096} {
|
: VideoCommon::BufferBase(null_params), scheduler{&runtime.scheduler}, tracker{4096} {
|
||||||
if (runtime.device.HasNullDescriptor()) {
|
if (runtime.device.HasNullDescriptor()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -95,6 +95,7 @@ Buffer::Buffer(BufferCacheRuntime& runtime, VideoCommon::NullBufferParams null_p
|
|||||||
|
|
||||||
Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_)
|
Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_)
|
||||||
: VideoCommon::BufferBase(cpu_addr_, size_bytes_), device{&runtime.device},
|
: VideoCommon::BufferBase(cpu_addr_, size_bytes_), device{&runtime.device},
|
||||||
|
scheduler{&runtime.scheduler},
|
||||||
buffer{CreateBuffer(*device, runtime.memory_allocator, SizeBytes())}, tracker{SizeBytes()} {
|
buffer{CreateBuffer(*device, runtime.memory_allocator, SizeBytes())}, tracker{SizeBytes()} {
|
||||||
if (runtime.device.HasDebuggingToolAttached()) {
|
if (runtime.device.HasDebuggingToolAttached()) {
|
||||||
buffer.SetObjectNameEXT(fmt::format("Buffer 0x{:x}", CpuAddr()).c_str());
|
buffer.SetObjectNameEXT(fmt::format("Buffer 0x{:x}", CpuAddr()).c_str());
|
||||||
@@ -384,7 +385,9 @@ u32 BufferCacheRuntime::GetStorageBufferAlignment() const {
|
|||||||
|
|
||||||
void BufferCacheRuntime::TickFrame(Common::SlotVector<Buffer>& slot_buffers) noexcept {
|
void BufferCacheRuntime::TickFrame(Common::SlotVector<Buffer>& slot_buffers) noexcept {
|
||||||
for (auto it = slot_buffers.begin(); it != slot_buffers.end(); it++) {
|
for (auto it = slot_buffers.begin(); it != slot_buffers.end(); it++) {
|
||||||
it->ResetUsageTracking();
|
if (scheduler.IsFree(it->LastUsageTick())) {
|
||||||
|
it->ResetUsageTracking();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,12 +45,17 @@ public:
|
|||||||
|
|
||||||
void MarkUsage(u64 offset, u64 size) noexcept {
|
void MarkUsage(u64 offset, u64 size) noexcept {
|
||||||
tracker.Track(offset, size);
|
tracker.Track(offset, size);
|
||||||
|
last_usage_tick = scheduler->CurrentTick();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetUsageTracking() noexcept {
|
void ResetUsageTracking() noexcept {
|
||||||
tracker.Reset();
|
tracker.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] u64 LastUsageTick() const noexcept {
|
||||||
|
return last_usage_tick;
|
||||||
|
}
|
||||||
|
|
||||||
operator VkBuffer() const noexcept {
|
operator VkBuffer() const noexcept {
|
||||||
return *buffer;
|
return *buffer;
|
||||||
}
|
}
|
||||||
@@ -64,9 +69,11 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
const Device* device{};
|
const Device* device{};
|
||||||
|
Scheduler* scheduler{};
|
||||||
vk::Buffer buffer;
|
vk::Buffer buffer;
|
||||||
std::vector<BufferView> views;
|
std::vector<BufferView> views;
|
||||||
VideoCommon::UsageTracker tracker;
|
VideoCommon::UsageTracker tracker;
|
||||||
|
u64 last_usage_tick{};
|
||||||
bool is_null{};
|
bool is_null{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user