sandbox
Loading...
Searching...
No Matches
image.hpp
1#ifndef LIBSBX_GRAPHICS_IMAGES_IMAGE_HPP_
2#define LIBSBX_GRAPHICS_IMAGES_IMAGE_HPP_
3
4#include <cinttypes>
5
6#include <vulkan/vulkan.hpp>
7
8#include <vk_mem_alloc.h>
9
10#include <libsbx/utility/noncopyable.hpp>
11
12#include <libsbx/math/vector2.hpp>
13
14#include <libsbx/graphics/commands/command_buffer.hpp>
15
16#include <libsbx/graphics/descriptor/descriptor.hpp>
17
18namespace sbx::graphics {
19
20class image : public utility::noncopyable, public descriptor {
21
22public:
23
24 image(const VkExtent3D extent, VkFilter filter, VkSamplerAddressMode address_mode, VkSampleCountFlagBits samples, VkImageLayout layout, VkImageUsageFlags usage, VkFormat format, std::uint32_t mip_levels, std::uint32_t array_layers);
25
26 virtual ~image();
27
28 static auto create_descriptor_set_layout_binding(std::uint32_t binding, VkDescriptorType descriptor_type, VkShaderStageFlags shader_stage_flags, std::uint32_t count = 1u) noexcept -> VkDescriptorSetLayoutBinding;
29
30 static auto mip_levels(const VkExtent3D& extent) noexcept -> std::uint32_t;
31
32 static auto find_supported_format(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) noexcept -> VkFormat;
33
34 static auto has_depth_component(VkFormat format) noexcept -> bool;
35
36 static auto has_stencil_component(VkFormat format) noexcept -> bool;
37
38 static auto create_image(VkImage& image, VmaAllocation& allocation, const VkExtent3D& extent, VkFormat format, VkSampleCountFlagBits samples, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, std::uint32_t mip_levels, std::uint32_t array_layers, VkImageType type) -> void;
39
40 static auto create_image_view(const VkImage& image, VkImageView& image_view, VkImageViewType type, VkFormat format, VkImageAspectFlags image_aspect, std::uint32_t mip_levels, std::uint32_t base_mip_level, std::uint32_t layer_count, std::uint32_t base_array_layer) -> void;
41
42 static auto create_image_sampler(VkSampler& sampler, VkFilter filter, VkSamplerAddressMode address_mode, bool anisotropic, std::uint32_t mip_levels) -> void;
43
44 static auto create_mipmaps(const VkImage& image, const VkExtent3D& extent, VkFormat format, VkImageLayout dst_image_layout, std::uint32_t mip_levels, std::uint32_t base_array_layer, std::uint32_t layer_count) -> void;
45
46 static auto transition_image_layout(const VkImage& image, VkFormat format, VkImageLayout src_image_layout, VkImageLayout dst_image_layout, VkImageAspectFlags image_aspect, std::uint32_t mip_levels, std::uint32_t base_mip_level, std::uint32_t layer_count, std::uint32_t base_array_layer) -> void;
47
48 static auto transition_image_layout(command_buffer& command_buffer, const VkImage& image, VkFormat format, VkImageLayout src_image_layout, VkImageLayout dst_image_layout, VkImageAspectFlags image_aspect, std::uint32_t mip_levels, std::uint32_t base_mip_level, std::uint32_t layer_count, std::uint32_t base_array_layer) -> void;
49
50 static auto insert_image_memory_barrier(command_buffer& command_buffer, const VkImage& image, VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask, VkImageLayout old_image_layout, VkImageLayout new_image_layout, VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask, VkImageAspectFlags image_aspect, uint32_t mip_levels, uint32_t base_mip_level, uint32_t layer_count, uint32_t base_array_layer) -> void;
51
52 static auto copy_buffer_to_image(const VkBuffer& buffer, const VkImage& image, const VkExtent3D& extent, std::uint32_t layer_count, std::uint32_t base_array_layer) -> void;
53
54 static auto copy_image_to_buffer(const VkImage& image, VkFormat format, const VkBuffer& buffer, const VkOffset3D& offset, const VkExtent3D& extent, std::uint32_t layer_count, std::uint32_t base_array_layer) -> void;
55
56 static auto copy_image(const VkImage& src_image, VkImage& dst_image, VmaAllocation& dst_allocation, VkFormat src_format, const VkExtent3D& extent, VkImageLayout src_image_layout, std::uint32_t mip_level, std::uint32_t array_layer) -> bool;
57
58 static auto channels_from_format(VkFormat format) -> std::uint8_t;
59
60 auto write_descriptor_set(std::uint32_t binding, VkDescriptorType descriptor_type) const noexcept -> graphics::write_descriptor_set override;
61
62 auto extent() const noexcept -> const VkExtent3D&;
63
64 auto size() const noexcept -> math::vector2u;
65
66 auto format() const noexcept -> VkFormat;
67
68 auto samples() const noexcept -> VkSampleCountFlagBits;
69
70 auto usage() const noexcept -> VkImageUsageFlags;
71
72 auto mip_levels() const noexcept -> std::uint32_t;
73
74 auto array_layers() const noexcept -> std::uint32_t;
75
76 auto filter() const noexcept -> VkFilter;
77
78 auto address_mode() const noexcept -> VkSamplerAddressMode;
79
80 auto layout() const noexcept -> VkImageLayout;
81
82 auto handle() const noexcept -> VkImage;
83
84 operator VkImage() const noexcept;
85
86 auto view() const noexcept -> VkImageView;
87
88 // auto memory() const noexcept -> const VkDeviceMemory&;
89
90 auto sampler() const noexcept -> VkSampler;
91
92protected:
93
94 VkExtent3D _extent;
95
96 VkFilter _filter;
97 VkSamplerAddressMode _address_mode;
98
99 VkSampleCountFlagBits _samples;
100 VkImageLayout _layout;
101 VkImageUsageFlags _usage;
102 VkFormat _format;
103 std::uint32_t _mip_levels;
104 std::uint32_t _array_layers;
105
106 VkImage _handle;
107 VmaAllocation _allocation;
108 // VkDeviceMemory _memory;
109 VkImageView _view;
110 VkSampler _sampler;
111
112}; // class image
113
114} // namespace sbx::graphics
115
116#endif // LIBSBX_GRAPHICS_IMAGES_IMAGE_HPP_
Definition: buffer.hpp:20
Definition: command_buffer.hpp:14
Definition: descriptor.hpp:37
Definition: image.hpp:20
Definition: descriptor.hpp:12
A vector in two-dimensional space.
Definition: vector2.hpp:27
Definition: noncopyable.hpp:6