summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2022-01-01 22:03:37 +0100
committerGravatar Fernando Sahmkow2022-10-06 21:00:52 +0200
commitf350c3d74ea7880fc6d21f7f638b0d4a70a3246b (patch)
tree30927fa3c736f5b758a0a971a2d95114d8f8d5fa /src/video_core/texture_cache
parentTexture cache: Fix dangling references on multichannel. (diff)
downloadyuzu-f350c3d74ea7880fc6d21f7f638b0d4a70a3246b.tar.gz
yuzu-f350c3d74ea7880fc6d21f7f638b0d4a70a3246b.tar.xz
yuzu-f350c3d74ea7880fc6d21f7f638b0d4a70a3246b.zip
Texture cache: Fix the remaining issues with memory mnagement and unmapping.
Diffstat (limited to 'src/video_core/texture_cache')
-rw-r--r--src/video_core/texture_cache/texture_cache.h27
-rw-r--r--src/video_core/texture_cache/texture_cache_base.h4
2 files changed, 23 insertions, 8 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 5ef07d18f..a483892e4 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -480,12 +480,20 @@ void TextureCache<P>::UnmapMemory(VAddr cpu_addr, size_t size) {
480} 480}
481 481
482template <class P> 482template <class P>
483void TextureCache<P>::UnmapGPUMemory(GPUVAddr gpu_addr, size_t size) { 483void TextureCache<P>::UnmapGPUMemory(size_t as_id, GPUVAddr gpu_addr, size_t size) {
484 std::vector<ImageId> deleted_images; 484 std::vector<ImageId> deleted_images;
485 ForEachImageInRegionGPU(gpu_addr, size, 485 ForEachImageInRegionGPU(as_id, gpu_addr, size,
486 [&](ImageId id, Image&) { deleted_images.push_back(id); }); 486 [&](ImageId id, Image&) { deleted_images.push_back(id); });
487 for (const ImageId id : deleted_images) { 487 for (const ImageId id : deleted_images) {
488 Image& image = slot_images[id]; 488 Image& image = slot_images[id];
489 if (True(image.flags & ImageFlagBits::CpuModified)) {
490 return;
491 }
492 image.flags |= ImageFlagBits::CpuModified;
493 if (True(image.flags & ImageFlagBits::Tracked)) {
494 UntrackImage(image, id);
495 }
496 /*
489 if (True(image.flags & ImageFlagBits::Remapped)) { 497 if (True(image.flags & ImageFlagBits::Remapped)) {
490 continue; 498 continue;
491 } 499 }
@@ -493,6 +501,7 @@ void TextureCache<P>::UnmapGPUMemory(GPUVAddr gpu_addr, size_t size) {
493 if (True(image.flags & ImageFlagBits::Tracked)) { 501 if (True(image.flags & ImageFlagBits::Tracked)) {
494 UntrackImage(image, id); 502 UntrackImage(image, id);
495 } 503 }
504 */
496 } 505 }
497} 506}
498 507
@@ -1322,13 +1331,19 @@ void TextureCache<P>::ForEachImageInRegion(VAddr cpu_addr, size_t size, Func&& f
1322 1331
1323template <class P> 1332template <class P>
1324template <typename Func> 1333template <typename Func>
1325void TextureCache<P>::ForEachImageInRegionGPU(GPUVAddr gpu_addr, size_t size, Func&& func) { 1334void TextureCache<P>::ForEachImageInRegionGPU(size_t as_id, GPUVAddr gpu_addr, size_t size,
1335 Func&& func) {
1326 using FuncReturn = typename std::invoke_result<Func, ImageId, Image&>::type; 1336 using FuncReturn = typename std::invoke_result<Func, ImageId, Image&>::type;
1327 static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>; 1337 static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>;
1328 boost::container::small_vector<ImageId, 8> images; 1338 boost::container::small_vector<ImageId, 8> images;
1329 ForEachGPUPage(gpu_addr, size, [this, &images, gpu_addr, size, func](u64 page) { 1339 auto storage_id = getStorageID(as_id);
1330 const auto it = channel_state->gpu_page_table->find(page); 1340 if (!storage_id) {
1331 if (it == channel_state->gpu_page_table->end()) { 1341 return;
1342 }
1343 auto& gpu_page_table = gpu_page_table_storage[*storage_id];
1344 ForEachGPUPage(gpu_addr, size, [this, gpu_page_table, &images, gpu_addr, size, func](u64 page) {
1345 const auto it = gpu_page_table.find(page);
1346 if (it == gpu_page_table.end()) {
1332 if constexpr (BOOL_BREAK) { 1347 if constexpr (BOOL_BREAK) {
1333 return false; 1348 return false;
1334 } else { 1349 } else {
diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h
index b24968b03..2f4db5047 100644
--- a/src/video_core/texture_cache/texture_cache_base.h
+++ b/src/video_core/texture_cache/texture_cache_base.h
@@ -173,7 +173,7 @@ public:
173 void UnmapMemory(VAddr cpu_addr, size_t size); 173 void UnmapMemory(VAddr cpu_addr, size_t size);
174 174
175 /// Remove images in a region 175 /// Remove images in a region
176 void UnmapGPUMemory(GPUVAddr gpu_addr, size_t size); 176 void UnmapGPUMemory(size_t as_id, GPUVAddr gpu_addr, size_t size);
177 177
178 /// Blit an image with the given parameters 178 /// Blit an image with the given parameters
179 void BlitImage(const Tegra::Engines::Fermi2D::Surface& dst, 179 void BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
@@ -309,7 +309,7 @@ private:
309 void ForEachImageInRegion(VAddr cpu_addr, size_t size, Func&& func); 309 void ForEachImageInRegion(VAddr cpu_addr, size_t size, Func&& func);
310 310
311 template <typename Func> 311 template <typename Func>
312 void ForEachImageInRegionGPU(GPUVAddr gpu_addr, size_t size, Func&& func); 312 void ForEachImageInRegionGPU(size_t as_id, GPUVAddr gpu_addr, size_t size, Func&& func);
313 313
314 template <typename Func> 314 template <typename Func>
315 void ForEachSparseImageInRegion(GPUVAddr gpu_addr, size_t size, Func&& func); 315 void ForEachSparseImageInRegion(GPUVAddr gpu_addr, size_t size, Func&& func);