summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar ameerj2023-02-07 21:33:57 -0500
committerGravatar ameerj2023-02-11 15:43:07 -0500
commit93cf2b3ca8edeb1e8f1e00182f920b8d50664ed5 (patch)
tree27f50dead32e6741d0cff761b3c0be4d8d7acd0c /src/video_core/texture_cache
parentMerge pull request #9508 from ameerj/hle-ipc-buffer-span (diff)
downloadyuzu-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.cpp3
-rw-r--r--src/video_core/texture_cache/texture_cache.h14
-rw-r--r--src/video_core/texture_cache/util.cpp5
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 {
703std::vector<ImageCopy> MakeShrinkImageCopies(const ImageInfo& dst, const ImageInfo& src, 699std::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) {