From 12b66c3e6447a01b7b2abe34fd53f2ac87c77089 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 28 Oct 2020 17:28:07 +0800 Subject: [PATCH] fix chaos of Layer and extension --- example/Vulkan/DeferredModel.cpp | 8 ++-- example/common/VulkanAppFramework.h | 2 +- inc/hgl/graph/VK.h | 25 +++++++++-- inc/hgl/graph/VKDevice.h | 8 ++++ inc/hgl/graph/VKDeviceAttribute.h | 2 + inc/hgl/graph/VKInstance.h | 16 +++++-- inc/hgl/graph/VKPhysicalDevice.h | 10 ++--- src/RenderDevice/VKDeviceCreater.cpp | 14 ------ src/RenderDevice/VKInstance.cpp | 13 ++---- src/RenderDevice/VKPhysicalDevice.cpp | 61 +++++++++++---------------- src/RenderDevice/VKProperties.cpp | 44 +++++++++++++------ 11 files changed, 111 insertions(+), 92 deletions(-) diff --git a/example/Vulkan/DeferredModel.cpp b/example/Vulkan/DeferredModel.cpp index ae11c750..e2cd9657 100644 --- a/example/Vulkan/DeferredModel.cpp +++ b/example/Vulkan/DeferredModel.cpp @@ -52,8 +52,8 @@ private: struct { - RenderTarget *rt; - RenderCommand *cmd; + RenderTarget *rt=nullptr; + RenderCommand *cmd=nullptr; public: @@ -100,8 +100,8 @@ public: ~TestApp() { - delete gbuffer.cmd; - delete gbuffer.rt; + SAFE_CLEAR(gbuffer.cmd); + SAFE_CLEAR(gbuffer.rt); } private: diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 0520a511..e0269ce8 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -88,7 +88,7 @@ public: InitNativeWindowSystem(); - InitVulkanProperties(); + InitVulkanInstanceProperties(); win=CreateRenderWindow(OS_TEXT("VulkanTest")); if(!win) diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 9d64a353..4794a42d 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -153,7 +153,14 @@ inline void copy(VkExtent3D &e3d,const VkExtent2D &e2d,const uint32 depth=1) e3d.depth =depth; } -inline void debug_out(const hgl::List &layer_properties) +inline void debug_out_vk_version(const uint32_t version) +{ + std::cout< &layer_properties) { const int property_count=layer_properties.GetCount(); @@ -163,12 +170,18 @@ inline void debug_out(const hgl::List &layer_properties) for(int i=0;ilayerName<<" desc: "<description<layerName<<" [spec: "; + debug_out_vk_version(lp->specVersion); + + std::cout<<", impl: "; + debug_out_vk_version(lp->implementationVersion); + + std::cout<<"] desc: "<description< &extension_properties) +inline void debug_out(const char *front,const hgl::List &extension_properties) { const int extension_count=extension_properties.GetCount(); @@ -177,7 +190,11 @@ inline void debug_out(const hgl::List &extension_properti VkExtensionProperties *ep=extension_properties.GetData(); for(int i=0;iextensionName<<" ver: "<specVersion<extensionName<<" ver: "; + + debug_out_vk_version(ep->specVersion); + + std::cout< + T *GetProc(const char *name) + { + return reinterpret_cast(vkGetDeviceProcAddr(attr->device,name)); + } + public: //内存相关 GPUMemory *CreateMemory(const VkMemoryRequirements &,const uint32_t properties); diff --git a/inc/hgl/graph/VKDeviceAttribute.h b/inc/hgl/graph/VKDeviceAttribute.h index eabdf618..4f25fdaa 100644 --- a/inc/hgl/graph/VKDeviceAttribute.h +++ b/inc/hgl/graph/VKDeviceAttribute.h @@ -10,6 +10,8 @@ struct GPUDeviceAttribute { VkInstance instance =VK_NULL_HANDLE; const GPUPhysicalDevice * physical_device =nullptr; + + VkPhysicalDeviceDriverPropertiesKHR driver_properties; VkSurfaceKHR surface =VK_NULL_HANDLE; VkSurfaceCapabilitiesKHR surface_caps; diff --git a/inc/hgl/graph/VKInstance.h b/inc/hgl/graph/VKInstance.h index 3ae57852..57080469 100644 --- a/inc/hgl/graph/VKInstance.h +++ b/inc/hgl/graph/VKInstance.h @@ -71,12 +71,20 @@ VK_NAMESPACE_BEGIN const ObjectList &GetDeviceList ()const {return physical_devices;} const GPUPhysicalDevice * GetDevice (VkPhysicalDeviceType)const; + + template + T *GetInstanceProc(const char *name) + { + return reinterpret_cast(vkGetInstanceProcAddr(inst,name)); + } };//class VulkanInstance - void InitVulkanProperties(); - const List & GetLayerProperties(); - const List & GetExtensionProperties(); - const bool CheckLayerSupport(const char *); + void InitVulkanInstanceProperties(); + const List & GetInstanceLayerProperties(); + const List & GetInstanceExtensionProperties(); + const bool CheckInstanceLayerSupport(const AnsiString &); + const bool GetInstanceLayerVersion(const AnsiString &,uint32_t &spec,uint32_t &impl); + const bool CheckInstanceExtensionSupport(const AnsiString &); VulkanInstance *CreateInstance(const AnsiString &,VKDebugOut *,CreateInstanceLayerInfo *); ///<创建一个Vulkan实例 VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKPhysicalDevice.h b/inc/hgl/graph/VKPhysicalDevice.h index 6146d85a..34a7b4f1 100644 --- a/inc/hgl/graph/VKPhysicalDevice.h +++ b/inc/hgl/graph/VKPhysicalDevice.h @@ -11,7 +11,6 @@ class GPUPhysicalDevice VkPhysicalDevice physical_device=nullptr; VkPhysicalDeviceFeatures features; VkPhysicalDeviceProperties properties; - VkPhysicalDeviceDriverPropertiesKHR driver_properties; VkPhysicalDeviceMemoryProperties memory_properties; List layer_properties; List extension_properties; @@ -32,12 +31,9 @@ public: const VkPhysicalDeviceFeatures & GetFeatures ()const{return features;} const VkPhysicalDeviceProperties & GetProperties ()const{return properties;} const VkPhysicalDeviceMemoryProperties &GetMemoryProperties ()const{return memory_properties;} - - const uint32_t GetExtensionSpecVersion(const AnsiString &name)const; - - const VkDriverIdKHR GetDriverId ()const{return driver_properties.driverID;} - const char * GetDriverName ()const{return driver_properties.driverName;} - const char * GetDriverInfo ()const{return driver_properties.driverInfo;} + + const bool GetLayerVersion(const AnsiString &,uint32_t &spec,uint32_t &impl)const; + const uint32_t GetExtensionVersion(const AnsiString &name)const; public: diff --git a/src/RenderDevice/VKDeviceCreater.cpp b/src/RenderDevice/VKDeviceCreater.cpp index d38bbe26..012ae7f9 100644 --- a/src/RenderDevice/VKDeviceCreater.cpp +++ b/src/RenderDevice/VKDeviceCreater.cpp @@ -378,20 +378,6 @@ GPUDevice *CreateRenderDevice(VkInstance inst,const GPUPhysicalDevice *physical_ { #ifdef _DEBUG { - const VkDriverIdKHR driver_id=physical_device->GetDriverId(); - - if(driver_id>=VK_DRIVER_ID_BEGIN_RANGE - &&driver_id<=VK_DRIVER_ID_END_RANGE) - { - std::cout<<"DriverID: "<GetDriverId()<GetDriverName()<GetDriverInfo()<GetProperties()); DebugOut(physical_device->GetFeatures()); } diff --git a/src/RenderDevice/VKInstance.cpp b/src/RenderDevice/VKInstance.cpp index b483d491..bc87b452 100644 --- a/src/RenderDevice/VKInstance.cpp +++ b/src/RenderDevice/VKInstance.cpp @@ -86,16 +86,9 @@ VulkanInstance::~VulkanInstance() const GPUPhysicalDevice *VulkanInstance::GetDevice(VkPhysicalDeviceType type)const { - const uint32_t count=physical_devices.GetCount(); - GPUPhysicalDevice **pd=physical_devices.GetData(); - - for(uint32_t i=0;iGetDeviceType()==type) - return(*pd); - - ++pd; - } + for(GPUPhysicalDevice *pd:physical_devices) + if(pd->GetDeviceType()==type) + return(pd); return(nullptr); } diff --git a/src/RenderDevice/VKPhysicalDevice.cpp b/src/RenderDevice/VKPhysicalDevice.cpp index 2f56bbe8..8cf121f7 100644 --- a/src/RenderDevice/VKPhysicalDevice.cpp +++ b/src/RenderDevice/VKPhysicalDevice.cpp @@ -1,4 +1,5 @@ #include +#include VK_NAMESPACE_BEGIN GPUPhysicalDevice::GPUPhysicalDevice(VkInstance inst,VkPhysicalDevice pd) @@ -14,7 +15,7 @@ GPUPhysicalDevice::GPUPhysicalDevice(VkInstance inst,VkPhysicalDevice pd) layer_properties.SetCount(property_count); vkEnumerateDeviceLayerProperties(physical_device,&property_count,layer_properties.GetData()); - debug_out(layer_properties); + debug_out("PhysicalDevice",layer_properties); } { @@ -25,48 +26,36 @@ GPUPhysicalDevice::GPUPhysicalDevice(VkInstance inst,VkPhysicalDevice pd) extension_properties.SetCount(exten_count); vkEnumerateDeviceExtensionProperties(physical_device,nullptr,&exten_count,extension_properties.GetData()); - debug_out(extension_properties); + debug_out("PhysicalDevice",extension_properties); } vkGetPhysicalDeviceFeatures(physical_device,&features); vkGetPhysicalDeviceMemoryProperties(physical_device,&memory_properties); - - PFN_vkGetPhysicalDeviceProperties2 GetGPUPhysicalDeviceProperties2=nullptr; - - if(GetExtensionSpecVersion(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) - GetGPUPhysicalDeviceProperties2=(PFN_vkGetPhysicalDeviceProperties2KHR)vkGetInstanceProcAddr(instance,"vkGetPhysicalDeviceProperties2KHR"); - - if(!GetGPUPhysicalDeviceProperties2) - if(GetExtensionSpecVersion(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) - GetGPUPhysicalDeviceProperties2=(PFN_vkGetPhysicalDeviceProperties2)vkGetInstanceProcAddr(instance,"vkGetPhysicalDeviceProperties2"); - - if(GetGPUPhysicalDeviceProperties2) - { - VkPhysicalDeviceProperties2KHR properties2; - GetGPUPhysicalDeviceProperties2(physical_device,&properties2); - - hgl_cpy(properties,properties2.properties); - - if(properties2.pNext) - memcpy(&driver_properties,properties2.pNext,sizeof(VkPhysicalDeviceDriverPropertiesKHR)); - } - else - { - vkGetPhysicalDeviceProperties(physical_device,&properties); - - hgl_zero(driver_properties); - } + vkGetPhysicalDeviceProperties(physical_device,&properties); } -const uint32_t GPUPhysicalDevice::GetExtensionSpecVersion(const AnsiString &name)const -{ - const uint count=extension_properties.GetCount(); - const VkExtensionProperties *ep=extension_properties.GetData(); - - for(uint i=0;iextensionName)==0) - return ep->specVersion; + if(name.Comp(lp.layerName)==0) + { + spec=lp.specVersion; + impl=lp.implementationVersion; + + return(true); + } + } + + return(false); +} + +const uint32_t GPUPhysicalDevice::GetExtensionVersion(const AnsiString &name)const +{ + for(const VkExtensionProperties &ep:extension_properties) + { + if(name.Comp(ep.extensionName)==0) + return ep.specVersion; } return 0; diff --git a/src/RenderDevice/VKProperties.cpp b/src/RenderDevice/VKProperties.cpp index f5d7ca9e..fd5baaf0 100644 --- a/src/RenderDevice/VKProperties.cpp +++ b/src/RenderDevice/VKProperties.cpp @@ -12,7 +12,7 @@ namespace const List &GetLayerProperties(){return layer_properties;} const List &GetExtensionProperties(){return extension_properties;} -void InitVulkanProperties() +void InitVulkanInstanceProperties() { layer_properties.Clear(); extension_properties.Clear(); @@ -24,7 +24,7 @@ void InitVulkanProperties() layer_properties.SetCount(layer_count); vkEnumerateInstanceLayerProperties(&layer_count,layer_properties.GetData()); - debug_out(layer_properties); + debug_out("Instance",layer_properties); } { @@ -34,24 +34,33 @@ void InitVulkanProperties() extension_properties.SetCount(prop_count); vkEnumerateInstanceExtensionProperties(nullptr,&prop_count,extension_properties.GetData()); - debug_out(extension_properties); + debug_out("Instance",extension_properties); } } -const bool CheckLayerSupport(const char *layer_name) +const bool CheckInstanceLayerSupport(const AnsiString &layer_name) { if(!layer_name||!*layer_name) return(false); - const uint32_t count=layer_properties.GetCount(); - VkLayerProperties *lp=layer_properties.GetData(); - - for(uint32_t i=0;ilayerName)==0) + for(const VkLayerProperties &lp:layer_properties) + if(layer_name.Comp(lp.layerName)==0) return(true); - ++lp; + return(false); +} + +const bool GetInstanceLayerVersion(const AnsiString &name,uint32_t &spec,uint32_t &impl) +{ + for(const VkLayerProperties &lp:layer_properties) + { + if(name.Comp(lp.layerName)==0) + { + spec=lp.specVersion; + impl=lp.implementationVersion; + + return(true); + } } return(false); @@ -61,7 +70,7 @@ void CheckInstanceLayer(CharPointerList &layer_list,CreateInstanceLayerInfo *lay { #define VK_LAYER_CHECK(sname,lname,name) if(layer_info->sname.name) \ { \ - if(CheckLayerSupport("VK_LAYER_" lname "_" #name)) \ + if(CheckInstanceLayerSupport("VK_LAYER_" lname "_" #name)) \ layer_list.Add("VK_LAYER_" lname "_" #name); \ } @@ -95,4 +104,15 @@ void CheckInstanceLayer(CharPointerList &layer_list,CreateInstanceLayerInfo *lay VK_LAYER_BANDICAM_ADD(helper) } + +const bool CheckInstanceExtensionSupport(const AnsiString &name) +{ + for(const VkExtensionProperties &ep:extension_properties) + { + if(name.Comp(ep.extensionName)==0) + return true; + } + + return(false); +} VK_NAMESPACE_END