389{
392 "Attempted to initialize null VKImage");
393 return;
394 }
395
396 if (
image->is_initialized()) {
398 "VKImage already initialized, skipping");
399 return;
400 }
401
402
403
404
405
406 vk::ImageCreateInfo image_info {};
407
408 switch (
image->get_type()) {
410 image_info.imageType = vk::ImageType::e1D;
411 break;
414 image_info.imageType = vk::ImageType::e2D;
415 break;
417 image_info.imageType = vk::ImageType::e3D;
418 break;
419 }
420
421 image_info.extent.width =
image->get_width();
422 image_info.extent.height =
image->get_height();
423 image_info.extent.depth =
image->get_depth();
424 image_info.mipLevels =
image->get_mip_levels();
425 image_info.arrayLayers =
image->get_array_layers();
426 image_info.format =
image->get_format();
427 image_info.tiling = vk::ImageTiling::eOptimal;
428 image_info.initialLayout = vk::ImageLayout::eUndefined;
429 image_info.usage =
image->get_usage_flags();
430 image_info.sharingMode = vk::SharingMode::eExclusive;
431 image_info.samples = vk::SampleCountFlagBits::e1;
433 ? vk::ImageCreateFlagBits::eCubeCompatible
434 : vk::ImageCreateFlags {};
435
436 vk::Image vk_image;
437 try {
439 } catch (const vk::SystemError& e) {
443 std::source_location::current(),
444 "Failed to create VkImage: " + std::string(e.what()));
445 }
446
447
448
449
450
451 vk::MemoryRequirements mem_requirements;
453
454 vk::MemoryAllocateInfo alloc_info {};
455 alloc_info.allocationSize = mem_requirements.size;
457 mem_requirements.memoryTypeBits,
458 image->get_memory_properties());
459
460 vk::DeviceMemory memory;
461 try {
463 } catch (const vk::SystemError& e) {
468 std::source_location::current(),
469 "Failed to allocate VkDeviceMemory for image: " + std::string(e.what()));
470 }
471
472
473
474
475
476 try {
478 } catch (const vk::SystemError& e) {
484 std::source_location::current(),
485 "Failed to bind memory to VkImage: " + std::string(e.what()));
486 }
487
488
489
490
491
492 vk::ImageViewCreateInfo view_info {};
493
494 switch (
image->get_type()) {
496 view_info.viewType = (
image->get_array_layers() > 1)
497 ? vk::ImageViewType::e1DArray
498 : vk::ImageViewType::e1D;
499 break;
501 view_info.viewType = (
image->get_array_layers() > 1)
502 ? vk::ImageViewType::e2DArray
503 : vk::ImageViewType::e2D;
504 break;
506 view_info.viewType = vk::ImageViewType::e3D;
507 break;
509 view_info.viewType = vk::ImageViewType::eCube;
510 break;
511 }
512
513 view_info.image = vk_image;
514 view_info.format =
image->get_format();
515 view_info.subresourceRange.aspectMask =
image->get_aspect_flags();
516 view_info.subresourceRange.baseMipLevel = 0;
517 view_info.subresourceRange.levelCount =
image->get_mip_levels();
518 view_info.subresourceRange.baseArrayLayer = 0;
519 view_info.subresourceRange.layerCount =
image->get_array_layers();
520
521 view_info.components.r = vk::ComponentSwizzle::eIdentity;
522 view_info.components.g = vk::ComponentSwizzle::eIdentity;
523 view_info.components.b = vk::ComponentSwizzle::eIdentity;
524 view_info.components.a = vk::ComponentSwizzle::eIdentity;
525
526 vk::ImageView image_view;
527 try {
529 } catch (const vk::SystemError& e) {
535 std::source_location::current(),
536 "Failed to create VkImageView: " + std::string(e.what()));
537 }
538
539
540
541
542
543 VKImageResources resources {};
544 resources.image = vk_image;
545 resources.image_view = image_view;
546 resources.memory = memory;
547 resources.sampler = nullptr;
548
549 image->set_image_resources(resources);
550 image->set_current_layout(vk::ImageLayout::eUndefined);
551
553 "VKImage initialized: {}x{}x{}, format: {}, {} mips, {} layers",
555 vk::to_string(
image->get_format()),
556 image->get_mip_levels(),
image->get_array_layers());
557}
#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.