diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index da659f2ef..fd1fb3740 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -254,6 +254,7 @@ namespace dxvk { && CHECK_FEATURE_NEED(extShaderModuleIdentifier.shaderModuleIdentifier) && CHECK_FEATURE_NEED(extShaderStencilExport) && CHECK_FEATURE_NEED(extSwapchainColorSpace) + && CHECK_FEATURE_NEED(extSwapchainMaintenance1.swapchainMaintenance1) && CHECK_FEATURE_NEED(extHdrMetadata) && CHECK_FEATURE_NEED(extTransformFeedback.transformFeedback) && CHECK_FEATURE_NEED(extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor) @@ -376,6 +377,11 @@ namespace dxvk { enabledFeatures.extShaderModuleIdentifier.shaderModuleIdentifier = m_deviceFeatures.extShaderModuleIdentifier.shaderModuleIdentifier; + // Enable swap chain features that are transparent tot he device + enabledFeatures.extSwapchainMaintenance1.swapchainMaintenance1 = + m_deviceFeatures.extSwapchainMaintenance1.swapchainMaintenance1 && + instance->extensions().extSurfaceMaintenance1; + // Create pNext chain for additional device features initFeatureChain(enabledFeatures, devExtensions, instance->extensions()); @@ -535,6 +541,10 @@ namespace dxvk { enabledFeatures.extShaderModuleIdentifier = *reinterpret_cast(f); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: + enabledFeatures.extSwapchainMaintenance1 = *reinterpret_cast(f); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: enabledFeatures.extTransformFeedback = *reinterpret_cast(f); break; @@ -805,6 +815,11 @@ namespace dxvk { if (m_deviceExtensions.supports(VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME)) m_deviceFeatures.extSwapchainColorSpace = VK_TRUE; + if (m_deviceExtensions.supports(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME)) { + m_deviceFeatures.extSwapchainMaintenance1.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT; + m_deviceFeatures.extSwapchainMaintenance1.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extSwapchainMaintenance1); + } + if (m_deviceExtensions.supports(VK_EXT_HDR_METADATA_EXTENSION_NAME)) m_deviceFeatures.extHdrMetadata = VK_TRUE; @@ -878,6 +893,7 @@ namespace dxvk { &devExtensions.extShaderModuleIdentifier, &devExtensions.extShaderStencilExport, &devExtensions.extSwapchainColorSpace, + &devExtensions.extSwapchainMaintenance1, &devExtensions.extTransformFeedback, &devExtensions.extVertexAttributeDivisor, &devExtensions.khrExternalMemoryWin32, @@ -974,6 +990,11 @@ namespace dxvk { if (devExtensions.extSwapchainColorSpace) enabledFeatures.extSwapchainColorSpace = VK_TRUE; + if (devExtensions.extSwapchainMaintenance1) { + enabledFeatures.extSwapchainMaintenance1.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT; + enabledFeatures.extSwapchainMaintenance1.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extSwapchainMaintenance1); + } + if (devExtensions.extHdrMetadata) enabledFeatures.extHdrMetadata = VK_TRUE; @@ -1106,6 +1127,8 @@ namespace dxvk { "\n extension supported : ", features.extShaderStencilExport ? "1" : "0", "\n", VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, "\n extension supported : ", features.extSwapchainColorSpace ? "1" : "0", + "\n", VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, + "\n swapchainMaintenance1 : ", features.extSwapchainMaintenance1.swapchainMaintenance1 ? "1" : "0", "\n", VK_EXT_HDR_METADATA_EXTENSION_NAME, "\n extension supported : ", features.extHdrMetadata ? "1" : "0", "\n", VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, diff --git a/src/dxvk/dxvk_device_info.h b/src/dxvk/dxvk_device_info.h index 3c385cbd3..2d4058f0b 100644 --- a/src/dxvk/dxvk_device_info.h +++ b/src/dxvk/dxvk_device_info.h @@ -48,6 +48,7 @@ namespace dxvk { VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT extFragmentShaderInterlock; VkBool32 extFullScreenExclusive; VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT extGraphicsPipelineLibrary; + VkBool32 extHdrMetadata; VkBool32 extMemoryBudget; VkPhysicalDeviceMemoryPriorityFeaturesEXT extMemoryPriority; VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT extNonSeamlessCubeMap; @@ -55,7 +56,7 @@ namespace dxvk { VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT extShaderModuleIdentifier; VkBool32 extShaderStencilExport; VkBool32 extSwapchainColorSpace; - VkBool32 extHdrMetadata; + VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT extSwapchainMaintenance1; VkPhysicalDeviceTransformFeedbackFeaturesEXT extTransformFeedback; VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT extVertexAttributeDivisor; VkBool32 khrExternalMemoryWin32; diff --git a/src/dxvk/dxvk_extensions.h b/src/dxvk/dxvk_extensions.h index 817d06f67..087221d92 100644 --- a/src/dxvk/dxvk_extensions.h +++ b/src/dxvk/dxvk_extensions.h @@ -311,6 +311,7 @@ namespace dxvk { DxvkExt extShaderModuleIdentifier = { VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extSwapchainColorSpace = { VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, DxvkExtMode::Optional }; + DxvkExt extSwapchainMaintenance1 = { VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extHdrMetadata = { VK_EXT_HDR_METADATA_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extTransformFeedback = { VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extVertexAttributeDivisor = { VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, DxvkExtMode::Optional }; @@ -330,6 +331,7 @@ namespace dxvk { */ struct DxvkInstanceExtensions { DxvkExt extDebugUtils = { VK_EXT_DEBUG_UTILS_EXTENSION_NAME, DxvkExtMode::Optional }; + DxvkExt extSurfaceMaintenance1 = { VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrGetSurfaceCapabilities2 = { VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrSurface = { VK_KHR_SURFACE_EXTENSION_NAME, DxvkExtMode::Required }; }; diff --git a/src/dxvk/dxvk_instance.cpp b/src/dxvk/dxvk_instance.cpp index dc19d5e24..9a29d2d11 100644 --- a/src/dxvk/dxvk_instance.cpp +++ b/src/dxvk/dxvk_instance.cpp @@ -212,6 +212,7 @@ namespace dxvk { std::vector DxvkInstance::getExtensionList(DxvkInstanceExtensions& ext, bool withDebug) { std::vector result = {{ + &ext.extSurfaceMaintenance1, &ext.khrGetSurfaceCapabilities2, &ext.khrSurface, }}; diff --git a/src/vulkan/vulkan_loader.h b/src/vulkan/vulkan_loader.h index 6939985fe..e50d439ac 100644 --- a/src/vulkan/vulkan_loader.h +++ b/src/vulkan/vulkan_loader.h @@ -161,6 +161,10 @@ namespace dxvk::vk { #ifdef VK_EXT_full_screen_exclusive VULKAN_FN(vkGetPhysicalDeviceSurfacePresentModes2EXT); #endif + + #ifdef VK_EXT_swapchain_maintenance1 + VULKAN_FN(vkReleaseSwapchainImagesEXT); + #endif };