mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2026-06-04 06:55:03 -06:00
Fix for scheduler.wait hack removal
This commit is contained in:
parent
d74e3d6d54
commit
a681ade446
@ -89,13 +89,12 @@ void BufferCache::InvalidateMemory(VAddr device_addr, u64 size, bool download) {
|
|||||||
void BufferCache::ReadMemory(VAddr device_addr, u64 size, bool is_write) {
|
void BufferCache::ReadMemory(VAddr device_addr, u64 size, bool is_write) {
|
||||||
liverpool->SendCommand<true>([this, device_addr, size, is_write] {
|
liverpool->SendCommand<true>([this, device_addr, size, is_write] {
|
||||||
Buffer& buffer = slot_buffers[FindBuffer(device_addr, size)];
|
Buffer& buffer = slot_buffers[FindBuffer(device_addr, size)];
|
||||||
if (DownloadBufferMemory(buffer, device_addr, size, is_write)) {
|
DownloadBufferMemory<false>(buffer, device_addr, size, is_write);
|
||||||
scheduler.Finish();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BufferCache::DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 size, bool is_write) {
|
template <bool async>
|
||||||
|
void BufferCache::DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 size, bool is_write) {
|
||||||
boost::container::small_vector<vk::BufferCopy, 1> copies;
|
boost::container::small_vector<vk::BufferCopy, 1> copies;
|
||||||
u64 total_size_bytes = 0;
|
u64 total_size_bytes = 0;
|
||||||
memory_tracker->ForEachDownloadRange<false>(
|
memory_tracker->ForEachDownloadRange<false>(
|
||||||
@ -118,7 +117,7 @@ bool BufferCache::DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 si
|
|||||||
gpu_modified_ranges.Subtract(device_addr_out, range_size);
|
gpu_modified_ranges.Subtract(device_addr_out, range_size);
|
||||||
});
|
});
|
||||||
if (total_size_bytes == 0) {
|
if (total_size_bytes == 0) {
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
const auto [download, offset] = download_buffer.Map(total_size_bytes);
|
const auto [download, offset] = download_buffer.Map(total_size_bytes);
|
||||||
for (auto& copy : copies) {
|
for (auto& copy : copies) {
|
||||||
@ -129,8 +128,9 @@ bool BufferCache::DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 si
|
|||||||
scheduler.EndRendering();
|
scheduler.EndRendering();
|
||||||
const auto cmdbuf = scheduler.CommandBuffer();
|
const auto cmdbuf = scheduler.CommandBuffer();
|
||||||
cmdbuf.copyBuffer(buffer.Handle(), download_buffer.Handle(), copies);
|
cmdbuf.copyBuffer(buffer.Handle(), download_buffer.Handle(), copies);
|
||||||
scheduler.DeferOperation([this, buf_addr = buffer.CpuAddr(), copies = std::move(copies),
|
|
||||||
download, offset, device_addr, size, is_write]() {
|
const auto write_func = [this, buf_addr = buffer.CpuAddr(), copies = std::move(copies),
|
||||||
|
download, offset, device_addr, size, is_write]() {
|
||||||
auto* memory = Core::Memory::Instance();
|
auto* memory = Core::Memory::Instance();
|
||||||
for (const auto& copy : copies) {
|
for (const auto& copy : copies) {
|
||||||
const VAddr copy_device_addr = buf_addr + copy.srcOffset;
|
const VAddr copy_device_addr = buf_addr + copy.srcOffset;
|
||||||
@ -142,9 +142,16 @@ bool BufferCache::DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 si
|
|||||||
if (is_write) {
|
if (is_write) {
|
||||||
memory_tracker->MarkRegionAsCpuModified(device_addr, size);
|
memory_tracker->MarkRegionAsCpuModified(device_addr, size);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
return true;
|
if constexpr (async) {
|
||||||
|
scheduler.DeferOperation(write_func);
|
||||||
|
} else {
|
||||||
|
scheduler.Finish();
|
||||||
|
write_func();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BufferCache::ReadEdgeImagePages(const Image& image) {
|
void BufferCache::ReadEdgeImagePages(const Image& image) {
|
||||||
@ -964,7 +971,7 @@ void BufferCache::RunGarbageCollector() {
|
|||||||
}
|
}
|
||||||
--max_deletions;
|
--max_deletions;
|
||||||
Buffer& buffer = slot_buffers[buffer_id];
|
Buffer& buffer = slot_buffers[buffer_id];
|
||||||
DownloadBufferMemory(buffer, buffer.CpuAddr(), buffer.SizeBytes(), true);
|
DownloadBufferMemory<true>(buffer, buffer.CpuAddr(), buffer.SizeBytes(), true);
|
||||||
DeleteBuffer(buffer_id);
|
DeleteBuffer(buffer_id);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -186,7 +186,8 @@ private:
|
|||||||
return !buffer_id || slot_buffers[buffer_id].is_deleted;
|
return !buffer_id || slot_buffers[buffer_id].is_deleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 size, bool is_write);
|
template <bool async>
|
||||||
|
void DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 size, bool is_write);
|
||||||
|
|
||||||
[[nodiscard]] OverlapResult ResolveOverlaps(VAddr device_addr, u32 wanted_size);
|
[[nodiscard]] OverlapResult ResolveOverlaps(VAddr device_addr, u32 wanted_size);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user