diff options
| author | 2023-02-07 21:33:57 -0500 | |
|---|---|---|
| committer | 2023-02-11 15:43:07 -0500 | |
| commit | 93cf2b3ca8edeb1e8f1e00182f920b8d50664ed5 (patch) | |
| tree | 27f50dead32e6741d0cff761b3c0be4d8d7acd0c /src/video_core/texture_cache | |
| parent | Merge pull request #9508 from ameerj/hle-ipc-buffer-span (diff) | |
| download | yuzu-93cf2b3ca8edeb1e8f1e00182f920b8d50664ed5.tar.gz yuzu-93cf2b3ca8edeb1e8f1e00182f920b8d50664ed5.tar.xz yuzu-93cf2b3ca8edeb1e8f1e00182f920b8d50664ed5.zip | |
texture_cache: OpenGL: Implement MSAA uploads and copies
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/formatter.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 14 | ||||
| -rw-r--r-- | src/video_core/texture_cache/util.cpp | 5 |
3 files changed, 10 insertions, 12 deletions
diff --git a/src/video_core/texture_cache/formatter.cpp b/src/video_core/texture_cache/formatter.cpp index 418890126..30f72361d 100644 --- a/src/video_core/texture_cache/formatter.cpp +++ b/src/video_core/texture_cache/formatter.cpp | |||
| @@ -22,6 +22,9 @@ std::string Name(const ImageBase& image) { | |||
| 22 | const u32 num_layers = image.info.resources.layers; | 22 | const u32 num_layers = image.info.resources.layers; |
| 23 | const u32 num_levels = image.info.resources.levels; | 23 | const u32 num_levels = image.info.resources.levels; |
| 24 | std::string resource; | 24 | std::string resource; |
| 25 | if (image.info.num_samples > 1) { | ||
| 26 | resource += fmt::format(":{}xMSAA", image.info.num_samples); | ||
| 27 | } | ||
| 25 | if (num_layers > 1) { | 28 | if (num_layers > 1) { |
| 26 | resource += fmt::format(":L{}", num_layers); | 29 | resource += fmt::format(":L{}", num_layers); |
| 27 | } | 30 | } |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 1b01990a4..3e2cbb0b0 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -773,7 +773,7 @@ void TextureCache<P>::RefreshContents(Image& image, ImageId image_id) { | |||
| 773 | image.flags &= ~ImageFlagBits::CpuModified; | 773 | image.flags &= ~ImageFlagBits::CpuModified; |
| 774 | TrackImage(image, image_id); | 774 | TrackImage(image, image_id); |
| 775 | 775 | ||
| 776 | if (image.info.num_samples > 1) { | 776 | if (image.info.num_samples > 1 && !runtime.CanUploadMSAA()) { |
| 777 | LOG_WARNING(HW_GPU, "MSAA image uploads are not implemented"); | 777 | LOG_WARNING(HW_GPU, "MSAA image uploads are not implemented"); |
| 778 | return; | 778 | return; |
| 779 | } | 779 | } |
| @@ -1167,14 +1167,14 @@ ImageId TextureCache<P>::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, VA | |||
| 1167 | if (True(overlap.flags & ImageFlagBits::GpuModified)) { | 1167 | if (True(overlap.flags & ImageFlagBits::GpuModified)) { |
| 1168 | new_image.flags |= ImageFlagBits::GpuModified; | 1168 | new_image.flags |= ImageFlagBits::GpuModified; |
| 1169 | } | 1169 | } |
| 1170 | const auto& resolution = Settings::values.resolution_info; | ||
| 1171 | const SubresourceBase base = new_image.TryFindBase(overlap.gpu_addr).value(); | ||
| 1172 | const u32 up_scale = can_rescale ? resolution.up_scale : 1; | ||
| 1173 | const u32 down_shift = can_rescale ? resolution.down_shift : 0; | ||
| 1174 | auto copies = MakeShrinkImageCopies(new_info, overlap.info, base, up_scale, down_shift); | ||
| 1170 | if (overlap.info.num_samples != new_image.info.num_samples) { | 1175 | if (overlap.info.num_samples != new_image.info.num_samples) { |
| 1171 | LOG_WARNING(HW_GPU, "Copying between images with different samples is not implemented"); | 1176 | runtime.CopyImageMSAA(new_image, overlap, std::move(copies)); |
| 1172 | } else { | 1177 | } else { |
| 1173 | const auto& resolution = Settings::values.resolution_info; | ||
| 1174 | const SubresourceBase base = new_image.TryFindBase(overlap.gpu_addr).value(); | ||
| 1175 | const u32 up_scale = can_rescale ? resolution.up_scale : 1; | ||
| 1176 | const u32 down_shift = can_rescale ? resolution.down_shift : 0; | ||
| 1177 | auto copies = MakeShrinkImageCopies(new_info, overlap.info, base, up_scale, down_shift); | ||
| 1178 | runtime.CopyImage(new_image, overlap, std::move(copies)); | 1178 | runtime.CopyImage(new_image, overlap, std::move(copies)); |
| 1179 | } | 1179 | } |
| 1180 | if (True(overlap.flags & ImageFlagBits::Tracked)) { | 1180 | if (True(overlap.flags & ImageFlagBits::Tracked)) { |
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index 03acc68d9..697f86641 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp | |||
| @@ -573,10 +573,6 @@ u32 CalculateUnswizzledSizeBytes(const ImageInfo& info) noexcept { | |||
| 573 | if (info.type == ImageType::Buffer) { | 573 | if (info.type == ImageType::Buffer) { |
| 574 | return info.size.width * BytesPerBlock(info.format); | 574 | return info.size.width * BytesPerBlock(info.format); |
| 575 | } | 575 | } |
| 576 | if (info.num_samples > 1) { | ||
| 577 | // Multisample images can't be uploaded or downloaded to the host | ||
| 578 | return 0; | ||
| 579 | } | ||
| 580 | if (info.type == ImageType::Linear) { | 576 | if (info.type == ImageType::Linear) { |
| 581 | return info.pitch * Common::DivCeil(info.size.height, DefaultBlockHeight(info.format)); | 577 | return info.pitch * Common::DivCeil(info.size.height, DefaultBlockHeight(info.format)); |
| 582 | } | 578 | } |
| @@ -703,7 +699,6 @@ ImageViewType RenderTargetImageViewType(const ImageInfo& info) noexcept { | |||
| 703 | std::vector<ImageCopy> MakeShrinkImageCopies(const ImageInfo& dst, const ImageInfo& src, | 699 | std::vector<ImageCopy> MakeShrinkImageCopies(const ImageInfo& dst, const ImageInfo& src, |
| 704 | SubresourceBase base, u32 up_scale, u32 down_shift) { | 700 | SubresourceBase base, u32 up_scale, u32 down_shift) { |
| 705 | ASSERT(dst.resources.levels >= src.resources.levels); | 701 | ASSERT(dst.resources.levels >= src.resources.levels); |
| 706 | ASSERT(dst.num_samples == src.num_samples); | ||
| 707 | 702 | ||
| 708 | const bool is_dst_3d = dst.type == ImageType::e3D; | 703 | const bool is_dst_3d = dst.type == ImageType::e3D; |
| 709 | if (is_dst_3d) { | 704 | if (is_dst_3d) { |