diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-02-16 01:48:33 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-02-16 04:15:42 -0300 | 
| commit | bfda5ff3f6695034486184275a1d6eb05810f62c (patch) | |
| tree | 449380520fb85c3282c625361cc14309303b876f | |
| parent | f552d553bac1374c583d748dad27f8c86e86c4a0 (diff) | |
texture_cache: Avoid matches in 3D textures
Code before this commit was trying to match 3D textures with another
target. Fix that.
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 19 | 
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); +                    }                  }              }          } | 
