VulkanUtils.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "VulkanUtils.hpp"
  2. #include <core/Array.hpp>
  3. #include <core/Logger.hpp>
  4. #include "core/VulkanUtility.hpp"
  5. static u32 getSwapImageCount(const VkSurfaceCapabilitiesKHR* caps) {
  6. u32 c = caps->minImageCount + 1;
  7. // according to VkSurfaceCapabilitiesKHR doc:
  8. // maxImageCount is 0 when there is no strict limit
  9. if(caps->maxImageCount != 0) {
  10. return Core::min(c, caps->maxImageCount);
  11. }
  12. return c;
  13. }
  14. bool initVulkanSwapchain(Swapchain& sc, VulkanSwapchainData* d) {
  15. VkSurfaceCapabilitiesKHR caps = {0};
  16. if(d->base.getSurfaceCapabilities(caps)) {
  17. return true;
  18. }
  19. VkSwapchainCreateInfoKHR ci = {
  20. .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
  21. .surface = d->base,
  22. .minImageCount = getSwapImageCount(&caps),
  23. .imageFormat = d->surfaceFormat.format,
  24. .imageColorSpace = d->surfaceFormat.colorSpace,
  25. .imageExtent = d->size,
  26. .imageArrayLayers = 1,
  27. .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
  28. .imageSharingMode = d->sharingMode,
  29. .queueFamilyIndexCount = static_cast<u32>(d->queueFamilies.getLength()),
  30. .pQueueFamilyIndices = &d->queueFamilies[0],
  31. .preTransform = caps.currentTransform,
  32. .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
  33. .presentMode = d->presentMode,
  34. .clipped = VK_TRUE,
  35. .oldSwapchain = VK_NULL_HANDLE};
  36. VK_CHECK_TRUE(vkCreateSwapchainKHR(d->base, &ci, nullptr, sc));
  37. sc.device = d->base;
  38. return false;
  39. }
  40. static bool createImageView(
  41. ImageView& view, VkDevice d, VkImage image, VkFormat format) {
  42. VkImageViewCreateInfo info = {
  43. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  44. .image = image,
  45. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  46. .format = format,
  47. .subresourceRange = {
  48. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  49. .baseMipLevel = 0,
  50. .levelCount = 1,
  51. .baseArrayLayer = 0,
  52. .layerCount = 1}};
  53. VK_CHECK_TRUE(vkCreateImageView(d, &info, nullptr, view));
  54. view.device = d;
  55. return false;
  56. }
  57. bool initVulkanSwapchainImages(
  58. VulkanSwapchainImages& si, VkDevice d, VkSwapchainKHR sc, VkFormat format) {
  59. u32 c = 0;
  60. VK_CHECK_TRUE(vkGetSwapchainImagesKHR(d, sc, &c, nullptr));
  61. si.images.resize(c);
  62. si.imageViews.resize(c);
  63. VK_CHECK_TRUE(vkGetSwapchainImagesKHR(d, sc, &c, &si.images[0]));
  64. for(u32 x = 0; x < c; x++) {
  65. if(createImageView(si.imageViews[x], d, si.images[x], format)) {
  66. return true;
  67. }
  68. }
  69. return false;
  70. }
  71. bool initVulkanFramebuffers(
  72. List<Framebuffer>& f, const List<ImageView>& iv, VkRenderPass rp, u32 width,
  73. u32 height) {
  74. for(u32 i = 0; i < iv.getLength(); i++) {
  75. Framebuffer fb;
  76. fb.device = iv[i].device;
  77. VkFramebufferCreateInfo info = {
  78. .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
  79. .renderPass = rp,
  80. .attachmentCount = 1,
  81. .pAttachments = iv[i],
  82. .width = width,
  83. .height = height,
  84. .layers = 1};
  85. VK_CHECK_TRUE(vkCreateFramebuffer(fb.device, &info, nullptr, fb));
  86. f.put(Core::move(fb));
  87. }
  88. return false;
  89. }
  90. bool initCommandVulkanBuffer(
  91. VkCommandBuffer* cb, VkDevice d, VkCommandPool cp) {
  92. VkCommandBufferAllocateInfo info = {
  93. .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
  94. .commandPool = cp,
  95. .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
  96. .commandBufferCount = 1};
  97. VK_CHECK_TRUE(vkAllocateCommandBuffers(d, &info, cb));
  98. return false;
  99. }