summaryrefslogtreecommitdiffstats
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2019-05-14 06:55:32 +0200
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-06-21 02:36:12 +0200
commitd267948a73d2364949660a24d07833ea05c9fcc8 (patch)
treef0bfd7e5bfdcb08be09733926e6b3a8c5ad31edf /src/video_core/texture_cache
parenttexture_cache: Document the most important methods. (diff)
downloadyuzu-d267948a73d2364949660a24d07833ea05c9fcc8.tar
yuzu-d267948a73d2364949660a24d07833ea05c9fcc8.tar.gz
yuzu-d267948a73d2364949660a24d07833ea05c9fcc8.tar.bz2
yuzu-d267948a73d2364949660a24d07833ea05c9fcc8.tar.lz
yuzu-d267948a73d2364949660a24d07833ea05c9fcc8.tar.xz
yuzu-d267948a73d2364949660a24d07833ea05c9fcc8.tar.zst
yuzu-d267948a73d2364949660a24d07833ea05c9fcc8.zip
Diffstat (limited to 'src/video_core/texture_cache')
-rw-r--r--src/video_core/texture_cache/surface_base.cpp2
-rw-r--r--src/video_core/texture_cache/texture_cache.h20
2 files changed, 19 insertions, 3 deletions
diff --git a/src/video_core/texture_cache/surface_base.cpp b/src/video_core/texture_cache/surface_base.cpp
index ceff51043..d4aa2c54b 100644
--- a/src/video_core/texture_cache/surface_base.cpp
+++ b/src/video_core/texture_cache/surface_base.cpp
@@ -130,7 +130,7 @@ void SurfaceBaseImpl::FlushBuffer(Tegra::MemoryManager& memory_manager,
return;
}
if (params.is_tiled) {
- ASSERT_MSG(params.block_width == 1, "Block width is defined as {}", params.block_width);
+ ASSERT_MSG(params.block_width == 0, "Block width is defined as {}", params.block_width);
for (u32 level = 0; level < params.num_levels; ++level) {
const std::size_t host_offset{params.GetHostMipmapLevelOffset(level)};
SwizzleFunc(MortonSwizzleMode::LinearToMorton, host_ptr, params,
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 04e9528b8..85c9160e0 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -425,6 +425,7 @@ private:
}
bool modified = false;
TSurface new_surface = GetUncachedSurface(gpu_addr, params);
+ u32 passed_tests = 0;
for (auto surface : overlaps) {
const SurfaceParams& src_params = surface->GetSurfaceParams();
if (src_params.is_layered || src_params.num_levels > 1) {
@@ -434,12 +435,12 @@ private:
const std::size_t candidate_size = surface->GetSizeInBytes();
auto mipmap_layer{new_surface->GetLayerMipmap(surface->GetGpuAddr())};
if (!mipmap_layer) {
- return {};
+ continue;
}
const u32 layer{mipmap_layer->first};
const u32 mipmap{mipmap_layer->second};
if (new_surface->GetMipmapSize(mipmap) != candidate_size) {
- return {};
+ continue;
}
modified |= surface->IsModified();
// Now we got all the data set up
@@ -448,8 +449,15 @@ private:
const CopyParams copy_params(0, 0, 0, 0, 0, layer, 0, mipmap,
std::min(src_params.width, dst_width),
std::min(src_params.height, dst_height), 1);
+ passed_tests++;
ImageCopy(surface, new_surface, copy_params);
}
+ if (passed_tests == 0) {
+ return {};
+ // In Accurate GPU all test should pass, else we recycle
+ } else if (Settings::values.use_accurate_gpu_emulation && passed_tests != overlaps.size()) {
+ return {};
+ }
for (auto surface : overlaps) {
Unregister(surface);
}
@@ -548,6 +556,14 @@ private:
}
return {current_surface, *view};
}
+ // The next case is unsafe, so if we r in accurate GPU, just skip it
+ if (Settings::values.use_accurate_gpu_emulation) {
+ return RecycleSurface(overlaps, params, gpu_addr, preserve_contents, false);
+ }
+ // This is the case the texture is a part of the parent.
+ if (current_surface->MatchesSubTexture(params, gpu_addr)) {
+ return RebuildSurface(current_surface, params);
+ }
} else {
// If there are many overlaps, odds are they are subtextures of the candidate
// surface. We try to construct a new surface based on the candidate parameters,