summaryrefslogtreecommitdiffstats
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2020-02-21 18:16:51 +0100
committerGitHub <noreply@github.com>2020-02-21 18:16:51 +0100
commitdc7ebc2d01d88258968559c48fdcb713da2e17c9 (patch)
tree84beda5bd2086dd5a240a40e244076b4f667591d /src/video_core/texture_cache
parentMerge pull request #3438 from bunnei/gpu-mem-manager-fix (diff)
parenttexture_cache: Avoid matches in 3D textures (diff)
downloadyuzu-dc7ebc2d01d88258968559c48fdcb713da2e17c9.tar
yuzu-dc7ebc2d01d88258968559c48fdcb713da2e17c9.tar.gz
yuzu-dc7ebc2d01d88258968559c48fdcb713da2e17c9.tar.bz2
yuzu-dc7ebc2d01d88258968559c48fdcb713da2e17c9.tar.lz
yuzu-dc7ebc2d01d88258968559c48fdcb713da2e17c9.tar.xz
yuzu-dc7ebc2d01d88258968559c48fdcb713da2e17c9.tar.zst
yuzu-dc7ebc2d01d88258968559c48fdcb713da2e17c9.zip
Diffstat (limited to 'src/video_core/texture_cache')
-rw-r--r--src/video_core/texture_cache/texture_cache.h19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index f4c015635..0d105d386 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -721,7 +721,6 @@ private:
std::pair<TSurface, TView> GetSurface(const GPUVAddr gpu_addr, const CacheAddr cache_addr,
const SurfaceParams& params, bool preserve_contents,
bool is_render) {
-
// Step 1
// Check Level 1 Cache for a fast structural match. If candidate surface
// matches at certain level we are pretty much done.
@@ -733,14 +732,18 @@ private:
return RecycleSurface(overlaps, params, gpu_addr, preserve_contents,
topological_result);
}
+
const auto struct_result = current_surface->MatchesStructure(params);
- if (struct_result != MatchStructureResult::None &&
- (params.target != SurfaceTarget::Texture3D ||
- current_surface->MatchTarget(params.target))) {
- if (struct_result == MatchStructureResult::FullMatch) {
- return ManageStructuralMatch(current_surface, params, is_render);
- } else {
- return RebuildSurface(current_surface, params, is_render);
+ if (struct_result != MatchStructureResult::None) {
+ const auto& old_params = current_surface->GetSurfaceParams();
+ const bool not_3d = params.target != SurfaceTarget::Texture3D &&
+ old_params.target != SurfaceTarget::Texture3D;
+ if (not_3d || current_surface->MatchTarget(params.target)) {
+ if (struct_result == MatchStructureResult::FullMatch) {
+ return ManageStructuralMatch(current_surface, params, is_render);
+ } else {
+ return RebuildSurface(current_surface, params, is_render);
+ }
}
}
}