improved features support/check.
This commit is contained in:
parent
621e056315
commit
d20e9cf1e3
@ -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);
|
||||
|
||||
|
@ -4,8 +4,16 @@
|
||||
#include<hgl/graph/VKDevice.h>
|
||||
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user