diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index ebd6764e6..5f388e973 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -528,6 +528,7 @@ enum class VulkanChunk : uint32_t vkCmdSetSampleLocationsEXT, vkCmdSetDiscardRectangleEXT, DeviceMemoryRefs, + vkResetQueryPoolEXT, Max, }; @@ -702,6 +703,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFloatControlsPropertiesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFragmentDensityMapFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFragmentDensityMapPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceGroupProperties); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceHostQueryResetFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceIDProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImageFormatInfo2); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMaintenance3Properties); @@ -919,6 +921,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFeatures2); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFragmentDensityMapFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFragmentDensityMapPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceGroupProperties); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceHostQueryResetFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceIDProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImageFormatInfo2); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMaintenance3Properties); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 3f8bca99f..b0fc427c2 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -678,6 +678,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION, }, + { + VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION, + }, { VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, VK_EXT_MEMORY_BUDGET_SPEC_VERSION, }, @@ -2850,6 +2853,9 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk) std::vector data; return GetResourceManager()->Serialise_DeviceMemoryRefs(ser, data); } + case VulkanChunk::vkResetQueryPoolEXT: + return Serialise_vkResetQueryPoolEXT(ser, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, 0); + break; default: { SystemChunk system = (SystemChunk)chunk; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 9f8f245a3..96cb2171c 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -2020,4 +2020,9 @@ public: VkResult vkGetCalibratedTimestampsEXT(VkDevice device, uint32_t timestampCount, const VkCalibratedTimestampInfoEXT *pTimestampInfos, uint64_t *pTimestamps, uint64_t *pMaxDeviation); + + // VK_EXT_host_query_reset + + IMPLEMENT_FUNCTION_SERIALISED(void, vkResetQueryPoolEXT, VkDevice device, VkQueryPool queryPool, + uint32_t firstQuery, uint32_t queryCount); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index a6715183b..6d8560f91 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -370,7 +370,8 @@ DeclExt(EXT_conditional_rendering); \ DeclExt(EXT_sample_locations); \ DeclExt(EXT_discard_rectangles); \ - DeclExt(EXT_calibrated_timestamps); + DeclExt(EXT_calibrated_timestamps); \ + DeclExt(EXT_host_query_reset); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -442,7 +443,8 @@ CheckExt(EXT_conditional_rendering, VKXX); \ CheckExt(EXT_sample_locations, VKXX); \ CheckExt(EXT_discard_rectangles, VKXX); \ - CheckExt(EXT_calibrated_timestamps, VKXX); + CheckExt(EXT_calibrated_timestamps, VKXX); \ + CheckExt(EXT_host_query_reset, VKXX); #define HookInitVulkanInstanceExts() \ HookInitExtension(KHR_surface, DestroySurfaceKHR); \ @@ -576,6 +578,7 @@ HookInitExtension(EXT_sample_locations, CmdSetSampleLocationsEXT); \ HookInitExtension(EXT_discard_rectangles, CmdSetDiscardRectangleEXT); \ HookInitExtension(EXT_calibrated_timestamps, GetCalibratedTimestampsEXT); \ + HookInitExtension(EXT_host_query_reset, ResetQueryPoolEXT); \ HookInitDevice_PlatformSpecific() #define DefineHooks() \ @@ -1144,6 +1147,8 @@ HookDefine5(VkResult, vkGetCalibratedTimestampsEXT, VkDevice, device, uint32_t, timestampCount, \ const VkCalibratedTimestampInfoEXT *, pTimestampInfos, uint64_t *, pTimestamps, \ uint64_t *, pMaxDeviation); \ + HookDefine4(void, vkResetQueryPoolEXT, VkDevice, device, VkQueryPool, queryPool, uint32_t, \ + firstQuery, uint32_t, queryCount); \ HookDefine_PlatformSpecific() struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 3147e0b92..87b972840 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -181,6 +181,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceFragmentDensityMapFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, \ VkPhysicalDeviceFragmentDensityMapPropertiesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, \ + VkPhysicalDeviceHostQueryResetFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VkPhysicalDeviceIDProperties); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, \ VkPhysicalDeviceImageFormatInfo2); \ @@ -479,7 +481,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index eb0677fc6..81079ba20 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -475,6 +475,10 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, \ VkDeviceQueueGlobalPriorityCreateInfoEXT) \ \ + /* VK_EXT_host_query_reset */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, \ + VkPhysicalDeviceHostQueryResetFeaturesEXT) \ + \ /* VK_EXT_memory_budget */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT, \ VkPhysicalDeviceMemoryBudgetPropertiesEXT) \ @@ -832,9 +836,6 @@ SERIALISE_VK_HANDLES(); /* VK_EXT_hdr_metadata */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_HDR_METADATA_EXT) \ \ - /* VK_EXT_host_query_reset */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT) \ - \ /* VK_EXT_image_drm_format_modifier */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT) \ @@ -3925,6 +3926,22 @@ void Deserialise(const VkPhysicalDeviceFragmentDensityMapFeaturesEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceHostQueryResetFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(hostQueryReset); +} + +template <> +void Deserialise(const VkPhysicalDeviceHostQueryResetFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceFragmentDensityMapPropertiesEXT &el) { @@ -6401,6 +6418,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFeatures2); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFragmentDensityMapFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFragmentDensityMapPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceGroupProperties); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceHostQueryResetFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceIDProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceImageFormatInfo2); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMaintenance3Properties); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index 86840843c..b1a06625f 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -28,7 +28,7 @@ template <> std::string DoStringise(const VulkanChunk &el) { - RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1133, "Chunks changed without updating names"); + RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1134, "Chunks changed without updating names"); BEGIN_ENUM_STRINGISE(VulkanChunk) { @@ -165,6 +165,7 @@ std::string DoStringise(const VulkanChunk &el) STRINGISE_ENUM_CLASS(vkCmdSetSampleLocationsEXT) STRINGISE_ENUM_CLASS(vkCmdSetDiscardRectangleEXT) STRINGISE_ENUM_CLASS_NAMED(DeviceMemoryRefs, "Device Memory References") + STRINGISE_ENUM_CLASS(vkResetQueryPoolEXT); STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk"); } END_ENUM_STRINGISE() diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 1ccc4f3cf..37f5e0d47 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1874,6 +1874,13 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(inheritedConditionalRendering); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceHostQueryResetFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(hostQueryReset); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp) diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 002187a8a..e45d5b45f 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -1286,6 +1286,48 @@ VkResult WrappedVulkan::vkGetQueryPoolResults(VkDevice device, VkQueryPool query queryCount, dataSize, pData, stride, flags); } +template +bool WrappedVulkan::Serialise_vkResetQueryPoolEXT(SerialiserType &ser, VkDevice device, + VkQueryPool queryPool, uint32_t firstQuery, + uint32_t queryCount) +{ + SERIALISE_ELEMENT(device); + SERIALISE_ELEMENT(queryPool); + SERIALISE_ELEMENT(firstQuery); + SERIALISE_ELEMENT(queryCount); + + Serialise_DebugMessages(ser); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + ObjDisp(device)->ResetQueryPoolEXT(Unwrap(device), Unwrap(queryPool), firstQuery, queryCount); + } + + return true; +} + +void WrappedVulkan::vkResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, + uint32_t queryCount) +{ + SCOPED_DBG_SINK(); + + SERIALISE_TIME_CALL(ObjDisp(device)->ResetQueryPoolEXT(Unwrap(device), Unwrap(queryPool), + firstQuery, queryCount)); + + if(IsActiveCapturing(m_State)) + { + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkResetQueryPoolEXT); + Serialise_vkResetQueryPoolEXT(ser, device, queryPool, firstQuery, queryCount); + + m_FrameCaptureRecord->AddChunk(scope.Get()); + GetResourceManager()->MarkResourceFrameReferenced(GetResID(queryPool), eFrameRef_Read); + } +} + template bool WrappedVulkan::Serialise_vkCreateSamplerYcbcrConversion( SerialiserType &ser, VkDevice device, const VkSamplerYcbcrConversionCreateInfo *pCreateInfo, @@ -1985,3 +2027,6 @@ INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateSamplerYcbcrConversion, VkDevi const VkSamplerYcbcrConversionCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSamplerYcbcrConversion *pYcbcrConversion); + +INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkResetQueryPoolEXT, VkDevice device, + VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);