#include"VKInstance.h" #include"VKSurfaceExtensionName.h" #include"VKPhysicalDevice.h" #include VK_NAMESPACE_BEGIN Device *CreateRenderDevice(VkInstance,const PhysicalDevice *,Window *); namespace { VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,const VkAllocationCallbacks *pAllocator,VkDebugUtilsMessengerEXT *pDebugMessenger) { auto func=(PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance,"vkCreateDebugUtilsMessengerEXT"); if(func) { return func(instance,pCreateInfo,pAllocator,pDebugMessenger); } else { return VK_ERROR_EXTENSION_NOT_PRESENT; } } void DestroyDebugUtilsMessengerEXT(VkInstance instance,VkDebugUtilsMessengerEXT debugMessenger,const VkAllocationCallbacks *pAllocator) { auto func=(PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance,"vkDestroyDebugUtilsMessengerEXT"); if(func) { func(instance,debugMessenger,pAllocator); } } VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,VkDebugUtilsMessageTypeFlagsEXT messageType,const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,void *pUserData) { std::cerr<<"validation layer: "<pMessage<layerName) return(true); ++lp; } return(false); } const PhysicalDevice *Instance::GetDevice(VkPhysicalDeviceType type)const { const uint32_t count=physical_devices.GetCount(); PhysicalDevice **pd=physical_devices.GetData(); for(uint32_t i=0;iGetDeviceType()==type) return(*pd); ++pd; } return(nullptr); } Device *Instance::CreateRenderDevice(Window *win,const PhysicalDevice *pd) { if(!win) return(nullptr); if(!pd)pd=GetDevice(VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU); //先找独显 if(!pd)pd=GetDevice(VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU); //再找集显 if(!pd)pd=GetDevice(VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU); //最后找虚拟显卡 if(!pd) return(nullptr); return VK_NAMESPACE::CreateRenderDevice(inst,pd,win); } VK_NAMESPACE_END