diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index f2c7e4ab8..eedcfa899 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -93,7 +93,9 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_shader_subgroup_vote` * `VK_EXT_shader_viewport_index_layer` * `VK_EXT_subgroup_size_control` +* `VK_EXT_surface_maintenance1` * `VK_EXT_swapchain_colorspace` +* `VK_EXT_swapchain_maintenance1` * `VK_EXT_texel_buffer_alignment` * `VK_EXT_texture_compression_astc_hdr` * `VK_EXT_tooling_info` @@ -267,8 +269,6 @@ Ray tracing extensions are now standard and will likely be supported at some poi * `VK_EXT_rasterization_order_attachment_access` * `VK_EXT_shader_module_identifier` * `VK_EXT_subpass_merge_feedback` -* `VK_EXT_surface_maintenance1` -* `VK_EXT_swapchain_maintenance1` ## Platform/IHV Extensions diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index b9bff7ee5..2c9b259ba 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1243,6 +1243,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSubgroupProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSubgroupSizeControlFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSubgroupSizeControlProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSurfaceInfo2KHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSynchronization2Features); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTexelBufferAlignmentProperties); @@ -1312,6 +1313,7 @@ DECLARE_REFLECTION_STRUCT(VkQueryPoolPerformanceCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkQueueFamilyGlobalPriorityPropertiesKHR); DECLARE_REFLECTION_STRUCT(VkQueueFamilyProperties2); DECLARE_REFLECTION_STRUCT(VkRefreshCycleDurationGOOGLE); +DECLARE_REFLECTION_STRUCT(VkReleaseSwapchainImagesInfoEXT); DECLARE_REFLECTION_STRUCT(VkRenderingAttachmentInfo); DECLARE_REFLECTION_STRUCT(VkRenderingFragmentDensityMapAttachmentInfoEXT); DECLARE_REFLECTION_STRUCT(VkRenderingFragmentShadingRateAttachmentInfoKHR); @@ -1356,10 +1358,17 @@ DECLARE_REFLECTION_STRUCT(VkSubpassSampleLocationsEXT); DECLARE_REFLECTION_STRUCT(VkSurfaceCapabilities2EXT); DECLARE_REFLECTION_STRUCT(VkSurfaceCapabilities2KHR); DECLARE_REFLECTION_STRUCT(VkSurfaceFormat2KHR); +DECLARE_REFLECTION_STRUCT(VkSurfacePresentModeCompatibilityEXT); +DECLARE_REFLECTION_STRUCT(VkSurfacePresentModeEXT); +DECLARE_REFLECTION_STRUCT(VkSurfacePresentScalingCapabilitiesEXT); DECLARE_REFLECTION_STRUCT(VkSurfaceProtectedCapabilitiesKHR); DECLARE_REFLECTION_STRUCT(VkSwapchainCounterCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkSwapchainCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkSwapchainDisplayNativeHdrCreateInfoAMD); +DECLARE_REFLECTION_STRUCT(VkSwapchainPresentFenceInfoEXT); +DECLARE_REFLECTION_STRUCT(VkSwapchainPresentModeInfoEXT); +DECLARE_REFLECTION_STRUCT(VkSwapchainPresentModesCreateInfoEXT); +DECLARE_REFLECTION_STRUCT(VkSwapchainPresentScalingCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkTextureLODGatherFormatPropertiesAMD); DECLARE_REFLECTION_STRUCT(VkTimelineSemaphoreSubmitInfo); DECLARE_REFLECTION_STRUCT(VkValidationCacheCreateInfoEXT); @@ -1631,6 +1640,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSubgroupProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSubgroupSizeControlFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSubgroupSizeControlProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSurfaceInfo2KHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSynchronization2Features); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentProperties); @@ -1698,6 +1708,7 @@ DECLARE_DESERIALISE_TYPE(VkQueryPoolCreateInfo); DECLARE_DESERIALISE_TYPE(VkQueryPoolPerformanceCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkQueueFamilyGlobalPriorityPropertiesKHR); DECLARE_DESERIALISE_TYPE(VkQueueFamilyProperties2); +DECLARE_DESERIALISE_TYPE(VkReleaseSwapchainImagesInfoEXT); DECLARE_DESERIALISE_TYPE(VkRenderingAttachmentInfo); DECLARE_DESERIALISE_TYPE(VkRenderingFragmentDensityMapAttachmentInfoEXT); DECLARE_DESERIALISE_TYPE(VkRenderingFragmentShadingRateAttachmentInfoKHR); @@ -1741,10 +1752,17 @@ DECLARE_DESERIALISE_TYPE(VkSubpassSampleLocationsEXT); DECLARE_DESERIALISE_TYPE(VkSurfaceCapabilities2EXT); DECLARE_DESERIALISE_TYPE(VkSurfaceCapabilities2KHR); DECLARE_DESERIALISE_TYPE(VkSurfaceFormat2KHR); +DECLARE_DESERIALISE_TYPE(VkSurfacePresentModeCompatibilityEXT); +DECLARE_DESERIALISE_TYPE(VkSurfacePresentModeEXT); +DECLARE_DESERIALISE_TYPE(VkSurfacePresentScalingCapabilitiesEXT); DECLARE_DESERIALISE_TYPE(VkSurfaceProtectedCapabilitiesKHR); DECLARE_DESERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkSwapchainCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkSwapchainDisplayNativeHdrCreateInfoAMD); +DECLARE_DESERIALISE_TYPE(VkSwapchainPresentFenceInfoEXT); +DECLARE_DESERIALISE_TYPE(VkSwapchainPresentModeInfoEXT); +DECLARE_DESERIALISE_TYPE(VkSwapchainPresentModesCreateInfoEXT); +DECLARE_DESERIALISE_TYPE(VkSwapchainPresentScalingCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkTextureLODGatherFormatPropertiesAMD); DECLARE_DESERIALISE_TYPE(VkTimelineSemaphoreSubmitInfo); DECLARE_DESERIALISE_TYPE(VkValidationCacheCreateInfoEXT); @@ -2024,7 +2042,9 @@ DECLARE_REFLECTION_ENUM(VkPipelineStageFlagBits); DECLARE_REFLECTION_ENUM(VkPipelineStageFlagBits2); DECLARE_REFLECTION_ENUM(VkPointClippingBehavior); DECLARE_REFLECTION_ENUM(VkPolygonMode); +DECLARE_REFLECTION_ENUM(VkPresentGravityFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkPresentModeKHR); +DECLARE_REFLECTION_ENUM(VkPresentScalingFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkPrimitiveTopology); DECLARE_REFLECTION_ENUM(VkRenderingFlagBits); DECLARE_REFLECTION_ENUM(VkQueryControlFlagBits); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 306e98c87..cb0a315a9 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1115,9 +1115,15 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION, }, + { + VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION, + }, { VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, VK_EXT_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION, }, + { + VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION, + }, { VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index f7c4037a5..bd301fbb4 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -2608,4 +2608,8 @@ public: VkResult vkGetDrmDisplayEXT(VkPhysicalDevice physicalDevice, int32_t drmFd, uint32_t connectorId, VkDisplayKHR *display); + + // VK_EXT_swapchain_maintenance1 + VkResult vkReleaseSwapchainImagesEXT(VkDevice device, + const VkReleaseSwapchainImagesInfoEXT *pReleaseInfo); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 9bfb24ccf..1ffbd3511 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -545,7 +545,8 @@ DeclExt(KHR_dynamic_rendering); \ DeclExt(KHR_fragment_shading_rate); \ DeclExt(EXT_attachment_feedback_loop_layout); \ - DeclExt(EXT_pageable_device_local_memory); + DeclExt(EXT_pageable_device_local_memory); \ + DeclExt(EXT_swapchain_maintenance1); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -661,7 +662,8 @@ CheckExt(KHR_dynamic_rendering, VK13); \ CheckExt(KHR_fragment_shading_rate, VKXX); \ CheckExt(EXT_attachment_feedback_loop_layout, VKXX); \ - CheckExt(EXT_pageable_device_local_memory, VKXX); + CheckExt(EXT_pageable_device_local_memory, VKXX); \ + CheckExt(EXT_swapchain_maintenance1, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ @@ -922,6 +924,7 @@ HookInitPromotedExtension(KHR_dynamic_rendering, CmdEndRendering, KHR); \ HookInitExtension(KHR_fragment_shading_rate, CmdSetFragmentShadingRateKHR); \ HookInitExtension(EXT_pageable_device_local_memory, SetDeviceMemoryPriorityEXT); \ + HookInitExtension(EXT_swapchain_maintenance1, ReleaseSwapchainImagesEXT); \ HookInitExtension_Device_Win32(); \ HookInitExtension_Device_Linux(); \ HookInitExtension_Device_GGP(); \ @@ -1646,6 +1649,8 @@ VkDisplayKHR, display); \ HookDefine4(VkResult, vkGetDrmDisplayEXT, VkPhysicalDevice, physicalDevice, int32_t, drmFd, \ uint32_t, connectorId, VkDisplayKHR *, display); \ + HookDefine2(VkResult, vkReleaseSwapchainImagesEXT, VkDevice, device, \ + const VkReleaseSwapchainImagesInfoEXT *, pReleaseInfo); \ HookDefine_Win32(); \ HookDefine_Linux(); \ HookDefine_GGP(); \ diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 675695072..cd8ea74aa 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -421,6 +421,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceSubgroupSizeControlFeatures) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES, \ VkPhysicalDeviceSubgroupSizeControlProperties) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, \ + VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, \ VkPhysicalDeviceSynchronization2Features); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, \ @@ -571,10 +573,20 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT, VkSurfaceCapabilities2EXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR, VkSurfaceCapabilities2KHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR, VkSurfaceFormat2KHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT, \ + VkSurfacePresentModeCompatibilityEXT) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT, VkSurfacePresentModeEXT) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT, \ + VkSurfacePresentScalingCapabilitiesEXT) \ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR, \ VkSurfaceProtectedCapabilitiesKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD, \ VkSwapchainDisplayNativeHdrCreateInfoAMD) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT, VkSwapchainPresentModeInfoEXT) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT, \ + VkSwapchainPresentModesCreateInfoEXT) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT, \ + VkSwapchainPresentScalingCreateInfoEXT) \ COPY_STRUCT(VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD, \ VkTextureLODGatherFormatPropertiesAMD); \ COPY_STRUCT(VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, VkTimelineSemaphoreSubmitInfo); \ @@ -677,6 +689,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, UnwrapInPlace(out->imageView), UnwrapInPlace(out->resolveImageView)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, VkRenderPassBeginInfo, \ UnwrapInPlace(out->renderPass), UnwrapInPlace(out->framebuffer)); \ + UNWRAP_STRUCT(VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT, \ + VkReleaseSwapchainImagesInfoEXT, UnwrapInPlace(out->swapchain)) \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, VkSamplerYcbcrConversionInfo, \ UnwrapInPlace(out->conversion)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO, VkSemaphoreSignalInfo, \ @@ -933,7 +947,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR: \ case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: \ @@ -963,7 +976,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR: \ case VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR: \ case VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV: \ - case VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT: \ case VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT: \ case VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT: \ @@ -976,14 +988,7 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: \ case VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT: \ case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV: \ - case VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT: \ - case VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT: \ - case VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT: \ case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV: \ - case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: \ - case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: \ - case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: \ - case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA: \ case VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM: \ case VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR: \ @@ -1390,6 +1395,14 @@ size_t GetNextPatchSize(const void *pNext) memSize += GetNextPatchSize(info->pSignalSemaphoreInfos[i].pNext); break; } + case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: + { + memSize += sizeof(VkSwapchainPresentFenceInfoEXT); + + VkSwapchainPresentFenceInfoEXT *info = (VkSwapchainPresentFenceInfoEXT *)next; + memSize += info->swapchainCount * sizeof(VkFence); + break; + } case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET: { memSize += sizeof(VkWriteDescriptorSet); @@ -2476,6 +2489,26 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem, break; } + case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: + { + const VkSwapchainPresentFenceInfoEXT *in = (const VkSwapchainPresentFenceInfoEXT *)nextInput; + VkSwapchainPresentFenceInfoEXT *out = (VkSwapchainPresentFenceInfoEXT *)tempMem; + + // append immediately so tempMem is incremented + AppendModifiedChainedStruct(tempMem, out, nextChainTail); + + // allocate unwrapped array + VkFence *outFences = (VkFence *)tempMem; + tempMem += sizeof(VkFence) * in->swapchainCount; + + *out = *in; + out->pFences = outFences; + + for(uint32_t i = 0; i < in->swapchainCount; i++) + outFences[i] = Unwrap(in->pFences[i]); + + break; + } case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET: { const VkWriteDescriptorSet *in = (const VkWriteDescriptorSet *)nextInput; @@ -2855,6 +2888,10 @@ void CopyNextChainForPatching(const char *structName, byte *&tempMem, VkBaseInSt case VK_STRUCTURE_TYPE_SUBMIT_INFO_2: CopyNextChainedStruct(sizeof(VkSubmitInfo2), tempMem, nextInput, nextChainTail); break; + case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: + CopyNextChainedStruct(sizeof(VkSwapchainPresentFenceInfoEXT), tempMem, nextInput, + nextChainTail); + break; case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET: CopyNextChainedStruct(sizeof(VkWriteDescriptorSet), tempMem, nextInput, nextChainTail); break; diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index d2f7c7f5b..4c97962ad 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -165,6 +165,8 @@ DECL_VKFLAG_EXT(VkAccess, 2); DECL_VKFLAG_EXT(VkFormatFeature, 2); DECL_VKFLAG_EXT(VkGraphicsPipelineLibrary, EXT); DECL_VKFLAG(VkRendering); +DECL_VKFLAG_EXT(VkPresentScaling, EXT); +DECL_VKFLAG_EXT(VkPresentGravity, EXT); // serialise a member as flags - cast to the Bits enum for serialisation so the stringification // picks up the bitfield and doesn't treat it as uint32_t. Then we rename the type back to the base @@ -840,6 +842,24 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, \ VkPipelineShaderStageRequiredSubgroupSizeCreateInfo) \ \ + /* VK_EXT_surface_maintenance1 */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT, VkSurfacePresentModeEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT, \ + VkSurfacePresentScalingCapabilitiesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT, \ + VkSurfacePresentModeCompatibilityEXT) \ + \ + /* VK_EXT_swapchain_maintenance1 */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, \ + VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT, VkReleaseSwapchainImagesInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT, VkSwapchainPresentFenceInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT, \ + VkSwapchainPresentModesCreateInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT, VkSwapchainPresentModeInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT, \ + VkSwapchainPresentScalingCreateInfoEXT) \ + \ /* VK_EXT_texel_buffer_alignment */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, \ VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT) \ @@ -1520,19 +1540,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT) \ \ - /* VK_EXT_surface_maintenance1 */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT) \ - \ - /* VK_EXT_swapchain_maintenance1 */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT) \ - \ /* VK_HUAWEI_invocation_mask */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI) \ \ @@ -4147,6 +4154,161 @@ void Deserialise(const VkSwapchainDisplayNativeHdrCreateInfoAMD &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkSurfacePresentModeEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentMode); +} + +template <> +void Deserialise(const VkSurfacePresentModeEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSurfacePresentScalingCapabilitiesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_VKFLAGS(VkPresentScalingFlagsEXT, supportedPresentScaling); + SERIALISE_MEMBER_VKFLAGS(VkPresentGravityFlagsEXT, supportedPresentGravityX); + SERIALISE_MEMBER_VKFLAGS(VkPresentGravityFlagsEXT, supportedPresentGravityY); + SERIALISE_MEMBER(minScaledImageExtent); + SERIALISE_MEMBER(maxScaledImageExtent); +} + +template <> +void Deserialise(const VkSurfacePresentScalingCapabilitiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSurfacePresentModeCompatibilityEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentModeCount); + SERIALISE_MEMBER_ARRAY(pPresentModes, presentModeCount); +} + +template <> +void Deserialise(const VkSurfacePresentModeCompatibilityEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pPresentModes; +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(swapchainMaintenance1); +} + +template <> +void Deserialise(const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkReleaseSwapchainImagesInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(swapchain); + SERIALISE_MEMBER(imageIndexCount); + SERIALISE_MEMBER_ARRAY(pImageIndices, imageIndexCount); +} + +template <> +void Deserialise(const VkReleaseSwapchainImagesInfoEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pImageIndices; +} + +template +void DoSerialise(SerialiserType &ser, VkSwapchainPresentFenceInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(swapchainCount); + SERIALISE_MEMBER_ARRAY(pFences, swapchainCount); +} + +template <> +void Deserialise(const VkSwapchainPresentFenceInfoEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pFences; +} + +template +void DoSerialise(SerialiserType &ser, VkSwapchainPresentModesCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentModeCount); + SERIALISE_MEMBER_ARRAY(pPresentModes, presentModeCount); +} + +template <> +void Deserialise(const VkSwapchainPresentModesCreateInfoEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pPresentModes; +} + +template +void DoSerialise(SerialiserType &ser, VkSwapchainPresentModeInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(swapchainCount); + SERIALISE_MEMBER_ARRAY(pPresentModes, swapchainCount); +} + +template <> +void Deserialise(const VkSwapchainPresentModeInfoEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pPresentModes; +} + +template +void DoSerialise(SerialiserType &ser, VkSwapchainPresentScalingCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_VKFLAGS(VkPresentScalingFlagsEXT, scalingBehavior); + SERIALISE_MEMBER_VKFLAGS(VkPresentGravityFlagsEXT, presentGravityX); + SERIALISE_MEMBER_VKFLAGS(VkPresentGravityFlagsEXT, presentGravityY); +} + +template <> +void Deserialise(const VkSwapchainPresentScalingCreateInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPresentInfoKHR &el) { @@ -11138,6 +11300,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSubgroupProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSubgroupSizeControlFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSubgroupSizeControlProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSurfaceInfo2KHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSynchronization2Features); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentProperties); @@ -11207,6 +11370,7 @@ INSTANTIATE_SERIALISE_TYPE(VkQueryPoolPerformanceCreateInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyGlobalPriorityPropertiesKHR); INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyProperties2); INSTANTIATE_SERIALISE_TYPE(VkRefreshCycleDurationGOOGLE); +INSTANTIATE_SERIALISE_TYPE(VkReleaseSwapchainImagesInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkRenderingAttachmentInfo); INSTANTIATE_SERIALISE_TYPE(VkRenderingFragmentDensityMapAttachmentInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkRenderingFragmentShadingRateAttachmentInfoKHR); @@ -11251,10 +11415,17 @@ INSTANTIATE_SERIALISE_TYPE(VkSubpassSampleLocationsEXT); INSTANTIATE_SERIALISE_TYPE(VkSurfaceCapabilities2EXT); INSTANTIATE_SERIALISE_TYPE(VkSurfaceCapabilities2KHR); INSTANTIATE_SERIALISE_TYPE(VkSurfaceFormat2KHR); +INSTANTIATE_SERIALISE_TYPE(VkSurfacePresentModeCompatibilityEXT); +INSTANTIATE_SERIALISE_TYPE(VkSurfacePresentModeEXT); +INSTANTIATE_SERIALISE_TYPE(VkSurfacePresentScalingCapabilitiesEXT); INSTANTIATE_SERIALISE_TYPE(VkSurfaceProtectedCapabilitiesKHR); INSTANTIATE_SERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkSwapchainCreateInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkSwapchainDisplayNativeHdrCreateInfoAMD); +INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentFenceInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentModeInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentModesCreateInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentScalingCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkTextureLODGatherFormatPropertiesAMD); INSTANTIATE_SERIALISE_TYPE(VkTimelineSemaphoreSubmitInfo); INSTANTIATE_SERIALISE_TYPE(VkValidationCacheCreateInfoEXT); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index 5e518d841..432189a43 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -3346,6 +3346,18 @@ rdcstr DoStringise(const VkSemaphoreType &el) END_ENUM_STRINGISE(); } +template <> +rdcstr DoStringise(const VkMemoryOverallocationBehaviorAMD &el) +{ + BEGIN_ENUM_STRINGISE(VkMemoryOverallocationBehaviorAMD); + { + STRINGISE_ENUM(VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD); + STRINGISE_ENUM(VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD); + STRINGISE_ENUM(VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD); + } + END_ENUM_STRINGISE(); +} + template <> rdcstr DoStringise(const VkSemaphoreWaitFlagBits &el) { @@ -3570,13 +3582,25 @@ rdcstr DoStringise(const VkRenderingFlagBits &el) } template <> -rdcstr DoStringise(const VkMemoryOverallocationBehaviorAMD &el) +rdcstr DoStringise(const VkPresentGravityFlagBitsEXT &el) { - BEGIN_BITFIELD_STRINGISE(VkMemoryOverallocationBehaviorAMD); + BEGIN_BITFIELD_STRINGISE(VkPresentGravityFlagBitsEXT); { - STRINGISE_BITFIELD_BIT(VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD); - STRINGISE_BITFIELD_BIT(VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD); - STRINGISE_BITFIELD_BIT(VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD); + STRINGISE_BITFIELD_BIT(VK_PRESENT_GRAVITY_MIN_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_GRAVITY_MAX_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_GRAVITY_CENTERED_BIT_EXT); + } + END_BITFIELD_STRINGISE(); +} + +template <> +rdcstr DoStringise(const VkPresentScalingFlagBitsEXT &el) +{ + BEGIN_BITFIELD_STRINGISE(VkPresentScalingFlagBitsEXT); + { + STRINGISE_BITFIELD_BIT(VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_SCALING_STRETCH_BIT_EXT); } END_BITFIELD_STRINGISE(); } diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index f4f837d73..16ce88364 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -182,7 +182,8 @@ static void StripUnwantedExtensions(rdcarray &Extensions) // remove WSI-only extensions if(ext == "VK_GOOGLE_display_timing" || ext == "VK_KHR_display_swapchain" || ext == "VK_EXT_display_control" || ext == "VK_KHR_present_id" || - ext == "VK_KHR_present_wait") + ext == "VK_KHR_present_wait" || ext == "VK_EXT_surface_maintenance1" || + ext == "VK_EXT_swapchain_maintenance1") return true; // remove fullscreen exclusive extension @@ -3028,6 +3029,13 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(pageableDeviceLocalMemory); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(swapchainMaintenance1); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp) diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index f7b32704e..98ce7d57b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -788,7 +788,6 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR unwrappedInfo.pSwapchains = unwrappedSwaps.data(); - // Don't support any extensions for present info const VkBaseInStructure *next = (const VkBaseInStructure *)pPresentInfo->pNext; while(next) { @@ -798,7 +797,9 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR next->sType != VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP && next->sType != VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR && next->sType != VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE && - next->sType != VK_STRUCTURE_TYPE_PRESENT_ID_KHR) + next->sType != VK_STRUCTURE_TYPE_PRESENT_ID_KHR && + next->sType != VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT && + next->sType != VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT) { RDCWARN("Unsupported pNext structure in pPresentInfo: %s", ToStr(next->sType).c_str()); } @@ -846,6 +847,16 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR if(ids) ids->swapchainCount = 1; + VkSwapchainPresentFenceInfoEXT *fences = (VkSwapchainPresentFenceInfoEXT *)FindNextStruct( + &mutableInfo, VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT); + if(fences) + fences->swapchainCount = 1; + + VkSwapchainPresentModeInfoEXT *mode = (VkSwapchainPresentModeInfoEXT *)FindNextStruct( + &mutableInfo, VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT); + if(mode) + mode->swapchainCount = 1; + for(uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { HandlePresent(queue, &mutableInfo, unwrappedWaitSems); @@ -861,6 +872,10 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR ids->pPresentIds++; if(times) times->pTimes++; + if(fences) + fences->pFences++; + if(mode) + mode->pPresentModes++; } } @@ -1434,6 +1449,14 @@ VkResult WrappedVulkan::vkWaitForPresentKHR(VkDevice device, VkSwapchainKHR swap return ObjDisp(device)->WaitForPresentKHR(Unwrap(device), Unwrap(swapchain), presentId, timeout); } +VkResult WrappedVulkan::vkReleaseSwapchainImagesEXT(VkDevice device, + const VkReleaseSwapchainImagesInfoEXT *pReleaseInfo) +{ + VkReleaseSwapchainImagesInfoEXT releaseInfo = *pReleaseInfo; + releaseInfo.swapchain = Unwrap(releaseInfo.swapchain); + return ObjDisp(device)->ReleaseSwapchainImagesEXT(Unwrap(device), &releaseInfo); +} + #ifdef VK_USE_PLATFORM_WIN32_KHR VkResult WrappedVulkan::vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,