vk_image.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright 2018 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <memory>
  6. #include <vector>
  7. #include "common/common_types.h"
  8. #include "video_core/renderer_vulkan/wrapper.h"
  9. namespace Vulkan {
  10. class VKDevice;
  11. class VKScheduler;
  12. class VKImage {
  13. public:
  14. explicit VKImage(const VKDevice& device, VKScheduler& scheduler,
  15. const VkImageCreateInfo& image_ci, VkImageAspectFlags aspect_mask);
  16. ~VKImage();
  17. /// Records in the passed command buffer an image transition and updates the state of the image.
  18. void Transition(u32 base_layer, u32 num_layers, u32 base_level, u32 num_levels,
  19. VkPipelineStageFlags new_stage_mask, VkAccessFlags new_access,
  20. VkImageLayout new_layout);
  21. /// Returns a view compatible with presentation, the image has to be 2D.
  22. VkImageView GetPresentView() {
  23. if (!present_view) {
  24. CreatePresentView();
  25. }
  26. return *present_view;
  27. }
  28. /// Returns the Vulkan image handler.
  29. const vk::Image& GetHandle() const {
  30. return image;
  31. }
  32. /// Returns the Vulkan format for this image.
  33. VkFormat GetFormat() const {
  34. return format;
  35. }
  36. /// Returns the Vulkan aspect mask.
  37. VkImageAspectFlags GetAspectMask() const {
  38. return aspect_mask;
  39. }
  40. private:
  41. struct SubrangeState final {
  42. VkAccessFlags access = 0; ///< Current access bits.
  43. VkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED; ///< Current image layout.
  44. };
  45. bool HasChanged(u32 base_layer, u32 num_layers, u32 base_level, u32 num_levels,
  46. VkAccessFlags new_access, VkImageLayout new_layout) noexcept;
  47. /// Creates a presentation view.
  48. void CreatePresentView();
  49. /// Returns the subrange state for a layer and layer.
  50. SubrangeState& GetSubrangeState(u32 layer, u32 level) noexcept;
  51. const VKDevice& device; ///< Device handler.
  52. VKScheduler& scheduler; ///< Device scheduler.
  53. const VkFormat format; ///< Vulkan format.
  54. const VkImageAspectFlags aspect_mask; ///< Vulkan aspect mask.
  55. const u32 image_num_layers; ///< Number of layers.
  56. const u32 image_num_levels; ///< Number of mipmap levels.
  57. vk::Image image; ///< Image handle.
  58. vk::ImageView present_view; ///< Image view compatible with presentation.
  59. std::vector<VkImageMemoryBarrier> barriers; ///< Pool of barriers.
  60. std::vector<SubrangeState> subrange_states; ///< Current subrange state.
  61. bool state_diverged = false; ///< True when subresources mismatch in layout.
  62. };
  63. } // namespace Vulkan