diff options
| author | 2022-01-01 22:03:37 +0100 | |
|---|---|---|
| committer | 2022-10-06 21:00:52 +0200 | |
| commit | f350c3d74ea7880fc6d21f7f638b0d4a70a3246b (patch) | |
| tree | 30927fa3c736f5b758a0a971a2d95114d8f8d5fa /src/video_core/texture_cache | |
| parent | Texture cache: Fix dangling references on multichannel. (diff) | |
| download | yuzu-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.h | 27 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache_base.h | 4 |
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 | ||
| 482 | template <class P> | 482 | template <class P> |
| 483 | void TextureCache<P>::UnmapGPUMemory(GPUVAddr gpu_addr, size_t size) { | 483 | void 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 | ||
| 1323 | template <class P> | 1332 | template <class P> |
| 1324 | template <typename Func> | 1333 | template <typename Func> |
| 1325 | void TextureCache<P>::ForEachImageInRegionGPU(GPUVAddr gpu_addr, size_t size, Func&& func) { | 1334 | void 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); |