Browse Source

[buffer_cache] guards against synchronizebuffer causing unmapped readblock due to rasterizers using writememory for unmap

xbzk/unreal-unsafe-junk-guards
xbzk 2 weeks ago
parent
commit
d266e5b8b3
  1. 9
      src/video_core/buffer_cache/buffer_cache.h
  2. 2
      src/video_core/buffer_cache/buffer_cache_base.h
  3. 2
      src/video_core/renderer_opengl/gl_rasterizer.cpp
  4. 2
      src/video_core/renderer_vulkan/vk_rasterizer.cpp

9
src/video_core/buffer_cache/buffer_cache.h

@ -121,6 +121,15 @@ void BufferCache<P>::WriteMemory(DAddr device_addr, u64 size) {
memory_tracker.MarkRegionAsCpuModified(device_addr, size);
}
template <class P>
void BufferCache<P>::UnmapMemory(DAddr device_addr, u64 size) {
if (memory_tracker.IsRegionGpuModified(device_addr, size)) {
ClearDownload(device_addr, size);
gpu_modified_ranges.Subtract(device_addr, size);
}
memory_tracker.UnmarkRegionAsCpuModified(device_addr, size);
}
template <class P>
void BufferCache<P>::CachedWriteMemory(DAddr device_addr, u64 size) {
const bool is_dirty = IsRegionRegistered(device_addr, size);

2
src/video_core/buffer_cache/buffer_cache_base.h

@ -219,6 +219,8 @@ public:
void WriteMemory(DAddr device_addr, u64 size);
void UnmapMemory(DAddr device_addr, u64 size);
void CachedWriteMemory(DAddr device_addr, u64 size);
bool OnCPUWrite(DAddr device_addr, u64 size);

2
src/video_core/renderer_opengl/gl_rasterizer.cpp

@ -595,7 +595,7 @@ void RasterizerOpenGL::UnmapMemory(DAddr addr, u64 size) {
}
{
std::scoped_lock lock{buffer_cache.mutex};
buffer_cache.WriteMemory(addr, size);
buffer_cache.UnmapMemory(addr, size);
}
shader_cache.OnCacheInvalidation(addr, size);
}

2
src/video_core/renderer_vulkan/vk_rasterizer.cpp

@ -758,7 +758,7 @@ void RasterizerVulkan::UnmapMemory(DAddr addr, u64 size) {
}
{
std::scoped_lock lock{buffer_cache.mutex};
buffer_cache.WriteMemory(addr, size);
buffer_cache.UnmapMemory(addr, size);
}
pipeline_cache.OnCacheInvalidation(addr, size);
}

Loading…
Cancel
Save