356{
359 "Attempted to initialize null VKImage");
360 return;
361 }
362
363 if (
image->is_initialized()) {
365 "VKImage already initialized, skipping");
366 return;
367 }
368
369
370
371
372
373 vk::ImageCreateInfo image_info {};
374
375 switch (
image->get_type()) {
377 image_info.imageType = vk::ImageType::e1D;
378 break;
381 image_info.imageType = vk::ImageType::e2D;
382 break;
384 image_info.imageType = vk::ImageType::e3D;
385 break;
386 }
387
388 image_info.extent.width =
image->get_width();
389 image_info.extent.height =
image->get_height();
390 image_info.extent.depth =
image->get_depth();
391 image_info.mipLevels =
image->get_mip_levels();
392 image_info.arrayLayers =
image->get_array_layers();
393 image_info.format =
image->get_format();
394 image_info.tiling = vk::ImageTiling::eOptimal;
395 image_info.initialLayout = vk::ImageLayout::eUndefined;
396 image_info.usage =
image->get_usage_flags();
397 image_info.sharingMode = vk::SharingMode::eExclusive;
398 image_info.samples = vk::SampleCountFlagBits::e1;
400 ? vk::ImageCreateFlagBits::eCubeCompatible
401 : vk::ImageCreateFlags {};
402
403 vk::Image vk_image;
404 try {
406 } catch (const vk::SystemError& e) {
410 std::source_location::current(),
411 "Failed to create VkImage: " + std::string(e.what()));
412 }
413
414
415
416
417
418 vk::MemoryRequirements mem_requirements;
420
421 vk::MemoryAllocateInfo alloc_info {};
422 alloc_info.allocationSize = mem_requirements.size;
424 mem_requirements.memoryTypeBits,
425 image->get_memory_properties());
426
427 vk::DeviceMemory memory;
428 try {
430 } catch (const vk::SystemError& e) {
435 std::source_location::current(),
436 "Failed to allocate VkDeviceMemory for image: " + std::string(e.what()));
437 }
438
439
440
441
442
443 try {
445 } catch (const vk::SystemError& e) {
451 std::source_location::current(),
452 "Failed to bind memory to VkImage: " + std::string(e.what()));
453 }
454
455
456
457
458
459 vk::ImageViewCreateInfo view_info {};
460
461 switch (
image->get_type()) {
463 view_info.viewType = (
image->get_array_layers() > 1)
464 ? vk::ImageViewType::e1DArray
465 : vk::ImageViewType::e1D;
466 break;
468 view_info.viewType = (
image->get_array_layers() > 1)
469 ? vk::ImageViewType::e2DArray
470 : vk::ImageViewType::e2D;
471 break;
473 view_info.viewType = vk::ImageViewType::e3D;
474 break;
476 view_info.viewType = vk::ImageViewType::eCube;
477 break;
478 }
479
480 view_info.image = vk_image;
481 view_info.format =
image->get_format();
482 view_info.subresourceRange.aspectMask =
image->get_aspect_flags();
483 view_info.subresourceRange.baseMipLevel = 0;
484 view_info.subresourceRange.levelCount =
image->get_mip_levels();
485 view_info.subresourceRange.baseArrayLayer = 0;
486 view_info.subresourceRange.layerCount =
image->get_array_layers();
487
488 view_info.components.r = vk::ComponentSwizzle::eIdentity;
489 view_info.components.g = vk::ComponentSwizzle::eIdentity;
490 view_info.components.b = vk::ComponentSwizzle::eIdentity;
491 view_info.components.a = vk::ComponentSwizzle::eIdentity;
492
493 vk::ImageView image_view;
494 try {
496 } catch (const vk::SystemError& e) {
502 std::source_location::current(),
503 "Failed to create VkImageView: " + std::string(e.what()));
504 }
505
506
507
508
509
510 VKImageResources resources {};
511 resources.image = vk_image;
512 resources.image_view = image_view;
513 resources.memory = memory;
514 resources.sampler = nullptr;
515
516 image->set_image_resources(resources);
517 image->set_current_layout(vk::ImageLayout::eUndefined);
518
520 "VKImage initialized: {}x{}x{}, format: {}, {} mips, {} layers",
522 vk::to_string(
image->get_format()),
523 image->get_mip_levels(),
image->get_array_layers());
524}
#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.
@ 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.