summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-10-18 22:56:36 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:31 +0100
commit3b61de74e6dc7526ffa8f03c21d81e2c3566ce90 (patch)
tree4f97e24ed00d7e46564e6aa8ecd3c05d6f6525ff /src/video_core/renderer_vulkan
parentTexture Cache: ease the requirements of textures being blacklisted. (diff)
downloadyuzu-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.cpp23
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h4
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
1075void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { 1075void 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
1130bool Image::ScaleUp() { 1137bool 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
1215bool Image::ScaleDown() { 1226bool 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
136private: 136private:
137 VKScheduler* scheduler{}; 137 VKScheduler* scheduler{};