diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/texture_cache/image_info.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 17 |
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 | ||