mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-28 04:54:30 +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
|
// First, import any queued host memory, then sync every mapped
|
||||||
// region that is cached on GPU memory.
|
// region that is cached on GPU memory.
|
||||||
buffer_cache.CoverQueuedRegions();
|
buffer_cache.CoverQueuedRegions();
|
||||||
// I feel bad for doing this copy
|
{
|
||||||
auto mapped_ranges_copy = ([this]() {
|
std::shared_lock lock{mapped_ranges_mutex};
|
||||||
std::shared_lock lock(mapped_ranges_mutex);
|
for (const auto& range : mapped_ranges) {
|
||||||
return mapped_ranges;
|
buffer_cache.SynchronizeRange(range.lower(), range.upper() - range.lower());
|
||||||
})();
|
}
|
||||||
for (const auto& range : mapped_ranges_copy) {
|
|
||||||
buffer_cache.SynchronizeRange(range.lower(), range.upper() - range.lower());
|
|
||||||
}
|
}
|
||||||
buffer_cache.ResetFaultReadbackBuffer();
|
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);
|
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);
|
return boost::icl::contains(mapped_ranges, range);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rasterizer::MapMemory(VAddr addr, u64 size) {
|
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);
|
mapped_ranges += decltype(mapped_ranges)::interval_type::right_open(addr, addr + size);
|
||||||
}
|
}
|
||||||
page_manager.OnGpuMap(addr, size);
|
page_manager.OnGpuMap(addr, size);
|
||||||
@ -978,7 +976,7 @@ void Rasterizer::UnmapMemory(VAddr addr, u64 size) {
|
|||||||
texture_cache.UnmapMemory(addr, size);
|
texture_cache.UnmapMemory(addr, size);
|
||||||
page_manager.OnGpuUnmap(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);
|
mapped_ranges -= decltype(mapped_ranges)::interval_type::right_open(addr, addr + size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,9 @@ private:
|
|||||||
AmdGpu::Liverpool* liverpool;
|
AmdGpu::Liverpool* liverpool;
|
||||||
Core::MemoryManager* memory;
|
Core::MemoryManager* memory;
|
||||||
boost::icl::interval_set<VAddr> mapped_ranges;
|
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_mutex;
|
||||||
|
std::shared_mutex mapped_ranges_ismapped_mutex;
|
||||||
PipelineCache pipeline_cache;
|
PipelineCache pipeline_cache;
|
||||||
|
|
||||||
boost::container::static_vector<
|
boost::container::static_vector<
|
||||||
|
Loading…
Reference in New Issue
Block a user