summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_texture_cache.cpp
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2021-10-18 22:56:36 +0200
committerFernando Sahmkow <fsahmkow27@gmail.com>2021-11-16 22:11:31 +0100
commit3b61de74e6dc7526ffa8f03c21d81e2c3566ce90 (patch)
tree4f97e24ed00d7e46564e6aa8ecd3c05d6f6525ff /src/video_core/renderer_vulkan/vk_texture_cache.cpp
parentTexture Cache: ease the requirements of textures being blacklisted. (diff)
downloadyuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.gz
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.bz2
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.lz
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.xz
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.zst
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.zip
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_texture_cache.cpp')
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp23
1 files changed, 19 insertions, 4 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
// TODO: Move this to another API
const bool is_rescaled = True(flags & ImageFlagBits::Rescaled);
if (is_rescaled) {
- ScaleDown();
+ ScaleDown(true);
}
scheduler->RequestOutsideRenderPassOperationContext();
std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask);
@@ -1073,6 +1073,10 @@ void Image::UploadMemory(const StagingBufferRef& map, std::span<const BufferImag
}
void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) {
+ const bool is_rescaled = True(flags & ImageFlagBits::Rescaled);
+ if (is_rescaled) {
+ ScaleDown();
+ }
std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask);
scheduler->RequestOutsideRenderPassOperationContext();
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
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
0, memory_write_barrier, nullptr, image_write_barrier);
});
+ if (is_rescaled) {
+ ScaleUp(true);
+ }
}
-bool Image::ScaleUp() {
+bool Image::ScaleUp(bool ignore) {
if (True(flags & ImageFlagBits::Rescaled)) {
return false;
}
@@ -1137,7 +1144,7 @@ bool Image::ScaleUp() {
if (!resolution.active) {
return false;
}
- scale_count++;
+ has_scaled = true;
const auto& device = runtime->device;
const bool is_2d = info.type == ImageType::e2D;
const u32 scaled_width = resolution.ScaleUp(info.size.width);
@@ -1149,8 +1156,12 @@ bool Image::ScaleUp() {
scaled_image = MakeImage(device, scaled_info);
auto& allocator = runtime->memory_allocator;
scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal));
+ ignore = false;
}
current_image = *scaled_image;
+ if (ignore) {
+ return true;
+ }
if (aspect_mask == 0) {
aspect_mask = ImageAspectMask(info.format);
@@ -1212,7 +1223,7 @@ bool Image::ScaleUp() {
return true;
}
-bool Image::ScaleDown() {
+bool Image::ScaleDown(bool ignore) {
if (False(flags & ImageFlagBits::Rescaled)) {
return false;
}
@@ -1221,6 +1232,10 @@ bool Image::ScaleDown() {
if (!resolution.active) {
return false;
}
+ if (ignore) {
+ current_image = *original_image;
+ return true;
+ }
const auto& device = runtime->device;
const bool is_2d = info.type == ImageType::e2D;
const u32 scaled_width = resolution.ScaleUp(info.size.width);