mirror of
https://github.com/godotengine/godot.git
synced 2026-01-08 00:25:01 +03:00
Add FidelityFX Super Resolution 2.2 (FSR 2.2.1) support.
Introduces support for FSR2 as a new upscaler option available from the project settings. Also introduces an specific render list for surfaces that require motion and the ability to derive motion vectors from depth buffer and camera motion.
This commit is contained in:
@@ -504,6 +504,7 @@ Error VulkanContext::_initialize_device_extensions() {
|
||||
register_requested_device_extension(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, false);
|
||||
register_requested_device_extension(VK_KHR_MAINTENANCE_2_EXTENSION_NAME, false);
|
||||
register_requested_device_extension(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, false);
|
||||
register_requested_device_extension(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false);
|
||||
|
||||
if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
|
||||
register_requested_device_extension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, true);
|
||||
@@ -739,9 +740,12 @@ Error VulkanContext::_check_capabilities() {
|
||||
multiview_capabilities.max_view_count = 0;
|
||||
multiview_capabilities.max_instance_count = 0;
|
||||
subgroup_capabilities.size = 0;
|
||||
subgroup_capabilities.min_size = 0;
|
||||
subgroup_capabilities.max_size = 0;
|
||||
subgroup_capabilities.supportedStages = 0;
|
||||
subgroup_capabilities.supportedOperations = 0;
|
||||
subgroup_capabilities.quadOperationsInAllStages = false;
|
||||
subgroup_capabilities.size_control_is_supported = false;
|
||||
shader_capabilities.shader_float16_is_supported = false;
|
||||
shader_capabilities.shader_int8_is_supported = false;
|
||||
storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported = false;
|
||||
@@ -886,6 +890,7 @@ Error VulkanContext::_check_capabilities() {
|
||||
VkPhysicalDeviceFragmentShadingRatePropertiesKHR vrsProperties{};
|
||||
VkPhysicalDeviceMultiviewProperties multiviewProperties{};
|
||||
VkPhysicalDeviceSubgroupProperties subgroupProperties{};
|
||||
VkPhysicalDeviceSubgroupSizeControlProperties subgroupSizeControlProperties = {};
|
||||
VkPhysicalDeviceProperties2 physicalDeviceProperties{};
|
||||
void *nextptr = nullptr;
|
||||
|
||||
@@ -894,6 +899,15 @@ Error VulkanContext::_check_capabilities() {
|
||||
subgroupProperties.pNext = nextptr;
|
||||
|
||||
nextptr = &subgroupProperties;
|
||||
|
||||
subgroup_capabilities.size_control_is_supported = is_device_extension_enabled(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME);
|
||||
|
||||
if (subgroup_capabilities.size_control_is_supported) {
|
||||
subgroupSizeControlProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES;
|
||||
subgroupSizeControlProperties.pNext = nextptr;
|
||||
|
||||
nextptr = &subgroupSizeControlProperties;
|
||||
}
|
||||
}
|
||||
|
||||
if (multiview_capabilities.is_supported) {
|
||||
@@ -916,6 +930,8 @@ Error VulkanContext::_check_capabilities() {
|
||||
device_properties_func(gpu, &physicalDeviceProperties);
|
||||
|
||||
subgroup_capabilities.size = subgroupProperties.subgroupSize;
|
||||
subgroup_capabilities.min_size = subgroupProperties.subgroupSize;
|
||||
subgroup_capabilities.max_size = subgroupProperties.subgroupSize;
|
||||
subgroup_capabilities.supportedStages = subgroupProperties.supportedStages;
|
||||
subgroup_capabilities.supportedOperations = subgroupProperties.supportedOperations;
|
||||
// Note: quadOperationsInAllStages will be true if:
|
||||
@@ -923,6 +939,11 @@ Error VulkanContext::_check_capabilities() {
|
||||
// - supportedOperations has VK_SUBGROUP_FEATURE_QUAD_BIT.
|
||||
subgroup_capabilities.quadOperationsInAllStages = subgroupProperties.quadOperationsInAllStages;
|
||||
|
||||
if (subgroup_capabilities.size_control_is_supported && (subgroupSizeControlProperties.requiredSubgroupSizeStages & VK_SHADER_STAGE_COMPUTE_BIT)) {
|
||||
subgroup_capabilities.min_size = subgroupSizeControlProperties.minSubgroupSize;
|
||||
subgroup_capabilities.max_size = subgroupSizeControlProperties.maxSubgroupSize;
|
||||
}
|
||||
|
||||
if (vrs_capabilities.pipeline_vrs_supported || vrs_capabilities.primitive_vrs_supported || vrs_capabilities.attachment_vrs_supported) {
|
||||
print_verbose("- Vulkan Variable Rate Shading supported:");
|
||||
if (vrs_capabilities.pipeline_vrs_supported) {
|
||||
@@ -962,6 +983,8 @@ Error VulkanContext::_check_capabilities() {
|
||||
|
||||
print_verbose("- Vulkan subgroup:");
|
||||
print_verbose(" size: " + itos(subgroup_capabilities.size));
|
||||
print_verbose(" min size: " + itos(subgroup_capabilities.min_size));
|
||||
print_verbose(" max size: " + itos(subgroup_capabilities.max_size));
|
||||
print_verbose(" stages: " + subgroup_capabilities.supported_stages_desc());
|
||||
print_verbose(" supported ops: " + subgroup_capabilities.supported_operations_desc());
|
||||
if (subgroup_capabilities.quadOperationsInAllStages) {
|
||||
|
||||
Reference in New Issue
Block a user