MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ initialize_image()

void MayaFlux::Core::BackendResourceManager::initialize_image ( const std::shared_ptr< VKImage > &  image)

Initialize a VKImage (allocate VkImage, memory, and create image view)

Parameters
imageVKImage to initialize

Follows the same pattern as initialize_buffer:

  1. Create VkImage
  2. Allocate VkDeviceMemory
  3. Bind memory to image
  4. Create VkImageView
  5. Store handles in VKImage

Definition at line 237 of file BackendResoureManager.cpp.

238{
239 if (!image) {
241 "Attempted to initialize null VKImage");
242 return;
243 }
244
245 if (image->is_initialized()) {
247 "VKImage already initialized, skipping");
248 return;
249 }
250
251 // ========================================================================
252 // Step 1: Create VkImage
253 // ========================================================================
254
255 vk::ImageCreateInfo image_info {};
256
257 switch (image->get_type()) {
259 image_info.imageType = vk::ImageType::e1D;
260 break;
263 image_info.imageType = vk::ImageType::e2D;
264 break;
266 image_info.imageType = vk::ImageType::e3D;
267 break;
268 }
269
270 image_info.extent.width = image->get_width();
271 image_info.extent.height = image->get_height();
272 image_info.extent.depth = image->get_depth();
273 image_info.mipLevels = image->get_mip_levels();
274 image_info.arrayLayers = image->get_array_layers();
275 image_info.format = image->get_format();
276 image_info.tiling = vk::ImageTiling::eOptimal;
277 image_info.initialLayout = vk::ImageLayout::eUndefined;
278 image_info.usage = image->get_usage_flags();
279 image_info.sharingMode = vk::SharingMode::eExclusive;
280 image_info.samples = vk::SampleCountFlagBits::e1; // No MSAA for now
281 image_info.flags = (image->get_type() == VKImage::Type::TYPE_CUBE)
282 ? vk::ImageCreateFlagBits::eCubeCompatible
283 : vk::ImageCreateFlags {};
284
285 vk::Image vk_image;
286 try {
287 vk_image = m_context.get_device().createImage(image_info);
288 } catch (const vk::SystemError& e) {
292 std::source_location::current(),
293 "Failed to create VkImage: " + std::string(e.what()));
294 }
295
296 // ========================================================================
297 // Step 2: Allocate memory
298 // ========================================================================
299
300 vk::MemoryRequirements mem_requirements;
301 mem_requirements = m_context.get_device().getImageMemoryRequirements(vk_image);
302
303 vk::MemoryAllocateInfo alloc_info {};
304 alloc_info.allocationSize = mem_requirements.size;
305 alloc_info.memoryTypeIndex = find_memory_type(
306 mem_requirements.memoryTypeBits,
307 image->get_memory_properties());
308
309 vk::DeviceMemory memory;
310 try {
311 memory = m_context.get_device().allocateMemory(alloc_info);
312 } catch (const vk::SystemError& e) {
313 m_context.get_device().destroyImage(vk_image);
317 std::source_location::current(),
318 "Failed to allocate VkDeviceMemory for image: " + std::string(e.what()));
319 }
320
321 // ========================================================================
322 // Step 3: Bind memory to image
323 // ========================================================================
324
325 try {
326 m_context.get_device().bindImageMemory(vk_image, memory, 0);
327 } catch (const vk::SystemError& e) {
328 m_context.get_device().freeMemory(memory);
329 m_context.get_device().destroyImage(vk_image);
333 std::source_location::current(),
334 "Failed to bind memory to VkImage: " + std::string(e.what()));
335 }
336
337 // ========================================================================
338 // Step 4: Create image view
339 // ========================================================================
340
341 vk::ImageViewCreateInfo view_info {};
342
343 switch (image->get_type()) {
345 view_info.viewType = (image->get_array_layers() > 1)
346 ? vk::ImageViewType::e1DArray
347 : vk::ImageViewType::e1D;
348 break;
350 view_info.viewType = (image->get_array_layers() > 1)
351 ? vk::ImageViewType::e2DArray
352 : vk::ImageViewType::e2D;
353 break;
355 view_info.viewType = vk::ImageViewType::e3D;
356 break;
358 view_info.viewType = vk::ImageViewType::eCube;
359 break;
360 }
361
362 view_info.image = vk_image;
363 view_info.format = image->get_format();
364 view_info.subresourceRange.aspectMask = image->get_aspect_flags();
365 view_info.subresourceRange.baseMipLevel = 0;
366 view_info.subresourceRange.levelCount = image->get_mip_levels();
367 view_info.subresourceRange.baseArrayLayer = 0;
368 view_info.subresourceRange.layerCount = image->get_array_layers();
369
370 view_info.components.r = vk::ComponentSwizzle::eIdentity;
371 view_info.components.g = vk::ComponentSwizzle::eIdentity;
372 view_info.components.b = vk::ComponentSwizzle::eIdentity;
373 view_info.components.a = vk::ComponentSwizzle::eIdentity;
374
375 vk::ImageView image_view;
376 try {
377 image_view = m_context.get_device().createImageView(view_info);
378 } catch (const vk::SystemError& e) {
379 m_context.get_device().freeMemory(memory);
380 m_context.get_device().destroyImage(vk_image);
384 std::source_location::current(),
385 "Failed to create VkImageView: " + std::string(e.what()));
386 }
387
388 // ========================================================================
389 // Step 5: Store handles in VKImage
390 // ========================================================================
391
392 VKImageResources resources {};
393 resources.image = vk_image;
394 resources.image_view = image_view;
395 resources.memory = memory;
396 resources.sampler = nullptr;
397
398 image->set_image_resources(resources);
399 image->set_current_layout(vk::ImageLayout::eUndefined);
400
402 "VKImage initialized: {}x{}x{}, format: {}, {} mips, {} layers",
403 image->get_width(), image->get_height(), image->get_depth(),
404 vk::to_string(image->get_format()),
405 image->get_mip_levels(), image->get_array_layers());
406}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
uint32_t find_memory_type(uint32_t type_filter, vk::MemoryPropertyFlags properties) const
Find a suitable memory type for Vulkan buffer allocation.
vk::Device get_device() const
Get logical device.
Definition VKContext.hpp:49
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
void error_rethrow(Component component, Context context, std::source_location location=std::source_location::current(), std::string_view additional_context="")
Catch and log an exception, then rethrow it.
@ Core
Core engine, backend, subsystems.

References MayaFlux::Journal::Core, find_memory_type(), MayaFlux::Core::VKContext::get_device(), MayaFlux::Journal::GraphicsBackend, MayaFlux::Core::VKImageResources::image, m_context, MF_ERROR, MF_INFO, MF_WARN, MayaFlux::Core::VKImage::TYPE_1D, MayaFlux::Core::VKImage::TYPE_2D, MayaFlux::Core::VKImage::TYPE_3D, and MayaFlux::Core::VKImage::TYPE_CUBE.

Referenced by MayaFlux::Portal::Graphics::TextureLoom::create_2d(), MayaFlux::Portal::Graphics::TextureLoom::create_3d(), MayaFlux::Portal::Graphics::TextureLoom::create_cubemap(), MayaFlux::Portal::Graphics::TextureLoom::create_depth_buffer(), MayaFlux::Portal::Graphics::TextureLoom::create_render_target(), and MayaFlux::Portal::Graphics::TextureLoom::create_storage_image().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: