From fff1cc4b0eeebd2e93941efa6074383b3ac724b0 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 24 Jul 2026 13:20:27 +0100 Subject: [PATCH] Add support for VK_EXT_present_timing * As with other WSI extensions this is only passed through on capture, not replayed. --- renderdoc/driver/vulkan/extension_support.md | 2 +- renderdoc/driver/vulkan/vk_common.h | 28 +++ renderdoc/driver/vulkan/vk_core.cpp | 4 + renderdoc/driver/vulkan/vk_core.h | 14 ++ renderdoc/driver/vulkan/vk_hookset_defs.h | 21 +- renderdoc/driver/vulkan/vk_next_chains.cpp | 26 +- renderdoc/driver/vulkan/vk_serialise.cpp | 228 ++++++++++++++++-- renderdoc/driver/vulkan/vk_stringise.cpp | 35 +++ .../vulkan/wrappers/vk_device_funcs.cpp | 6 +- .../driver/vulkan/wrappers/vk_get_funcs.cpp | 30 ++- .../driver/vulkan/wrappers/vk_wsi_funcs.cpp | 36 +++ 11 files changed, 396 insertions(+), 34 deletions(-) diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index d91db7b37..64a74d144 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -97,6 +97,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_pipeline_robustness` * `VK_EXT_post_depth_coverage` * `VK_EXT_present_mode_fifo_latest_ready` +* `VK_EXT_present_timing` * `VK_EXT_primitive_topology_list_restart` * `VK_EXT_primitives_generated_query` * `VK_EXT_private_data` @@ -337,7 +338,6 @@ The portability subset is only relevant on mac, which is not a supported platfor * `VK_EXT_multisampled_render_to_swapchain` * `VK_EXT_opacity_micromap` * `VK_EXT_pipeline_library_group_handles` -* `VK_EXT_present_timing` * `VK_EXT_primitive_restart_index` * `VK_EXT_shader_float8` * `VK_EXT_shader_long_vector` diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index fe9a7461b..ba6c084b8 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1666,6 +1666,9 @@ DECLARE_REFLECTION_STRUCT(VkMultisampledRenderToSingleSampledInfoEXT); DECLARE_REFLECTION_STRUCT(VkMultisamplePropertiesEXT); DECLARE_REFLECTION_STRUCT(VkMutableDescriptorTypeCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkOpaqueCaptureDescriptorDataCreateInfoEXT); +DECLARE_REFLECTION_STRUCT(VkPastPresentationTimingEXT); +DECLARE_REFLECTION_STRUCT(VkPastPresentationTimingInfoEXT); +DECLARE_REFLECTION_STRUCT(VkPastPresentationTimingPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPastPresentationTimingGOOGLE); DECLARE_REFLECTION_STRUCT(VkPerformanceCounterDescriptionKHR); DECLARE_REFLECTION_STRUCT(VkPerformanceCounterKHR); @@ -1794,6 +1797,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePointClippingProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentId2FeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentIdFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentTimingFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentWait2FeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentWaitFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT); @@ -1933,8 +1937,12 @@ DECLARE_REFLECTION_STRUCT(VkPresentId2KHR); DECLARE_REFLECTION_STRUCT(VkPresentIdKHR); DECLARE_REFLECTION_STRUCT(VkPresentInfoKHR); DECLARE_REFLECTION_STRUCT(VkPresentRegionsKHR); +DECLARE_REFLECTION_STRUCT(VkPresentStageTimeEXT); DECLARE_REFLECTION_STRUCT(VkPresentTimeGOOGLE); DECLARE_REFLECTION_STRUCT(VkPresentTimesInfoGOOGLE); +DECLARE_REFLECTION_STRUCT(VkPresentTimingInfoEXT); +DECLARE_REFLECTION_STRUCT(VkPresentTimingsInfoEXT); +DECLARE_REFLECTION_STRUCT(VkPresentTimingSurfaceCapabilitiesEXT); DECLARE_REFLECTION_STRUCT(VkPresentWait2InfoKHR); DECLARE_REFLECTION_STRUCT(VkPrivateDataSlotCreateInfo); DECLARE_REFLECTION_STRUCT(VkProtectedSubmitInfo); @@ -2013,6 +2021,7 @@ DECLARE_REFLECTION_STRUCT(VkSurfacePresentModeCompatibilityKHR); DECLARE_REFLECTION_STRUCT(VkSurfacePresentModeKHR); DECLARE_REFLECTION_STRUCT(VkSurfacePresentScalingCapabilitiesKHR); DECLARE_REFLECTION_STRUCT(VkSurfaceProtectedCapabilitiesKHR); +DECLARE_REFLECTION_STRUCT(VkSwapchainCalibratedTimestampInfoEXT); DECLARE_REFLECTION_STRUCT(VkSwapchainCounterCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkSwapchainCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkSwapchainDisplayNativeHdrCreateInfoAMD); @@ -2020,6 +2029,8 @@ DECLARE_REFLECTION_STRUCT(VkSwapchainPresentFenceInfoKHR); DECLARE_REFLECTION_STRUCT(VkSwapchainPresentModeInfoKHR); DECLARE_REFLECTION_STRUCT(VkSwapchainPresentModesCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkSwapchainPresentScalingCreateInfoKHR); +DECLARE_REFLECTION_STRUCT(VkSwapchainTimeDomainPropertiesEXT); +DECLARE_REFLECTION_STRUCT(VkSwapchainTimingPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkTextureLODGatherFormatPropertiesAMD); DECLARE_REFLECTION_STRUCT(VkTimelineSemaphoreSubmitInfo); DECLARE_REFLECTION_STRUCT(VkValidationCacheCreateInfoEXT); @@ -2232,6 +2243,10 @@ DECLARE_DESERIALISE_TYPE(VkMultisampledRenderToSingleSampledInfoEXT); DECLARE_DESERIALISE_TYPE(VkMultisamplePropertiesEXT); DECLARE_DESERIALISE_TYPE(VkMutableDescriptorTypeCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkOpaqueCaptureDescriptorDataCreateInfoEXT); +DECLARE_DESERIALISE_TYPE(VkPastPresentationTimingEXT); +DECLARE_DESERIALISE_TYPE(VkPastPresentationTimingInfoEXT); +DECLARE_DESERIALISE_TYPE(VkPastPresentationTimingPropertiesEXT); +DECLARE_DESERIALISE_TYPE(VkPastPresentationTimingGOOGLE); DECLARE_DESERIALISE_TYPE(VkPerformanceCounterDescriptionKHR); DECLARE_DESERIALISE_TYPE(VkPerformanceCounterKHR); DECLARE_DESERIALISE_TYPE(VkPerformanceQuerySubmitInfoKHR); @@ -2356,6 +2371,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePointClippingProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentId2FeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentIdFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentTimingFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentWait2FeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentWaitFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT); @@ -2495,7 +2511,12 @@ DECLARE_DESERIALISE_TYPE(VkPresentId2KHR); DECLARE_DESERIALISE_TYPE(VkPresentIdKHR); DECLARE_DESERIALISE_TYPE(VkPresentInfoKHR); DECLARE_DESERIALISE_TYPE(VkPresentRegionsKHR); +DECLARE_DESERIALISE_TYPE(VkPresentStageTimeEXT); +DECLARE_DESERIALISE_TYPE(VkPresentTimeGOOGLE); DECLARE_DESERIALISE_TYPE(VkPresentTimesInfoGOOGLE); +DECLARE_DESERIALISE_TYPE(VkPresentTimingInfoEXT); +DECLARE_DESERIALISE_TYPE(VkPresentTimingsInfoEXT); +DECLARE_DESERIALISE_TYPE(VkPresentTimingSurfaceCapabilitiesEXT); DECLARE_DESERIALISE_TYPE(VkPresentWait2InfoKHR); DECLARE_DESERIALISE_TYPE(VkPrivateDataSlotCreateInfo); DECLARE_DESERIALISE_TYPE(VkProtectedSubmitInfo); @@ -2512,6 +2533,7 @@ DECLARE_DESERIALISE_TYPE(VkQueueFamilyProperties2); DECLARE_DESERIALISE_TYPE(VkRayTracingPipelineCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkRayTracingPipelineInterfaceCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkRayTracingShaderGroupCreateInfoKHR); +DECLARE_DESERIALISE_TYPE(VkRefreshCycleDurationGOOGLE); DECLARE_DESERIALISE_TYPE(VkReleaseSwapchainImagesInfoKHR); DECLARE_DESERIALISE_TYPE(VkRenderingAreaInfo); DECLARE_DESERIALISE_TYPE(VkRenderingAttachmentInfo); @@ -2573,6 +2595,7 @@ DECLARE_DESERIALISE_TYPE(VkSurfacePresentModeCompatibilityKHR); DECLARE_DESERIALISE_TYPE(VkSurfacePresentModeKHR); DECLARE_DESERIALISE_TYPE(VkSurfacePresentScalingCapabilitiesKHR); DECLARE_DESERIALISE_TYPE(VkSurfaceProtectedCapabilitiesKHR); +DECLARE_DESERIALISE_TYPE(VkSwapchainCalibratedTimestampInfoEXT); DECLARE_DESERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkSwapchainCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkSwapchainDisplayNativeHdrCreateInfoAMD); @@ -2580,6 +2603,8 @@ DECLARE_DESERIALISE_TYPE(VkSwapchainPresentFenceInfoKHR); DECLARE_DESERIALISE_TYPE(VkSwapchainPresentModeInfoKHR); DECLARE_DESERIALISE_TYPE(VkSwapchainPresentModesCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkSwapchainPresentScalingCreateInfoKHR); +DECLARE_DESERIALISE_TYPE(VkSwapchainTimeDomainPropertiesEXT); +DECLARE_DESERIALISE_TYPE(VkSwapchainTimingPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkTextureLODGatherFormatPropertiesAMD); DECLARE_DESERIALISE_TYPE(VkTimelineSemaphoreSubmitInfo); DECLARE_DESERIALISE_TYPE(VkValidationCacheCreateInfoEXT); @@ -2883,6 +2908,7 @@ DECLARE_REFLECTION_ENUM(VkMemoryOverallocationBehaviorAMD); DECLARE_REFLECTION_ENUM(VkMemoryPropertyFlagBits); DECLARE_REFLECTION_ENUM(VkMemoryUnmapFlagBits); DECLARE_REFLECTION_ENUM(VkObjectType); +DECLARE_REFLECTION_ENUM(VkPastPresentationTimingFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkPerformanceCounterDescriptionFlagBitsKHR); DECLARE_REFLECTION_ENUM(VkPerformanceCounterScopeKHR); DECLARE_REFLECTION_ENUM(VkPerformanceCounterStorageKHR); @@ -2908,6 +2934,8 @@ DECLARE_REFLECTION_ENUM(VkPolygonMode); DECLARE_REFLECTION_ENUM(VkPresentGravityFlagBitsKHR); DECLARE_REFLECTION_ENUM(VkPresentModeKHR); DECLARE_REFLECTION_ENUM(VkPresentScalingFlagBitsKHR); +DECLARE_REFLECTION_ENUM(VkPresentStageFlagBitsEXT); +DECLARE_REFLECTION_ENUM(VkPresentTimingInfoFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkPrimitiveTopology); DECLARE_REFLECTION_ENUM(VkProvokingVertexModeEXT); DECLARE_REFLECTION_ENUM(VkQueryControlFlagBits); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 37d013b5f..bcaf8e5e3 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1376,6 +1376,10 @@ static const VkExtensionProperties supportedExtensions[] = { VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME, VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_SPEC_VERSION, }, + { + VK_EXT_PRESENT_TIMING_EXTENSION_NAME, + VK_EXT_PRESENT_TIMING_SPEC_VERSION, + }, { VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME, VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 664d7c485..dbe183090 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -3318,4 +3318,18 @@ public: // VK_EXT_depth_bias_control IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdSetDepthBias2EXT, VkCommandBuffer commandBuffer, const VkDepthBiasInfoEXT *pDepthBiasInfo); + + // VK_EXT_present_timing + VkResult vkGetPastPresentationTimingEXT( + VkDevice device, const VkPastPresentationTimingInfoEXT *pPastPresentationTimingInfo, + VkPastPresentationTimingPropertiesEXT *pPastPresentationTimingProperties); + VkResult vkGetSwapchainTimeDomainPropertiesEXT( + VkDevice device, VkSwapchainKHR swapchain, + VkSwapchainTimeDomainPropertiesEXT *pSwapchainTimeDomainProperties, + uint64_t *pTimeDomainsCounter); + VkResult vkGetSwapchainTimingPropertiesEXT(VkDevice device, VkSwapchainKHR swapchain, + VkSwapchainTimingPropertiesEXT *pSwapchainTimingProperties, + uint64_t *pSwapchainTimingPropertiesCounter); + VkResult vkSetSwapchainPresentTimingQueueSizeEXT(VkDevice device, VkSwapchainKHR swapchain, + uint32_t size); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 3cdedb202..2dfed4916 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -562,7 +562,8 @@ DeclExt(EXT_image_drm_format_modifier); \ DeclExt(EXT_custom_resolve); \ DeclExt(NV_device_diagnostic_checkpoints); \ - DeclExt(EXT_depth_bias_control); + DeclExt(EXT_depth_bias_control); \ + DeclExt(EXT_present_timing); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -711,7 +712,8 @@ CheckExt(EXT_image_drm_format_modifier, VKXX); \ CheckExt(EXT_custom_resolve, VKXX); \ CheckExt(NV_device_diagnostic_checkpoints, VKXX); \ - CheckExt(EXT_depth_bias_control, VKXX); + CheckExt(EXT_depth_bias_control, VKXX); \ + CheckExt(EXT_present_timing, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ @@ -1121,6 +1123,10 @@ HookInitExtension(NV_device_diagnostic_checkpoints, GetQueueCheckpointDataNV); \ HookInitExtension(NV_device_diagnostic_checkpoints, GetQueueCheckpointData2NV); \ HookInitExtension(EXT_depth_bias_control, CmdSetDepthBias2EXT); \ + HookInitExtension(EXT_present_timing, GetPastPresentationTimingEXT); \ + HookInitExtension(EXT_present_timing, GetSwapchainTimeDomainPropertiesEXT); \ + HookInitExtension(EXT_present_timing, GetSwapchainTimingPropertiesEXT); \ + HookInitExtension(EXT_present_timing, SetSwapchainPresentTimingQueueSizeEXT); \ HookInitExtension_Device_Win32(); \ HookInitExtension_Device_Linux(); \ HookInitExtension_Device_Android(); \ @@ -2103,6 +2109,17 @@ VkCheckpointData2NV *, pCheckpointData); \ HookDefine2(void, vkCmdSetDepthBias2EXT, VkCommandBuffer, commandBuffer, \ const VkDepthBiasInfoEXT *, pDepthBiasInfo); \ + HookDefine3(VkResult, vkGetPastPresentationTimingEXT, VkDevice, device, \ + const VkPastPresentationTimingInfoEXT *, pPastPresentationTimingInfo, \ + VkPastPresentationTimingPropertiesEXT *, pPastPresentationTimingProperties); \ + HookDefine4(VkResult, vkGetSwapchainTimeDomainPropertiesEXT, VkDevice, device, VkSwapchainKHR, \ + swapchain, VkSwapchainTimeDomainPropertiesEXT *, pSwapchainTimeDomainProperties, \ + uint64_t *, pTimeDomainsCounter); \ + HookDefine4(VkResult, vkGetSwapchainTimingPropertiesEXT, VkDevice, device, VkSwapchainKHR, \ + swapchain, VkSwapchainTimingPropertiesEXT *, pSwapchainTimingProperties, uint64_t *, \ + pSwapchainTimingPropertiesCounter); \ + HookDefine3(VkResult, vkSetSwapchainPresentTimingQueueSizeEXT, VkDevice, device, VkSwapchainKHR, \ + swapchain, uint32_t, size); \ HookDefine_Win32(); \ HookDefine_Linux(); \ HookDefine_Android(); \ diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 5cf081454..b9c26ac5e 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -238,6 +238,9 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkMutableDescriptorTypeCreateInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT, \ VkOpaqueCaptureDescriptorDataCreateInfoEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_EXT, VkPastPresentationTimingEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_PROPERTIES_EXT, \ + VkPastPresentationTimingPropertiesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR, \ VkPerformanceCounterDescriptionKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR, VkPerformanceCounterKHR); \ @@ -491,6 +494,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDevicePresentId2FeaturesKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR, \ VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT, \ + VkPhysicalDevicePresentTimingFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, \ VkPhysicalDevicePresentWaitFeaturesKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR, \ @@ -746,6 +751,10 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_ID_2_KHR, VkPresentId2KHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, VkPresentRegionsKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE, VkPresentTimesInfoGOOGLE); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMING_INFO_EXT, VkPresentTimingInfoEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMING_SURFACE_CAPABILITIES_EXT, \ + VkPresentTimingSurfaceCapabilitiesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMINGS_INFO_EXT, VkPresentTimingsInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO, VkPrivateDataSlotCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, VkQueryPoolCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR, \ @@ -825,6 +834,9 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkSwapchainPresentModesCreateInfoKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_KHR, \ VkSwapchainPresentScalingCreateInfoKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_TIME_DOMAIN_PROPERTIES_EXT, \ + VkSwapchainTimeDomainPropertiesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_TIMING_PROPERTIES_EXT, VkSwapchainTimingPropertiesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD, \ VkTextureLODGatherFormatPropertiesAMD); \ COPY_STRUCT(VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, VkTimelineSemaphoreSubmitInfo); \ @@ -962,6 +974,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, UnwrapInPlace(out->buffer), UnwrapInPlace(out->image)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_MEMORY_MAP_INFO, VkMemoryMapInfo, UnwrapInPlace(out->memory)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO, VkMemoryUnmapInfo, UnwrapInPlace(out->memory)); \ + UNWRAP_STRUCT(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_INFO_EXT, \ + VkPastPresentationTimingInfoEXT, UnwrapInPlace(out->swapchain)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR, VkPipelineInfoKHR, \ UnwrapInPlace(out->pipeline)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR, VkPipelineExecutableInfoKHR, \ @@ -991,6 +1005,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, UnwrapInPlace(out->semaphore)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_SET_DESCRIPTOR_BUFFER_OFFSETS_INFO_EXT, \ VkSetDescriptorBufferOffsetsInfoEXT, UnwrapInPlace(out->layout)); \ + UNWRAP_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_CALIBRATED_TIMESTAMP_INFO_EXT, \ + VkSwapchainCalibratedTimestampInfoEXT, UnwrapInPlace(out->swapchain)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO, VkCopyImageToImageInfo, \ UnwrapInPlace(out->srcImage), UnwrapInPlace(out->dstImage)); \ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO, VkCopyImageToMemoryInfo, \ @@ -1260,9 +1276,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_OUT_OF_BAND_QUEUE_TYPE_INFO_NV: \ case VK_STRUCTURE_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_FLAGS_NV: \ case VK_STRUCTURE_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCES_INPUT_NV: \ - case VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_EXT: \ - case VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_INFO_EXT: \ - case VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PER_TILE_BEGIN_INFO_QCOM: \ case VK_STRUCTURE_TYPE_PER_TILE_END_INFO_QCOM: \ case VK_STRUCTURE_TYPE_PERF_HINT_INFO_QCOM: \ @@ -1392,7 +1405,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_PROPERTIES_NV: \ @@ -1484,9 +1496,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, 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_FRAME_TOKEN_GGP: \ - case VK_STRUCTURE_TYPE_PRESENT_TIMING_INFO_EXT: \ - case VK_STRUCTURE_TYPE_PRESENT_TIMING_SURFACE_CAPABILITIES_EXT: \ - case VK_STRUCTURE_TYPE_PRESENT_TIMINGS_INFO_EXT: \ case VK_STRUCTURE_TYPE_PRESENT_WAIT_2_INFO_KHR: \ case VK_STRUCTURE_TYPE_PUSH_CONSTANT_BANK_INFO_NV: \ case VK_STRUCTURE_TYPE_PUSH_DATA_INFO_EXT: \ @@ -1536,12 +1545,9 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: \ case VK_STRUCTURE_TYPE_SUBSAMPLED_IMAGE_FORMAT_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV: \ - case VK_STRUCTURE_TYPE_SWAPCHAIN_CALIBRATED_TIMESTAMP_INFO_EXT: \ case VK_STRUCTURE_TYPE_SWAPCHAIN_FLAGS_SURFACE_CAPABILITIES_EXT: \ case VK_STRUCTURE_TYPE_SWAPCHAIN_LATENCY_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV: \ - case VK_STRUCTURE_TYPE_SWAPCHAIN_TIME_DOMAIN_PROPERTIES_EXT: \ - case VK_STRUCTURE_TYPE_SWAPCHAIN_TIMING_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA: \ case VK_STRUCTURE_TYPE_TENSOR_CAPTURE_DESCRIPTOR_DATA_INFO_ARM: \ case VK_STRUCTURE_TYPE_TENSOR_COPY_ARM: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 9f66a50f2..d234da3d1 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -167,6 +167,9 @@ DECL_VKFLAG_EXT(VkGraphicsPipelineLibrary, EXT); DECL_VKFLAG(VkRendering); DECL_VKFLAG_EXT(VkPresentScaling, KHR); DECL_VKFLAG_EXT(VkPresentGravity, KHR); +DECL_VKFLAG_EXT(VkPastPresentationTiming, EXT); +DECL_VKFLAG_EXT(VkPresentStage, EXT); +DECL_VKFLAG_EXT(VkPresentTimingInfo, EXT); DECL_VKFLAG_EXT(VkAccelerationStructureCreate, KHR); DECL_VKFLAG_EXT(VkBuildAccelerationStructure, KHR); DECL_VKFLAG_EXT(VkGeometry, KHR); @@ -903,6 +906,23 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES, \ VkPhysicalDevicePipelineRobustnessProperties) \ \ + /* VK_EXT_present_timing */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_EXT, VkPastPresentationTimingEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_INFO_EXT, VkPastPresentationTimingInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_PROPERTIES_EXT, \ + VkPastPresentationTimingPropertiesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT, \ + VkPhysicalDevicePresentTimingFeaturesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMING_INFO_EXT, VkPresentTimingInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMING_SURFACE_CAPABILITIES_EXT, \ + VkPresentTimingSurfaceCapabilitiesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_TIMINGS_INFO_EXT, VkPresentTimingsInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_CALIBRATED_TIMESTAMP_INFO_EXT, \ + VkSwapchainCalibratedTimestampInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_TIME_DOMAIN_PROPERTIES_EXT, \ + VkSwapchainTimeDomainPropertiesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_TIMING_PROPERTIES_EXT, VkSwapchainTimingPropertiesEXT) \ + \ /* VK_EXT_primitive_topology_list_restart */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, \ VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT) \ @@ -2076,18 +2096,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT) \ \ - /* VK_EXT_present_timing */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_PROPERTIES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PRESENT_TIMING_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PRESENT_TIMING_SURFACE_CAPABILITIES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PRESENT_TIMINGS_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SWAPCHAIN_CALIBRATED_TIMESTAMP_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SWAPCHAIN_TIME_DOMAIN_PROPERTIES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SWAPCHAIN_TIMING_PROPERTIES_EXT) \ - \ /* VK_EXT_primitive_restart_index */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT) \ \ @@ -8078,6 +8086,185 @@ void Deserialise(const VkPhysicalDevicePresentId2FeaturesKHR &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPresentStageTimeEXT &el) +{ + SERIALISE_MEMBER_VKFLAGS(VkPresentStageFlagsEXT, stage); + SERIALISE_MEMBER(time); +} + +template +void DoSerialise(SerialiserType &ser, VkPastPresentationTimingEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentId); + SERIALISE_MEMBER(targetTime); + SERIALISE_MEMBER_ARRAY(pPresentStages, presentStageCount); + SERIALISE_MEMBER(timeDomain); + SERIALISE_MEMBER(timeDomainId); + SERIALISE_MEMBER(reportComplete); +} + +template <> +void Deserialise(const VkPastPresentationTimingEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPastPresentationTimingInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_VKFLAGS(VkPastPresentationTimingFlagsEXT, flags); + SERIALISE_MEMBER(swapchain); +} + +template <> +void Deserialise(const VkPastPresentationTimingInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPastPresentationTimingPropertiesEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_PROPERTIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(timingPropertiesCounter); + SERIALISE_MEMBER(timeDomainsCounter); + SERIALISE_MEMBER_ARRAY(pPresentationTimings, presentationTimingCount); +} + +template <> +void Deserialise(const VkPastPresentationTimingPropertiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDevicePresentTimingFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentTiming); + SERIALISE_MEMBER(presentAtAbsoluteTime); + SERIALISE_MEMBER(presentAtRelativeTime); +} + +template <> +void Deserialise(const VkPhysicalDevicePresentTimingFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPresentTimingInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_TIMING_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_VKFLAGS(VkPresentTimingInfoFlagsEXT, flags); + SERIALISE_MEMBER(targetTime); + SERIALISE_MEMBER(timeDomainId); + SERIALISE_MEMBER_VKFLAGS(VkPresentStageFlagsEXT, presentStageQueries); + SERIALISE_MEMBER_VKFLAGS(VkPresentStageFlagsEXT, targetTimeDomainPresentStage); +} + +template <> +void Deserialise(const VkPresentTimingInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPresentTimingSurfaceCapabilitiesEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_TIMING_SURFACE_CAPABILITIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(presentTimingSupported); + SERIALISE_MEMBER(presentAtAbsoluteTimeSupported); + SERIALISE_MEMBER(presentAtRelativeTimeSupported); + SERIALISE_MEMBER_VKFLAGS(VkPresentStageFlagsEXT, presentStageQueries); +} + +template <> +void Deserialise(const VkPresentTimingSurfaceCapabilitiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPresentTimingsInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_TIMINGS_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_ARRAY(pTimingInfos, swapchainCount); +} + +template <> +void Deserialise(const VkPresentTimingsInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSwapchainCalibratedTimestampInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_CALIBRATED_TIMESTAMP_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(swapchain); + SERIALISE_MEMBER_VKFLAGS(VkPresentStageFlagsEXT, presentStage); + SERIALISE_MEMBER(timeDomainId); +} + +template <> +void Deserialise(const VkSwapchainCalibratedTimestampInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSwapchainTimeDomainPropertiesEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_TIME_DOMAIN_PROPERTIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_ARRAY(pTimeDomains, timeDomainCount); + SERIALISE_MEMBER_ARRAY(pTimeDomainIds, timeDomainCount); +} + +template <> +void Deserialise(const VkSwapchainTimeDomainPropertiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSwapchainTimingPropertiesEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_TIMING_PROPERTIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(refreshDuration); + SERIALISE_MEMBER(refreshInterval); +} + +template <> +void Deserialise(const VkSwapchainTimingPropertiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR &el) { @@ -15512,8 +15699,8 @@ INSTANTIATE_SERIALISE_TYPE(VkBufferOpaqueCaptureAddressCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkBufferUsageFlags2CreateInfo); INSTANTIATE_SERIALISE_TYPE(VkBufferViewCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkCalibratedTimestampInfoKHR); -INSTANTIATE_SERIALISE_TYPE(VkCheckpointDataNV); INSTANTIATE_SERIALISE_TYPE(VkCheckpointData2NV); +INSTANTIATE_SERIALISE_TYPE(VkCheckpointDataNV); INSTANTIATE_SERIALISE_TYPE(VkCommandBufferAllocateInfo); INSTANTIATE_SERIALISE_TYPE(VkCommandBufferBeginInfo); INSTANTIATE_SERIALISE_TYPE(VkCommandBufferInheritanceConditionalRenderingInfoEXT); @@ -15671,7 +15858,10 @@ INSTANTIATE_SERIALISE_TYPE(VkMultisampledRenderToSingleSampledInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkMultisamplePropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkMutableDescriptorTypeCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkOpaqueCaptureDescriptorDataCreateInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkPastPresentationTimingEXT); INSTANTIATE_SERIALISE_TYPE(VkPastPresentationTimingGOOGLE); +INSTANTIATE_SERIALISE_TYPE(VkPastPresentationTimingInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkPastPresentationTimingPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPerformanceCounterDescriptionKHR); INSTANTIATE_SERIALISE_TYPE(VkPerformanceCounterKHR); INSTANTIATE_SERIALISE_TYPE(VkPerformanceQuerySubmitInfoKHR); @@ -15708,6 +15898,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDescriptorIndexingProperties) INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDiagnosticsConfigFeaturesNV); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDiscardRectanglePropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDriverProperties); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDrmPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDynamicRenderingFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDynamicRenderingLocalReadFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT); @@ -15786,7 +15977,6 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceNestedCommandBufferPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePCIBusInfoPropertiesEXT); -INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDrmPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePerformanceQueryFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePerformanceQueryPropertiesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePipelineCreationCacheControlFeatures); @@ -15798,6 +15988,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePointClippingProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentId2FeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentIdFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentTimingFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentWaitFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT); @@ -15938,6 +16129,9 @@ INSTANTIATE_SERIALISE_TYPE(VkPresentInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkPresentRegionsKHR); INSTANTIATE_SERIALISE_TYPE(VkPresentTimeGOOGLE); INSTANTIATE_SERIALISE_TYPE(VkPresentTimesInfoGOOGLE); +INSTANTIATE_SERIALISE_TYPE(VkPresentTimingInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkPresentTimingsInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkPresentTimingSurfaceCapabilitiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPresentWait2InfoKHR); INSTANTIATE_SERIALISE_TYPE(VkPrivateDataSlotCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkProtectedSubmitInfo); @@ -15946,8 +16140,8 @@ INSTANTIATE_SERIALISE_TYPE(VkPushDescriptorSetInfo); INSTANTIATE_SERIALISE_TYPE(VkPushDescriptorSetWithTemplateInfo); INSTANTIATE_SERIALISE_TYPE(VkQueryPoolCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkQueryPoolPerformanceCreateInfoKHR); -INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyCheckpointPropertiesNV); INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyCheckpointProperties2NV); +INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyCheckpointPropertiesNV); INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyGlobalPriorityProperties); INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyOwnershipTransferPropertiesKHR); INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyProperties2); @@ -16016,6 +16210,7 @@ INSTANTIATE_SERIALISE_TYPE(VkSurfacePresentModeCompatibilityKHR); INSTANTIATE_SERIALISE_TYPE(VkSurfacePresentModeKHR); INSTANTIATE_SERIALISE_TYPE(VkSurfacePresentScalingCapabilitiesKHR); INSTANTIATE_SERIALISE_TYPE(VkSurfaceProtectedCapabilitiesKHR); +INSTANTIATE_SERIALISE_TYPE(VkSwapchainCalibratedTimestampInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkSwapchainCreateInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkSwapchainDisplayNativeHdrCreateInfoAMD); @@ -16023,6 +16218,8 @@ INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentFenceInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentModeInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentModesCreateInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkSwapchainPresentScalingCreateInfoKHR); +INSTANTIATE_SERIALISE_TYPE(VkSwapchainTimeDomainPropertiesEXT); +INSTANTIATE_SERIALISE_TYPE(VkSwapchainTimingPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkTextureLODGatherFormatPropertiesAMD); INSTANTIATE_SERIALISE_TYPE(VkTimelineSemaphoreSubmitInfo); INSTANTIATE_SERIALISE_TYPE(VkValidationCacheCreateInfoEXT); @@ -16092,6 +16289,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPipelineColorBlendAttachmentState); INSTANTIATE_SERIALISE_TYPE(VkPipelineCreationFeedback); INSTANTIATE_SERIALISE_TYPE(VkPipelineExecutableStatisticValueKHR); INSTANTIATE_SERIALISE_TYPE(VkPresentRegionKHR); +INSTANTIATE_SERIALISE_TYPE(VkPresentStageTimeEXT); INSTANTIATE_SERIALISE_TYPE(VkPushConstantRange); INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyProperties); INSTANTIATE_SERIALISE_TYPE(VkRect2D); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index 48b09bcc3..40132c813 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -4854,3 +4854,38 @@ rdcstr DoStringise(const VkDepthBiasRepresentationEXT &el) } END_ENUM_STRINGISE(); } + +template <> +rdcstr DoStringise(const VkPastPresentationTimingFlagBitsEXT &el) +{ + BEGIN_BITFIELD_STRINGISE(VkPastPresentationTimingFlagBitsEXT); + { + STRINGISE_BITFIELD_BIT(VK_PAST_PRESENTATION_TIMING_ALLOW_PARTIAL_RESULTS_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PAST_PRESENTATION_TIMING_ALLOW_OUT_OF_ORDER_RESULTS_BIT_EXT); + } + END_BITFIELD_STRINGISE(); +} + +template <> +rdcstr DoStringise(const VkPresentStageFlagBitsEXT &el) +{ + BEGIN_BITFIELD_STRINGISE(VkPresentStageFlagBitsEXT); + { + STRINGISE_BITFIELD_BIT(VK_PRESENT_STAGE_QUEUE_OPERATIONS_END_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_STAGE_REQUEST_DEQUEUED_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_STAGE_IMAGE_FIRST_PIXEL_OUT_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_STAGE_IMAGE_FIRST_PIXEL_VISIBLE_BIT_EXT); + } + END_BITFIELD_STRINGISE(); +} + +template <> +rdcstr DoStringise(const VkPresentTimingInfoFlagBitsEXT &el) +{ + BEGIN_BITFIELD_STRINGISE(VkPresentTimingInfoFlagBitsEXT); + { + STRINGISE_BITFIELD_BIT(VK_PRESENT_TIMING_INFO_PRESENT_AT_RELATIVE_TIME_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_PRESENT_TIMING_INFO_PRESENT_AT_NEAREST_REFRESH_CYCLE_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 74c5a2455..4af4d0594 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -199,7 +199,7 @@ static void StripUnwantedExtensions(rdcarray &Extensions) ext == "VK_EXT_present_mode_fifo_latest_ready" || ext == "VK_EXT_surface_maintenance1" || ext == "VK_EXT_swapchain_maintenance1" || ext == "VK_KHR_surface_maintenance1" || ext == "VK_KHR_swapchain_maintenance1" || ext == "VK_EXT_hdr_metadata" || - ext == "VK_KHR_get_display_properties2") + ext == "VK_KHR_get_display_properties2" || ext == "VK_EXT_present_timing") return true; // remove fullscreen exclusive extension @@ -2260,9 +2260,11 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi RemoveNextStruct(&createInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR); present_exts |= RemoveNextStruct( &createInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR); + present_exts |= + RemoveNextStruct(&createInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT); if(present_exts) { - RDCLOG("Removed VK_KHR_present_id/wait/latest_ready structs from vkCreateDevice pNext chain"); + RDCLOG("Removed present-related structs from vkCreateDevice pNext chain"); } VkPhysicalDeviceFeatures enabledFeatures = {0}; diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index 55a91b60a..2facbc6c3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -1117,8 +1117,19 @@ VkResult WrappedVulkan::vkGetCalibratedTimestampsEXT(VkDevice device, uint32_t t const VkCalibratedTimestampInfoKHR *pTimestampInfos, uint64_t *pTimestamps, uint64_t *pMaxDeviation) { - return ObjDisp(device)->GetCalibratedTimestampsEXT(Unwrap(device), timestampCount, - pTimestampInfos, pTimestamps, pMaxDeviation); + size_t memSize = sizeof(VkCalibratedTimestampInfoKHR) * timestampCount; + for(uint32_t i = 0; i < timestampCount; i++) + memSize += GetNextPatchSize(&pTimestampInfos[i]); + + byte *tempMem = GetTempMemory(memSize); + VkCalibratedTimestampInfoKHR *unwrappedInfos = (VkCalibratedTimestampInfoKHR *)tempMem; + tempMem += sizeof(VkCalibratedTimestampInfoKHR) * timestampCount; + + for(uint32_t i = 0; i < timestampCount; i++) + unwrappedInfos[i] = *UnwrapStructAndChain(m_State, tempMem, &pTimestampInfos[i]); + + return ObjDisp(device)->GetCalibratedTimestampsEXT(Unwrap(device), timestampCount, unwrappedInfos, + pTimestamps, pMaxDeviation); } VkResult WrappedVulkan::vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( @@ -1133,8 +1144,19 @@ VkResult WrappedVulkan::vkGetCalibratedTimestampsKHR(VkDevice device, uint32_t t const VkCalibratedTimestampInfoKHR *pTimestampInfos, uint64_t *pTimestamps, uint64_t *pMaxDeviation) { - return ObjDisp(device)->GetCalibratedTimestampsKHR(Unwrap(device), timestampCount, - pTimestampInfos, pTimestamps, pMaxDeviation); + size_t memSize = sizeof(VkCalibratedTimestampInfoKHR) * timestampCount; + for(uint32_t i = 0; i < timestampCount; i++) + memSize += GetNextPatchSize(&pTimestampInfos[i]); + + byte *tempMem = GetTempMemory(memSize); + VkCalibratedTimestampInfoKHR *unwrappedInfos = (VkCalibratedTimestampInfoKHR *)tempMem; + tempMem += sizeof(VkCalibratedTimestampInfoKHR) * timestampCount; + + for(uint32_t i = 0; i < timestampCount; i++) + unwrappedInfos[i] = *UnwrapStructAndChain(m_State, tempMem, &pTimestampInfos[i]); + + return ObjDisp(device)->GetCalibratedTimestampsKHR(Unwrap(device), timestampCount, unwrappedInfos, + pTimestamps, pMaxDeviation); } VkDeviceAddress WrappedVulkan::vkGetBufferDeviceAddressEXT(VkDevice device, diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index c0e70be19..b4b6eff57 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -1808,6 +1808,42 @@ VkResult WrappedVulkan::vkReleaseSwapchainImagesEXT(VkDevice device, return vkReleaseSwapchainImagesKHR(device, pReleaseInfo); } +VkResult WrappedVulkan::vkGetPastPresentationTimingEXT( + VkDevice device, const VkPastPresentationTimingInfoEXT *pPastPresentationTimingInfo, + VkPastPresentationTimingPropertiesEXT *pPastPresentationTimingProperties) +{ + VkPastPresentationTimingInfoEXT timingInfo = *pPastPresentationTimingInfo; + timingInfo.swapchain = Unwrap(timingInfo.swapchain); + return ObjDisp(device)->GetPastPresentationTimingEXT(Unwrap(device), &timingInfo, + pPastPresentationTimingProperties); +} + +VkResult WrappedVulkan::vkGetSwapchainTimeDomainPropertiesEXT( + VkDevice device, VkSwapchainKHR swapchain, + VkSwapchainTimeDomainPropertiesEXT *pSwapchainTimeDomainProperties, uint64_t *pTimeDomainsCounter) +{ + return ObjDisp(device)->GetSwapchainTimeDomainPropertiesEXT( + Unwrap(device), Unwrap(swapchain), pSwapchainTimeDomainProperties, pTimeDomainsCounter); +} + +VkResult WrappedVulkan::vkGetSwapchainTimingPropertiesEXT( + VkDevice device, VkSwapchainKHR swapchain, + VkSwapchainTimingPropertiesEXT *pSwapchainTimingProperties, + uint64_t *pSwapchainTimingPropertiesCounter) +{ + return ObjDisp(device)->GetSwapchainTimingPropertiesEXT(Unwrap(device), Unwrap(swapchain), + pSwapchainTimingProperties, + pSwapchainTimingPropertiesCounter); +} + +VkResult WrappedVulkan::vkSetSwapchainPresentTimingQueueSizeEXT(VkDevice device, + VkSwapchainKHR swapchain, + uint32_t size) +{ + return ObjDisp(device)->SetSwapchainPresentTimingQueueSizeEXT(Unwrap(device), Unwrap(swapchain), + size); +} + #ifdef VK_USE_PLATFORM_WIN32_KHR VkResult WrappedVulkan::vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,