#pragma once #include "vkn/type.h" namespace vkn { class Instance; class DeviceCreator { private: class DesiredQueue final { public: Name name; VkQueueFlags flag; float prioritie; int queueFamilyIndex; DesiredQueue(Name name, VkQueueFlags flag, float prioritie) : name(name), flag(flag), prioritie(prioritie), queueFamilyIndex(0) {} }; public: VkPhysicalDeviceFeatures desiredPhysicalDeviceFeatures; VkPhysicalDeviceType desiredPhysicalDeviceType; pmr::vector desiredExtensions; pmr::vector desiredQueues; int fencePoolCount = 256; Instance& instance; public: DeviceCreator(Instance& instance); void AddQueue(Name name, VkQueueFlags flag, float prioritie); void AddExtension(string_view extensionName); void AddWindowExtension(); bool CheckProperty(const VkPhysicalDevice device); bool CheckExtension(const VkPhysicalDevice device); bool FindDevice(VkPhysicalDevice& device); void QueueCreateInfos(pmr::vector& queue_create_infos, pmr::vector>& queue_prioritie, pmr::vector& queue_families); pmr::vector EnabledExtensionNames(); void EnableDeviceFeatures(); VkPhysicalDeviceFeatures2 GetDeviceFeature2(); VkPhysicalDeviceVulkan12Features GetVulkan12Features(); #ifdef Z_RENDER_DEBUG public: pmr::vector desiredLayers; void AddLayer(string_view layerName); bool CheckLayer(const VkPhysicalDevice device); pmr::vector EnabledLayerNames(); #endif public: static bool CheckAvailableQueueFamilies(VkPhysicalDevice physical_device, pmr::vector& queue_families); }; };