layer.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "common/math_util.h"
  5. #include "video_core/host1x/gpu_device_memory_manager.h"
  6. #include "video_core/vulkan_common/vulkan_wrapper.h"
  7. namespace Layout {
  8. struct FramebufferLayout;
  9. }
  10. namespace Tegra {
  11. struct FramebufferConfig;
  12. }
  13. namespace Service::android {
  14. enum class PixelFormat : u32;
  15. }
  16. namespace Settings {
  17. enum class AntiAliasing : u32;
  18. }
  19. namespace Vulkan {
  20. class AntiAliasPass;
  21. class Device;
  22. class FSR;
  23. class MemoryAllocator;
  24. struct PresentPushConstants;
  25. class RasterizerVulkan;
  26. class Scheduler;
  27. class Layer final {
  28. public:
  29. explicit Layer(const Device& device, MemoryAllocator& memory_allocator, Scheduler& scheduler,
  30. Tegra::MaxwellDeviceMemoryManager& device_memory, size_t image_count,
  31. VkExtent2D output_size, VkDescriptorSetLayout layout);
  32. ~Layer();
  33. void ConfigureDraw(PresentPushConstants* out_push_constants,
  34. VkDescriptorSet* out_descriptor_set, RasterizerVulkan& rasterizer,
  35. VkSampler sampler, size_t image_index,
  36. const Tegra::FramebufferConfig& framebuffer,
  37. const Layout::FramebufferLayout& layout);
  38. private:
  39. void CreateDescriptorPool();
  40. void CreateDescriptorSets(VkDescriptorSetLayout layout);
  41. void CreateStagingBuffer(const Tegra::FramebufferConfig& framebuffer);
  42. void CreateRawImages(const Tegra::FramebufferConfig& framebuffer);
  43. void CreateFSR(VkExtent2D output_size);
  44. void RefreshResources(const Tegra::FramebufferConfig& framebuffer);
  45. void SetAntiAliasPass();
  46. void ReleaseRawImages();
  47. u64 CalculateBufferSize(const Tegra::FramebufferConfig& framebuffer) const;
  48. u64 GetRawImageOffset(const Tegra::FramebufferConfig& framebuffer, size_t image_index) const;
  49. void SetMatrixData(PresentPushConstants& data, const Layout::FramebufferLayout& layout) const;
  50. void SetVertexData(PresentPushConstants& data, const Layout::FramebufferLayout& layout,
  51. const Common::Rectangle<f32>& crop) const;
  52. void UpdateDescriptorSet(VkImageView image_view, VkSampler sampler, size_t image_index);
  53. void UpdateRawImage(const Tegra::FramebufferConfig& framebuffer, size_t image_index);
  54. private:
  55. const Device& device;
  56. MemoryAllocator& memory_allocator;
  57. Scheduler& scheduler;
  58. Tegra::MaxwellDeviceMemoryManager& device_memory;
  59. const size_t image_count{};
  60. vk::DescriptorPool descriptor_pool{};
  61. vk::DescriptorSets descriptor_sets{};
  62. vk::Buffer buffer{};
  63. std::vector<vk::Image> raw_images{};
  64. std::vector<vk::ImageView> raw_image_views{};
  65. u32 raw_width{};
  66. u32 raw_height{};
  67. Service::android::PixelFormat pixel_format{};
  68. Settings::AntiAliasing anti_alias_setting{};
  69. std::unique_ptr<AntiAliasPass> anti_alias{};
  70. std::unique_ptr<FSR> fsr{};
  71. std::vector<u64> resource_ticks{};
  72. };
  73. } // namespace Vulkan