mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-29 13:20:54 +00:00
Where possible apply offs/len knowledge when viewing buffers. Refs #224
This commit is contained in:
+18
-13
@@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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<TreelistView.Node> m_VBNodes = new List<TreelistView.Node>();
|
||||
|
||||
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;
|
||||
|
||||
@@ -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<TreelistView.Node> m_VBNodes = new List<TreelistView.Node>();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,18 @@ namespace renderdocui.Windows.PipelineState
|
||||
private List<TreelistView.Node> m_VBNodes = new List<TreelistView.Node>();
|
||||
private List<TreelistView.Node> m_BindNodes = new List<TreelistView.Node>();
|
||||
|
||||
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<TreelistView.Node, TreelistView.Node> m_CombinedImageSamplers = new Dictionary<TreelistView.Node, TreelistView.Node>();
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user