diff options
| author | 2021-10-18 22:56:36 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:31 +0100 | |
| commit | 3b61de74e6dc7526ffa8f03c21d81e2c3566ce90 (patch) | |
| tree | 4f97e24ed00d7e46564e6aa8ecd3c05d6f6525ff /src/video_core/renderer_vulkan | |
| parent | Texture Cache: ease the requirements of textures being blacklisted. (diff) | |
| download | yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.gz yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.xz yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.zip | |
Texture Cache: fix memory managment and optimize scaled downloads, uploads.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 23 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.h | 4 |
2 files changed, 21 insertions, 6 deletions
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 51367c01d..02aac3b98 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -1055,7 +1055,7 @@ void Image::UploadMemory(const StagingBufferRef& map, std::span<const BufferImag | |||
| 1055 | // TODO: Move this to another API | 1055 | // TODO: Move this to another API |
| 1056 | const bool is_rescaled = True(flags & ImageFlagBits::Rescaled); | 1056 | const bool is_rescaled = True(flags & ImageFlagBits::Rescaled); |
| 1057 | if (is_rescaled) { | 1057 | if (is_rescaled) { |
| 1058 | ScaleDown(); | 1058 | ScaleDown(true); |
| 1059 | } | 1059 | } |
| 1060 | scheduler->RequestOutsideRenderPassOperationContext(); | 1060 | scheduler->RequestOutsideRenderPassOperationContext(); |
| 1061 | std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask); | 1061 | std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask); |
| @@ -1073,6 +1073,10 @@ void Image::UploadMemory(const StagingBufferRef& map, std::span<const BufferImag | |||
| 1073 | } | 1073 | } |
| 1074 | 1074 | ||
| 1075 | void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { | 1075 | void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { |
| 1076 | const bool is_rescaled = True(flags & ImageFlagBits::Rescaled); | ||
| 1077 | if (is_rescaled) { | ||
| 1078 | ScaleDown(); | ||
| 1079 | } | ||
| 1076 | std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask); | 1080 | std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask); |
| 1077 | scheduler->RequestOutsideRenderPassOperationContext(); | 1081 | scheduler->RequestOutsideRenderPassOperationContext(); |
| 1078 | scheduler->Record([buffer = map.buffer, image = *original_image, aspect_mask = aspect_mask, | 1082 | scheduler->Record([buffer = map.buffer, image = *original_image, aspect_mask = aspect_mask, |
| @@ -1125,9 +1129,12 @@ void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferIm | |||
| 1125 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | 1129 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, |
| 1126 | 0, memory_write_barrier, nullptr, image_write_barrier); | 1130 | 0, memory_write_barrier, nullptr, image_write_barrier); |
| 1127 | }); | 1131 | }); |
| 1132 | if (is_rescaled) { | ||
| 1133 | ScaleUp(true); | ||
| 1134 | } | ||
| 1128 | } | 1135 | } |
| 1129 | 1136 | ||
| 1130 | bool Image::ScaleUp() { | 1137 | bool Image::ScaleUp(bool ignore) { |
| 1131 | if (True(flags & ImageFlagBits::Rescaled)) { | 1138 | if (True(flags & ImageFlagBits::Rescaled)) { |
| 1132 | return false; | 1139 | return false; |
| 1133 | } | 1140 | } |
| @@ -1137,7 +1144,7 @@ bool Image::ScaleUp() { | |||
| 1137 | if (!resolution.active) { | 1144 | if (!resolution.active) { |
| 1138 | return false; | 1145 | return false; |
| 1139 | } | 1146 | } |
| 1140 | scale_count++; | 1147 | has_scaled = true; |
| 1141 | const auto& device = runtime->device; | 1148 | const auto& device = runtime->device; |
| 1142 | const bool is_2d = info.type == ImageType::e2D; | 1149 | const bool is_2d = info.type == ImageType::e2D; |
| 1143 | const u32 scaled_width = resolution.ScaleUp(info.size.width); | 1150 | const u32 scaled_width = resolution.ScaleUp(info.size.width); |
| @@ -1149,8 +1156,12 @@ bool Image::ScaleUp() { | |||
| 1149 | scaled_image = MakeImage(device, scaled_info); | 1156 | scaled_image = MakeImage(device, scaled_info); |
| 1150 | auto& allocator = runtime->memory_allocator; | 1157 | auto& allocator = runtime->memory_allocator; |
| 1151 | scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal)); | 1158 | scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal)); |
| 1159 | ignore = false; | ||
| 1152 | } | 1160 | } |
| 1153 | current_image = *scaled_image; | 1161 | current_image = *scaled_image; |
| 1162 | if (ignore) { | ||
| 1163 | return true; | ||
| 1164 | } | ||
| 1154 | 1165 | ||
| 1155 | if (aspect_mask == 0) { | 1166 | if (aspect_mask == 0) { |
| 1156 | aspect_mask = ImageAspectMask(info.format); | 1167 | aspect_mask = ImageAspectMask(info.format); |
| @@ -1212,7 +1223,7 @@ bool Image::ScaleUp() { | |||
| 1212 | return true; | 1223 | return true; |
| 1213 | } | 1224 | } |
| 1214 | 1225 | ||
| 1215 | bool Image::ScaleDown() { | 1226 | bool Image::ScaleDown(bool ignore) { |
| 1216 | if (False(flags & ImageFlagBits::Rescaled)) { | 1227 | if (False(flags & ImageFlagBits::Rescaled)) { |
| 1217 | return false; | 1228 | return false; |
| 1218 | } | 1229 | } |
| @@ -1221,6 +1232,10 @@ bool Image::ScaleDown() { | |||
| 1221 | if (!resolution.active) { | 1232 | if (!resolution.active) { |
| 1222 | return false; | 1233 | return false; |
| 1223 | } | 1234 | } |
| 1235 | if (ignore) { | ||
| 1236 | current_image = *original_image; | ||
| 1237 | return true; | ||
| 1238 | } | ||
| 1224 | const auto& device = runtime->device; | 1239 | const auto& device = runtime->device; |
| 1225 | const bool is_2d = info.type == ImageType::e2D; | 1240 | const bool is_2d = info.type == ImageType::e2D; |
| 1226 | const u32 scaled_width = resolution.ScaleUp(info.size.width); | 1241 | const u32 scaled_width = resolution.ScaleUp(info.size.width); |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index df854a20c..8dbddfaf7 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h | |||
| @@ -129,9 +129,9 @@ public: | |||
| 129 | return std::exchange(initialized, true); | 129 | return std::exchange(initialized, true); |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | bool ScaleUp(); | 132 | bool ScaleUp(bool ignore = false); |
| 133 | 133 | ||
| 134 | bool ScaleDown(); | 134 | bool ScaleDown(bool ignore = false); |
| 135 | 135 | ||
| 136 | private: | 136 | private: |
| 137 | VKScheduler* scheduler{}; | 137 | VKScheduler* scheduler{}; |