mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
renderer: eliminate extra copy for small streaming buffers
This commit is contained in:
+15
-3
@@ -612,9 +612,21 @@ BufferBinding BufferCache::ObtainBuffer(CommandBuffer& command, uint64_t vaddr,
|
|||||||
if (is_read && !is_written && size <= CACHING_PAGE_SIZE &&
|
if (is_read && !is_written && size <= CACHING_PAGE_SIZE &&
|
||||||
!m_memory_tracker.IsRegionGpuModified(vaddr, size) &&
|
!m_memory_tracker.IsRegionGpuModified(vaddr, size) &&
|
||||||
m_memory_tracker.IsRegionCpuModified(vaddr, size)) {
|
m_memory_tracker.IsRegionCpuModified(vaddr, size)) {
|
||||||
std::vector<uint8_t> data(size);
|
const auto alignment = std::max<uint64_t>(
|
||||||
if (Libs::LibKernel::Memory::TryReadBacking(vaddr, data.data(), size)) {
|
m_graphics.physical_device_properties.limits.minUniformBufferOffsetAlignment, 1);
|
||||||
return UploadTransient(data.data(), size, 16);
|
if (auto [mapped, offset] = m_stream_buffer.Map(size, alignment, false);
|
||||||
|
mapped != nullptr) {
|
||||||
|
if (Libs::LibKernel::Memory::TryReadBacking(vaddr, mapped, size)) {
|
||||||
|
m_stream_buffer.Commit();
|
||||||
|
return {{}, m_stream_buffer.Handle(), offset};
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
auto owner = std::make_shared<Buffer>(m_graphics, m_scheduler, MemoryUsage::Upload, 0,
|
||||||
|
AllFlags, size);
|
||||||
|
if (Libs::LibKernel::Memory::TryReadBacking(vaddr, owner->Mapped().data(), size)) {
|
||||||
|
owner->Flush(0, size);
|
||||||
|
return {owner, owner->Handle(), 0};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user