|
|
|
@ -46,6 +46,7 @@ constexpr std::array REQUIRED_EXTENSIONS{ |
|
|
|
VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, |
|
|
|
VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, |
|
|
|
VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, |
|
|
|
VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, |
|
|
|
VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, |
|
|
|
#ifdef _WIN32
|
|
|
|
VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, |
|
|
|
@ -379,20 +380,6 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR |
|
|
|
LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); |
|
|
|
} |
|
|
|
|
|
|
|
VkPhysicalDeviceRobustness2FeaturesEXT robustness2; |
|
|
|
if (ext_robustness2) { |
|
|
|
robustness2 = { |
|
|
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, |
|
|
|
.pNext = nullptr, |
|
|
|
.robustBufferAccess2 = true, |
|
|
|
.robustImageAccess2 = true, |
|
|
|
.nullDescriptor = true, |
|
|
|
}; |
|
|
|
SetNext(next, robustness2); |
|
|
|
} else { |
|
|
|
LOG_INFO(Render_Vulkan, "Device doesn't support robustness2"); |
|
|
|
} |
|
|
|
|
|
|
|
if (!ext_depth_range_unrestricted) { |
|
|
|
LOG_INFO(Render_Vulkan, "Device doesn't support depth range unrestricted"); |
|
|
|
} |
|
|
|
@ -579,7 +566,16 @@ void Device::CheckSuitability(bool requires_swapchain) const { |
|
|
|
throw vk::Exception(VK_ERROR_FEATURE_NOT_PRESENT); |
|
|
|
} |
|
|
|
} |
|
|
|
const VkPhysicalDeviceFeatures features{physical.GetFeatures()}; |
|
|
|
VkPhysicalDeviceRobustness2FeaturesEXT robustness2{}; |
|
|
|
robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; |
|
|
|
|
|
|
|
VkPhysicalDeviceFeatures2 features2{}; |
|
|
|
features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; |
|
|
|
features2.pNext = &robustness2; |
|
|
|
|
|
|
|
physical.GetFeatures2KHR(features2); |
|
|
|
|
|
|
|
const VkPhysicalDeviceFeatures& features{features2.features}; |
|
|
|
const std::array feature_report{ |
|
|
|
std::make_pair(features.robustBufferAccess, "robustBufferAccess"), |
|
|
|
std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"), |
|
|
|
@ -598,6 +594,9 @@ void Device::CheckSuitability(bool requires_swapchain) const { |
|
|
|
std::make_pair(features.shaderImageGatherExtended, "shaderImageGatherExtended"), |
|
|
|
std::make_pair(features.shaderStorageImageWriteWithoutFormat, |
|
|
|
"shaderStorageImageWriteWithoutFormat"), |
|
|
|
std::make_pair(robustness2.robustBufferAccess2, "robustBufferAccess2"), |
|
|
|
std::make_pair(robustness2.robustImageAccess2, "robustImageAccess2"), |
|
|
|
std::make_pair(robustness2.nullDescriptor, "nullDescriptor"), |
|
|
|
}; |
|
|
|
for (const auto& [is_supported, name] : feature_report) { |
|
|
|
if (is_supported) { |
|
|
|
@ -621,7 +620,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { |
|
|
|
bool has_ext_transform_feedback{}; |
|
|
|
bool has_ext_custom_border_color{}; |
|
|
|
bool has_ext_extended_dynamic_state{}; |
|
|
|
bool has_ext_robustness2{}; |
|
|
|
for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { |
|
|
|
const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, |
|
|
|
bool push) { |
|
|
|
@ -649,14 +647,12 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { |
|
|
|
test(has_ext_transform_feedback, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, false); |
|
|
|
test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false); |
|
|
|
test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); |
|
|
|
test(has_ext_robustness2, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, false); |
|
|
|
test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false); |
|
|
|
if (Settings::values.renderer_debug) { |
|
|
|
test(nv_device_diagnostics_config, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, |
|
|
|
true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
VkPhysicalDeviceFeatures2KHR features; |
|
|
|
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; |
|
|
|
|
|
|
|
@ -673,7 +669,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { |
|
|
|
is_float16_supported = float16_int8_features.shaderFloat16; |
|
|
|
extensions.push_back(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME); |
|
|
|
} |
|
|
|
|
|
|
|
if (has_ext_subgroup_size_control) { |
|
|
|
VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_features; |
|
|
|
subgroup_features.sType = |
|
|
|
@ -700,7 +695,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { |
|
|
|
} else { |
|
|
|
is_warp_potentially_bigger = true; |
|
|
|
} |
|
|
|
|
|
|
|
if (has_ext_transform_feedback) { |
|
|
|
VkPhysicalDeviceTransformFeedbackFeaturesEXT tfb_features; |
|
|
|
tfb_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT; |
|
|
|
@ -722,7 +716,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { |
|
|
|
ext_transform_feedback = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (has_ext_custom_border_color) { |
|
|
|
VkPhysicalDeviceCustomBorderColorFeaturesEXT border_features; |
|
|
|
border_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT; |
|
|
|
@ -735,7 +728,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { |
|
|
|
ext_custom_border_color = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (has_ext_extended_dynamic_state) { |
|
|
|
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT dynamic_state; |
|
|
|
dynamic_state.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; |
|
|
|
@ -748,20 +740,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { |
|
|
|
ext_extended_dynamic_state = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (has_ext_robustness2) { |
|
|
|
VkPhysicalDeviceRobustness2FeaturesEXT robustness2; |
|
|
|
robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; |
|
|
|
robustness2.pNext = nullptr; |
|
|
|
features.pNext = &robustness2; |
|
|
|
physical.GetFeatures2KHR(features); |
|
|
|
if (robustness2.nullDescriptor && robustness2.robustBufferAccess2 && |
|
|
|
robustness2.robustImageAccess2) { |
|
|
|
extensions.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); |
|
|
|
ext_robustness2 = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return extensions; |
|
|
|
} |
|
|
|
|
|
|
|
|