MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
VKImage.cpp
Go to the documentation of this file.
1#include "VKImage.hpp"
3
4namespace MayaFlux::Core {
5
7 uint32_t width,
8 uint32_t height,
9 uint32_t depth,
10 vk::Format format,
11 Usage usage,
12 Type type,
13 uint32_t mip_levels,
14 uint32_t array_layers,
15 Kakshya::DataModality modality)
16 : m_width(width)
17 , m_height(height)
18 , m_depth(depth)
19 , m_format(format)
20 , m_usage(usage)
21 , m_type(type)
22 , m_mip_levels(mip_levels)
23 , m_array_layers(array_layers)
24 , m_modality(modality)
25{
27}
28
34
35vk::ImageUsageFlags VKImage::get_usage_flags() const
36{
37 vk::ImageUsageFlags flags = vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst;
38
39 switch (m_usage) {
41 flags |= vk::ImageUsageFlagBits::eSampled;
42 break;
43
45 flags |= vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled;
46 break;
47
49 flags |= vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eSampled;
50 break;
51
52 case Usage::STORAGE:
53 flags |= vk::ImageUsageFlagBits::eStorage | vk::ImageUsageFlagBits::eSampled;
54 break;
55
57 // Already included above
58 break;
59
61 // Already included above
62 break;
63
64 case Usage::STAGING:
65 // Staging images are rare in Vulkan (usually use buffers)
66 // Just transfer ops
67 break;
68 }
69
70 return flags;
71}
72
73vk::MemoryPropertyFlags VKImage::get_memory_properties() const
74{
75 if (is_host_visible()) {
76 return vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
77 }
78
79 return vk::MemoryPropertyFlagBits::eDeviceLocal;
80}
81
82vk::ImageAspectFlags VKImage::get_aspect_flags() const
83{
85 switch (m_format) {
86 case vk::Format::eD16UnormS8Uint:
87 case vk::Format::eD24UnormS8Uint:
88 case vk::Format::eD32SfloatS8Uint:
89 return vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
90
91 case vk::Format::eD16Unorm:
92 case vk::Format::eD32Sfloat:
93 case vk::Format::eX8D24UnormPack32:
94 return vk::ImageAspectFlagBits::eDepth;
95
96 case vk::Format::eS8Uint:
97 return vk::ImageAspectFlagBits::eStencil;
98
99 default:
100 return vk::ImageAspectFlagBits::eDepth;
101 }
102 }
103
104 return vk::ImageAspectFlagBits::eColor;
105}
106
108{
109 size_t bytes_per_pixel = 0;
110
111 switch (m_format) {
112 case vk::Format::eR8Unorm:
113 case vk::Format::eR8Snorm:
114 case vk::Format::eR8Uint:
115 case vk::Format::eR8Sint:
116 bytes_per_pixel = 1;
117 break;
118
119 case vk::Format::eR8G8Unorm:
120 case vk::Format::eR8G8Snorm:
121 case vk::Format::eR8G8Uint:
122 case vk::Format::eR8G8Sint:
123 case vk::Format::eR16Unorm:
124 case vk::Format::eR16Snorm:
125 case vk::Format::eR16Uint:
126 case vk::Format::eR16Sint:
127 case vk::Format::eR16Sfloat:
128 bytes_per_pixel = 2;
129 break;
130
131 case vk::Format::eR8G8B8Unorm:
132 case vk::Format::eR8G8B8Snorm:
133 case vk::Format::eR8G8B8Uint:
134 case vk::Format::eR8G8B8Sint:
135 case vk::Format::eB8G8R8Unorm:
136 bytes_per_pixel = 3;
137 break;
138
139 case vk::Format::eR8G8B8A8Unorm:
140 case vk::Format::eR8G8B8A8Snorm:
141 case vk::Format::eR8G8B8A8Uint:
142 case vk::Format::eR8G8B8A8Sint:
143 case vk::Format::eR8G8B8A8Srgb:
144 case vk::Format::eB8G8R8A8Unorm:
145 case vk::Format::eB8G8R8A8Srgb:
146 case vk::Format::eR16G16Unorm:
147 case vk::Format::eR16G16Snorm:
148 case vk::Format::eR16G16Uint:
149 case vk::Format::eR16G16Sint:
150 case vk::Format::eR16G16Sfloat:
151 case vk::Format::eR32Uint:
152 case vk::Format::eR32Sint:
153 case vk::Format::eR32Sfloat:
154 case vk::Format::eD24UnormS8Uint:
155 case vk::Format::eD32Sfloat:
156 bytes_per_pixel = 4;
157 break;
158
159 case vk::Format::eR16G16B16A16Unorm:
160 case vk::Format::eR16G16B16A16Snorm:
161 case vk::Format::eR16G16B16A16Uint:
162 case vk::Format::eR16G16B16A16Sint:
163 case vk::Format::eR16G16B16A16Sfloat:
164 case vk::Format::eR32G32Uint:
165 case vk::Format::eR32G32Sint:
166 case vk::Format::eR32G32Sfloat:
167 bytes_per_pixel = 8;
168 break;
169
170 case vk::Format::eR32G32B32Uint:
171 case vk::Format::eR32G32B32Sint:
172 case vk::Format::eR32G32B32Sfloat:
173 bytes_per_pixel = 12;
174 break;
175
176 case vk::Format::eR32G32B32A32Uint:
177 case vk::Format::eR32G32B32A32Sint:
178 case vk::Format::eR32G32B32A32Sfloat:
179 bytes_per_pixel = 16;
180 break;
181
182 default:
183 // Fallback: assume 4 bytes per pixel for unknown formats
184 bytes_per_pixel = 4;
186 "Unknown format for size calculation, assuming 4 bytes/pixel");
187 break;
188 }
189
190 size_t total_size = 0;
191 uint32_t mip_width = m_width;
192 uint32_t mip_height = m_height;
193 uint32_t mip_depth = m_depth;
194
195 for (uint32_t i = 0; i < m_mip_levels; ++i) {
196 total_size += static_cast<size_t>(mip_width) * mip_height * mip_depth * bytes_per_pixel;
197
198 mip_width = std::max(1U, mip_width / 2);
199 mip_height = std::max(1U, mip_height / 2);
200 mip_depth = std::max(1U, mip_depth / 2);
201 }
202
203 // Multiply by array layers (e.g., 6 for cubemaps)
204 total_size *= m_array_layers;
205
206 return total_size;
207}
208
210{
211 using namespace Kakshya;
212
213 m_dimensions.clear();
214
215 switch (m_type) {
216 case Type::TYPE_1D:
217 m_dimensions.push_back(DataDimension::spatial_1d(m_width));
218 break;
219
220 case Type::TYPE_2D:
221 m_dimensions.push_back(DataDimension::spatial_2d(m_width, m_height));
222 break;
223
224 case Type::TYPE_3D:
225 m_dimensions.push_back(DataDimension::spatial_3d(m_width, m_height, m_depth));
226 break;
227
228 case Type::TYPE_CUBE:
229 m_dimensions.push_back(DataDimension::grouped("cubemap_faces", 6, 2));
230
231 break;
232 }
233
234 uint32_t num_channels = 0;
235 switch (m_format) {
236 case vk::Format::eR8Unorm:
237 case vk::Format::eR16Unorm:
238 case vk::Format::eR32Sfloat:
239 num_channels = 1;
240 break;
241
242 case vk::Format::eR8G8Unorm:
243 case vk::Format::eR16G16Unorm:
244 case vk::Format::eR32G32Sfloat:
245 num_channels = 2;
246 break;
247
248 case vk::Format::eR8G8B8Unorm:
249 case vk::Format::eB8G8R8Unorm:
250 num_channels = 3;
251 break;
252
253 case vk::Format::eR8G8B8A8Unorm:
254 case vk::Format::eB8G8R8A8Unorm:
255 case vk::Format::eR8G8B8A8Srgb:
256 case vk::Format::eR16G16B16A16Unorm:
257 case vk::Format::eR32G32B32A32Sfloat:
258 default:
259 num_channels = 4; // Assume RGBA for unknown formats
260 break;
261 }
262
263 if (num_channels > 0) {
264 m_dimensions.push_back(DataDimension::channel(num_channels));
265 }
266
267 if (m_mip_levels > 1) {
268 m_dimensions.push_back(DataDimension::mipmap_levels(m_mip_levels));
269 }
270
271 if (m_array_layers > 1 && m_type != Type::TYPE_CUBE) {
272 m_dimensions.push_back(DataDimension::grouped("cubemap_faces", 6, 2));
273 }
274
276 "VKImage dimensions inferred: {}x{}x{}, {} channels, {} mips, {} layers",
278}
279
280} // namespace MayaFlux::Core
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
vk::ImageAspectFlags get_aspect_flags() const
Get appropriate VkImageAspectFlags based on format.
Definition VKImage.cpp:82
vk::ImageUsageFlags get_usage_flags() const
Get appropriate VkImageUsageFlags based on Usage.
Definition VKImage.cpp:35
vk::MemoryPropertyFlags get_memory_properties() const
Get appropriate VkMemoryPropertyFlags based on Usage.
Definition VKImage.cpp:73
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:107
void infer_dimensions_from_parameters()
Infer Kakshya::DataDimension entries from image parameters.
Definition VKImage.cpp:209
void set_modality(Kakshya::DataModality modality)
Update the semantic modality and re-infer dimensions.
Definition VKImage.cpp:29
std::vector< Kakshya::DataDimension > m_dimensions
Definition VKImage.hpp:219
Kakshya::DataModality m_modality
Definition VKImage.hpp:218
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:78