mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 13:56:59 +01:00
renderer: align buffer synchronization flow
This commit is contained in:
+21
-14
@@ -454,6 +454,24 @@ BufferCache::CachedBuffer& BufferCache::GetOrCreateBuffer(CommandBuffer& command
|
|||||||
return *m_buffers.emplace(cached->vaddr, std::move(cached)).first->second;
|
return *m_buffers.emplace(cached->vaddr, std::move(cached)).first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BufferCache::SynchronizeBuffer(CommandBuffer& command, Buffer& buffer, uint64_t vaddr,
|
||||||
|
uint64_t size, bool is_written, bool is_texel_buffer) {
|
||||||
|
std::vector<std::pair<uint64_t, uint64_t>> uploads;
|
||||||
|
m_memory_tracker.ForEachUploadRange(
|
||||||
|
vaddr, size, is_written,
|
||||||
|
[&](uint64_t address, uint64_t bytes) noexcept { uploads.emplace_back(address, bytes); },
|
||||||
|
[&]() noexcept {
|
||||||
|
for (const auto& [address, bytes]: uploads) {
|
||||||
|
Upload(command, buffer, buffer.Offset(address),
|
||||||
|
reinterpret_cast<const void*>(address), bytes);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (is_texel_buffer && !is_written) {
|
||||||
|
return SynchronizeBufferFromImage(buffer, vaddr, size);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
BufferBinding BufferCache::ObtainBuffer(CommandBuffer& command, uint64_t vaddr, uint64_t size,
|
BufferBinding BufferCache::ObtainBuffer(CommandBuffer& command, uint64_t vaddr, uint64_t size,
|
||||||
bool is_written, bool is_read, bool is_formatted) {
|
bool is_written, bool is_read, bool is_formatted) {
|
||||||
if (command.IsInvalid() || command.IsExecute()) {
|
if (command.IsInvalid() || command.IsExecute()) {
|
||||||
@@ -485,25 +503,14 @@ BufferBinding BufferCache::ObtainBuffer(CommandBuffer& command, uint64_t vaddr,
|
|||||||
(void)m_texture_cache.InvalidateMemoryFromGPU(vaddr, size, true);
|
(void)m_texture_cache.InvalidateMemoryFromGPU(vaddr, size, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& cached = GetOrCreateBuffer(command, vaddr, size);
|
auto& cached = GetOrCreateBuffer(command, vaddr, size);
|
||||||
std::vector<std::pair<uint64_t, uint64_t>> uploads;
|
(void)SynchronizeBuffer(command, *cached.buffer, vaddr, size, is_written,
|
||||||
m_memory_tracker.ForEachUploadRange(
|
is_formatted && is_read);
|
||||||
vaddr, size, is_written,
|
|
||||||
[&](uint64_t address, uint64_t bytes) noexcept { uploads.emplace_back(address, bytes); },
|
|
||||||
[&]() noexcept {
|
|
||||||
for (const auto& [address, bytes]: uploads) {
|
|
||||||
Upload(command, *cached.buffer, cached.buffer->Offset(address),
|
|
||||||
reinterpret_cast<const void*>(address), bytes);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (is_written) {
|
if (is_written) {
|
||||||
m_gpu_modified_ranges.Add(vaddr, size);
|
m_gpu_modified_ranges.Add(vaddr, size);
|
||||||
}
|
}
|
||||||
auto owner = cached.buffer;
|
auto owner = cached.buffer;
|
||||||
uint64_t offset = cached.buffer->Offset(vaddr);
|
uint64_t offset = cached.buffer->Offset(vaddr);
|
||||||
if (is_formatted && is_read && !is_written) {
|
|
||||||
(void)SynchronizeBufferFromImage(*owner, vaddr, size);
|
|
||||||
}
|
|
||||||
return {owner, owner->Handle(), offset};
|
return {owner, owner->Handle(), offset};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,8 @@ private:
|
|||||||
const void* source, uint64_t size);
|
const void* source, uint64_t size);
|
||||||
[[nodiscard]] CachedBuffer& GetOrCreateBuffer(CommandBuffer& command, uint64_t vaddr,
|
[[nodiscard]] CachedBuffer& GetOrCreateBuffer(CommandBuffer& command, uint64_t vaddr,
|
||||||
uint64_t size);
|
uint64_t size);
|
||||||
|
[[nodiscard]] bool SynchronizeBuffer(CommandBuffer& command, Buffer& buffer, uint64_t vaddr,
|
||||||
|
uint64_t size, bool is_written, bool is_texel_buffer);
|
||||||
[[nodiscard]] bool SynchronizeBufferFromImage(Buffer& buffer, uint64_t vaddr, uint64_t size);
|
[[nodiscard]] bool SynchronizeBufferFromImage(Buffer& buffer, uint64_t vaddr, uint64_t size);
|
||||||
[[nodiscard]] std::vector<DownloadRange> RecordDownloads(std::span<const DownloadCopy> copies);
|
[[nodiscard]] std::vector<DownloadRange> RecordDownloads(std::span<const DownloadCopy> copies);
|
||||||
void PublishDownloads(std::span<const DownloadRange> downloads);
|
void PublishDownloads(std::span<const DownloadRange> downloads);
|
||||||
|
|||||||
Reference in New Issue
Block a user