]> git.seodisparate.com - blue_noise_generation/commitdiff
WIP Vulkan compute: initialize VkDevice
authorStephen Seo <stephen@seodisparate.com>
Fri, 8 Mar 2024 04:45:18 +0000 (13:45 +0900)
committerStephen Seo <stephen@seodisparate.com>
Fri, 8 Mar 2024 04:48:42 +0000 (13:48 +0900)
src/blue_noise.cpp

index a1a0d25e5a5a900cae563e0f7b0c30698c459e0b..a9303fcfe0ad878b0b8f487370122bb92863f682 100644 (file)
@@ -222,6 +222,50 @@ image::Bl dither::blue_noise(int width, int height, int threads,
       std::clog << "WARNING: No suitable GPUs found!\n";
       goto ENDOF_VULKAN;
     }
+
+    auto indices = find_queue_families(phys_device);
+    std::vector<VkDeviceQueueCreateInfo> queue_create_infos;
+    std::unordered_set<uint32_t> unique_queue_families = {
+        indices.computeFamily.value()};
+
+    float queue_priority = 1.0F;
+    for (uint32_t queue_family : unique_queue_families) {
+      VkDeviceQueueCreateInfo queue_create_info{};
+      queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+      queue_create_info.queueFamilyIndex = queue_family;
+      queue_create_info.queueCount = 1;
+      queue_create_info.pQueuePriorities = &queue_priority;
+      queue_create_infos.push_back(queue_create_info);
+    }
+
+    VkPhysicalDeviceFeatures device_features{};
+
+    VkDeviceCreateInfo dev_create_info{};
+    dev_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+
+    dev_create_info.queueCreateInfoCount = queue_create_infos.size();
+    dev_create_info.pQueueCreateInfos = queue_create_infos.data();
+
+    dev_create_info.pEnabledFeatures = &device_features;
+
+    dev_create_info.enabledExtensionCount = 0;
+
+#if VULKAN_VALIDATION == 1
+    dev_create_info.enabledLayerCount = VALIDATION_LAYERS.size();
+    dev_create_info.ppEnabledLayerNames = VALIDATION_LAYERS.data();
+#else
+    dev_create_info.enabledLayerCount = 0;
+#endif
+
+    VkDevice device;
+    if (vkCreateDevice(phys_device, &dev_create_info, nullptr, &device) !=
+        VK_SUCCESS) {
+      std::clog << "WARNING: Failed to create VkDevice!\n";
+      goto ENDOF_VULKAN;
+    }
+    utility::Cleanup device_cleanup(
+        [](void *ptr) { vkDestroyDevice(*((VkDevice *)ptr), nullptr); },
+        &device);
   }
 ENDOF_VULKAN:
   std::clog << "TODO: Remove this once Vulkan support is implemented.\n";