summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-12-31 02:58:05 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2021-01-15 20:19:36 +0100
commite996f1ad09dcfe1e9eaa0273b710560a44d9a1da (patch)
tree66efbbace2b1bdcf287edb48b9b2549ef7cbc3bb /src/video_core/renderer_vulkan/vk_staging_buffer_pool.h
parentMerge pull request #5355 from lioncash/timer (diff)
downloadyuzu-e996f1ad09dcfe1e9eaa0273b710560a44d9a1da.tar
yuzu-e996f1ad09dcfe1e9eaa0273b710560a44d9a1da.tar.gz
yuzu-e996f1ad09dcfe1e9eaa0273b710560a44d9a1da.tar.bz2
yuzu-e996f1ad09dcfe1e9eaa0273b710560a44d9a1da.tar.lz
yuzu-e996f1ad09dcfe1e9eaa0273b710560a44d9a1da.tar.xz
yuzu-e996f1ad09dcfe1e9eaa0273b710560a44d9a1da.tar.zst
yuzu-e996f1ad09dcfe1e9eaa0273b710560a44d9a1da.zip
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_staging_buffer_pool.h')
-rw-r--r--src/video_core/renderer_vulkan/vk_staging_buffer_pool.h49
1 files changed, 29 insertions, 20 deletions
diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h
index 90dadcbbe..5234a95fa 100644
--- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h
+++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h
@@ -17,46 +17,54 @@ namespace Vulkan {
class Device;
class VKScheduler;
-struct VKBuffer final {
- vk::Buffer handle;
- VKMemoryCommit commit;
+struct StagingBufferRef {
+ VkBuffer buffer;
+ std::span<u8> mapped_span;
};
-class VKStagingBufferPool final {
+class StagingBufferPool {
public:
- explicit VKStagingBufferPool(const Device& device, VKMemoryManager& memory_manager,
- VKScheduler& scheduler);
- ~VKStagingBufferPool();
+ explicit StagingBufferPool(const Device& device, VKMemoryManager& memory_manager,
+ VKScheduler& scheduler);
+ ~StagingBufferPool();
- VKBuffer& GetUnusedBuffer(std::size_t size, bool host_visible);
+ StagingBufferRef Request(size_t size, bool host_visible);
void TickFrame();
private:
- struct StagingBuffer final {
- explicit StagingBuffer(std::unique_ptr<VKBuffer> buffer);
-
- std::unique_ptr<VKBuffer> buffer;
+ struct StagingBuffer {
+ vk::Buffer buffer;
+ MemoryCommit commit;
+ std::span<u8> mapped_span;
u64 tick = 0;
+
+ StagingBufferRef Ref() const noexcept {
+ return {
+ .buffer = *buffer,
+ .mapped_span = mapped_span,
+ };
+ }
};
- struct StagingBuffers final {
+ struct StagingBuffers {
std::vector<StagingBuffer> entries;
- std::size_t delete_index = 0;
+ size_t delete_index = 0;
+ size_t iterate_index = 0;
};
- static constexpr std::size_t NumLevels = sizeof(std::size_t) * CHAR_BIT;
- using StagingBuffersCache = std::array<StagingBuffers, NumLevels>;
+ static constexpr size_t NUM_LEVELS = sizeof(size_t) * CHAR_BIT;
+ using StagingBuffersCache = std::array<StagingBuffers, NUM_LEVELS>;
- VKBuffer* TryGetReservedBuffer(std::size_t size, bool host_visible);
+ std::optional<StagingBufferRef> TryGetReservedBuffer(size_t size, bool host_visible);
- VKBuffer& CreateStagingBuffer(std::size_t size, bool host_visible);
+ StagingBufferRef CreateStagingBuffer(size_t size, bool host_visible);
StagingBuffersCache& GetCache(bool host_visible);
void ReleaseCache(bool host_visible);
- u64 ReleaseLevel(StagingBuffersCache& cache, std::size_t log2);
+ void ReleaseLevel(StagingBuffersCache& cache, size_t log2);
const Device& device;
VKMemoryManager& memory_manager;
@@ -65,7 +73,8 @@ private:
StagingBuffersCache host_staging_buffers;
StagingBuffersCache device_staging_buffers;
- std::size_t current_delete_level = 0;
+ size_t current_delete_level = 0;
+ u64 buffer_index = 0;
};
} // namespace Vulkan