summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp8
-rw-r--r--src/video_core/texture_cache/image_info.cpp4
-rw-r--r--src/video_core/texture_cache/texture_cache.h17
3 files changed, 21 insertions, 8 deletions
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 5b4f51a31..4f0bab274 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -860,9 +860,10 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst
860 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 860 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
861 0, nullptr, nullptr, read_barriers); 861 0, nullptr, nullptr, read_barriers);
862 if (is_resolve) { 862 if (is_resolve) {
863 VkImageResolve resolve_info =
864 MakeImageResolve(dst_region, src_region, dst_layers, src_layers);
863 cmdbuf.ResolveImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, 865 cmdbuf.ResolveImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image,
864 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 866 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, resolve_info);
865 MakeImageResolve(dst_region, src_region, dst_layers, src_layers));
866 } else { 867 } else {
867 const bool is_linear = filter == Fermi2D::Filter::Bilinear; 868 const bool is_linear = filter == Fermi2D::Filter::Bilinear;
868 const VkFilter vk_filter = is_linear ? VK_FILTER_LINEAR : VK_FILTER_NEAREST; 869 const VkFilter vk_filter = is_linear ? VK_FILTER_LINEAR : VK_FILTER_NEAREST;
@@ -1149,6 +1150,9 @@ bool Image::ScaleUp() {
1149 if (aspect_mask == 0) { 1150 if (aspect_mask == 0) {
1150 aspect_mask = ImageAspectMask(info.format); 1151 aspect_mask = ImageAspectMask(info.format);
1151 } 1152 }
1153 if (info.num_samples > 1) {
1154 return true;
1155 }
1152 const PixelFormat format = StorageFormat(info.format); 1156 const PixelFormat format = StorageFormat(info.format);
1153 const auto format_info = MaxwellToVK::SurfaceFormat(device, FormatType::Optimal, false, format); 1157 const auto format_info = MaxwellToVK::SurfaceFormat(device, FormatType::Optimal, false, format);
1154 const auto similar = device.GetSupportedFormat( 1158 const auto similar = device.GetSupportedFormat(
diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp
index bdf306bf9..7fa8fd4fe 100644
--- a/src/video_core/texture_cache/image_info.cpp
+++ b/src/video_core/texture_cache/image_info.cpp
@@ -101,7 +101,7 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept {
101 // FIXME: Call this without passing *this 101 // FIXME: Call this without passing *this
102 layer_stride = CalculateLayerStride(*this); 102 layer_stride = CalculateLayerStride(*this);
103 maybe_unaligned_layer_stride = CalculateLayerSize(*this); 103 maybe_unaligned_layer_stride = CalculateLayerSize(*this);
104 rescaleable &= (block.depth == 0) && resources.levels == 1 && num_samples == 1; 104 rescaleable &= (block.depth == 0) && resources.levels == 1;
105 } 105 }
106} 106}
107 107
@@ -134,7 +134,7 @@ ImageInfo::ImageInfo(const Tegra::Engines::Maxwell3D::Regs& regs, size_t index)
134 type = ImageType::e3D; 134 type = ImageType::e3D;
135 size.depth = rt.depth; 135 size.depth = rt.depth;
136 } else { 136 } else {
137 rescaleable = block.depth == 0 && size.height > 256 && num_samples == 1; 137 rescaleable = block.depth == 0 && size.height > 256;
138 type = ImageType::e2D; 138 type = ImageType::e2D;
139 resources.layers = rt.depth; 139 resources.layers = rt.depth;
140 } 140 }
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index a543776fd..b60f840c1 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -476,17 +476,26 @@ void TextureCache<P>::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
476 Image& dst_image = slot_images[dst_id]; 476 Image& dst_image = slot_images[dst_id];
477 Image& src_image = slot_images[src_id]; 477 Image& src_image = slot_images[src_id];
478 478
479 bool is_resolve = src_image.info.num_samples != 1 && dst_image.info.num_samples == 1;
480
479 bool is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled); 481 bool is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled);
480 bool is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled); 482 bool is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
481 483
482 if (is_src_rescaled != is_dst_rescaled) { 484 if (is_src_rescaled != is_dst_rescaled) {
483 if (ImageCanRescale(dst_image)) {
484 ScaleUp(dst_image);
485 is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
486 }
487 if (ImageCanRescale(src_image)) { 485 if (ImageCanRescale(src_image)) {
488 ScaleUp(src_image); 486 ScaleUp(src_image);
489 is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled); 487 is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled);
488 if (is_resolve) {
489 dst_image.info.rescaleable = true;
490 for (const auto& alias : dst_image.aliased_images) {
491 Image& other_image = slot_images[alias.id];
492 other_image.info.rescaleable = true;
493 }
494 }
495 }
496 if (ImageCanRescale(dst_image)) {
497 ScaleUp(dst_image);
498 is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
490 } 499 }
491 } 500 }
492 501