summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar FernandoS272021-10-17 02:21:26 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:31 +0100
commitd4f5193bd308988a80f52941d9eefc4c857bfa99 (patch)
tree09f3c34e22ef0255a43ef64ba2270e5b38c28916 /src
parentTexture cache: Fix memory consumption and ignore rating when a depth texture ... (diff)
downloadyuzu-d4f5193bd308988a80f52941d9eefc4c857bfa99.tar.gz
yuzu-d4f5193bd308988a80f52941d9eefc4c857bfa99.tar.xz
yuzu-d4f5193bd308988a80f52941d9eefc4c857bfa99.zip
Texture Cache: Rescale conversions between depth and color
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h2
-rw-r--r--src/video_core/renderer_vulkan/blit_image.cpp29
-rw-r--r--src/video_core/renderer_vulkan/blit_image.h14
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp13
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h2
-rw-r--r--src/video_core/texture_cache/texture_cache.h2
6 files changed, 37 insertions, 25 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h
index cf7f37a16..f90dbfe9e 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.h
+++ b/src/video_core/renderer_opengl/gl_texture_cache.h
@@ -84,7 +84,7 @@ public:
84 84
85 void CopyImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies); 85 void CopyImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies);
86 86
87 void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view) { 87 void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view, bool rescaled) {
88 UNIMPLEMENTED(); 88 UNIMPLEMENTED();
89 } 89 }
90 90
diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp
index b97aac550..bc3e4b93d 100644
--- a/src/video_core/renderer_vulkan/blit_image.cpp
+++ b/src/video_core/renderer_vulkan/blit_image.cpp
@@ -418,40 +418,45 @@ void BlitImageHelper::BlitDepthStencil(const Framebuffer* dst_framebuffer,
418} 418}
419 419
420void BlitImageHelper::ConvertD32ToR32(const Framebuffer* dst_framebuffer, 420void BlitImageHelper::ConvertD32ToR32(const Framebuffer* dst_framebuffer,
421 const ImageView& src_image_view) { 421 const ImageView& src_image_view, u32 up_scale,
422 u32 down_shift) {
422 ConvertDepthToColorPipeline(convert_d32_to_r32_pipeline, dst_framebuffer->RenderPass()); 423 ConvertDepthToColorPipeline(convert_d32_to_r32_pipeline, dst_framebuffer->RenderPass());
423 Convert(*convert_d32_to_r32_pipeline, dst_framebuffer, src_image_view); 424 Convert(*convert_d32_to_r32_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift);
424} 425}
425 426
426void BlitImageHelper::ConvertR32ToD32(const Framebuffer* dst_framebuffer, 427void BlitImageHelper::ConvertR32ToD32(const Framebuffer* dst_framebuffer,
427 const ImageView& src_image_view) { 428 const ImageView& src_image_view, u32 up_scale,
429 u32 down_shift) {
428 ConvertColorToDepthPipeline(convert_r32_to_d32_pipeline, dst_framebuffer->RenderPass()); 430 ConvertColorToDepthPipeline(convert_r32_to_d32_pipeline, dst_framebuffer->RenderPass());
429 Convert(*convert_r32_to_d32_pipeline, dst_framebuffer, src_image_view); 431 Convert(*convert_r32_to_d32_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift);
430} 432}
431 433
432void BlitImageHelper::ConvertD16ToR16(const Framebuffer* dst_framebuffer, 434void BlitImageHelper::ConvertD16ToR16(const Framebuffer* dst_framebuffer,
433 const ImageView& src_image_view) { 435 const ImageView& src_image_view, u32 up_scale,
436 u32 down_shift) {
434 ConvertDepthToColorPipeline(convert_d16_to_r16_pipeline, dst_framebuffer->RenderPass()); 437 ConvertDepthToColorPipeline(convert_d16_to_r16_pipeline, dst_framebuffer->RenderPass());
435 Convert(*convert_d16_to_r16_pipeline, dst_framebuffer, src_image_view); 438 Convert(*convert_d16_to_r16_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift);
436} 439}
437 440
438void BlitImageHelper::ConvertR16ToD16(const Framebuffer* dst_framebuffer, 441void BlitImageHelper::ConvertR16ToD16(const Framebuffer* dst_framebuffer,
439 const ImageView& src_image_view) { 442 const ImageView& src_image_view, u32 up_scale,
443 u32 down_shift) {
440 ConvertColorToDepthPipeline(convert_r16_to_d16_pipeline, dst_framebuffer->RenderPass()); 444 ConvertColorToDepthPipeline(convert_r16_to_d16_pipeline, dst_framebuffer->RenderPass());
441 Convert(*convert_r16_to_d16_pipeline, dst_framebuffer, src_image_view); 445 Convert(*convert_r16_to_d16_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift);
442} 446}
443 447
444void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, 448void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
445 const ImageView& src_image_view) { 449 const ImageView& src_image_view, u32 up_scale, u32 down_shift) {
446 const VkPipelineLayout layout = *one_texture_pipeline_layout; 450 const VkPipelineLayout layout = *one_texture_pipeline_layout;
447 const VkImageView src_view = src_image_view.Handle(Shader::TextureType::Color2D); 451 const VkImageView src_view = src_image_view.Handle(Shader::TextureType::Color2D);
448 const VkSampler sampler = *nearest_sampler; 452 const VkSampler sampler = *nearest_sampler;
449 const VkExtent2D extent{ 453 const VkExtent2D extent{
450 .width = src_image_view.size.width, 454 .width = std::max((src_image_view.size.width * up_scale) >> down_shift, 1U),
451 .height = src_image_view.size.height, 455 .height = std::max((src_image_view.size.height * up_scale) >> down_shift, 1U),
452 }; 456 };
453 scheduler.RequestRenderpass(dst_framebuffer); 457 scheduler.RequestRenderpass(dst_framebuffer);
454 scheduler.Record([pipeline, layout, sampler, src_view, extent, this](vk::CommandBuffer cmdbuf) { 458 scheduler.Record([pipeline, layout, sampler, src_view, extent, up_scale, down_shift,
459 this](vk::CommandBuffer cmdbuf) {
455 const VkOffset2D offset{ 460 const VkOffset2D offset{
456 .x = 0, 461 .x = 0,
457 .y = 0, 462 .y = 0,
diff --git a/src/video_core/renderer_vulkan/blit_image.h b/src/video_core/renderer_vulkan/blit_image.h
index e11f8c214..c0f4a16a4 100644
--- a/src/video_core/renderer_vulkan/blit_image.h
+++ b/src/video_core/renderer_vulkan/blit_image.h
@@ -44,17 +44,21 @@ public:
44 const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter, 44 const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter,
45 Tegra::Engines::Fermi2D::Operation operation); 45 Tegra::Engines::Fermi2D::Operation operation);
46 46
47 void ConvertD32ToR32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); 47 void ConvertD32ToR32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view,
48 u32 up_scale, u32 down_shift);
48 49
49 void ConvertR32ToD32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); 50 void ConvertR32ToD32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view,
51 u32 up_scale, u32 down_shift);
50 52
51 void ConvertD16ToR16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); 53 void ConvertD16ToR16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view,
54 u32 up_scale, u32 down_shift);
52 55
53 void ConvertR16ToD16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); 56 void ConvertR16ToD16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view,
57 u32 up_scale, u32 down_shift);
54 58
55private: 59private:
56 void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, 60 void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
57 const ImageView& src_image_view); 61 const ImageView& src_image_view, u32 up_scale, u32 down_shift);
58 62
59 [[nodiscard]] VkPipeline FindOrEmplacePipeline(const BlitImagePipelineKey& key); 63 [[nodiscard]] VkPipeline FindOrEmplacePipeline(const BlitImagePipelineKey& key);
60 64
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index a4fbbc735..17c62e27d 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -867,26 +867,29 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst
867 }); 867 });
868} 868}
869 869
870void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view) { 870void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view,
871 bool rescaled) {
872 const u32 up_scale = rescaled ? resolution.up_scale : 1;
873 const u32 down_shift = rescaled ? resolution.down_shift : 0;
871 switch (dst_view.format) { 874 switch (dst_view.format) {
872 case PixelFormat::R16_UNORM: 875 case PixelFormat::R16_UNORM:
873 if (src_view.format == PixelFormat::D16_UNORM) { 876 if (src_view.format == PixelFormat::D16_UNORM) {
874 return blit_image_helper.ConvertD16ToR16(dst, src_view); 877 return blit_image_helper.ConvertD16ToR16(dst, src_view, up_scale, down_shift);
875 } 878 }
876 break; 879 break;
877 case PixelFormat::R32_FLOAT: 880 case PixelFormat::R32_FLOAT:
878 if (src_view.format == PixelFormat::D32_FLOAT) { 881 if (src_view.format == PixelFormat::D32_FLOAT) {
879 return blit_image_helper.ConvertD32ToR32(dst, src_view); 882 return blit_image_helper.ConvertD32ToR32(dst, src_view, up_scale, down_shift);
880 } 883 }
881 break; 884 break;
882 case PixelFormat::D16_UNORM: 885 case PixelFormat::D16_UNORM:
883 if (src_view.format == PixelFormat::R16_UNORM) { 886 if (src_view.format == PixelFormat::R16_UNORM) {
884 return blit_image_helper.ConvertR16ToD16(dst, src_view); 887 return blit_image_helper.ConvertR16ToD16(dst, src_view, up_scale, down_shift);
885 } 888 }
886 break; 889 break;
887 case PixelFormat::D32_FLOAT: 890 case PixelFormat::D32_FLOAT:
888 if (src_view.format == PixelFormat::R32_FLOAT) { 891 if (src_view.format == PixelFormat::R32_FLOAT) {
889 return blit_image_helper.ConvertR32ToD32(dst, src_view); 892 return blit_image_helper.ConvertR32ToD32(dst, src_view, up_scale, down_shift);
890 } 893 }
891 break; 894 break;
892 default: 895 default:
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h
index dc9175ee1..6dc190632 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.h
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.h
@@ -61,7 +61,7 @@ public:
61 61
62 void CopyImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies); 62 void CopyImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies);
63 63
64 void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view); 64 void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view, bool rescaled);
65 65
66 bool CanAccelerateImageUpload(Image&) const noexcept { 66 bool CanAccelerateImageUpload(Image&) const noexcept {
67 return false; 67 return false;
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index c06cddae9..a035d2b18 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -1774,7 +1774,7 @@ void TextureCache<P>::CopyImage(ImageId dst_id, ImageId src_id, std::vector<Imag
1774 }; 1774 };
1775 UNIMPLEMENTED_IF(copy.extent != expected_size); 1775 UNIMPLEMENTED_IF(copy.extent != expected_size);
1776 1776
1777 runtime.ConvertImage(dst_framebuffer, dst_view, src_view); 1777 runtime.ConvertImage(dst_framebuffer, dst_view, src_view, is_rescaled);
1778 } 1778 }
1779} 1779}
1780 1780