diff options
| author | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-11-21 01:53:16 -0500 | 
|---|---|---|
| committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-12-05 15:42:44 -0500 | 
| commit | b8f3e5157ba08dc978ee8abb4f8ecc0ffa5c3c8c (patch) | |
| tree | 64539cf02b793108a482546f5ac726148119f7fa | |
| parent | 35d94dcb2b54913f608163fe1c73f8a3ef326fb3 (diff) | |
blit_image: Refactor upscale factors usage
The image view itself can be queried to see if it is being rescaled or not, removing the need to pass the upscale/down shift factors from the texture cache.
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/blit_image.cpp | 65 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/blit_image.h | 22 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 18 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.h | 6 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 2 | 
6 files changed, 53 insertions, 62 deletions
| diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index 37d5e6a6b..dbf1df79c 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -92,7 +92,7 @@ public:      void ReinterpretImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies); -    void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view, bool rescaled) { +    void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view) {          UNIMPLEMENTED();      } diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index 3b652f21b..cd5995897 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp @@ -4,6 +4,7 @@  #include <algorithm> +#include "common/settings.h"  #include "video_core/host_shaders/convert_abgr8_to_d24s8_frag_spv.h"  #include "video_core/host_shaders/convert_d24s8_to_abgr8_frag_spv.h"  #include "video_core/host_shaders/convert_depth_to_float_frag_spv.h" @@ -335,6 +336,17 @@ void BindBlitState(vk::CommandBuffer cmdbuf, VkPipelineLayout layout, const Regi      cmdbuf.SetScissor(0, scissor);      cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants);  } + +VkExtent2D GetConversionExtent(const ImageView& src_image_view) { +    const auto& resolution = Settings::values.resolution_info; +    const bool is_rescaled = src_image_view.IsRescaled(); +    u32 width = src_image_view.size.width; +    u32 height = src_image_view.size.height; +    return VkExtent2D{ +        .width = is_rescaled ? resolution.ScaleUp(width) : width, +        .height = is_rescaled ? resolution.ScaleUp(height) : height, +    }; +}  } // Anonymous namespace  BlitImageHelper::BlitImageHelper(const Device& device_, VKScheduler& scheduler_, @@ -425,61 +437,52 @@ void BlitImageHelper::BlitDepthStencil(const Framebuffer* dst_framebuffer,  }  void BlitImageHelper::ConvertD32ToR32(const Framebuffer* dst_framebuffer, -                                      const ImageView& src_image_view, u32 up_scale, -                                      u32 down_shift) { +                                      const ImageView& src_image_view) {      ConvertDepthToColorPipeline(convert_d32_to_r32_pipeline, dst_framebuffer->RenderPass()); -    Convert(*convert_d32_to_r32_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift); +    Convert(*convert_d32_to_r32_pipeline, dst_framebuffer, src_image_view);  }  void BlitImageHelper::ConvertR32ToD32(const Framebuffer* dst_framebuffer, -                                      const ImageView& src_image_view, u32 up_scale, -                                      u32 down_shift) { +                                      const ImageView& src_image_view) {      ConvertColorToDepthPipeline(convert_r32_to_d32_pipeline, dst_framebuffer->RenderPass()); -    Convert(*convert_r32_to_d32_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift); +    Convert(*convert_r32_to_d32_pipeline, dst_framebuffer, src_image_view);  }  void BlitImageHelper::ConvertD16ToR16(const Framebuffer* dst_framebuffer, -                                      const ImageView& src_image_view, u32 up_scale, -                                      u32 down_shift) { +                                      const ImageView& src_image_view) {      ConvertDepthToColorPipeline(convert_d16_to_r16_pipeline, dst_framebuffer->RenderPass()); -    Convert(*convert_d16_to_r16_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift); +    Convert(*convert_d16_to_r16_pipeline, dst_framebuffer, src_image_view);  }  void BlitImageHelper::ConvertR16ToD16(const Framebuffer* dst_framebuffer, -                                      const ImageView& src_image_view, u32 up_scale, -                                      u32 down_shift) { +                                      const ImageView& src_image_view) {      ConvertColorToDepthPipeline(convert_r16_to_d16_pipeline, dst_framebuffer->RenderPass()); -    Convert(*convert_r16_to_d16_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift); +    Convert(*convert_r16_to_d16_pipeline, dst_framebuffer, src_image_view);  }  void BlitImageHelper::ConvertABGR8ToD24S8(const Framebuffer* dst_framebuffer, -                                          ImageView& src_image_view, u32 up_scale, u32 down_shift) { +                                          const ImageView& src_image_view) {      ConvertPipelineDepthTargetEx(convert_abgr8_to_d24s8_pipeline, dst_framebuffer->RenderPass(),                                   convert_abgr8_to_d24s8_frag); -    ConvertColor(*convert_abgr8_to_d24s8_pipeline, dst_framebuffer, src_image_view, up_scale, -                 down_shift); +    Convert(*convert_abgr8_to_d24s8_pipeline, dst_framebuffer, src_image_view);  }  void BlitImageHelper::ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer, -                                          ImageView& src_image_view, u32 up_scale, u32 down_shift) { +                                          ImageView& src_image_view) {      ConvertPipelineColorTargetEx(convert_d24s8_to_abgr8_pipeline, dst_framebuffer->RenderPass(),                                   convert_d24s8_to_abgr8_frag); -    ConvertDepthStencil(*convert_d24s8_to_abgr8_pipeline, dst_framebuffer, src_image_view, up_scale, -                        down_shift); +    ConvertDepthStencil(*convert_d24s8_to_abgr8_pipeline, dst_framebuffer, src_image_view);  }  void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, -                              const ImageView& src_image_view, u32 up_scale, u32 down_shift) { +                              const ImageView& src_image_view) {      const VkPipelineLayout layout = *one_texture_pipeline_layout;      const VkImageView src_view = src_image_view.Handle(Shader::TextureType::Color2D);      const VkSampler sampler = *nearest_sampler; -    const VkExtent2D extent{ -        .width = std::max((src_image_view.size.width * up_scale) >> down_shift, 1U), -        .height = std::max((src_image_view.size.height * up_scale) >> down_shift, 1U), -    }; +    const VkExtent2D extent = GetConversionExtent(src_image_view); +      scheduler.RequestRenderpass(dst_framebuffer); -    scheduler.Record([pipeline, layout, sampler, src_view, extent, up_scale, down_shift, -                      this](vk::CommandBuffer cmdbuf) { +    scheduler.Record([pipeline, layout, sampler, src_view, extent, this](vk::CommandBuffer cmdbuf) {          const VkOffset2D offset{              .x = 0,              .y = 0, @@ -563,18 +566,16 @@ void BlitImageHelper::ConvertColor(VkPipeline pipeline, const Framebuffer* dst_f  }  void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer, -                                          ImageView& src_image_view, u32 up_scale, u32 down_shift) { +                                          ImageView& src_image_view) {      const VkPipelineLayout layout = *two_textures_pipeline_layout;      const VkImageView src_depth_view = src_image_view.DepthView();      const VkImageView src_stencil_view = src_image_view.StencilView();      const VkSampler sampler = *nearest_sampler; -    const VkExtent2D extent{ -        .width = std::max((src_image_view.size.width * up_scale) >> down_shift, 1U), -        .height = std::max((src_image_view.size.height * up_scale) >> down_shift, 1U), -    }; +    const VkExtent2D extent = GetConversionExtent(src_image_view); +      scheduler.RequestRenderpass(dst_framebuffer); -    scheduler.Record([pipeline, layout, sampler, src_depth_view, src_stencil_view, extent, up_scale, -                      down_shift, this](vk::CommandBuffer cmdbuf) { +    scheduler.Record([pipeline, layout, sampler, src_depth_view, src_stencil_view, extent, +                      this](vk::CommandBuffer cmdbuf) {          const VkOffset2D offset{              .x = 0,              .y = 0, diff --git a/src/video_core/renderer_vulkan/blit_image.h b/src/video_core/renderer_vulkan/blit_image.h index 29a9c9eef..1d9f61a52 100644 --- a/src/video_core/renderer_vulkan/blit_image.h +++ b/src/video_core/renderer_vulkan/blit_image.h @@ -44,33 +44,27 @@ public:                            const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter,                            Tegra::Engines::Fermi2D::Operation operation); -    void ConvertD32ToR32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view, -                         u32 up_scale, u32 down_shift); +    void ConvertD32ToR32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); -    void ConvertR32ToD32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view, -                         u32 up_scale, u32 down_shift); +    void ConvertR32ToD32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); -    void ConvertD16ToR16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view, -                         u32 up_scale, u32 down_shift); +    void ConvertD16ToR16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); -    void ConvertR16ToD16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view, -                         u32 up_scale, u32 down_shift); +    void ConvertR16ToD16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); -    void ConvertABGR8ToD24S8(const Framebuffer* dst_framebuffer, ImageView& src_image_view, -                             u32 up_scale, u32 down_shift); +    void ConvertABGR8ToD24S8(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); -    void ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer, ImageView& src_image_view, -                             u32 up_scale, u32 down_shift); +    void ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer, ImageView& src_image_view);  private:      void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, -                 const ImageView& src_image_view, u32 up_scale, u32 down_shift); +                 const ImageView& src_image_view);      void ConvertColor(VkPipeline pipeline, const Framebuffer* dst_framebuffer,                        ImageView& src_image_view, u32 up_scale, u32 down_shift);      void ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer, -                             ImageView& src_image_view, u32 up_scale, u32 down_shift); +                             ImageView& src_image_view);      [[nodiscard]] VkPipeline FindOrEmplaceColorPipeline(const BlitImagePipelineKey& key); diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index c5ddaf576..dd7daa3a5 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -1057,37 +1057,33 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst      });  } -void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view, -                                       bool rescaled) { -    const u32 up_scale = rescaled ? resolution.up_scale : 1; -    const u32 down_shift = rescaled ? resolution.down_shift : 0; +void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view) {      switch (dst_view.format) {      case PixelFormat::R16_UNORM:          if (src_view.format == PixelFormat::D16_UNORM) { -            return blit_image_helper.ConvertD16ToR16(dst, src_view, up_scale, down_shift); +            return blit_image_helper.ConvertD16ToR16(dst, src_view);          }          break;      case PixelFormat::A8B8G8R8_UNORM:          if (src_view.format == PixelFormat::S8_UINT_D24_UNORM) { -            return blit_image_helper.ConvertD24S8ToABGR8(dst, src_view, up_scale, down_shift); +            return blit_image_helper.ConvertD24S8ToABGR8(dst, src_view);          }          break;      case PixelFormat::R32_FLOAT:          if (src_view.format == PixelFormat::D32_FLOAT) { -            return blit_image_helper.ConvertD32ToR32(dst, src_view, up_scale, down_shift); +            return blit_image_helper.ConvertD32ToR32(dst, src_view);          }          break;      case PixelFormat::D16_UNORM:          if (src_view.format == PixelFormat::R16_UNORM) { -            return blit_image_helper.ConvertR16ToD16(dst, src_view, up_scale, down_shift); +            return blit_image_helper.ConvertR16ToD16(dst, src_view);          }          break;      case PixelFormat::S8_UINT_D24_UNORM: -        return blit_image_helper.ConvertABGR8ToD24S8(dst, src_view, up_scale, down_shift); -        break; +        return blit_image_helper.ConvertABGR8ToD24S8(dst, src_view);      case PixelFormat::D32_FLOAT:          if (src_view.format == PixelFormat::R32_FLOAT) { -            return blit_image_helper.ConvertR32ToD32(dst, src_view, up_scale, down_shift); +            return blit_image_helper.ConvertR32ToD32(dst, src_view);          }          break;      default: diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index e80978842..c592f2666 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -65,7 +65,7 @@ public:      void ReinterpretImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies); -    void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view, bool rescaled); +    void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view);      bool CanAccelerateImageUpload(Image&) const noexcept {          return false; @@ -191,6 +191,8 @@ public:      [[nodiscard]] VkImageView StorageView(Shader::TextureType texture_type,                                            Shader::ImageFormat image_format); +    [[nodiscard]] bool IsRescaled() const noexcept; +      [[nodiscard]] VkImageView Handle(Shader::TextureType texture_type) const noexcept {          return *image_views[static_cast<size_t>(texture_type)];      } @@ -215,8 +217,6 @@ public:          return buffer_size;      } -    [[nodiscard]] bool IsRescaled() const noexcept; -  private:      struct StorageViews {          std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> signeds; diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 565b99254..43ebf4ce1 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -1849,7 +1849,7 @@ void TextureCache<P>::CopyImage(ImageId dst_id, ImageId src_id, std::vector<Imag          };          UNIMPLEMENTED_IF(copy.extent != expected_size); -        runtime.ConvertImage(dst_framebuffer, dst_view, src_view, is_rescaled); +        runtime.ConvertImage(dst_framebuffer, dst_view, src_view);      }  } | 
