From d6c03f58bc7bf27cb631a780fd19b410ae967b82 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 15 Aug 2017 15:21:09 +0100 Subject: [PATCH] Select the next highest event when replaying from an event * Searching down from the end for the next lowest event causes us to sometimes replay backwards when a marker is selected (and has no event in the array to replay directly). This can crash on vulkan, and is unintuitive/wrong on other APIs. Instead we follow the behaviour that we have elsewhere so that when a marker is selected we move _forward_ in the frame to select the next event after it. * Checking the history there doesn't seem to be any strong reason for this direction of search. --- renderdoc/driver/d3d11/d3d11_context.cpp | 8 ++++---- renderdoc/driver/d3d11/d3d11_context.h | 2 +- renderdoc/driver/d3d12/d3d12_command_queue.h | 2 +- renderdoc/driver/d3d12/d3d12_commands.cpp | 8 ++++---- renderdoc/driver/gl/gl_driver.cpp | 8 ++++---- renderdoc/driver/gl/gl_driver.h | 2 +- renderdoc/driver/vulkan/vk_core.cpp | 8 ++++---- renderdoc/driver/vulkan/vk_core.h | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index 69ec0235f..17ce14c9b 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -1030,12 +1030,12 @@ void WrappedID3D11DeviceContext::AddEvent(string description) m_Events.push_back(apievent); } -APIEvent WrappedID3D11DeviceContext::GetEvent(uint32_t eventID) +const APIEvent &WrappedID3D11DeviceContext::GetEvent(uint32_t eventID) { - for(size_t i = m_Events.size() - 1; i > 0; i--) + for(const APIEvent &e : m_Events) { - if(m_Events[i].eventID <= eventID) - return m_Events[i]; + if(e.eventID >= eventID) + return e; } return m_Events[0]; diff --git a/renderdoc/driver/d3d11/d3d11_context.h b/renderdoc/driver/d3d11/d3d11_context.h index 2d6b0386c..d88577e92 100644 --- a/renderdoc/driver/d3d11/d3d11_context.h +++ b/renderdoc/driver/d3d11/d3d11_context.h @@ -316,7 +316,7 @@ public: void ClearMaps(); uint32_t GetEventID() { return m_CurEventID; } - APIEvent GetEvent(uint32_t eventID); + const APIEvent &GetEvent(uint32_t eventID); const DrawcallTreeNode &GetRootDraw() { return m_ParentDrawcall; } void ThreadSafe_SetMarker(uint32_t col, const wchar_t *name); diff --git a/renderdoc/driver/d3d12/d3d12_command_queue.h b/renderdoc/driver/d3d12/d3d12_command_queue.h index adcd8f301..538a81246 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue.h +++ b/renderdoc/driver/d3d12/d3d12_command_queue.h @@ -118,7 +118,7 @@ public: WrappedID3D12Device *GetWrappedDevice() { return m_pDevice; } const vector &GetCmdLists() { return m_CmdListRecords; } D3D12DrawcallTreeNode &GetParentDrawcall() { return m_Cmd.m_ParentDrawcall; } - APIEvent GetEvent(uint32_t eventID); + const APIEvent &GetEvent(uint32_t eventID); uint32_t GetMaxEID() { return m_Cmd.m_Events.back().eventID; } ResourceId GetBackbufferResourceID() { return m_BackbufferID; } void ClearAfterCapture(); diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 42a5fc299..e23ec5815 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -254,12 +254,12 @@ void WrappedID3D12CommandQueue::ClearAfterCapture() m_QueueRecord->DeleteChunks(); } -APIEvent WrappedID3D12CommandQueue::GetEvent(uint32_t eventID) +const APIEvent &WrappedID3D12CommandQueue::GetEvent(uint32_t eventID) { - for(size_t i = m_Cmd.m_Events.size() - 1; i > 0; i--) + for(const APIEvent &e : m_Cmd.m_Events) { - if(m_Cmd.m_Events[i].eventID <= eventID) - return m_Cmd.m_Events[i]; + if(e.eventID >= eventID) + return e; } return m_Cmd.m_Events[0]; diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 3254e9f4e..369ba1eb5 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -4462,12 +4462,12 @@ void WrappedOpenGL::AddEvent(string description) m_Events.push_back(apievent); } -APIEvent WrappedOpenGL::GetEvent(uint32_t eventID) +const APIEvent &WrappedOpenGL::GetEvent(uint32_t eventID) { - for(size_t i = m_Events.size() - 1; i > 0; i--) + for(const APIEvent &e : m_Events) { - if(m_Events[i].eventID <= eventID) - return m_Events[i]; + if(e.eventID >= eventID) + return e; } return m_Events[0]; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 4ac92f760..3bcd70ae9 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -574,7 +574,7 @@ public: GLuint GetFakeBBFBO() { return m_FakeBB_FBO; } GLuint GetFakeVAO() { return m_FakeVAO; } FrameRecord &GetFrameRecord() { return m_FrameRecord; } - APIEvent GetEvent(uint32_t eventID); + const APIEvent &GetEvent(uint32_t eventID); const DrawcallTreeNode &GetRootDraw() { return m_ParentDrawcall; } const DrawcallDescription *GetDrawcall(uint32_t eventID); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 52d3563e5..b8f9b466d 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -3108,12 +3108,12 @@ void WrappedVulkan::AddEvent(string description) m_EventMessages.clear(); } -APIEvent WrappedVulkan::GetEvent(uint32_t eventID) +const APIEvent &WrappedVulkan::GetEvent(uint32_t eventID) { - for(size_t i = m_Events.size() - 1; i > 0; i--) + for(const APIEvent &e : m_Events) { - if(m_Events[i].eventID <= eventID) - return m_Events[i]; + if(e.eventID >= eventID) + return e; } return m_Events[0]; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index e6ffe2bde..d75cffaf7 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -724,7 +724,7 @@ public: void ReadLogInitialisation(); FrameRecord &GetFrameRecord() { return m_FrameRecord; } - APIEvent GetEvent(uint32_t eventID); + const APIEvent &GetEvent(uint32_t eventID); uint32_t GetMaxEID() { return m_Events.back().eventID; } const DrawcallDescription *GetDrawcall(uint32_t eventID);