diff --git a/renderdocui/Windows/BufferViewer.Designer.cs b/renderdocui/Windows/BufferViewer.Designer.cs index a744f6af6..2c89e02f5 100644 --- a/renderdocui/Windows/BufferViewer.Designer.cs +++ b/renderdocui/Windows/BufferViewer.Designer.cs @@ -112,7 +112,8 @@ this.rowOffset = new System.Windows.Forms.ToolStripTextBox(); this.byteOffsLab = new System.Windows.Forms.ToolStripLabel(); this.byteOffset = new System.Windows.Forms.ToolStripTextBox(); - this.offsetCancel = new System.Windows.Forms.ToolStripButton(); + this.rowRangeLab = new System.Windows.Forms.ToolStripLabel(); + this.rowRange = new System.Windows.Forms.ToolStripTextBox(); this.instSep = new System.Windows.Forms.ToolStripSeparator(); this.instLabel = new System.Windows.Forms.ToolStripLabel(); this.instanceIdxToolitem = new System.Windows.Forms.ToolStripTextBox(); @@ -786,7 +787,7 @@ this.flowLayoutPanel2.Controls.Add(this.toolStrip1); this.flowLayoutPanel2.Location = new System.Drawing.Point(3, 3); this.flowLayoutPanel2.Name = "flowLayoutPanel2"; - this.flowLayoutPanel2.Size = new System.Drawing.Size(728, 25); + this.flowLayoutPanel2.Size = new System.Drawing.Size(831, 25); this.flowLayoutPanel2.TabIndex = 0; // // toolStrip1 @@ -805,13 +806,14 @@ this.rowOffset, this.byteOffsLab, this.byteOffset, - this.offsetCancel, + this.rowRangeLab, + this.rowRange, this.instSep, this.instLabel, this.instanceIdxToolitem}); this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(728, 25); + this.toolStrip1.Size = new System.Drawing.Size(831, 25); this.toolStrip1.TabIndex = 0; this.toolStrip1.Text = "toolStrip1"; // @@ -920,15 +922,17 @@ this.byteOffset.Size = new System.Drawing.Size(60, 25); this.byteOffset.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.byteOffset_KeyPress); // - // offsetCancel + // rowRangeLab // - this.offsetCancel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.offsetCancel.Image = global::renderdocui.Properties.Resources.red_x_16; - this.offsetCancel.ImageTransparentColor = System.Drawing.Color.Magenta; - this.offsetCancel.Name = "offsetCancel"; - this.offsetCancel.Size = new System.Drawing.Size(23, 22); - this.offsetCancel.Text = "Reset"; - this.offsetCancel.Click += new System.EventHandler(this.offsetCancel_Click); + this.rowRangeLab.Name = "rowRangeLab"; + this.rowRangeLab.Size = new System.Drawing.Size(33, 22); + this.rowRangeLab.Text = "Rows"; + // + // rowRange + // + this.rowRange.Name = "rowRange"; + this.rowRange.Size = new System.Drawing.Size(60, 25); + this.rowRange.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.rowRange_KeyPress); // // instSep // @@ -1118,7 +1122,6 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripLabel toolStripLabel2; private System.Windows.Forms.ToolStripTextBox rowOffset; - private System.Windows.Forms.ToolStripButton offsetCancel; private System.Windows.Forms.ToolStripSeparator instSep; private System.Windows.Forms.ToolStripLabel instLabel; private System.Windows.Forms.ToolStripTextBox instanceIdxToolitem; @@ -1157,6 +1160,8 @@ private System.Windows.Forms.ToolStripMenuItem selectColumnAsSecondaryToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem selectAlphaAsSecondaryToolStripMenuItem; private System.Windows.Forms.Label largeBufferWarning; + private System.Windows.Forms.ToolStripLabel rowRangeLab; + private System.Windows.Forms.ToolStripTextBox rowRange; } } \ No newline at end of file diff --git a/renderdocui/Windows/BufferViewer.cs b/renderdocui/Windows/BufferViewer.cs index 2bbf1acf7..d2e934439 100644 --- a/renderdocui/Windows/BufferViewer.cs +++ b/renderdocui/Windows/BufferViewer.cs @@ -146,15 +146,6 @@ namespace renderdocui.Windows } } - private int MaxRowCount - { - get - { - // for now, don't clamp rows on mesh view - return MeshView ? int.MaxValue : 200000; - } - } - // one UI state for each stage private UIState m_VSIn = new UIState(MeshDataStage.VSIn); private UIState m_VSOut = new UIState(MeshDataStage.VSOut); @@ -279,14 +270,19 @@ namespace renderdocui.Windows instLabel.Visible = instSep.Visible = instanceIdxToolitem.Visible = false; syncViewsToolItem.Visible = false; highlightVerts.Visible = false; + byteOffset.Visible = true; byteOffsLab.Visible = true; + rowRange.Visible = true; rowRangeLab.Visible = true; byteOffset.Text = "0"; + rowRange.Text = DefaultMaxRows.ToString(); Text = "Buffer Contents"; } else { byteOffset.Visible = false; byteOffsLab.Visible = false; + rowRange.Visible = false; rowRangeLab.Visible = false; byteOffset.Text = "0"; + rowRange.Text = DefaultMaxRows.ToString(); Text = "Mesh Output"; } @@ -458,7 +454,7 @@ namespace renderdocui.Windows previewTab.SelectedIndex = 0; - uint byteoffs = ByteOffset; + ulong byteoffs = ByteOffset; if (MeshView) { @@ -558,7 +554,7 @@ namespace renderdocui.Windows int curReq = m_ReqID; - uint byteoffs = ByteOffset; + ulong byteoffs = ByteOffset; m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { @@ -695,25 +691,39 @@ namespace renderdocui.Windows } } - private uint ByteOffset + private uint DefaultMaxRows { get { return 200000; } } + + private int MaxRowCount + { + get + { + // for now, don't clamp rows on mesh view + if (IsDisposed || MeshView) return int.MaxValue; + int maxrows = 0; + int.TryParse(rowRange.Text, out maxrows); + return maxrows; + } + } + + private ulong ByteOffset { get { if (IsDisposed) return 0; - uint offs = 0; - uint.TryParse(byteOffset.Text, out offs); + ulong offs = 0; + ulong.TryParse(byteOffset.Text, out offs); return offs; } } #region Get Data Formats/Organisation - public void ViewRawBuffer(bool isBuffer, ResourceId id) + public void ViewRawBuffer(bool isBuffer, ulong offset, ulong size, ResourceId id) { - ViewRawBuffer(isBuffer, id, ""); + ViewRawBuffer(isBuffer, offset, size, id, ""); } - public void ViewRawBuffer(bool isBuffer, ResourceId id, string formatString) + public void ViewRawBuffer(bool isBuffer, ulong offset, ulong size, ResourceId id, string formatString) { if (m_Core.CurBuffers == null) return; @@ -745,7 +755,21 @@ namespace renderdocui.Windows input.IndexOffset = 0; largeBufferWarning.Visible = false; - byteOffset.Enabled = false; + byteOffset.Text = offset.ToString(); + + if (size == ulong.MaxValue) + { + rowRange.Text = DefaultMaxRows.ToString(); + } + else + { + uint rows = (uint)(size / input.Strides[0]); + + if (rows * input.Strides[0] < size) + rows++; + + rowRange.Text = rows.ToString(); + } m_VSIn.m_Input = input; @@ -755,13 +779,11 @@ namespace renderdocui.Windows ClearStoredData(); - uint byteoffset = ByteOffset; - m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { if (IsDisposed) return; - var contents = RT_FetchBufferContents(MeshDataStage.VSIn, r, input, byteoffset); + var contents = RT_FetchBufferContents(MeshDataStage.VSIn, r, input, offset); this.BeginInvoke(new Action(() => { @@ -938,7 +960,7 @@ namespace renderdocui.Windows #region Get Actual Bytes - private Dataset RT_FetchBufferContents(MeshDataStage type, ReplayRenderer r, Input input, uint byteoffs) + private Dataset RT_FetchBufferContents(MeshDataStage type, ReplayRenderer r, Input input, ulong byteoffs) { Dataset ret = new Dataset(); @@ -956,7 +978,7 @@ namespace renderdocui.Windows if(input.Buffers[0] != ResourceId.Null) ret.Buffers[0] = r.GetBufferData(input.Buffers[0], byteoffs, 0); else if (input.Buffers[1] != ResourceId.Null) - ret.Buffers[0] = r.GetTextureData(input.Buffers[1], byteoffs, 0); + ret.Buffers[0] = r.GetTextureData(input.Buffers[1], (uint)byteoffs, 0); ret.Indices = null; ret.DataIndices = null; @@ -1688,7 +1710,7 @@ namespace renderdocui.Windows { bufView.RowCount = Math.Min(state.m_Rows.Length, MaxRowCount); - if (state.m_Rows.Length > MaxRowCount) + if (state.m_Rows.Length > MaxRowCount && MaxRowCount >= DefaultMaxRows) largeBufferWarning.Visible = true; ScrollToRow(bufView, RowOffset); @@ -3122,7 +3144,7 @@ namespace renderdocui.Windows byteOffset.Enabled = false; - uint byteoffset = ByteOffset; + ulong byteoffset = ByteOffset; m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { @@ -3140,7 +3162,7 @@ namespace renderdocui.Windows private void largeBufferWarning_Click(object sender, EventArgs e) { - byteOffset.Text = (ByteOffset + m_VSIn.m_Input.Strides[0]*MaxRowCount).ToString(); + byteOffset.Text = (ByteOffset + (ulong)(m_VSIn.m_Input.Strides[0]*MaxRowCount)).ToString(); SetByteOffset(); } @@ -3152,6 +3174,16 @@ namespace renderdocui.Windows } } + private void rowRange_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\n' || e.KeyChar == '\r') + { + if (MaxRowCount > DefaultMaxRows) + rowRange.Text = DefaultMaxRows.ToString(); + SetByteOffset(); + } + } + private void offsetCancel_Click(object sender, EventArgs e) { rowOffset.Text = "0"; @@ -3175,7 +3207,7 @@ namespace renderdocui.Windows id = GetUIState(MeshDataStage.VSIn).m_Input.Buffers[1]; } - ViewRawBuffer(isBuffer, id, formatText); + ViewRawBuffer(isBuffer, ByteOffset, ulong.MaxValue, id, formatText); } private void ShowFormatSpecifier() diff --git a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs index aac58a78d..0845f28bc 100644 --- a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs @@ -48,6 +48,18 @@ namespace renderdocui.Windows.PipelineState // keep track of the VB nodes (we want to be able to highlight them easily on hover) private List m_VBNodes = new List(); + private struct IABufferTag + { + public IABufferTag(ResourceId i, ulong offs) + { + id = i; + offset = offs; + } + + public ResourceId id; + public ulong offset; + }; + public D3D11PipelineStateViewer(Core core, DockContent c) { InitializeComponent(); @@ -826,7 +838,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = state.m_IA.ibuffer.Buffer; + node.Tag = new IABufferTag(state.m_IA.ibuffer.Buffer, draw.indexOffset); if (!ibufferUsed) InactiveRow(node); @@ -843,7 +855,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = state.m_IA.ibuffer.Buffer; + node.Tag = new IABufferTag(state.m_IA.ibuffer.Buffer, draw.indexOffset); EmptyRow(node); @@ -889,7 +901,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = v.Buffer; + node.Tag = new IABufferTag(v.Buffer, v.Offset); if (!filledSlot) EmptyRow(node); @@ -1559,7 +1571,7 @@ namespace renderdocui.Windows.PipelineState if (tex.resType == ShaderResourceType.Buffer) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(false, tex.ID); + viewer.ViewRawBuffer(false, 0, ulong.MaxValue, tex.ID); viewer.Show(m_DockContent.DockPanel); } else @@ -1685,9 +1697,9 @@ namespace renderdocui.Windows.PipelineState { var viewer = new BufferViewer(m_Core, false); if (format.Length == 0) - viewer.ViewRawBuffer(true, buf.ID); + viewer.ViewRawBuffer(true, 0, ulong.MaxValue, buf.ID); else - viewer.ViewRawBuffer(true, buf.ID, format); + viewer.ViewRawBuffer(true, 0, ulong.MaxValue, buf.ID, format); viewer.Show(m_DockContent.DockPanel); } } @@ -1775,14 +1787,14 @@ namespace renderdocui.Windows.PipelineState private void iabuffers_NodeDoubleClicked(TreelistView.Node node) { - if (node.Tag is ResourceId) + if (node.Tag is IABufferTag) { - ResourceId id = (ResourceId)node.Tag; + IABufferTag tag = (IABufferTag)node.Tag; - if (id != ResourceId.Null) + if (tag.id != ResourceId.Null) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(true, id); + viewer.ViewRawBuffer(true, tag.offset, ulong.MaxValue, tag.id); viewer.Show(m_DockContent.DockPanel); } } @@ -2141,8 +2153,8 @@ namespace renderdocui.Windows.PipelineState if (stage.ConstantBuffers.Length < slot) return; - var buf = stage.ConstantBuffers[slot].Buffer; - viewer.ViewRawBuffer(true, buf); + var buf = stage.ConstantBuffers[slot]; + viewer.ViewRawBuffer(true, buf.VecOffset * 4 * sizeof(float), buf.VecCount * 4 * sizeof(float), buf.Buffer); viewer.Show(m_DockContent.DockPanel); return; diff --git a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs index 7271c6182..48a97df1e 100644 --- a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs @@ -53,12 +53,31 @@ namespace renderdocui.Windows.PipelineState public FetchBuffer buf; }; + private struct IABufferTag + { + public IABufferTag(ResourceId i, ulong offs) + { + id = i; + offset = offs; + } + + public ResourceId id; + public ulong offset; + }; + private Core m_Core; private DockContent m_DockContent; // keep track of the VB nodes (we want to be able to highlight them easily on hover) private List m_VBNodes = new List(); + private enum GLReadWriteType + { + Atomic, + SSBO, + Image, + }; + public GLPipelineStateViewer(Core core, DockContent c) { InitializeComponent(); @@ -226,6 +245,31 @@ namespace renderdocui.Windows.PipelineState readwrites.Nodes.Clear(); } + private GLReadWriteType GetGLReadWriteType(ShaderResource res) + { + GLReadWriteType ret = GLReadWriteType.Image; + + if (res.IsTexture) + { + ret = GLReadWriteType.Image; + } + else + { + if (res.variableType.descriptor.rows == 1 && + res.variableType.descriptor.cols == 1 && + res.variableType.descriptor.type == VarType.UInt) + { + ret = GLReadWriteType.Atomic; + } + else + { + ret = GLReadWriteType.SSBO; + } + } + + return ret; + } + // Set a shader stage's resources and values private void SetShaderState(FetchTexture[] texs, FetchBuffer[] bufs, GLPipelineState state, GLPipelineState.ShaderStage stage, @@ -562,45 +606,28 @@ namespace renderdocui.Windows.PipelineState { int bindPoint = stage.BindpointMapping.ReadWriteResources[i].bind; - bool atomic = false; - bool ssbo = false; - bool image = false; + GLReadWriteType readWriteType = GetGLReadWriteType(res); GLPipelineState.Buffer bf = null; GLPipelineState.ImageLoadStore im = null; ResourceId id = ResourceId.Null; - if (res.IsTexture) + if (readWriteType == GLReadWriteType.Image && bindPoint >= 0 && bindPoint < state.Images.Length) { - image = true; - if (bindPoint >= 0 && bindPoint < state.Images.Length) - { - im = state.Images[bindPoint]; - id = state.Images[bindPoint].Resource; - } + im = state.Images[bindPoint]; + id = state.Images[bindPoint].Resource; } - else + + if (readWriteType == GLReadWriteType.Atomic && bindPoint >= 0 && bindPoint < state.AtomicBuffers.Length) { - if (res.variableType.descriptor.rows == 1 && - res.variableType.descriptor.cols == 1 && - res.variableType.descriptor.type == VarType.UInt) - { - atomic = true; - if (bindPoint >= 0 && bindPoint < state.AtomicBuffers.Length) - { - bf = state.AtomicBuffers[bindPoint]; - id = state.AtomicBuffers[bindPoint].Resource; - } - } - else - { - ssbo = true; - if (bindPoint >= 0 && bindPoint < state.ShaderStorageBuffers.Length) - { - bf = state.ShaderStorageBuffers[bindPoint]; - id = state.ShaderStorageBuffers[bindPoint].Resource; - } - } + bf = state.AtomicBuffers[bindPoint]; + id = state.AtomicBuffers[bindPoint].Resource; + } + + if (readWriteType == GLReadWriteType.SSBO && bindPoint >= 0 && bindPoint < state.ShaderStorageBuffers.Length) + { + bf = state.ShaderStorageBuffers[bindPoint]; + id = state.ShaderStorageBuffers[bindPoint].Resource; } bool filledSlot = id != ResourceId.Null; @@ -612,9 +639,9 @@ namespace renderdocui.Windows.PipelineState (showEmpty.Checked && !filledSlot) // it's empty, and we have "show empty" ) { - string binding = image ? "Image" : - atomic ? "Atomic" : - ssbo ? "SSBO" : + string binding = readWriteType == GLReadWriteType.Image ? "Image" : + readWriteType == GLReadWriteType.Atomic ? "Atomic" : + readWriteType == GLReadWriteType.SSBO ? "SSBO" : "Unknown"; string slotname = String.Format("{0}: {1}", bindPoint, res.name); @@ -953,7 +980,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = state.m_VtxIn.ibuffer; + node.Tag = new IABufferTag(state.m_VtxIn.ibuffer, draw.indexOffset); if (!ibufferUsed) InactiveRow(node); @@ -970,7 +997,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = state.m_VtxIn.ibuffer; + node.Tag = new IABufferTag(state.m_VtxIn.ibuffer, draw.indexOffset); EmptyRow(node); @@ -1017,7 +1044,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = v.Buffer; + node.Tag = new IABufferTag(v.Buffer, v.Offset); if (!filledSlot) EmptyRow(node); @@ -1633,7 +1660,7 @@ namespace renderdocui.Windows.PipelineState if (tex.resType == ShaderResourceType.Buffer) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(false, tex.ID); + viewer.ViewRawBuffer(false, 0, ulong.MaxValue, tex.ID); viewer.Show(m_DockContent.DockPanel); } else @@ -1654,6 +1681,22 @@ namespace renderdocui.Windows.PipelineState var deets = stage.ShaderDetails; ShaderResource r = deets.ReadWriteResources[rwtag.idx]; + var bindpoint = stage.BindpointMapping.ReadWriteResources[rwtag.idx]; + + GLReadWriteType readWriteType = GetGLReadWriteType(r); + + ulong offset = 0; + ulong size = ulong.MaxValue; + if (readWriteType == GLReadWriteType.SSBO) + { + offset = m_Core.CurGLPipelineState.ShaderStorageBuffers[bindpoint.bind].Offset; + size = m_Core.CurGLPipelineState.ShaderStorageBuffers[bindpoint.bind].Size; + } + if (readWriteType == GLReadWriteType.Atomic) + { + offset = m_Core.CurGLPipelineState.AtomicBuffers[bindpoint.bind].Offset; + size = m_Core.CurGLPipelineState.AtomicBuffers[bindpoint.bind].Size; + } if (deets != null) { @@ -1672,9 +1715,9 @@ namespace renderdocui.Windows.PipelineState { var viewer = new BufferViewer(m_Core, false); if (format.Length == 0) - viewer.ViewRawBuffer(true, buf.ID); + viewer.ViewRawBuffer(true, offset, size, buf.ID); else - viewer.ViewRawBuffer(true, buf.ID, format); + viewer.ViewRawBuffer(true, offset, size, buf.ID, format); viewer.Show(m_DockContent.DockPanel); } } @@ -1758,14 +1801,14 @@ namespace renderdocui.Windows.PipelineState private void iabuffers_NodeDoubleClicked(TreelistView.Node node) { - if (node.Tag is ResourceId) + if (node.Tag is IABufferTag) { - ResourceId id = (ResourceId)node.Tag; + IABufferTag tag = (IABufferTag)node.Tag; - if (id != ResourceId.Null) + if (tag.id != ResourceId.Null) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(true, id); + viewer.ViewRawBuffer(true, tag.offset, ulong.MaxValue, tag.id); viewer.Show(m_DockContent.DockPanel); } } diff --git a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs index 58a44ab9d..5c1e8858e 100644 --- a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs @@ -49,6 +49,18 @@ namespace renderdocui.Windows.PipelineState private List m_VBNodes = new List(); private List m_BindNodes = new List(); + private struct IABufferTag + { + public IABufferTag(ResourceId i, ulong offs) + { + id = i; + offset = offs; + } + + public ResourceId id; + public ulong offset; + }; + class SamplerData { public SamplerData(TreelistView.Node n) { node = n; } @@ -65,10 +77,13 @@ namespace renderdocui.Windows.PipelineState class BufferResTag { - public BufferResTag(bool rw, UInt32 b, ResourceId i) { rwRes = rw; bindPoint = b; ID = i; } + public BufferResTag(bool rw, UInt32 b, ResourceId id, ulong offs, ulong sz) + { rwRes = rw; bindPoint = b; ID = id; offset = offs; size = sz; } public bool rwRes; public UInt32 bindPoint; public ResourceId ID; + public ulong offset; + public ulong size; }; private Dictionary m_CombinedImageSamplers = new Dictionary(); @@ -494,7 +509,7 @@ namespace renderdocui.Windows.PipelineState name = bufs[t].name; restype = ShaderResourceType.Buffer; - tag = new BufferResTag(isrw, bindPoint, bufs[t].ID); + tag = new BufferResTag(isrw, bindPoint, bufs[t].ID, descriptorBind.offset, descriptorBind.size); isbuf = true; } @@ -1030,7 +1045,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = state.IA.ibuffer.buf; + node.Tag = new IABufferTag(state.IA.ibuffer.buf, draw.indexOffset); if (!ibufferUsed) InactiveRow(node); @@ -1047,7 +1062,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = state.IA.ibuffer.buf; + node.Tag = new IABufferTag(state.IA.ibuffer.buf, draw.indexOffset); EmptyRow(node); @@ -1120,7 +1135,7 @@ namespace renderdocui.Windows.PipelineState node.Image = global::renderdocui.Properties.Resources.action; node.HoverImage = global::renderdocui.Properties.Resources.action_hover; - node.Tag = vbuff != null ? vbuff.buffer : ResourceId.Null; + node.Tag = new IABufferTag(vbuff != null ? vbuff.buffer : ResourceId.Null, vbuff != null ? vbuff.offset : 0); if (!filledSlot || bind == null || vbuff == null) EmptyRow(node); @@ -1464,7 +1479,7 @@ namespace renderdocui.Windows.PipelineState if (tex.resType == ShaderResourceType.Buffer) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(false, tex.ID); + viewer.ViewRawBuffer(false, 0, ulong.MaxValue, tex.ID); viewer.Show(m_DockContent.DockPanel); } else @@ -1499,7 +1514,7 @@ namespace renderdocui.Windows.PipelineState if (buf.ID != ResourceId.Null) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(true, buf.ID, format); + viewer.ViewRawBuffer(true, buf.offset, buf.size, buf.ID, format); viewer.Show(m_DockContent.DockPanel); } } @@ -1587,14 +1602,14 @@ namespace renderdocui.Windows.PipelineState private void iabuffers_NodeDoubleClicked(TreelistView.Node node) { - if (node.Tag is ResourceId) + if (node.Tag is IABufferTag) { - ResourceId id = (ResourceId)node.Tag; + IABufferTag tag = (IABufferTag)node.Tag; - if (id != ResourceId.Null) + if (tag.id != ResourceId.Null) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(true, id); + viewer.ViewRawBuffer(true, tag.offset, ulong.MaxValue, tag.id); viewer.Show(m_DockContent.DockPanel); } } diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index 4cca0dbe8..dc391605a 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -741,7 +741,7 @@ namespace renderdocui.Windows if (m_Core.CurBuffers[i].ID == ID) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(true, ID); + viewer.ViewRawBuffer(true, 0, ulong.MaxValue, ID); viewer.Show(DockPanel); return; } @@ -3385,7 +3385,7 @@ namespace renderdocui.Windows private void viewTexBuffer_Click(object sender, EventArgs e) { var viewer = new BufferViewer(m_Core, false); - viewer.ViewRawBuffer(false, CurrentTexture.ID); + viewer.ViewRawBuffer(false, 0, ulong.MaxValue, CurrentTexture.ID); viewer.Show(this.DockPanel); }