summaryrefslogtreecommitdiffstats
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/texture_cache')
-rw-r--r--src/video_core/texture_cache/texture_cache.h15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 2ad6210dd..38b56475f 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -295,6 +295,9 @@ private:
RecycleStrategy PickStrategy(std::vector<TSurface>& overlaps, const SurfaceParams& params,
const GPUVAddr gpu_addr, const bool untopological) {
+ if (Settings::values.use_accurate_gpu_emulation) {
+ return RecycleStrategy::Flush;
+ }
// 3D Textures decision
if (params.block_depth > 1 || params.target == SurfaceTarget::Texture3D) {
return RecycleStrategy::Flush;
@@ -319,10 +322,7 @@ private:
for (auto surface : overlaps) {
Unregister(surface);
}
- RecycleStrategy strategy = !Settings::values.use_accurate_gpu_emulation
- ? PickStrategy(overlaps, params, gpu_addr, untopological)
- : RecycleStrategy::Flush;
- switch (strategy) {
+ switch (PickStrategy(overlaps, params, gpu_addr, untopological)) {
case RecycleStrategy::Ignore: {
return InitializeSurface(gpu_addr, params, preserve_contents);
}
@@ -453,6 +453,13 @@ private:
if (overlaps.size() == 1) {
TSurface current_surface = overlaps[0];
if (!current_surface->IsInside(gpu_addr, gpu_addr + candidate_size)) {
+ if (current_surface->GetGpuAddr() == gpu_addr) {
+ std::optional<std::pair<TSurface, TView>> view =
+ ReconstructSurface(overlaps, params, gpu_addr, host_ptr);
+ if (view.has_value()) {
+ return *view;
+ }
+ }
return RecycleSurface(overlaps, params, gpu_addr, preserve_contents, false);
}
std::optional<TView> view =