ULRE/src/RenderDevice/VKInstance.cpp

96 lines
2.6 KiB
C++
Raw Normal View History

#include<hgl/graph/VKInstance.h>
#include<hgl/graph/VKSurfaceExtensionName.h>
#include<hgl/graph/VKPhysicalDevice.h>
#include<hgl/graph/VKDebugOut.h>
#include<iostream>
2019-04-09 00:22:26 +08:00
VK_NAMESPACE_BEGIN
2020-10-21 12:39:22 +08:00
GPUDevice *CreateRenderDevice(VkInstance,const GPUPhysicalDevice *,Window *);
2019-04-09 00:22:26 +08:00
2019-11-13 20:50:34 +08:00
void CheckInstanceLayer(CharPointerList &layer_list,CreateInstanceLayerInfo *layer_info);
2020-10-21 12:39:22 +08:00
VulkanInstance *CreateInstance(const AnsiString &app_name,VKDebugOut *out,CreateInstanceLayerInfo *layer_info)
2019-04-09 00:22:26 +08:00
{
2020-09-28 11:16:45 +08:00
ApplicationInfo app_info;
InstanceCreateInfo inst_info(&app_info);
CharPointerList ext_list;
2019-11-11 20:26:35 +08:00
CharPointerList layer_list;
2019-04-09 00:22:26 +08:00
2019-11-11 20:26:35 +08:00
app_info.pApplicationName = app_name.c_str();
2019-04-09 00:22:26 +08:00
app_info.applicationVersion = 1;
2019-11-11 20:26:35 +08:00
app_info.pEngineName = "CMGameEngine/ULRE";
app_info.engineVersion = 1;
app_info.apiVersion = VK_API_VERSION_1_0;
2019-04-09 00:22:26 +08:00
ext_list.Add(VK_KHR_SURFACE_EXTENSION_NAME);
ext_list.Add(HGL_VK_SURFACE_EXTENSION_NAME); //此宏在VKSurfaceExtensionName.h中定义
#ifdef _DEBUG
ext_list.Add(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
2019-04-19 18:09:08 +08:00
ext_list.Add(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
#endif//_DEBUG
if(layer_info)
2019-11-13 20:50:34 +08:00
CheckInstanceLayer(layer_list,layer_info);
2019-04-19 18:09:08 +08:00
2019-11-06 20:52:09 +08:00
inst_info.enabledExtensionCount = ext_list.GetCount();
inst_info.ppEnabledExtensionNames = ext_list.GetData();
2019-11-11 20:26:35 +08:00
inst_info.enabledLayerCount = layer_list.GetCount();
inst_info.ppEnabledLayerNames = layer_list.GetData();
2019-04-09 00:22:26 +08:00
VkInstance inst;
2019-04-09 00:22:26 +08:00
if(vkCreateInstance(&inst_info,nullptr,&inst)==VK_SUCCESS)
2019-11-06 20:52:09 +08:00
{
#ifdef _DEBUG
if(!out)
out=new VKDebugOut;
#endif//_DEBUG
if(out)
out->Init(inst);
2020-10-21 12:39:22 +08:00
return(new VulkanInstance(inst,out));
2019-11-06 20:52:09 +08:00
}
return(nullptr);
2019-04-09 00:22:26 +08:00
}
2020-10-21 12:39:22 +08:00
VulkanInstance::VulkanInstance(VkInstance i,VKDebugOut *out)
2019-04-09 00:22:26 +08:00
{
inst=i;
2019-04-09 00:22:26 +08:00
debug_out=out;
uint32_t gpu_count = 1;
2019-04-09 00:22:26 +08:00
if(vkEnumeratePhysicalDevices(inst, &gpu_count, nullptr)==VK_SUCCESS)
2019-04-09 00:22:26 +08:00
{
VkPhysicalDevice *pd_list=new VkPhysicalDevice[gpu_count];
vkEnumeratePhysicalDevices(inst, &gpu_count,pd_list);
for(uint32_t i=0;i<gpu_count;i++)
2020-10-21 12:39:22 +08:00
physical_devices.Add(new GPUPhysicalDevice(inst,pd_list[i]));
2019-04-19 16:32:54 +08:00
delete[] pd_list;
}
}
2020-10-21 12:39:22 +08:00
VulkanInstance::~VulkanInstance()
{
2019-11-06 20:52:09 +08:00
SAFE_CLEAR(debug_out);
physical_devices.Clear();
vkDestroyInstance(inst,nullptr);
2019-04-09 00:22:26 +08:00
}
2020-10-21 12:39:22 +08:00
const GPUPhysicalDevice *VulkanInstance::GetDevice(VkPhysicalDeviceType type)const
{
2020-10-28 17:28:07 +08:00
for(GPUPhysicalDevice *pd:physical_devices)
if(pd->GetDeviceType()==type)
return(pd);
return(nullptr);
}
2019-04-09 00:22:26 +08:00
VK_NAMESPACE_END