MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
VKImage.cpp
Go to the documentation of this file.
1#include "VKImage.hpp"
2
5
6namespace MayaFlux::Core {
7
9 uint32_t width,
10 uint32_t height,
11 uint32_t depth,
12 vk::Format format,
13 Usage usage,
14 Type type,
15 uint32_t mip_levels,
16 uint32_t array_layers,
17 Kakshya::DataModality modality)
18 : m_width(width)
19 , m_height(height)
20 , m_depth(depth)
21 , m_format(format)
22 , m_usage(usage)
23 , m_type(type)
24 , m_mip_levels(mip_levels)
25 , m_array_layers(array_layers)
26 , m_modality(modality)
27{
29}
30
36
37vk::ImageUsageFlags VKImage::get_usage_flags() const
38{
39 vk::ImageUsageFlags flags = vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst;
40
41 switch (m_usage) {
43 flags |= vk::ImageUsageFlagBits::eSampled;
44 break;
45
47 flags |= vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled;
48 break;
49
51 flags |= vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eSampled;
52 break;
53
54 case Usage::STORAGE:
55 flags |= vk::ImageUsageFlagBits::eStorage | vk::ImageUsageFlagBits::eSampled;
56 break;
57
60 case Usage::STAGING:
61 // Staging images are rare in Vulkan (usually use buffers)
62 // Just transfer ops
63 break;
64 }
65
66 return flags;
67}
68
69vk::MemoryPropertyFlags VKImage::get_memory_properties() const
70{
71 if (is_host_visible()) {
72 return vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
73 }
74
75 return vk::MemoryPropertyFlagBits::eDeviceLocal;
76}
77
78vk::ImageAspectFlags VKImage::get_aspect_flags() const
79{
81 switch (m_format) {
82 case vk::Format::eD16UnormS8Uint:
83 case vk::Format::eD24UnormS8Uint:
84 case vk::Format::eD32SfloatS8Uint:
85 return vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
86
87 case vk::Format::eD16Unorm:
88 case vk::Format::eD32Sfloat:
89 case vk::Format::eX8D24UnormPack32:
90 return vk::ImageAspectFlagBits::eDepth;
91
92 case vk::Format::eS8Uint:
93 return vk::ImageAspectFlagBits::eStencil;
94
95 default:
96 return vk::ImageAspectFlagBits::eDepth;
97 }
98 }
99
100 return vk::ImageAspectFlagBits::eColor;
101}
102
104{
105 const size_t bpp = vk_format_bytes_per_pixel(m_format);
106
107 size_t total = 0;
108 uint32_t mip_w = m_width;
109 uint32_t mip_h = m_height;
110 uint32_t mip_d = m_depth;
111
112 for (uint32_t i = 0; i < m_mip_levels; ++i) {
113 total += static_cast<size_t>(mip_w) * mip_h * mip_d * bpp;
114 mip_w = std::max(1U, mip_w / 2);
115 mip_h = std::max(1U, mip_h / 2);
116 mip_d = std::max(1U, mip_d / 2);
117 }
118
119 return total * m_array_layers;
120}
121
123{
124 using namespace Kakshya;
125
126 m_dimensions.clear();
127
128 switch (m_type) {
129 case Type::TYPE_1D:
130 m_dimensions.push_back(DataDimension::spatial_1d(m_width));
131 break;
132
133 case Type::TYPE_2D:
134 m_dimensions.push_back(DataDimension::spatial_2d(m_width, m_height));
135 break;
136
137 case Type::TYPE_3D:
138 m_dimensions.push_back(DataDimension::spatial_3d(m_width, m_height, m_depth));
139 break;
140
141 case Type::TYPE_CUBE:
142 m_dimensions.push_back(DataDimension::grouped("cubemap_faces", 6, 2));
143
144 break;
145 }
146
147 uint32_t num_channels = 0;
148 switch (m_format) {
149 case vk::Format::eR8Unorm:
150 case vk::Format::eR16Unorm:
151 case vk::Format::eR32Sfloat:
152 num_channels = 1;
153 break;
154
155 case vk::Format::eR8G8Unorm:
156 case vk::Format::eR16G16Unorm:
157 case vk::Format::eR32G32Sfloat:
158 num_channels = 2;
159 break;
160
161 case vk::Format::eR8G8B8Unorm:
162 case vk::Format::eB8G8R8Unorm:
163 num_channels = 3;
164 break;
165
166 case vk::Format::eR8G8B8A8Unorm:
167 case vk::Format::eB8G8R8A8Unorm:
168 case vk::Format::eR8G8B8A8Srgb:
169 case vk::Format::eR16G16B16A16Unorm:
170 case vk::Format::eR32G32B32A32Sfloat:
171 default:
172 num_channels = 4; // Assume RGBA for unknown formats
173 break;
174 }
175
176 if (num_channels > 0) {
177 m_dimensions.push_back(DataDimension::channel(num_channels));
178 }
179
180 if (m_mip_levels > 1) {
181 m_dimensions.push_back(DataDimension::mipmap_levels(m_mip_levels));
182 }
183
184 if (m_array_layers > 1 && m_type != Type::TYPE_CUBE) {
185 m_dimensions.push_back(DataDimension::grouped("cubemap_faces", 6, 2));
186 }
187
189 "VKImage dimensions inferred: {}x{}x{}, {} channels, {} mips, {} layers",
191}
192
193} // namespace MayaFlux::Core
#define MF_DEBUG(comp, ctx,...)
vk::ImageAspectFlags get_aspect_flags() const
Get appropriate VkImageAspectFlags based on format.
Definition VKImage.cpp:78
vk::ImageUsageFlags get_usage_flags() const
Get appropriate VkImageUsageFlags based on Usage.
Definition VKImage.cpp:37
vk::MemoryPropertyFlags get_memory_properties() const
Get appropriate VkMemoryPropertyFlags based on Usage.
Definition VKImage.cpp:69
bool is_host_visible() const
Whether this image should be host-visible (staging images)
Definition VKImage.hpp:196
@ RENDER_TARGET
Color attachment for rendering.
@ STORAGE
Storage image (compute shader read/write)
@ TRANSFER_SRC
Transfer source.
@ TRANSFER_DST
Transfer destination.
@ STAGING
Host-visible staging image (rare)
@ TEXTURE_2D
Sampled texture (shader read)
@ DEPTH_STENCIL
Depth/stencil attachment.
size_t get_size_bytes() const
Get total size in bytes (for memory allocation)
Definition VKImage.cpp:103
void infer_dimensions_from_parameters()
Infer Kakshya::DataDimension entries from image parameters.
Definition VKImage.cpp:122
void set_modality(Kakshya::DataModality modality)
Update the semantic modality and re-infer dimensions.
Definition VKImage.cpp:31
std::vector< Kakshya::DataDimension > m_dimensions
Definition VKImage.hpp:219
Kakshya::DataModality m_modality
Definition VKImage.hpp:218
uint32_t vk_format_bytes_per_pixel(vk::Format fmt)
Byte width of a single pixel for a given Vulkan format.
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:78