diff options
| author | 2021-10-17 02:21:26 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:31 +0100 | |
| commit | d4f5193bd308988a80f52941d9eefc4c857bfa99 (patch) | |
| tree | 09f3c34e22ef0255a43ef64ba2270e5b38c28916 /src | |
| parent | Texture cache: Fix memory consumption and ignore rating when a depth texture ... (diff) | |
| download | yuzu-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.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/blit_image.cpp | 29 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/blit_image.h | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.h | 2 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 2 |
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 | ||
| 420 | void BlitImageHelper::ConvertD32ToR32(const Framebuffer* dst_framebuffer, | 420 | void 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 | ||
| 426 | void BlitImageHelper::ConvertR32ToD32(const Framebuffer* dst_framebuffer, | 427 | void 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 | ||
| 432 | void BlitImageHelper::ConvertD16ToR16(const Framebuffer* dst_framebuffer, | 434 | void 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 | ||
| 438 | void BlitImageHelper::ConvertR16ToD16(const Framebuffer* dst_framebuffer, | 441 | void 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 | ||
| 444 | void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, | 448 | void 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 | ||
| 55 | private: | 59 | private: |
| 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 | ||
| 870 | void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view) { | 870 | void 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 | ||