Program Listing for File VkScopedImage.h

Return to documentation for file (Source\Azura\RenderSystem\Inc\Vulkan\VkScopedImage.h)

#pragma once

#include <vulkan/vulkan_core.h>
#include "Types.h"
#include "Log/Log.h"
#include "Generic/TextureManager.h"

namespace Azura {
namespace Vulkan {

struct ImageTransition {
  VkImageLayout m_layout;
  VkAccessFlags m_accessMask;
  VkPipelineStageFlags m_stageMask;
};

class VkScopedImage {
public:
  VkScopedImage(VkDevice device,
                const TextureDesc& textureDesc,
                VkImageUsageFlags usage,
                const VkPhysicalDeviceMemoryProperties& physicalDeviceMemoryProperties,
                Log logger);

  VkScopedImage(VkDevice device,
    const TextureDesc& textureDesc,
    VkImage image,
    Log logger);

  explicit VkScopedImage(Log logger);

  void Create(VkDevice device,
              const TextureDesc& textureDesc,
              VkImageUsageFlags usage,
              const VkPhysicalDeviceMemoryProperties& physicalDeviceMemoryProperties);

  VkImage Real() const;
  VkImageView View() const;
  VkDeviceMemory Memory() const;

  VkFormat GetRealFormat() const;
  RawStorageFormat GetFormat() const;

  void CleanUp() const;

  void TransitionLayout(VkCommandBuffer commandBuffer,
                        ImageTransition oldTransition,
                        ImageTransition newTransition) const;
  void CopyFromBuffer(VkCommandBuffer commandBuffer, const TextureBufferInfo& bufferInfo, VkBuffer buffer) const;

  void CreateImageView(ImageViewType imageView);

private:
  VkDevice m_device;

  VkImage m_image{};
  VkImageView m_imageView{};
  VkDeviceMemory m_memory{};

  TextureDesc m_desc;

  const Log log_VulkanRenderSystem;
};

} // namespace Vulkan
} // namespace Azura