diff --git a/example/Vulkan/TextureFormat.cpp b/example/Vulkan/TextureFormat.cpp index 82b2b0f1..40033cc9 100644 --- a/example/Vulkan/TextureFormat.cpp +++ b/example/Vulkan/TextureFormat.cpp @@ -35,18 +35,13 @@ constexpr char *data_type_name[] "SRGB" };// -int main(int,char **) +vulkan::Instance *InitVulkanInstance() { - Window * win =nullptr; - vulkan::Instance * inst =nullptr; - vulkan::Device * device =nullptr; - const vulkan::PhysicalDevice *physical_device =nullptr; - #ifdef _DEBUG if(!CheckStrideBytesByFormat()) { std::cerr<<"check stride bytes by format failed."<GetDevice(VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU); diff --git a/inc/hgl/graph/vulkan/VK.h b/inc/hgl/graph/vulkan/VK.h index f324c855..53803eea 100644 --- a/inc/hgl/graph/vulkan/VK.h +++ b/inc/hgl/graph/vulkan/VK.h @@ -52,8 +52,6 @@ class VertexAttributeBinding; class Renderable; -using CharPointerList=hgl::List; - enum class ShaderStage { Vertex =VK_SHADER_STAGE_VERTEX_BIT, @@ -104,11 +102,5 @@ inline void debug_out(const hgl::List &extension_properti ++ep; } } - - void InitVulkanProperties(); -const List & GetLayerProperties(); -const List & GetExtensionProperties(); -const bool CheckLayerSupport(const char *); - VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_INCLUDE diff --git a/inc/hgl/graph/vulkan/VKInstance.h b/inc/hgl/graph/vulkan/VKInstance.h index 3651dddb..860b5ef9 100644 --- a/inc/hgl/graph/vulkan/VKInstance.h +++ b/inc/hgl/graph/vulkan/VKInstance.h @@ -8,6 +8,47 @@ #include VK_NAMESPACE_BEGIN + #define VK_BOOL1BIT(name) bool name:1; + struct CreateInstanceLayerInfo + { + struct + { + VK_BOOL1BIT(api_dump) + VK_BOOL1BIT(device_simulation) + VK_BOOL1BIT(monitor) + VK_BOOL1BIT(screenshot) + VK_BOOL1BIT(standard_validation) + VK_BOOL1BIT(vktrace) + }lunarg; + + struct + { + VK_BOOL1BIT(validation) + }khronos; + + struct + { + VK_BOOL1BIT(optimus) + }nv; + + struct + { + VK_BOOL1BIT(steam_overlay) + VK_BOOL1BIT(steam_fossilize) + }valve; + + struct + { + VK_BOOL1BIT(Capture) + }RenderDoc; + + struct + { + VK_BOOL1BIT(helper); + }bandicam; + }; + #undef VK_BOOL1BIT + class Instance { VkInstance inst; @@ -18,7 +59,7 @@ VK_NAMESPACE_BEGIN private: - friend Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out=nullptr); + friend Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out=nullptr,CreateInstanceLayerInfo *cili=nullptr); Instance(VkInstance,VKDebugOut *); @@ -31,7 +72,12 @@ VK_NAMESPACE_BEGIN const ObjectList &GetDeviceList ()const {return physical_devices;} const PhysicalDevice * GetDevice (VkPhysicalDeviceType)const; };//class Instance + + void InitVulkanProperties(); + const List & GetLayerProperties(); + const List & GetExtensionProperties(); + const bool CheckLayerSupport(const char *); - Instance *CreateInstance(const UTF8String &,VKDebugOut *); ///<创建一个Vulkan实例 + Instance *CreateInstance(const UTF8String &,VKDebugOut *,CreateInstanceLayerInfo *); ///<创建一个Vulkan实例 VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_INSTANCE_INCLUDE diff --git a/src/RenderDevice/Vulkan/VKInstance.cpp b/src/RenderDevice/Vulkan/VKInstance.cpp index a75068d5..9c6afa1a 100644 --- a/src/RenderDevice/Vulkan/VKInstance.cpp +++ b/src/RenderDevice/Vulkan/VKInstance.cpp @@ -7,7 +7,9 @@ VK_NAMESPACE_BEGIN Device *CreateRenderDevice(VkInstance,const PhysicalDevice *,Window *); -Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out) +using CharPointerList=hgl::List; + +Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out,CreateInstanceLayerInfo *layer_info) { VkApplicationInfo app_info; VkInstanceCreateInfo inst_info; @@ -24,12 +26,44 @@ Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out) 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); ext_list.Add(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); +#endif//_DEBUG - layer_list.Add("VK_LAYER_KHRONOS_validation"); - layer_list.Add("VK_LAYER_LUNARG_standard_validation"); - layer_list.Add("VK_LAYER_RENDERDOC_Capture"); + if(layer_info) + { + #define VK_LAYER_LUNARG_ADD(name) if(layer_info->lunarg.name)layer_list.Add("VK_LAYER_LUNARG_" #name); + + VK_LAYER_LUNARG_ADD(api_dump) + VK_LAYER_LUNARG_ADD(device_simulation) + VK_LAYER_LUNARG_ADD(monitor) + VK_LAYER_LUNARG_ADD(screenshot) + VK_LAYER_LUNARG_ADD(standard_validation) + VK_LAYER_LUNARG_ADD(vktrace) + + #define VK_LAYER_KHRONOS_ADD(name) if(layer_info->khronos.name)layer_list.Add("VK_LAYER_KHRONOS_" #name); + + VK_LAYER_KHRONOS_ADD(validation) + + #define VK_LAYER_NV_ADD(name) if(layer_info->nv.name)layer_list.Add("VK_LAYER_NV_" #name); + + VK_LAYER_NV_ADD(optimus) + + #define VK_LAYER_VALVE_ADD(name) if(layer_info->valve.name)layer_list.Add("VK_LAYER_VALVE_" #name); + + VK_LAYER_VALVE_ADD(steam_overlay) + VK_LAYER_VALVE_ADD(steam_fossilize) + + #define VK_LAYER_RENDERDOC_ADD(name) if(layer_info->RenderDoc.name)layer_list.Add("VK_LAYER_RENDERDOC_" #name); + + VK_LAYER_RENDERDOC_ADD(Capture) + + #define VK_LAYER_BANDICAM_ADD(name) if(layer_info->bandicam.name)layer_list.Add("VK_LAYER_bandicam_" #name); + + VK_LAYER_BANDICAM_ADD(helper) + } inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; inst_info.pNext = nullptr; @@ -44,10 +78,14 @@ Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out) if(vkCreateInstance(&inst_info,nullptr,&inst)==VK_SUCCESS) { +#ifdef _DEBUG if(!out) out=new VKDebugOut; - - out->Init(inst); +#endif//_DEBUG + + if(out) + out->Init(inst); + return(new Instance(inst,out)); }