renderer_vulkan: Add more feature checking
This commit is contained in:
parent
220a42896d
commit
b8c96cee5f
|
@ -309,7 +309,7 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device
|
||||||
.support_int16 = device.IsShaderInt16Supported(),
|
.support_int16 = device.IsShaderInt16Supported(),
|
||||||
.support_int64 = device.IsShaderInt64Supported(),
|
.support_int64 = device.IsShaderInt64Supported(),
|
||||||
.support_vertex_instance_id = false,
|
.support_vertex_instance_id = false,
|
||||||
.support_float_controls = true,
|
.support_float_controls = device.IsKhrShaderFloatControlsSupported(),
|
||||||
.support_separate_denorm_behavior =
|
.support_separate_denorm_behavior =
|
||||||
float_control.denormBehaviorIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
|
float_control.denormBehaviorIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
|
||||||
.support_separate_rounding_mode =
|
.support_separate_rounding_mode =
|
||||||
|
@ -325,12 +325,13 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device
|
||||||
.support_fp64_signed_zero_nan_preserve =
|
.support_fp64_signed_zero_nan_preserve =
|
||||||
float_control.shaderSignedZeroInfNanPreserveFloat64 != VK_FALSE,
|
float_control.shaderSignedZeroInfNanPreserveFloat64 != VK_FALSE,
|
||||||
.support_explicit_workgroup_layout = device.IsKhrWorkgroupMemoryExplicitLayoutSupported(),
|
.support_explicit_workgroup_layout = device.IsKhrWorkgroupMemoryExplicitLayoutSupported(),
|
||||||
.support_vote = true,
|
.support_vote = device.IsSubgroupFeatureSupported(VK_SUBGROUP_FEATURE_VOTE_BIT),
|
||||||
.support_viewport_index_layer_non_geometry =
|
.support_viewport_index_layer_non_geometry =
|
||||||
device.IsExtShaderViewportIndexLayerSupported(),
|
device.IsExtShaderViewportIndexLayerSupported(),
|
||||||
.support_viewport_mask = device.IsNvViewportArray2Supported(),
|
.support_viewport_mask = device.IsNvViewportArray2Supported(),
|
||||||
.support_typeless_image_loads = device.IsFormatlessImageLoadSupported(),
|
.support_typeless_image_loads = device.IsFormatlessImageLoadSupported(),
|
||||||
.support_demote_to_helper_invocation = true,
|
.support_demote_to_helper_invocation =
|
||||||
|
device.IsExtShaderDemoteToHelperInvocationSupported(),
|
||||||
.support_int64_atomics = device.IsExtShaderAtomicInt64Supported(),
|
.support_int64_atomics = device.IsExtShaderAtomicInt64Supported(),
|
||||||
.support_derivative_control = true,
|
.support_derivative_control = true,
|
||||||
.support_geometry_shader_passthrough = device.IsNvGeometryShaderPassthroughSupported(),
|
.support_geometry_shader_passthrough = device.IsNvGeometryShaderPassthroughSupported(),
|
||||||
|
|
|
@ -905,6 +905,10 @@ bool Device::GetSuitability(bool requires_swapchain) {
|
||||||
properties.driver.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
|
properties.driver.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
|
||||||
SetNext(next, properties.driver);
|
SetNext(next, properties.driver);
|
||||||
|
|
||||||
|
// Retrieve subgroup properties.
|
||||||
|
properties.subgroup_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
|
||||||
|
SetNext(next, properties.subgroup_properties);
|
||||||
|
|
||||||
// Retrieve relevant extension properties.
|
// Retrieve relevant extension properties.
|
||||||
if (extensions.shader_float_controls) {
|
if (extensions.shader_float_controls) {
|
||||||
properties.float_controls.sType =
|
properties.float_controls.sType =
|
||||||
|
|
|
@ -323,6 +323,11 @@ public:
|
||||||
return properties.subgroup_size_control.requiredSubgroupSizeStages & stage;
|
return properties.subgroup_size_control.requiredSubgroupSizeStages & stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if the device supports the provided subgroup feature.
|
||||||
|
bool IsSubgroupFeatureSupported(VkSubgroupFeatureFlagBits feature) const {
|
||||||
|
return properties.subgroup_properties.supportedOperations & feature;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the maximum number of push descriptors.
|
/// Returns the maximum number of push descriptors.
|
||||||
u32 MaxPushDescriptors() const {
|
u32 MaxPushDescriptors() const {
|
||||||
return properties.push_descriptor.maxPushDescriptors;
|
return properties.push_descriptor.maxPushDescriptors;
|
||||||
|
@ -388,6 +393,11 @@ public:
|
||||||
return extensions.swapchain_mutable_format;
|
return extensions.swapchain_mutable_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if VK_KHR_shader_float_controls is enabled.
|
||||||
|
bool IsKhrShaderFloatControlsSupported() const {
|
||||||
|
return extensions.shader_float_controls;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout.
|
/// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout.
|
||||||
bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const {
|
bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const {
|
||||||
return extensions.workgroup_memory_explicit_layout;
|
return extensions.workgroup_memory_explicit_layout;
|
||||||
|
@ -487,6 +497,11 @@ public:
|
||||||
return extensions.shader_stencil_export;
|
return extensions.shader_stencil_export;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if the device supports VK_EXT_shader_demote_to_helper_invocation
|
||||||
|
bool IsExtShaderDemoteToHelperInvocationSupported() const {
|
||||||
|
return extensions.shader_demote_to_helper_invocation;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if the device supports VK_EXT_conservative_rasterization.
|
/// Returns true if the device supports VK_EXT_conservative_rasterization.
|
||||||
bool IsExtConservativeRasterizationSupported() const {
|
bool IsExtConservativeRasterizationSupported() const {
|
||||||
return extensions.conservative_rasterization;
|
return extensions.conservative_rasterization;
|
||||||
|
@ -684,6 +699,7 @@ private:
|
||||||
|
|
||||||
struct Properties {
|
struct Properties {
|
||||||
VkPhysicalDeviceDriverProperties driver{};
|
VkPhysicalDeviceDriverProperties driver{};
|
||||||
|
VkPhysicalDeviceSubgroupProperties subgroup_properties{};
|
||||||
VkPhysicalDeviceFloatControlsProperties float_controls{};
|
VkPhysicalDeviceFloatControlsProperties float_controls{};
|
||||||
VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor{};
|
VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor{};
|
||||||
VkPhysicalDeviceSubgroupSizeControlProperties subgroup_size_control{};
|
VkPhysicalDeviceSubgroupSizeControlProperties subgroup_size_control{};
|
||||||
|
|
Reference in New Issue