336{
339 "Attempted to initialize null VKImage");
340 return;
341 }
342
343 if (
image->is_initialized()) {
345 "VKImage already initialized, skipping");
346 return;
347 }
348
349
350
351
352
353 vk::ImageCreateInfo image_info {};
354
355 switch (
image->get_type()) {
357 image_info.imageType = vk::ImageType::e1D;
358 break;
361 image_info.imageType = vk::ImageType::e2D;
362 break;
364 image_info.imageType = vk::ImageType::e3D;
365 break;
366 }
367
368 image_info.extent.width =
image->get_width();
369 image_info.extent.height =
image->get_height();
370 image_info.extent.depth =
image->get_depth();
371 image_info.mipLevels =
image->get_mip_levels();
372 image_info.arrayLayers =
image->get_array_layers();
373 image_info.format =
image->get_format();
374 image_info.tiling = vk::ImageTiling::eOptimal;
375 image_info.initialLayout = vk::ImageLayout::eUndefined;
376 image_info.usage =
image->get_usage_flags();
377 image_info.sharingMode = vk::SharingMode::eExclusive;
378 image_info.samples = vk::SampleCountFlagBits::e1;
380 ? vk::ImageCreateFlagBits::eCubeCompatible
381 : vk::ImageCreateFlags {};
382
383 vk::Image vk_image;
384 try {
386 } catch (const vk::SystemError& e) {
390 std::source_location::current(),
391 "Failed to create VkImage: " + std::string(e.what()));
392 }
393
394
395
396
397
398 vk::MemoryRequirements mem_requirements;
400
401 vk::MemoryAllocateInfo alloc_info {};
402 alloc_info.allocationSize = mem_requirements.size;
404 mem_requirements.memoryTypeBits,
405 image->get_memory_properties());
406
407 vk::DeviceMemory memory;
408 try {
410 } catch (const vk::SystemError& e) {
415 std::source_location::current(),
416 "Failed to allocate VkDeviceMemory for image: " + std::string(e.what()));
417 }
418
419
420
421
422
423 try {
425 } catch (const vk::SystemError& e) {
431 std::source_location::current(),
432 "Failed to bind memory to VkImage: " + std::string(e.what()));
433 }
434
435
436
437
438
439 vk::ImageViewCreateInfo view_info {};
440
441 switch (
image->get_type()) {
443 view_info.viewType = (
image->get_array_layers() > 1)
444 ? vk::ImageViewType::e1DArray
445 : vk::ImageViewType::e1D;
446 break;
448 view_info.viewType = (
image->get_array_layers() > 1)
449 ? vk::ImageViewType::e2DArray
450 : vk::ImageViewType::e2D;
451 break;
453 view_info.viewType = vk::ImageViewType::e3D;
454 break;
456 view_info.viewType = vk::ImageViewType::eCube;
457 break;
458 }
459
460 view_info.image = vk_image;
461 view_info.format =
image->get_format();
462 view_info.subresourceRange.aspectMask =
image->get_aspect_flags();
463 view_info.subresourceRange.baseMipLevel = 0;
464 view_info.subresourceRange.levelCount =
image->get_mip_levels();
465 view_info.subresourceRange.baseArrayLayer = 0;
466 view_info.subresourceRange.layerCount =
image->get_array_layers();
467
468 view_info.components.r = vk::ComponentSwizzle::eIdentity;
469 view_info.components.g = vk::ComponentSwizzle::eIdentity;
470 view_info.components.b = vk::ComponentSwizzle::eIdentity;
471 view_info.components.a = vk::ComponentSwizzle::eIdentity;
472
473 vk::ImageView image_view;
474 try {
476 } catch (const vk::SystemError& e) {
482 std::source_location::current(),
483 "Failed to create VkImageView: " + std::string(e.what()));
484 }
485
486
487
488
489
490 VKImageResources resources {};
491 resources.image = vk_image;
492 resources.image_view = image_view;
493 resources.memory = memory;
494 resources.sampler = nullptr;
495
496 image->set_image_resources(resources);
497 image->set_current_layout(vk::ImageLayout::eUndefined);
498
500 "VKImage initialized: {}x{}x{}, format: {}, {} mips, {} layers",
502 vk::to_string(
image->get_format()),
503 image->get_mip_levels(),
image->get_array_layers());
504}
#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.