From 5a64a78d2a2106df96c03bbefc4789531bd1e39a Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 18 Jul 2016 18:51:36 +0200 Subject: [PATCH] Add multiple-frame capture, grabbing N successive frames to captures * In-application API is bumped to 1.1.0 as a new function pointer is added to the end of the structure. * This comes with some caveats - capturing a frame is fairly heavy weight, so capturing a frame might throw off timing-related bugs you are trying to capture in subsequent frames. If you know your bug is every other frame though, capturing two can be a quick way to ensure you get it. --- renderdoc/api/app/renderdoc_app.h | 23 +++++--- renderdoc/api/replay/renderdoc_replay.h | 5 +- renderdoc/core/core.cpp | 11 ++-- renderdoc/core/core.h | 4 +- renderdoc/core/remote_access.cpp | 21 ++++++-- renderdoc/replay/app_api.cpp | 30 +++++++---- renderdocui/Interop/ReplayRenderer.cs | 6 +-- .../Windows/Dialogs/LiveCapture.Designer.cs | 54 +++++++++++++++---- renderdocui/Windows/Dialogs/LiveCapture.cs | 4 +- renderdocui/Windows/Dialogs/LiveCapture.resx | 3 ++ 10 files changed, 115 insertions(+), 46 deletions(-) diff --git a/renderdoc/api/app/renderdoc_app.h b/renderdoc/api/app/renderdoc_app.h index 51b28e981..a392cecbb 100644 --- a/renderdoc/api/app/renderdoc_app.h +++ b/renderdoc/api/app/renderdoc_app.h @@ -379,9 +379,6 @@ typedef uint32_t(RENDERDOC_CC *pRENDERDOC_GetNumCaptures)(); typedef uint32_t(RENDERDOC_CC *pRENDERDOC_GetCapture)(uint32_t idx, char *logfile, uint32_t *pathlength, uint64_t *timestamp); -// capture the next frame on whichever window and API is currently considered active -typedef void(RENDERDOC_CC *pRENDERDOC_TriggerCapture)(); - // returns 1 if the RenderDoc UI is connected to this application, 0 otherwise typedef uint32_t(RENDERDOC_CC *pRENDERDOC_IsRemoteAccessConnected)(); @@ -421,6 +418,12 @@ typedef void *RENDERDOC_WindowHandle; typedef void(RENDERDOC_CC *pRENDERDOC_SetActiveWindow)(RENDERDOC_DevicePointer device, RENDERDOC_WindowHandle wndHandle); +// capture the next frame on whichever window and API is currently considered active +typedef void(RENDERDOC_CC *pRENDERDOC_TriggerCapture)(); + +// capture the next N frames on whichever window and API is currently considered active +typedef void(RENDERDOC_CC *pRENDERDOC_TriggerMultiFrameCapture)(uint32_t numFrames); + // When choosing either a device pointer or a window handle to capture, you can pass NULL. // Passing NULL specifies a 'wildcard' match against anything. This allows you to specify // any API rendering to a specific window, or a specific API instance rendering to any window, @@ -470,6 +473,7 @@ typedef enum { eRENDERDOC_API_Version_1_0_0 = 10000, // RENDERDOC_API_1_0_0 = 1 00 00 eRENDERDOC_API_Version_1_0_1 = 10001, // RENDERDOC_API_1_0_1 = 1 00 01 eRENDERDOC_API_Version_1_0_2 = 10002, // RENDERDOC_API_1_0_2 = 1 00 02 + eRENDERDOC_API_Version_1_1_0 = 10100, // RENDERDOC_API_1_1_0 = 1 01 00 } RENDERDOC_Version; // API version changelog: @@ -478,8 +482,10 @@ typedef enum { // 1.0.1 - Bugfix: IsFrameCapturing() was returning false for captures that were triggered // by keypress or TriggerCapture, instead of Start/EndFrameCapture. // 1.0.2 - Refactor: Renamed eRENDERDOC_Option_DebugDeviceMode to eRENDERDOC_Option_APIValidation +// 1.1.0 - Add feature: TriggerMultiFrameCapture(). Backwards compatible with 1.0.x since the new +// function pointer is added to the end of the struct, the original layout is identical -// eRENDERDOC_API_Version_1_0_2 +// eRENDERDOC_API_Version_1_1_0 typedef struct { pRENDERDOC_GetAPIVersion GetAPIVersion; @@ -515,10 +521,13 @@ typedef struct pRENDERDOC_StartFrameCapture StartFrameCapture; pRENDERDOC_IsFrameCapturing IsFrameCapturing; pRENDERDOC_EndFrameCapture EndFrameCapture; -} RENDERDOC_API_1_0_2; -typedef RENDERDOC_API_1_0_2 RENDERDOC_API_1_0_0; -typedef RENDERDOC_API_1_0_2 RENDERDOC_API_1_0_1; + pRENDERDOC_TriggerMultiFrameCapture TriggerMultiFrameCapture; +} RENDERDOC_API_1_1_0; + +typedef RENDERDOC_API_1_1_0 RENDERDOC_API_1_0_0; +typedef RENDERDOC_API_1_1_0 RENDERDOC_API_1_0_1; +typedef RENDERDOC_API_1_1_0 RENDERDOC_API_1_0_2; ////////////////////////////////////////////////////////////////////////////////////////////////// // RenderDoc API entry point diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 07173d7ef..cf312ee4c 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -374,7 +374,7 @@ struct IRemoteAccess virtual uint32_t GetPID() = 0; virtual const char *GetBusyClient() = 0; - virtual void TriggerCapture() = 0; + virtual void TriggerCapture(uint32_t numFrames) = 0; virtual void QueueCapture(uint32_t frameNumber) = 0; virtual void CopyCapture(uint32_t remoteID, const char *localpath) = 0; @@ -402,7 +402,8 @@ extern "C" RENDERDOC_API const char *RENDERDOC_CC RemoteAccess_GetAPI(RemoteAcce extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RemoteAccess_GetPID(RemoteAccess *access); extern "C" RENDERDOC_API const char *RENDERDOC_CC RemoteAccess_GetBusyClient(RemoteAccess *access); -extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_TriggerCapture(RemoteAccess *access); +extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_TriggerCapture(RemoteAccess *access, + uint32_t numFrames); extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_QueueCapture(RemoteAccess *access, uint32_t frameNumber); extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_CopyCapture(RemoteAccess *access, diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 07d775732..b611b8dc7 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -168,7 +168,7 @@ RenderDoc::RenderDoc() m_Replay = false; - m_Cap = false; + m_Cap = 0; m_FocusKeys.clear(); m_FocusKeys.push_back(eRENDERDOC_Key_F11); @@ -459,7 +459,7 @@ void RenderDoc::Tick() if(!prev_focus && cur_focus) { - m_Cap = false; + m_Cap = 0; // can only shift focus if we have multiple windows if(m_WindowFrameCapturers.size() > 1) @@ -483,7 +483,7 @@ void RenderDoc::Tick() } if(!prev_cap && cur_cap) { - TriggerCapture(); + TriggerCapture(1); } prev_focus = cur_focus; @@ -492,9 +492,10 @@ void RenderDoc::Tick() bool RenderDoc::ShouldTriggerCapture(uint32_t frameNumber) { - bool ret = m_Cap; + bool ret = m_Cap > 0; - m_Cap = false; + if(m_Cap > 0) + m_Cap--; set frames; frames.swap(m_QueuedFrameCaptures); diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 76237c850..69c8a6124 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -274,7 +274,7 @@ public: return dev == m_ActiveWindow.dev && wnd == m_ActiveWindow.wnd; } - void TriggerCapture() { m_Cap = true; } + void TriggerCapture(uint32_t numFrames) { m_Cap = numFrames; } uint32_t GetOverlayBits() { return m_Overlay; } void MaskOverlayBits(uint32_t And, uint32_t Or) { m_Overlay = (m_Overlay & And) | Or; } void QueueCapture(uint32_t frameNumber) { m_QueuedFrameCaptures.insert(frameNumber); } @@ -303,7 +303,7 @@ private: bool m_Replay; - bool m_Cap; + uint32_t m_Cap; vector m_FocusKeys; vector m_CaptureKeys; diff --git a/renderdoc/core/remote_access.cpp b/renderdoc/core/remote_access.cpp index 156756225..a3f4c27f7 100644 --- a/renderdoc/core/remote_access.cpp +++ b/renderdoc/core/remote_access.cpp @@ -165,7 +165,10 @@ void RenderDoc::RemoteAccessClientThread(void *s) } else if(type == ePacket_TriggerCapture) { - RenderDoc::Inst().TriggerCapture(); + uint32_t numFrames = 0; + recvser->Serialise("", numFrames); + + RenderDoc::Inst().TriggerCapture(numFrames); } else if(type == ePacket_QueueCapture) { @@ -417,10 +420,17 @@ public: const char *GetAPI() { return m_API.c_str(); } uint32_t GetPID() { return m_PID; } const char *GetBusyClient() { return m_BusyClient.c_str(); } - void TriggerCapture() + void TriggerCapture(uint32_t numFrames) { - if(!SendPacket(m_Socket, ePacket_TriggerCapture)) + Serialiser ser("", Serialiser::WRITING, false); + + ser.Serialise("", numFrames); + + if(!SendPacket(m_Socket, ePacket_TriggerCapture, ser)) + { SAFE_DELETE(m_Socket); + return; + } } void QueueCapture(uint32_t frameNumber) @@ -635,9 +645,10 @@ extern "C" RENDERDOC_API const char *RENDERDOC_CC RemoteAccess_GetBusyClient(Rem return access->GetBusyClient(); } -extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_TriggerCapture(RemoteAccess *access) +extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_TriggerCapture(RemoteAccess *access, + uint32_t numFrames) { - access->TriggerCapture(); + access->TriggerCapture(numFrames); } extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_QueueCapture(RemoteAccess *access, uint32_t frameNumber) diff --git a/renderdoc/replay/app_api.cpp b/renderdoc/replay/app_api.cpp index 2d0ac84db..aed497277 100644 --- a/renderdoc/replay/app_api.cpp +++ b/renderdoc/replay/app_api.cpp @@ -105,7 +105,12 @@ static uint32_t GetCapture(uint32_t idx, char *logfile, uint32_t *pathlength, ui static void TriggerCapture() { - RenderDoc::Inst().TriggerCapture(); + RenderDoc::Inst().TriggerCapture(1); +} + +static void TriggerMultiFrameCapture(uint32_t numFrames) +{ + RenderDoc::Inst().TriggerCapture(numFrames); } static uint32_t IsRemoteAccessConnected() @@ -160,22 +165,22 @@ int RENDERDOC_CC SetCaptureOptionF32(RENDERDOC_CaptureOption opt, float val); uint32_t RENDERDOC_CC GetCaptureOptionU32(RENDERDOC_CaptureOption opt); float RENDERDOC_CC GetCaptureOptionF32(RENDERDOC_CaptureOption opt); -void RENDERDOC_CC GetAPIVersion_1_0_2(int *major, int *minor, int *patch) +void RENDERDOC_CC GetAPIVersion_1_1_0(int *major, int *minor, int *patch) { if(major) *major = 1; if(minor) - *minor = 0; + *minor = 1; if(patch) - *patch = 2; + *patch = 0; } -RENDERDOC_API_1_0_2 api_1_0_2; -void Init_1_0_2() +RENDERDOC_API_1_1_0 api_1_1_0; +void Init_1_1_0() { - RENDERDOC_API_1_0_2 &api = api_1_0_2; + RENDERDOC_API_1_1_0 &api = api_1_1_0; - api.GetAPIVersion = &GetAPIVersion_1_0_2; + api.GetAPIVersion = &GetAPIVersion_1_1_0; api.SetCaptureOptionU32 = &SetCaptureOptionU32; api.SetCaptureOptionF32 = &SetCaptureOptionF32; @@ -208,6 +213,8 @@ void Init_1_0_2() api.StartFrameCapture = &StartFrameCapture; api.IsFrameCapturing = &IsFrameCapturing; api.EndFrameCapture = &EndFrameCapture; + + api.TriggerMultiFrameCapture = &TriggerMultiFrameCapture; } extern "C" RENDERDOC_API int RENDERDOC_CC RENDERDOC_GetAPI(RENDERDOC_Version version, @@ -231,9 +238,10 @@ extern "C" RENDERDOC_API int RENDERDOC_CC RENDERDOC_GetAPI(RENDERDOC_Version ver ret = 1; \ } - API_VERSION_HANDLE(1_0_0, 1_0_2); - API_VERSION_HANDLE(1_0_1, 1_0_2); - API_VERSION_HANDLE(1_0_2, 1_0_2); + API_VERSION_HANDLE(1_0_0, 1_1_0); + API_VERSION_HANDLE(1_0_1, 1_1_0); + API_VERSION_HANDLE(1_0_2, 1_1_0); + API_VERSION_HANDLE(1_1_0, 1_1_0); #undef API_VERSION_HANDLE diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index 5b0f18923..6dd28011c 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -930,7 +930,7 @@ namespace renderdoc private static extern IntPtr RemoteAccess_GetBusyClient(IntPtr real); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] - private static extern void RemoteAccess_TriggerCapture(IntPtr real); + private static extern void RemoteAccess_TriggerCapture(IntPtr real, UInt32 numFrames); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern void RemoteAccess_QueueCapture(IntPtr real, UInt32 frameNumber); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] @@ -994,9 +994,9 @@ namespace renderdoc m_Real = IntPtr.Zero; } - public void TriggerCapture() + public void TriggerCapture(UInt32 numFrames) { - RemoteAccess_TriggerCapture(m_Real); + RemoteAccess_TriggerCapture(m_Real, numFrames); } public void QueueCapture(UInt32 frameNum) diff --git a/renderdocui/Windows/Dialogs/LiveCapture.Designer.cs b/renderdocui/Windows/Dialogs/LiveCapture.Designer.cs index fe2de671d..15ebbfd95 100644 --- a/renderdocui/Windows/Dialogs/LiveCapture.Designer.cs +++ b/renderdocui/Windows/Dialogs/LiveCapture.Designer.cs @@ -35,6 +35,7 @@ System.Windows.Forms.GroupBox groupBox1; System.Windows.Forms.ToolStrip toolStrip1; System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LiveCapture)); + System.Windows.Forms.Label label4; this.queueCap = new System.Windows.Forms.Button(); this.captureFrame = new System.Windows.Forms.NumericUpDown(); this.captureDelay = new System.Windows.Forms.NumericUpDown(); @@ -59,11 +60,13 @@ this.deleteThisCaptureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.captureCountdown = new System.Windows.Forms.Timer(this.components); this.childUpdateTimer = new System.Windows.Forms.Timer(this.components); + this.numFrames = new System.Windows.Forms.NumericUpDown(); label1 = new System.Windows.Forms.Label(); label2 = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label(); groupBox1 = new System.Windows.Forms.GroupBox(); toolStrip1 = new System.Windows.Forms.ToolStrip(); + label4 = new System.Windows.Forms.Label(); groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.captureFrame)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.captureDelay)).BeginInit(); @@ -71,6 +74,7 @@ this.tableLayoutPanel1.SuspendLayout(); this.flowLayoutPanel1.SuspendLayout(); this.rightclickContext.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numFrames)).BeginInit(); this.SuspendLayout(); // // label1 @@ -106,6 +110,8 @@ groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + groupBox1.Controls.Add(this.numFrames); + groupBox1.Controls.Add(label4); groupBox1.Controls.Add(this.queueCap); groupBox1.Controls.Add(this.captureFrame); groupBox1.Controls.Add(label3); @@ -114,7 +120,7 @@ groupBox1.Controls.Add(this.triggerCapture); groupBox1.Location = new System.Drawing.Point(3, 34); groupBox1.Name = "groupBox1"; - groupBox1.Size = new System.Drawing.Size(351, 75); + groupBox1.Size = new System.Drawing.Size(356, 75); groupBox1.TabIndex = 7; groupBox1.TabStop = false; groupBox1.Text = "Tools"; @@ -156,12 +162,12 @@ // this.captureDelay.Location = new System.Drawing.Point(96, 19); this.captureDelay.Name = "captureDelay"; - this.captureDelay.Size = new System.Drawing.Size(120, 20); + this.captureDelay.Size = new System.Drawing.Size(46, 20); this.captureDelay.TabIndex = 1; // // triggerCapture // - this.triggerCapture.Location = new System.Drawing.Point(222, 17); + this.triggerCapture.Location = new System.Drawing.Point(253, 16); this.triggerCapture.Name = "triggerCapture"; this.triggerCapture.Size = new System.Drawing.Size(92, 23); this.triggerCapture.TabIndex = 2; @@ -181,7 +187,7 @@ toolStrip1.Location = new System.Drawing.Point(0, 375); toolStrip1.Name = "toolStrip1"; toolStrip1.RightToLeft = System.Windows.Forms.RightToLeft.Yes; - toolStrip1.Size = new System.Drawing.Size(357, 25); + toolStrip1.Size = new System.Drawing.Size(362, 25); toolStrip1.Stretch = true; toolStrip1.TabIndex = 8; toolStrip1.Text = "toolStrip1"; @@ -256,7 +262,7 @@ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.Size = new System.Drawing.Size(357, 400); + this.tableLayoutPanel1.Size = new System.Drawing.Size(362, 400); this.tableLayoutPanel1.TabIndex = 0; // // captures @@ -266,7 +272,7 @@ this.captures.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.captures.Location = new System.Drawing.Point(3, 221); this.captures.Name = "captures"; - this.captures.Size = new System.Drawing.Size(351, 151); + this.captures.Size = new System.Drawing.Size(356, 151); this.captures.TabIndex = 6; this.captures.TileSize = new System.Drawing.Size(300, 100); this.captures.UseCompatibleStateImageBehavior = false; @@ -283,7 +289,7 @@ this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.flowLayoutPanel1.Location = new System.Drawing.Point(3, 3); this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(351, 25); + this.flowLayoutPanel1.Size = new System.Drawing.Size(356, 25); this.flowLayoutPanel1.TabIndex = 4; this.flowLayoutPanel1.WrapContents = false; // @@ -321,9 +327,9 @@ this.childProcesses.Dock = System.Windows.Forms.DockStyle.Fill; this.childProcesses.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.childProcesses.Location = new System.Drawing.Point(3, 143); - this.childProcesses.MinimumSize = new System.Drawing.Size(0, 40); + this.childProcesses.MinimumSize = new System.Drawing.Size(4, 40); this.childProcesses.Name = "childProcesses"; - this.childProcesses.Size = new System.Drawing.Size(351, 40); + this.childProcesses.Size = new System.Drawing.Size(356, 40); this.childProcesses.TabIndex = 5; this.childProcesses.UseCompatibleStateImageBehavior = false; this.childProcesses.View = System.Windows.Forms.View.Tile; @@ -385,11 +391,37 @@ this.childUpdateTimer.Enabled = true; this.childUpdateTimer.Tick += new System.EventHandler(this.childUpdateTimer_Tick); // + // label4 + // + label4.AutoSize = true; + label4.Location = new System.Drawing.Point(148, 21); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(54, 13); + label4.TabIndex = 5; + label4.Text = "# Frames:"; + // + // numFrames + // + this.numFrames.Location = new System.Drawing.Point(208, 19); + this.numFrames.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numFrames.Name = "numFrames"; + this.numFrames.Size = new System.Drawing.Size(39, 20); + this.numFrames.TabIndex = 6; + this.numFrames.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // // LiveCapture // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(357, 400); + this.ClientSize = new System.Drawing.Size(362, 400); this.Controls.Add(this.tableLayoutPanel1); this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Name = "LiveCapture"; @@ -408,6 +440,7 @@ this.flowLayoutPanel1.ResumeLayout(false); this.flowLayoutPanel1.PerformLayout(); this.rightclickContext.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numFrames)).EndInit(); this.ResumeLayout(false); } @@ -438,5 +471,6 @@ private System.Windows.Forms.ToolStripSplitButton openMenu; private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem newInstanceToolStripMenuItem; + private System.Windows.Forms.NumericUpDown numFrames; } } \ No newline at end of file diff --git a/renderdocui/Windows/Dialogs/LiveCapture.cs b/renderdocui/Windows/Dialogs/LiveCapture.cs index b72f27111..6071a9ab9 100644 --- a/renderdocui/Windows/Dialogs/LiveCapture.cs +++ b/renderdocui/Windows/Dialogs/LiveCapture.cs @@ -54,6 +54,7 @@ namespace renderdocui.Windows Thread m_ConnectThread = null; bool m_TriggerCapture = false; bool m_QueueCapture = false; + int m_CaptureNumFrames = 1; int m_CaptureFrameNum = 0; int m_CaptureCounter = 0; bool m_Disconnect = false; @@ -174,7 +175,7 @@ namespace renderdocui.Windows if (m_TriggerCapture) { - m_Connection.TriggerCapture(); + m_Connection.TriggerCapture((uint)m_CaptureNumFrames); m_TriggerCapture = false; } @@ -703,6 +704,7 @@ namespace renderdocui.Windows private void triggerCapture_Click(object sender, EventArgs e) { + m_CaptureNumFrames = (int)numFrames.Value; if (captureDelay.Value == 0) { m_TriggerCapture = true; diff --git a/renderdocui/Windows/Dialogs/LiveCapture.resx b/renderdocui/Windows/Dialogs/LiveCapture.resx index dc6a8c067..d978fc7d6 100644 --- a/renderdocui/Windows/Dialogs/LiveCapture.resx +++ b/renderdocui/Windows/Dialogs/LiveCapture.resx @@ -129,6 +129,9 @@ False + + False + False