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