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