mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-27 20:44:28 +00:00
Use 2 mutexes insteed of copy
This commit is contained in:
parent
442a7ee509
commit
bee2ad3721
@ -469,13 +469,11 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) {
|
||||
// First, import any queued host memory, then sync every mapped
|
||||
// region that is cached on GPU memory.
|
||||
buffer_cache.CoverQueuedRegions();
|
||||
// I feel bad for doing this copy
|
||||
auto mapped_ranges_copy = ([this]() {
|
||||
std::shared_lock lock(mapped_ranges_mutex);
|
||||
return mapped_ranges;
|
||||
})();
|
||||
for (const auto& range : mapped_ranges_copy) {
|
||||
buffer_cache.SynchronizeRange(range.lower(), range.upper() - range.lower());
|
||||
{
|
||||
std::shared_lock lock{mapped_ranges_mutex};
|
||||
for (const auto& range : mapped_ranges) {
|
||||
buffer_cache.SynchronizeRange(range.lower(), range.upper() - range.lower());
|
||||
}
|
||||
}
|
||||
buffer_cache.ResetFaultReadbackBuffer();
|
||||
}
|
||||
@ -960,13 +958,13 @@ bool Rasterizer::IsMapped(VAddr addr, u64 size) {
|
||||
}
|
||||
const auto range = decltype(mapped_ranges)::interval_type::right_open(addr, addr + size);
|
||||
|
||||
std::shared_lock lock{mapped_ranges_mutex};
|
||||
std::shared_lock lock{mapped_ranges_ismapped_mutex};
|
||||
return boost::icl::contains(mapped_ranges, range);
|
||||
}
|
||||
|
||||
void Rasterizer::MapMemory(VAddr addr, u64 size) {
|
||||
{
|
||||
std::scoped_lock lock{mapped_ranges_mutex};
|
||||
std::scoped_lock lock{mapped_ranges_mutex, mapped_ranges_ismapped_mutex};
|
||||
mapped_ranges += decltype(mapped_ranges)::interval_type::right_open(addr, addr + size);
|
||||
}
|
||||
page_manager.OnGpuMap(addr, size);
|
||||
@ -978,7 +976,7 @@ void Rasterizer::UnmapMemory(VAddr addr, u64 size) {
|
||||
texture_cache.UnmapMemory(addr, size);
|
||||
page_manager.OnGpuUnmap(addr, size);
|
||||
{
|
||||
std::scoped_lock lock{mapped_ranges_mutex};
|
||||
std::scoped_lock lock{mapped_ranges_mutex, mapped_ranges_ismapped_mutex};
|
||||
mapped_ranges -= decltype(mapped_ranges)::interval_type::right_open(addr, addr + size);
|
||||
}
|
||||
}
|
||||
|
@ -115,7 +115,9 @@ private:
|
||||
AmdGpu::Liverpool* liverpool;
|
||||
Core::MemoryManager* memory;
|
||||
boost::icl::interval_set<VAddr> mapped_ranges;
|
||||
// use 2 mutexes to avoid undefined behavior when using shared lock
|
||||
std::shared_mutex mapped_ranges_mutex;
|
||||
std::shared_mutex mapped_ranges_ismapped_mutex;
|
||||
PipelineCache pipeline_cache;
|
||||
|
||||
boost::container::static_vector<
|
||||
|
Loading…
Reference in New Issue
Block a user