diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 03e53c7d1..b55558abc 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -584,6 +584,7 @@ DECLARE_REFLECTION_STRUCT(VkBufferCreateInfo); DECLARE_REFLECTION_STRUCT(VkBufferMemoryBarrier); DECLARE_REFLECTION_STRUCT(VkBufferMemoryRequirementsInfo2); DECLARE_REFLECTION_STRUCT(VkBufferViewCreateInfo); +DECLARE_REFLECTION_STRUCT(VkCalibratedTimestampInfoEXT); DECLARE_REFLECTION_STRUCT(VkCommandBufferAllocateInfo); DECLARE_REFLECTION_STRUCT(VkCommandBufferBeginInfo); DECLARE_REFLECTION_STRUCT(VkCommandBufferInheritanceConditionalRenderingInfoEXT); @@ -798,6 +799,7 @@ DECLARE_DESERIALISE_TYPE(VkBufferCreateInfo); DECLARE_DESERIALISE_TYPE(VkBufferMemoryBarrier); DECLARE_DESERIALISE_TYPE(VkBufferMemoryRequirementsInfo2); DECLARE_DESERIALISE_TYPE(VkBufferViewCreateInfo); +DECLARE_DESERIALISE_TYPE(VkCalibratedTimestampInfoEXT); DECLARE_DESERIALISE_TYPE(VkCommandBufferAllocateInfo); DECLARE_DESERIALISE_TYPE(VkCommandBufferBeginInfo); DECLARE_DESERIALISE_TYPE(VkCommandBufferInheritanceConditionalRenderingInfoEXT); @@ -1219,6 +1221,7 @@ DECLARE_REFLECTION_ENUM(VkSurfaceCounterFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkSurfaceTransformFlagBitsKHR); DECLARE_REFLECTION_ENUM(VkSwapchainCreateFlagBitsKHR); DECLARE_REFLECTION_ENUM(VkTessellationDomainOrigin); +DECLARE_REFLECTION_ENUM(VkTimeDomainEXT); DECLARE_REFLECTION_ENUM(VkValidationCheckEXT); DECLARE_REFLECTION_ENUM(VkValidationFeatureEnableEXT); DECLARE_REFLECTION_ENUM(VkValidationFeatureDisableEXT); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 82dc1d2ac..c833391cf 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -635,6 +635,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, }, + { + VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME, VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION, + }, { VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 5a8269317..6a81e0c1c 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -2013,4 +2013,13 @@ public: IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdSetDiscardRectangleEXT, VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle, uint32_t discardRectangleCount, const VkRect2D *pDiscardRectangles); + + // VK_EXT_calibrated_timestamps + + VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(VkPhysicalDevice physicalDevice, + uint32_t *pTimeDomainCount, + VkTimeDomainEXT *pTimeDomains); + VkResult vkGetCalibratedTimestampsEXT(VkDevice device, uint32_t timestampCount, + const VkCalibratedTimestampInfoEXT *pTimestampInfos, + uint64_t *pTimestamps, uint64_t *pMaxDeviation); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 2b9ddafb5..6918c666b 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -355,7 +355,8 @@ DeclExt(EXT_transform_feedback); \ DeclExt(EXT_conditional_rendering); \ DeclExt(EXT_sample_locations); \ - DeclExt(EXT_discard_rectangles); + DeclExt(EXT_discard_rectangles); \ + DeclExt(EXT_calibrated_timestamps); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -381,7 +382,8 @@ CheckExt(protected_memory, VK11); \ CheckExt(KHR_get_surface_capabilities2, VKXX); \ CheckExt(KHR_get_display_properties2, VKXX); \ - CheckExt(EXT_sample_locations, VKXX); + CheckExt(EXT_sample_locations, VKXX); \ + CheckExt(EXT_calibrated_timestamps, VKXX); #define CheckDeviceExts() \ CheckExt(EXT_debug_marker, VKXX); \ @@ -423,7 +425,8 @@ CheckExt(EXT_transform_feedback, VKXX); \ CheckExt(EXT_conditional_rendering, VKXX); \ CheckExt(EXT_sample_locations, VKXX); \ - CheckExt(EXT_discard_rectangles, VKXX); + CheckExt(EXT_discard_rectangles, VKXX); \ + CheckExt(EXT_calibrated_timestamps, VKXX); #define HookInitVulkanInstanceExts() \ HookInitExtension(KHR_surface, DestroySurfaceKHR); \ @@ -478,6 +481,7 @@ HookInitExtension(KHR_get_display_properties2, GetDisplayModeProperties2KHR); \ HookInitExtension(KHR_get_display_properties2, GetDisplayPlaneCapabilities2KHR); \ HookInitExtension(EXT_sample_locations, GetPhysicalDeviceMultisamplePropertiesEXT); \ + HookInitExtension(EXT_calibrated_timestamps, GetPhysicalDeviceCalibrateableTimeDomainsEXT); \ HookInitInstance_PlatformSpecific() #define HookInitVulkanDeviceExts() \ @@ -555,6 +559,7 @@ HookInitExtension(EXT_conditional_rendering, CmdEndConditionalRenderingEXT); \ HookInitExtension(EXT_sample_locations, CmdSetSampleLocationsEXT); \ HookInitExtension(EXT_discard_rectangles, CmdSetDiscardRectangleEXT); \ + HookInitExtension(EXT_calibrated_timestamps, GetCalibratedTimestampsEXT); \ HookInitDevice_PlatformSpecific() #define DefineHooks() \ @@ -1118,6 +1123,11 @@ HookDefine4(void, vkCmdSetDiscardRectangleEXT, VkCommandBuffer, commandBuffer, uint32_t, \ firstDiscardRectangle, uint32_t, discardRectangleCount, const VkRect2D *, \ pDiscardRectangles); \ + HookDefine3(VkResult, vkGetPhysicalDeviceCalibrateableTimeDomainsEXT, VkPhysicalDevice, \ + physicalDevice, uint32_t *, pTimeDomainCount, VkTimeDomainEXT *, pTimeDomains); \ + HookDefine5(VkResult, vkGetCalibratedTimestampsEXT, VkDevice, device, uint32_t, timestampCount, \ + const VkCalibratedTimestampInfoEXT *, pTimestampInfos, uint64_t *, pTimestamps, \ + uint64_t *, pMaxDeviation); \ HookDefine_PlatformSpecific() struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index a381340ee..5e4befc7a 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -83,6 +83,7 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, VkBufferCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT, \ VkBufferDeviceAddressCreateInfoEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT, VkCalibratedTimestampInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, VkCommandBufferBeginInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT, \ VkCommandBufferInheritanceConditionalRenderingInfoEXT); \ @@ -431,7 +432,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID: \ case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: \ case VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV: \ - case VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT: \ case VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV: \ case VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX: \ case VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index dfb805c5c..dd6b474a9 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -413,6 +413,9 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, \ VkPhysicalDeviceASTCDecodeFeaturesEXT) \ \ + /* VK_EXT_calibrated_timestamps */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT, VkCalibratedTimestampInfoEXT) \ + \ /* VK_EXT_conditional_rendering */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT, \ VkCommandBufferInheritanceConditionalRenderingInfoEXT) \ @@ -791,9 +794,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT) \ \ - /* VK_EXT_calibrated_timestamps */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT) \ - \ /* VK_EXT_descriptor_indexing */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT) \ @@ -5071,6 +5071,21 @@ void Deserialise(const VkDisplayEventInfoEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkCalibratedTimestampInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(timeDomain); +} + +template <> +void Deserialise(const VkCalibratedTimestampInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkSwapchainCounterCreateInfoEXT &el) { @@ -6153,6 +6168,7 @@ INSTANTIATE_SERIALISE_TYPE(VkBufferCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkBufferMemoryBarrier); INSTANTIATE_SERIALISE_TYPE(VkBufferMemoryRequirementsInfo2); INSTANTIATE_SERIALISE_TYPE(VkBufferViewCreateInfo); +INSTANTIATE_SERIALISE_TYPE(VkCalibratedTimestampInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkCommandBufferAllocateInfo); INSTANTIATE_SERIALISE_TYPE(VkCommandBufferBeginInfo); INSTANTIATE_SERIALISE_TYPE(VkCommandBufferInheritanceInfo); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index a8dccb523..0dbd93a70 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -2062,6 +2062,19 @@ std::string DoStringise(const VkSamplerReductionModeEXT &el) END_ENUM_STRINGISE(); } +template <> +std::string DoStringise(const VkTimeDomainEXT &el) +{ + BEGIN_ENUM_STRINGISE(VkTimeDomainEXT); + { + STRINGISE_ENUM(VK_TIME_DOMAIN_DEVICE_EXT) + STRINGISE_ENUM(VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT) + STRINGISE_ENUM(VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT) + STRINGISE_ENUM(VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT) + } + END_ENUM_STRINGISE(); +} + template <> std::string DoStringise(const VkSamplerYcbcrModelConversion &el) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index 98e2f454f..b694bc0db 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -704,4 +704,20 @@ void WrappedVulkan::vkGetPhysicalDeviceMultisamplePropertiesEXT( return ObjDisp(physicalDevice) ->GetPhysicalDeviceMultisamplePropertiesEXT(Unwrap(physicalDevice), samples, pMultisampleProperties); +} + +VkResult WrappedVulkan::vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( + VkPhysicalDevice physicalDevice, uint32_t *pTimeDomainCount, VkTimeDomainEXT *pTimeDomains) +{ + return ObjDisp(physicalDevice) + ->GetPhysicalDeviceCalibrateableTimeDomainsEXT(Unwrap(physicalDevice), pTimeDomainCount, + pTimeDomains); +} + +VkResult WrappedVulkan::vkGetCalibratedTimestampsEXT(VkDevice device, uint32_t timestampCount, + const VkCalibratedTimestampInfoEXT *pTimestampInfos, + uint64_t *pTimestamps, uint64_t *pMaxDeviation) +{ + return ObjDisp(device)->GetCalibratedTimestampsEXT(Unwrap(device), timestampCount, + pTimestampInfos, pTimestamps, pMaxDeviation); } \ No newline at end of file