texture_cache: Add ASync Protections
This commit is contained in:
parent
1bbc9debfb
commit
07cc7e0c12
1 changed files with 10 additions and 0 deletions
|
@ -5,6 +5,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
@ -56,12 +57,16 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void InvalidateRegion(CacheAddr addr, std::size_t size) {
|
void InvalidateRegion(CacheAddr addr, std::size_t size) {
|
||||||
|
std::lock_guard lock{mutex};
|
||||||
|
|
||||||
for (const auto& surface : GetSurfacesInRegion(addr, size)) {
|
for (const auto& surface : GetSurfacesInRegion(addr, size)) {
|
||||||
Unregister(surface);
|
Unregister(surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlushRegion(CacheAddr addr, std::size_t size) {
|
void FlushRegion(CacheAddr addr, std::size_t size) {
|
||||||
|
std::lock_guard lock{mutex};
|
||||||
|
|
||||||
auto surfaces = GetSurfacesInRegion(addr, size);
|
auto surfaces = GetSurfacesInRegion(addr, size);
|
||||||
if (surfaces.empty()) {
|
if (surfaces.empty()) {
|
||||||
return;
|
return;
|
||||||
|
@ -220,6 +225,8 @@ protected:
|
||||||
const Common::Rectangle<u32>& dst_rect) = 0;
|
const Common::Rectangle<u32>& dst_rect) = 0;
|
||||||
|
|
||||||
void Register(TSurface surface) {
|
void Register(TSurface surface) {
|
||||||
|
std::lock_guard lock{mutex};
|
||||||
|
|
||||||
const GPUVAddr gpu_addr = surface->GetGpuAddr();
|
const GPUVAddr gpu_addr = surface->GetGpuAddr();
|
||||||
const CacheAddr cache_ptr = ToCacheAddr(memory_manager->GetPointer(gpu_addr));
|
const CacheAddr cache_ptr = ToCacheAddr(memory_manager->GetPointer(gpu_addr));
|
||||||
const std::size_t size = surface->GetSizeInBytes();
|
const std::size_t size = surface->GetSizeInBytes();
|
||||||
|
@ -237,6 +244,8 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unregister(TSurface surface) {
|
void Unregister(TSurface surface) {
|
||||||
|
std::lock_guard lock{mutex};
|
||||||
|
|
||||||
if (surface->IsProtected()) {
|
if (surface->IsProtected()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -579,6 +588,7 @@ private:
|
||||||
FramebufferTargetInfo depth_buffer;
|
FramebufferTargetInfo depth_buffer;
|
||||||
|
|
||||||
std::vector<u8> staging_buffer;
|
std::vector<u8> staging_buffer;
|
||||||
|
std::recursive_mutex mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace VideoCommon
|
} // namespace VideoCommon
|
||||||
|
|
Loading…
Reference in a new issue