From 168d98bbdee3594228a48ec547a32dcbe803add8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 25 Apr 2018 11:44:09 +0100 Subject: [PATCH] Add support for VK_AMD_buffer_marker extension --- renderdoc/driver/vulkan/vk_common.h | 1 + renderdoc/driver/vulkan/vk_core.cpp | 8 ++ renderdoc/driver/vulkan/vk_core.h | 4 + renderdoc/driver/vulkan/vk_hookset_defs.h | 7 +- renderdoc/driver/vulkan/vk_stringise.cpp | 3 +- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 79 +++++++++++++++++++ 6 files changed, 100 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 9029c9deb..869a22af5 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -471,6 +471,7 @@ enum class VulkanChunk : uint32_t vkUpdateDescriptorSetWithTemplateKHR, vkBindBufferMemory2KHR, vkBindImageMemory2KHR, + vkCmdWriteBufferMarkerAMD, Max, }; diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index f3c87c9f1..5ca057327 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -509,6 +509,9 @@ bool operator<(const VkExtensionProperties &a, const VkExtensionProperties &b) // This list must be kept sorted according to the above sort operator! static const VkExtensionProperties supportedExtensions[] = { + { + VK_AMD_BUFFER_MARKER_EXTENSION_NAME, VK_AMD_BUFFER_MARKER_SPEC_VERSION, + }, { VK_AMD_GCN_SHADER_EXTENSION_NAME, VK_AMD_GCN_SHADER_SPEC_VERSION, }, @@ -2301,6 +2304,11 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk) return Serialise_vkBindImageMemory2KHR(ser, VK_NULL_HANDLE, 0, NULL); break; + case VulkanChunk::vkCmdWriteBufferMarkerAMD: + return Serialise_vkCmdWriteBufferMarkerAMD( + ser, VK_NULL_HANDLE, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 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 8eaaee8c5..457cde1c6 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1694,4 +1694,8 @@ public: void vkGetDescriptorSetLayoutSupportKHR(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, VkDescriptorSetLayoutSupport *pSupport); + + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdWriteBufferMarkerAMD, VkCommandBuffer commandBuffer, + VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer, + VkDeviceSize dstOffset, uint32_t marker); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 1e535be5b..407ac33bc 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -323,7 +323,8 @@ CheckExt(KHR_descriptor_update_template, VK11); \ CheckExt(KHR_bind_memory2, VK11); \ CheckExt(EXT_conservative_rasterization, VKXX); \ - CheckExt(EXT_global_priority, VKXX); + CheckExt(EXT_global_priority, VKXX); \ + CheckExt(AMD_buffer_marker, VKXX); #define HookInitVulkanInstanceExts() \ HookInitExtension(KHR_surface, DestroySurfaceKHR); \ @@ -397,6 +398,7 @@ HookInitExtension(KHR_bind_memory2, BindBufferMemory2KHR); \ HookInitExtension(KHR_bind_memory2, BindImageMemory2KHR); \ HookInitExtension(KHR_maintenance3, GetDescriptorSetLayoutSupportKHR); \ + HookInitExtension(AMD_buffer_marker, CmdWriteBufferMarkerAMD); \ HookInitDevice_PlatformSpecific() #define DefineHooks() \ @@ -840,6 +842,9 @@ HookDefine3(void, vkGetDescriptorSetLayoutSupportKHR, VkDevice, device, \ const VkDescriptorSetLayoutCreateInfo *, pCreateInfo, \ VkDescriptorSetLayoutSupport *, pSupport); \ + HookDefine5(void, vkCmdWriteBufferMarkerAMD, VkCommandBuffer, commandBuffer, \ + VkPipelineStageFlagBits, pipelineStage, VkBuffer, dstBuffer, VkDeviceSize, \ + dstOffset, uint32_t, marker); \ HookDefine_PlatformSpecific() struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index 76b69c155..f5e39a936 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 == 1104, "Chunks changed without updating names"); + RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1105, "Chunks changed without updating names"); BEGIN_ENUM_STRINGISE(VulkanChunk) { @@ -136,6 +136,7 @@ std::string DoStringise(const VulkanChunk &el) STRINGISE_ENUM_CLASS(vkUpdateDescriptorSetWithTemplateKHR); STRINGISE_ENUM_CLASS(vkBindBufferMemory2KHR); STRINGISE_ENUM_CLASS(vkBindImageMemory2KHR); + STRINGISE_ENUM_CLASS(vkCmdWriteBufferMarkerAMD); STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk"); } END_ENUM_STRINGISE() diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 6584b85d4..cafaf2712 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -3504,6 +3504,81 @@ void WrappedVulkan::vkCmdPushDescriptorSetWithTemplateKHR( } } +template +bool WrappedVulkan::Serialise_vkCmdWriteBufferMarkerAMD(SerialiserType &ser, + VkCommandBuffer commandBuffer, + VkPipelineStageFlagBits pipelineStage, + VkBuffer dstBuffer, VkDeviceSize dstOffset, + uint32_t marker) +{ + SERIALISE_ELEMENT(commandBuffer); + SERIALISE_ELEMENT(pipelineStage); + SERIALISE_ELEMENT(dstBuffer); + SERIALISE_ELEMENT(dstOffset); + SERIALISE_ELEMENT(marker); + + Serialise_DebugMessages(ser); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); + + if(IsActiveReplaying(m_State)) + { + if(InRerecordRange(m_LastCmdBufferID)) + commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); + else + commandBuffer = VK_NULL_HANDLE; + } + + if(commandBuffer != VK_NULL_HANDLE) + { + ObjDisp(commandBuffer) + ->CmdWriteBufferMarkerAMD(Unwrap(commandBuffer), pipelineStage, Unwrap(dstBuffer), + dstOffset, marker); + } + } + + return true; +} + +void WrappedVulkan::vkCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, + VkPipelineStageFlagBits pipelineStage, + VkBuffer dstBuffer, VkDeviceSize dstOffset, + uint32_t marker) +{ + SCOPED_DBG_SINK(); + + SERIALISE_TIME_CALL(ObjDisp(commandBuffer) + ->CmdWriteBufferMarkerAMD(Unwrap(commandBuffer), pipelineStage, + Unwrap(dstBuffer), dstOffset, marker)); + + if(IsCaptureMode(m_State)) + { + VkResourceRecord *record = GetRecord(commandBuffer); + + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdWriteBufferMarkerAMD); + Serialise_vkCmdWriteBufferMarkerAMD(ser, commandBuffer, pipelineStage, dstBuffer, dstOffset, + marker); + + record->AddChunk(scope.Get()); + + VkResourceRecord *buf = GetRecord(dstBuffer); + + // mark buffer just as read, and memory behind as write & dirtied + record->MarkResourceFrameReferenced(buf->GetResourceID(), eFrameRef_Read); + record->MarkResourceFrameReferenced(buf->baseResource, eFrameRef_Write); + if(buf->baseResource != ResourceId()) + record->cmdInfo->dirtied.insert(buf->baseResource); + if(buf->sparseInfo) + record->cmdInfo->sparse.insert(buf->sparseInfo); + } +} + INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateCommandPool, VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool); @@ -3601,3 +3676,7 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdPushDescriptorSetWithTemplateKHR, VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void *pData); + +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdWriteBufferMarkerAMD, VkCommandBuffer commandBuffer, + VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer, + VkDeviceSize dstOffset, uint32_t marker); \ No newline at end of file