From 0e75b926b0214fb8a18d9650a4e29f0bfa544dd4 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 21 Oct 2021 15:59:34 +0100 Subject: [PATCH] Add support for VK_KHR_present_id/wait --- renderdoc/driver/vulkan/extension_support.md | 4 +- renderdoc/driver/vulkan/vk_common.h | 6 ++ renderdoc/driver/vulkan/vk_core.cpp | 6 ++ renderdoc/driver/vulkan/vk_core.h | 5 ++ renderdoc/driver/vulkan/vk_hookset_defs.h | 6 +- renderdoc/driver/vulkan/vk_next_chains.cpp | 8 ++- renderdoc/driver/vulkan/vk_serialise.cpp | 66 +++++++++++++++++-- .../vulkan/wrappers/vk_device_funcs.cpp | 31 ++++----- .../driver/vulkan/wrappers/vk_wsi_funcs.cpp | 9 ++- 9 files changed, 109 insertions(+), 32 deletions(-) diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index 62425e955..8e0a39147 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -135,6 +135,8 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_KHR_multiview` * `VK_KHR_performance_query` * `VK_KHR_pipeline_executable_properties` +* `VK_KHR_present_id` +* `VK_KHR_present_wait` * `VK_KHR_push_descriptor` * `VK_KHR_relaxed_block_layout` * `VK_KHR_sampler_mirror_clamp_to_edge` @@ -189,8 +191,6 @@ KHR extensions will definitely be implemented at some point, though KHR extensio * `VK_KHR_fragment_shading_rate` * `VK_KHR_maintenance4` -* `VK_KHR_present_id` -* `VK_KHR_present_wait` * `VK_KHR_shader_integer_dot_product` * `VK_KHR_shader_subgroup_uniform_control_flow` diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 5b21b5387..59bfb1807 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -964,6 +964,8 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePipelineCreationCacheControlFeaturesEX DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePointClippingProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePrivateDataFeaturesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentIdFeaturesKHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentWaitFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProperties2); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProtectedMemoryFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProtectedMemoryProperties); @@ -1038,6 +1040,7 @@ DECLARE_REFLECTION_STRUCT(VkPipelineTessellationStateCreateInfo); DECLARE_REFLECTION_STRUCT(VkPipelineVertexInputDivisorStateCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkPipelineVertexInputStateCreateInfo); DECLARE_REFLECTION_STRUCT(VkPipelineViewportStateCreateInfo); +DECLARE_REFLECTION_STRUCT(VkPresentIdKHR); DECLARE_REFLECTION_STRUCT(VkPresentInfoKHR); DECLARE_REFLECTION_STRUCT(VkPresentRegionsKHR); DECLARE_REFLECTION_STRUCT(VkPresentTimeGOOGLE); @@ -1294,6 +1297,8 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePointClippingProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePrivateDataFeaturesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentIdFeaturesKHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentWaitFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProperties2); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryProperties); @@ -1368,6 +1373,7 @@ DECLARE_DESERIALISE_TYPE(VkPipelineTessellationStateCreateInfo); DECLARE_DESERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkPipelineVertexInputStateCreateInfo); DECLARE_DESERIALISE_TYPE(VkPipelineViewportStateCreateInfo); +DECLARE_DESERIALISE_TYPE(VkPresentIdKHR); DECLARE_DESERIALISE_TYPE(VkPresentInfoKHR); DECLARE_DESERIALISE_TYPE(VkPresentRegionsKHR); DECLARE_DESERIALISE_TYPE(VkPresentTimesInfoGOOGLE); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 9b036ee3d..42b77a69e 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1237,6 +1237,12 @@ static const VkExtensionProperties supportedExtensions[] = { VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION, }, + { + VK_KHR_PRESENT_ID_EXTENSION_NAME, VK_KHR_PRESENT_ID_SPEC_VERSION, + }, + { + VK_KHR_PRESENT_WAIT_EXTENSION_NAME, VK_KHR_PRESENT_WAIT_SPEC_VERSION, + }, { VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 42910674c..df46cbc80 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -2454,4 +2454,9 @@ public: IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkQueueSubmit2KHR, VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits, VkFence fence); + + // VK_KHR_present_wait + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkWaitForPresentKHR, VkDevice device, + VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 6b9b54f77..21a84dfb1 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -527,7 +527,8 @@ DeclExt(EXT_private_data); \ DeclExt(EXT_extended_dynamic_state); \ DeclExt(KHR_copy_commands2); \ - DeclExt(KHR_synchronization2); + DeclExt(KHR_synchronization2); \ + DeclExt(KHR_present_wait); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -868,6 +869,7 @@ HookInitExtension(KHR_synchronization2, CmdWriteTimestamp2KHR); \ HookInitExtension(KHR_synchronization2, QueueSubmit2KHR); \ HookInitExtension(KHR_synchronization2 &&AMD_buffer_marker, CmdWriteBufferMarker2AMD); \ + HookInitExtension(KHR_present_wait, WaitForPresentKHR); \ /* No GetQueueCheckpointData2NV without VK_NV_device_diagnostic_checkpoints */ \ HookInitExtension_Device_Win32(); \ HookInitExtension_Device_Linux(); \ @@ -1552,6 +1554,8 @@ HookDefine5(void, vkCmdWriteBufferMarker2AMD, VkCommandBuffer, commandBuffer, \ VkPipelineStageFlags2KHR, stage, VkBuffer, dstBuffer, VkDeviceSize, dstOffset, \ uint32_t, marker); \ + HookDefine4(VkResult, vkWaitForPresentKHR, VkDevice, device, VkSwapchainKHR, swapchain, \ + uint64_t, presentId, uint64_t, timeout); \ 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 27c1456cd..391f3687c 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -300,6 +300,10 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDevicePointClippingProperties); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT, \ VkPhysicalDevicePrivateDataFeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, \ + VkPhysicalDevicePresentIdFeaturesKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, \ + VkPhysicalDevicePresentWaitFeaturesKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, VkPhysicalDeviceProperties2); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, \ VkPhysicalDeviceProtectedMemoryFeatures); \ @@ -434,6 +438,7 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPipelineVertexInputStateCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, \ VkPipelineViewportStateCreateInfo); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_ID_KHR, VkPresentIdKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, VkPresentRegionsKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE, VkPresentTimesInfoGOOGLE) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT, VkPrivateDataSlotCreateInfoEXT) \ @@ -735,8 +740,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: \ @@ -779,7 +782,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: \ - case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: \ case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: \ case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: \ case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 9e1c3dbf4..03c049c05 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -1040,6 +1040,15 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR, \ VkPipelineExecutableInternalRepresentationKHR) \ \ + /* VK_KHR_present_id */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_ID_KHR, VkPresentIdKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, \ + VkPhysicalDevicePresentIdFeaturesKHR) \ + \ + /* VK_KHR_present_wait */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, \ + VkPhysicalDevicePresentWaitFeaturesKHR) \ + \ /* VK_KHR_push_descriptor */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, \ VkPhysicalDevicePushDescriptorPropertiesKHR) \ @@ -1328,13 +1337,6 @@ SERIALISE_VK_HANDLES(); /* VK_KHR_pipeline_library */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR) \ \ - /* VK_KHR_present_id */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PRESENT_ID_KHR) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR) \ - \ - /* VK_KHR_present_wait */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR) \ - \ /* VK_KHR_ray_tracing_pipeline */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR) \ @@ -5421,6 +5423,53 @@ void Deserialise(const VkPipelineExecutableInternalRepresentationKHR &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPresentIdKHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_ID_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(swapchainCount); + SERIALISE_MEMBER_ARRAY(pPresentIds); +} + +template <> +void Deserialise(const VkPresentIdKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDevicePresentIdFeaturesKHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentId); +} + +template <> +void Deserialise(const VkPhysicalDevicePresentIdFeaturesKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDevicePresentWaitFeaturesKHR &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentWait); +} + +template <> +void Deserialise(const VkPhysicalDevicePresentWaitFeaturesKHR &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDevicePushDescriptorPropertiesKHR &el) { @@ -9480,6 +9529,8 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePipelineCreationCacheControlFeaturesE INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePointClippingProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePrivateDataFeaturesEXT); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentIdFeaturesKHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentWaitFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProperties2); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryProperties); @@ -9554,6 +9605,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPipelineTessellationStateCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkPipelineVertexInputStateCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkPipelineViewportStateCreateInfo); +INSTANTIATE_SERIALISE_TYPE(VkPresentIdKHR); INSTANTIATE_SERIALISE_TYPE(VkPresentInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkPresentRegionsKHR); INSTANTIATE_SERIALISE_TYPE(VkPresentTimeGOOGLE); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 4e19cfbe6..32b38bb5f 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -179,7 +179,8 @@ static void StripUnwantedExtensions(rdcarray &Extensions) } // remove WSI-only extensions - if(ext == "VK_GOOGLE_display_timing") + if(ext == "VK_GOOGLE_display_timing" || ext == "VK_KHR_display_swapchain" || + ext == "VK_EXT_display_control" || ext == "VK_KHR_present_id") return true; // remove fullscreen exclusive extension @@ -188,7 +189,8 @@ static void StripUnwantedExtensions(rdcarray &Extensions) // this is debug only, nothing to capture, so nothing to replay if(ext == "VK_EXT_tooling_info" || ext == "VK_EXT_private_data" || - ext == "VK_EXT_validation_features" || ext == "VK_EXT_validation_flags") + ext == "VK_EXT_validation_features" || ext == "VK_EXT_validation_cache" || + ext == "VK_EXT_validation_flags") return true; // these are debug only and will be added (if supported) as optional @@ -1618,19 +1620,6 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi rdcarray Extensions; for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++) { - // don't include the debug marker extension - if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) - continue; - - // don't include the validation cache extension - if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_VALIDATION_CACHE_EXTENSION_NAME)) - continue; - - // don't include direct-display WSI extensions - if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) || - !strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME)) - continue; - Extensions.push_back(createInfo.ppEnabledExtensionNames[i]); } @@ -2062,12 +2051,18 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi return false; } - // remove private data structs to improve capture compatibility, since we don't replay any - // private data. + // remove structs from extensions that we have stripped but may still be referenced here, + // to ensure we don't pass structs for disabled extensions. if(RemoveNextStruct(&createInfo, VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT) || RemoveNextStruct(&createInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT)) { - RDCLOG("Removed private data structs from vkCreateDevice pNext chain"); + RDCLOG("Removed VK_EXT_private_data structs from vkCreateDevice pNext chain"); + } + + if(RemoveNextStruct(&createInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR) || + RemoveNextStruct(&createInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR)) + { + RDCLOG("Removed VK_KHR_present_id/wait structs from vkCreateDevice pNext chain"); } VkPhysicalDeviceFeatures enabledFeatures = {0}; diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index 8a05aa1bd..ecf53f7d1 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -769,7 +769,8 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR next->sType != VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR && 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_TIMES_INFO_GOOGLE && + next->sType != VK_STRUCTURE_TYPE_PRESENT_ID_KHR) { RDCWARN("Unsupported pNext structure in pPresentInfo: %s", ToStr(next->sType).c_str()); } @@ -1309,6 +1310,12 @@ VkResult WrappedVulkan::vkCreateHeadlessSurfaceEXT(VkInstance instance, return ret; } +VkResult WrappedVulkan::vkWaitForPresentKHR(VkDevice device, VkSwapchainKHR swapchain, + uint64_t presentId, uint64_t timeout) +{ + return ObjDisp(device)->WaitForPresentKHR(Unwrap(device), Unwrap(swapchain), presentId, timeout); +} + #ifdef VK_USE_PLATFORM_WIN32_KHR VkResult WrappedVulkan::vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,