From d20e9cf1e31a29cd56d4a8ad2e6443a89461f428 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 18 Apr 2024 00:36:52 +0800 Subject: [PATCH] improved features support/check. --- example/common/VulkanAppFramework.h | 2 +- inc/hgl/graph/VKDeviceCreater.h | 38 +++++++---- inc/hgl/graph/VKPhysicalDevice.h | 6 ++ src/SceneGraph/Vulkan/VKDeviceCreater.cpp | 79 ++++++++++++---------- src/SceneGraph/Vulkan/VKPhysicalDevice.cpp | 1 + 5 files changed, 76 insertions(+), 50 deletions(-) diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 0c2a7b98..2393a78c 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -132,7 +132,7 @@ public: { VulkanHardwareRequirement vh_req; - vh_req.wide_lines=true; + vh_req.wide_lines=VulkanHardwareRequirement::SupportLevel::Want; device=CreateRenderDevice(inst,win,&vh_req); diff --git a/inc/hgl/graph/VKDeviceCreater.h b/inc/hgl/graph/VKDeviceCreater.h index 93de5ff7..8acfcebb 100644 --- a/inc/hgl/graph/VKDeviceCreater.h +++ b/inc/hgl/graph/VKDeviceCreater.h @@ -4,8 +4,16 @@ #include VK_NAMESPACE_BEGIN + struct VulkanHardwareRequirement { + enum class SupportLevel + { + DontCare=0, ///<不介意 + Want, ///<希望支持 + Must, ///<必须支持 + }; + uint min_1d_image_size; uint min_2d_image_size; uint min_3d_image_size; @@ -21,24 +29,23 @@ struct VulkanHardwareRequirement uint min_draw_indirect_count; ///<最小间接绘制次数需求 - bool geometry_shader; ///<要求支持几何着色器 - bool tessellation_shader; ///<要求支持细分着色器 -// bool compute_shader; ///<要求支持计算着色器 + SupportLevel geometry_shader; ///<要求支持几何着色器 + SupportLevel tessellation_shader; ///<要求支持细分着色器 - bool multi_draw_indirect; ///<要求支持MultiDrawIndirect + SupportLevel multi_draw_indirect; ///<要求支持MultiDrawIndirect - bool wide_lines; ///<要求支持宽线条 - bool line_rasterization; ///<要支持线条特性(这功能mac/ios平台不支持) - bool large_points; ///<要求支持绘制大点 + SupportLevel wide_lines; ///<要求支持宽线条 + SupportLevel line_rasterization; ///<要支持线条特性(这功能mac/ios平台不支持) + SupportLevel large_points; ///<要求支持绘制大点 - bool texture_cube_array; ///<要求支持立方体数组纹理 + SupportLevel texture_cube_array; ///<要求支持立方体数组纹理 - bool uint8_draw_index; ///<要求支持8位索引 - bool uint32_draw_index; ///<要求支持32位索引(不建议使用) + SupportLevel uint8_draw_index; ///<要求支持8位索引 + SupportLevel uint32_draw_index; ///<要求支持32位索引 struct { - bool bc,etc2,astc_ldr,astc_hdr,pvrtc; ///<要求支持的压缩纹理格式 + SupportLevel bc,etc2,astc_ldr,astc_hdr,pvrtc; ///<要求支持的压缩纹理格式 }texture_compression; //dynamic_state VK_EXT_extended_dynamic_state @@ -78,10 +85,10 @@ struct VulkanHardwareRequirement // line stipple // depth clip -1 to 1 // shading rate image enable - bool dynamic_state[3]; ///<要求支持动态状态 + SupportLevel dynamic_state[3]; ///<要求支持动态状态 // 1.3 特性 - bool dynamic_rendering; ///<要求支持动态渲染 + SupportLevel dynamic_rendering; ///<要求支持动态渲染 uint32_t descriptor_pool; ///<描述符池大小(默认1024) @@ -93,7 +100,10 @@ public: descriptor_pool=1024; - geometry_shader=true; + geometry_shader=SupportLevel::Want; + + uint8_draw_index=SupportLevel::Want; + uint32_draw_index=SupportLevel::Want; } }; diff --git a/inc/hgl/graph/VKPhysicalDevice.h b/inc/hgl/graph/VKPhysicalDevice.h index dd85364a..febaaf7c 100644 --- a/inc/hgl/graph/VKPhysicalDevice.h +++ b/inc/hgl/graph/VKPhysicalDevice.h @@ -27,6 +27,7 @@ class GPUPhysicalDevice private: + bool support_u8_index=false; bool dynamic_state=false; public: @@ -141,8 +142,13 @@ public: public: const VkBool32 SupportGeometryShader ()const{return features.geometryShader;} + const VkBool32 SupportTessellationShader ()const{return features.tessellationShader;} + const VkBool32 SupportCubeMapArray ()const{return features.imageCubeArray;} + const VkBool32 SupportU32Index ()const{return features.fullDrawIndexUint32;} + const VkBool32 SupportU8Index ()const{return support_u8_index;} + // support != open, so please don't direct use GetFeatures(). // open any features in CreateDevice()&SetDeviceFeatures() functions. const bool SupportMDI ()const diff --git a/src/SceneGraph/Vulkan/VKDeviceCreater.cpp b/src/SceneGraph/Vulkan/VKDeviceCreater.cpp index f2050b10..fda334b7 100644 --- a/src/SceneGraph/Vulkan/VKDeviceCreater.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceCreater.cpp @@ -70,9 +70,6 @@ namespace // VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, - VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, - VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME, - VK_KHR_SPIRV_1_4_EXTENSION_NAME, }; @@ -80,36 +77,37 @@ namespace if(physical_device->CheckExtensionSupport(ext_name)) ext_list->Add(ext_name); - if(require.line_rasterization) + if(require.line_rasterization>=VulkanHardwareRequirement::SupportLevel::Want) ext_list->Add(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME); - if(require.texture_compression.pvrtc) //前面检测过了,所以这里不用再次检测是否支持 + if(require.texture_compression.pvrtc>=VulkanHardwareRequirement::SupportLevel::Want) //前面检测过了,所以这里不用再次检测是否支持 ext_list->Add(VK_IMG_FORMAT_PVRTC_EXTENSION_NAME); - if(require.uint8_draw_index) + if(require.uint8_draw_index>=VulkanHardwareRequirement::SupportLevel::Want) ext_list->Add(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME); } void SetDeviceFeatures(VkPhysicalDeviceFeatures *features,const VkPhysicalDeviceFeatures &pdf,const VulkanHardwareRequirement &require) { #define FEATURE_COPY(name) features->name=pdf.name; + #define REQURE_FEATURE_COPY(rn,fn) if(require.rn>=VulkanHardwareRequirement::SupportLevel::Want)features->fn=pdf.fn; - if(require.geometry_shader) FEATURE_COPY(geometryShader); -// if(require.compute_shader) FEATURE_COPY(computeShader); + FEATURE_COPY(multiDrawIndirect); + FEATURE_COPY(samplerAnisotropy); - FEATURE_COPY(multiDrawIndirect); + REQURE_FEATURE_COPY(geometry_shader, geometryShader); - FEATURE_COPY(samplerAnisotropy); + REQURE_FEATURE_COPY(texture_cube_array, imageCubeArray); - if(require.texture_cube_array) FEATURE_COPY(imageCubeArray); - if(require.uint32_draw_index) FEATURE_COPY(fullDrawIndexUint32); - if(require.wide_lines) FEATURE_COPY(wideLines) - if(require.large_points) FEATURE_COPY(largePoints) + REQURE_FEATURE_COPY(uint32_draw_index, fullDrawIndexUint32); + REQURE_FEATURE_COPY(wide_lines, wideLines) + REQURE_FEATURE_COPY(large_points, largePoints) - if(require.texture_compression.bc)FEATURE_COPY(textureCompressionBC); - if(require.texture_compression.etc2)FEATURE_COPY(textureCompressionETC2); - if(require.texture_compression.astc_ldr)FEATURE_COPY(textureCompressionASTC_LDR); + REQURE_FEATURE_COPY(texture_compression.bc, textureCompressionBC); + REQURE_FEATURE_COPY(texture_compression.etc2, textureCompressionETC2); + REQURE_FEATURE_COPY(texture_compression.astc_ldr, textureCompressionASTC_LDR); + #undef REQURE_FEATURE_COPY #undef FEATURE_COPY } @@ -387,31 +385,42 @@ bool VulkanDeviceCreater::RequirementCheck() const VkPhysicalDeviceFeatures &features10=physical_device->GetFeatures10(); const VkPhysicalDeviceVulkan13Features &features13=physical_device->GetFeatures13(); - if(require.geometry_shader &&(!features10.geometryShader ))return(false); - if(require.tessellation_shader &&(!features10.tessellationShader ))return(false); +#define VHRC(name,check) if(require.name>=VulkanHardwareRequirement::SupportLevel::Must&&(!check))return(false); - if(require.multi_draw_indirect &&(!features10.multiDrawIndirect ))return(false); + #define VHRC_F10(name,f10name) VHRC(name,features10.f10name) + #define VHRC_F13(name,f13name) VHRC(name,features13.f13name) + #define VHRC_PDE(name,pdename) VHRC(name,physical_device->CheckExtensionSupport(VK_##pdename##_EXTENSION_NAME)) - if(require.wide_lines &&(!features10.wideLines ))return(false); - if(require.large_points &&(!features10.largePoints ))return(false); - if(require.texture_cube_array &&(!features10.imageCubeArray ))return(false); + VHRC_F10(geometry_shader, geometryShader); + VHRC_F10(tessellation_shader, tessellationShader); - if(require.uint8_draw_index &&(!physical_device->CheckExtensionSupport(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME)))return(false); - if(require.uint32_draw_index &&(!features10.fullDrawIndexUint32 ))return(false); + VHRC_F10(multi_draw_indirect, multiDrawIndirect); - if(require.texture_compression.bc &&(!features10.textureCompressionBC))return(false); - if(require.texture_compression.etc2 &&(!features10.textureCompressionETC2))return(false); - if(require.texture_compression.astc_ldr &&(!features10.textureCompressionASTC_LDR))return(false); - if(require.texture_compression.astc_hdr &&(!features13.textureCompressionASTC_HDR))return(false); - if(require.texture_compression.pvrtc &&(!physical_device->CheckExtensionSupport(VK_IMG_FORMAT_PVRTC_EXTENSION_NAME)))return(false); + VHRC_F10(wide_lines, wideLines); + VHRC_PDE(line_rasterization, EXT_LINE_RASTERIZATION); + VHRC_F10(large_points, largePoints); - if(require.dynamic_rendering&&(!features13.dynamicRendering))return(false); + VHRC_F10(texture_cube_array, imageCubeArray); - if(require.dynamic_state[0]&&(!physical_device->CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME )))return(false); - if(require.dynamic_state[1]&&(!physical_device->CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME )))return(false); - if(require.dynamic_state[2]&&(!physical_device->CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME )))return(false); + VHRC_PDE(uint8_draw_index, EXT_INDEX_TYPE_UINT8); + VHRC_F10(uint32_draw_index, fullDrawIndexUint32); - if(require.line_rasterization&&(!physical_device->CheckExtensionSupport(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME)))return(false); + VHRC_F10(texture_compression.bc, textureCompressionBC); + VHRC_F10(texture_compression.etc2, textureCompressionETC2); + VHRC_F10(texture_compression.astc_ldr, textureCompressionASTC_LDR); + VHRC_F13(texture_compression.astc_hdr, textureCompressionASTC_HDR); + VHRC_PDE(texture_compression.pvrtc, IMG_FORMAT_PVRTC); + + VHRC_F13(dynamic_rendering, dynamicRendering); + + VHRC_PDE(dynamic_state[0], EXT_EXTENDED_DYNAMIC_STATE); + VHRC_PDE(dynamic_state[1], EXT_EXTENDED_DYNAMIC_STATE_2); + VHRC_PDE(dynamic_state[2], EXT_EXTENDED_DYNAMIC_STATE_3); + +#undef VHRC_PDE +#undef VHRC_F13 +#undef VHRC_F10 +#undef VHRC return(true); } diff --git a/src/SceneGraph/Vulkan/VKPhysicalDevice.cpp b/src/SceneGraph/Vulkan/VKPhysicalDevice.cpp index 92624fab..27e0290b 100644 --- a/src/SceneGraph/Vulkan/VKPhysicalDevice.cpp +++ b/src/SceneGraph/Vulkan/VKPhysicalDevice.cpp @@ -163,6 +163,7 @@ GPUPhysicalDevice::GPUPhysicalDevice(VkInstance inst,VkPhysicalDevice pd) debug_queue_family_properties_out(debug_front.c_str(),queue_family_properties); } + support_u8_index=CheckExtensionSupport(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME); dynamic_state=CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); }