vk_smaa.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include "video_core/vulkan_common/vulkan_memory_allocator.h"
  6. #include "video_core/vulkan_common/vulkan_wrapper.h"
  7. namespace Vulkan {
  8. class Device;
  9. class Scheduler;
  10. class StagingBufferPool;
  11. class SMAA {
  12. public:
  13. explicit SMAA(const Device& device, MemoryAllocator& allocator, size_t image_count,
  14. VkExtent2D extent);
  15. VkImageView Draw(Scheduler& scheduler, size_t image_index, VkImage source_image,
  16. VkImageView source_image_view);
  17. private:
  18. enum SMAAStage {
  19. EdgeDetection = 0,
  20. BlendingWeightCalculation = 1,
  21. NeighborhoodBlending = 2,
  22. MaxSMAAStage = 3,
  23. };
  24. enum StaticImageType {
  25. Area = 0,
  26. Search = 1,
  27. MaxStaticImage = 2,
  28. };
  29. enum DynamicImageType {
  30. Blend = 0,
  31. Edges = 1,
  32. Output = 2,
  33. MaxDynamicImage = 3,
  34. };
  35. void CreateImages();
  36. void CreateRenderPasses();
  37. void CreateSampler();
  38. void CreateShaders();
  39. void CreateDescriptorPool();
  40. void CreateDescriptorSetLayouts();
  41. void CreateDescriptorSets();
  42. void CreatePipelineLayouts();
  43. void CreatePipelines();
  44. void UpdateDescriptorSets(VkImageView image_view, size_t image_index);
  45. void UploadImages(Scheduler& scheduler);
  46. const Device& m_device;
  47. MemoryAllocator& m_allocator;
  48. const VkExtent2D m_extent;
  49. const u32 m_image_count;
  50. vk::DescriptorPool m_descriptor_pool{};
  51. std::array<vk::DescriptorSetLayout, MaxSMAAStage> m_descriptor_set_layouts{};
  52. std::array<vk::PipelineLayout, MaxSMAAStage> m_pipeline_layouts{};
  53. std::array<vk::ShaderModule, MaxSMAAStage> m_vertex_shaders{};
  54. std::array<vk::ShaderModule, MaxSMAAStage> m_fragment_shaders{};
  55. std::array<vk::Pipeline, MaxSMAAStage> m_pipelines{};
  56. std::array<vk::RenderPass, MaxSMAAStage> m_renderpasses{};
  57. std::array<vk::Image, MaxStaticImage> m_static_images{};
  58. std::array<vk::ImageView, MaxStaticImage> m_static_image_views{};
  59. struct Images {
  60. vk::DescriptorSets descriptor_sets{};
  61. std::array<vk::Image, MaxDynamicImage> images{};
  62. std::array<vk::ImageView, MaxDynamicImage> image_views{};
  63. std::array<vk::Framebuffer, MaxSMAAStage> framebuffers{};
  64. };
  65. std::vector<Images> m_dynamic_images{};
  66. bool m_images_ready{};
  67. vk::Sampler m_sampler{};
  68. };
  69. } // namespace Vulkan