From 1c5a5c9a4b11d4cc7773aa64fe378d242c31d1bd Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 27 Nov 2015 00:42:15 +0100 Subject: [PATCH] Add functions to get FetchDrawcall by ID from core --- renderdoc/driver/vulkan/vk_core.cpp | 46 +++++++++++++++++++++++++++++ renderdoc/driver/vulkan/vk_core.h | 2 ++ 2 files changed, 48 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index e6143499d..e2f76aa10 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1982,3 +1982,49 @@ FetchAPIEvent WrappedVulkan::GetEvent(uint32_t eventID) return m_Events[0]; } + +const FetchDrawcall *WrappedVulkan::GetDrawcall(const FetchDrawcall *draw, uint32_t eventID) +{ + if(draw == NULL) return NULL; + if(draw->eventID == eventID) return draw; + + int32_t count = draw->children.count; + for(int32_t i=0; i < count; i++) + { + const FetchDrawcall *cur = &draw->children.elems[i]; + const FetchDrawcall *next = i+1 < count ? &draw->children.elems[i+1] : NULL; + + if(next && next->eventID <= eventID) + continue; + + cur = GetDrawcall(cur, eventID); + + if(cur) + return cur; + } + + return NULL; +} + +const FetchDrawcall *WrappedVulkan::GetDrawcall(uint32_t frameID, uint32_t eventID) +{ + if(frameID >= m_FrameRecord.size()) + return NULL; + + size_t count = m_FrameRecord[frameID].drawcallList.size(); + for(size_t i=0; i < count; i++) + { + const FetchDrawcall *cur = &m_FrameRecord[frameID].drawcallList[i]; + const FetchDrawcall *next = i+1 < count ? &m_FrameRecord[frameID].drawcallList[i+1] : NULL; + + if(next && next->eventID <= eventID) + continue; + + cur = GetDrawcall(cur, eventID); + + if(cur) + return cur; + } + + return NULL; +} diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index b723a182a..498a3f19f 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -154,6 +154,7 @@ private: double m_TotalTime, m_AvgFrametime, m_MinFrametime, m_MaxFrametime; vector m_FrameRecord; + const FetchDrawcall *GetDrawcall(const FetchDrawcall *draw, uint32_t eventID); struct PhysicalDeviceData { @@ -530,6 +531,7 @@ public: vector &GetFrameRecord() { return m_FrameRecord; } FetchAPIEvent GetEvent(uint32_t eventID); + const FetchDrawcall *GetDrawcall(uint32_t frameID, uint32_t eventID); // Device initialization