public void AddModification(EnvironmentModification mod, bool silent) { TreelistView.Node node = new TreelistView.Node(); int idx = ExistingIndex(); if (idx >= 0) node = variables.Nodes[idx]; if (mod.variable.Trim() == "") { if(!silent) MessageBox.Show("Environment variable cannot be just whitespace", "Invalid variable", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } variables.BeginUpdate(); if (idx < 0) variables.Nodes.Add(node); node.SetData(new object[] { mod.variable, mod.GetTypeString(), mod.value }); node.Tag = mod; variables.EndUpdate(); variables.NodesSelection.Clear(); variables.NodesSelection.Add(node); varName.AutoCompleteCustomSource.Clear(); for (int i = 0; i < variables.Nodes.Count; i++) varName.AutoCompleteCustomSource.Add((string)variables.Nodes[i][0]); }
public void ExpandNode(TreelistView.Node node) { var n = node; while (node != null) { node.Expand(); node = node.Parent; } eventView.EnsureVisible(n); }
private void ConnectToApp(TreelistView.Node node) { if (node != null && node.Tag != null) { var connect = node.Tag as RemoteConnect; var live = new LiveCapture(m_Core, connect.host, connect.ident, m_Main); m_Main.ShowLiveCapture(live); Close(); } }
private void connect_Click(object sender, EventArgs e) { TreelistView.Node node = hosts.SelectedNode; if (node == null) { return; } if (node.Tag is RemoteConnect) { ConnectToApp(node); } else if (node.Tag is RemoteHost) { RemoteHost host = node.Tag as RemoteHost; if (host.ServerRunning) { DialogResult res = MessageBox.Show(String.Format("Are you sure you wish to shut down running remote server on {0}?", host.Hostname), "Remote server shutdown", MessageBoxButtons.YesNoCancel); if (res == DialogResult.Cancel || res == DialogResult.No) { return; } // shut down try { RemoteServer server = StaticExports.CreateRemoteServer(host.Hostname, 0); server.ShutdownServerAndConnection(); hosts.BeginUpdate(); SetRemoteServerLive(node, false, false); hosts.EndUpdate(); } catch (Exception) { MessageBox.Show("Error shutting down remote server", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } updateConnectButton(); } else { // try to run refreshOne.Enabled = refreshAll.Enabled = false; Thread th = Helpers.NewThread(new ParameterizedThreadStart(RunRemoteServer)); th.Start(node); UpdateLookupsStatus(); } } }
private uint GetNodeEventID(TreelistView.Node n) { DeferredEvent def = n.Tag as DeferredEvent; if (def != null) { return(def.eventID); } return(0); }
private static void RunRemoteServer(object o) { TreelistView.Node node = o as TreelistView.Node; RemoteHost host = node.Tag as RemoteHost; host.Launch(); // now refresh this host Thread th = Helpers.NewThread(new ParameterizedThreadStart(LookupHostConnections)); th.Start(node); }
private void hostname_TextChanged(object sender, EventArgs e) { if (selectInProgress) { return; } selectInProgress = true; addUpdateHost.Text = "Add"; addUpdateHost.Enabled = true; deleteHost.Enabled = refreshOne.Enabled = false; hostname.Enabled = addUpdateHost.Enabled = runCommand.Enabled = true; TreelistView.Node node = null; foreach (var n in hosts.Nodes) { if (n["hostname"].ToString() == hostname.Text) { if (refreshAll.Enabled) { refreshOne.Enabled = true; } addUpdateHost.Text = "Update"; if (hostname.Text == "localhost") { hostname.Enabled = addUpdateHost.Enabled = runCommand.Enabled = false; } else { deleteHost.Enabled = true; runCommand.Text = (n.Tag as RemoteHost).RunCommand; } node = n; break; } } if (hosts.SelectedNode != node) { hosts.FocusedNode = node; } updateConnectButton(); selectInProgress = false; }
public void OnLogfileClosed() { eventView.BeginUpdate(); eventView.Nodes.Clear(); m_FrameNode = null; eventView.EndUpdate(); ClearBookmarks(); findEventButton.Enabled = false; jumpEventButton.Enabled = false; timeDraws.Enabled = false; toggleBookmark.Enabled = false; }
private void iabuffers_NodeDoubleClicked(TreelistView.Node node) { if (node.Tag is ResourceId) { ResourceId id = (ResourceId)node.Tag; if (id != ResourceId.Null) { var viewer = new BufferViewer(m_Core, false); viewer.ViewRawBuffer(id); viewer.Show(m_DockContent.DockPanel); } } }
public void FillAPIView() { apiEvents.BeginUpdate(); apiEvents.Nodes.Clear(); Regex rgx = new Regex("^\\s*[{}]?"); string replacement = ""; FetchDrawcall draw = m_Core.CurDrawcall; if (draw != null && draw.events != null && draw.events.Length > 0) { foreach (var ev in draw.events) { // hack until I have a proper interface. Skip events associated with this draw that // come from another context (means they will just be completely omitted/invisible). if (ev.context != draw.context) { continue; } string[] lines = ev.eventDesc.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); TreelistView.Node node = apiEvents.Nodes.Add(new TreelistView.Node(new object[] { ev.eventID, lines[0] })); for (int i = 1; i < lines.Length; i++) { string l = rgx.Replace(lines[i], replacement); if (l.Length > 0) { node.Nodes.Add(new TreelistView.Node(new object[] { "", l })); } } if (ev.eventID == draw.eventID) { node.Bold = true; } node.Tag = (object)ev; } if (apiEvents.Nodes.Count > 0) { apiEvents.NodesSelection.Add(apiEvents.Nodes[0]); } } apiEvents.EndUpdate(); }
// we kick off a thread per host to query for any open connections. The // interfaces on the C++ side should be thread-safe to cope with this private void AddHost(String host) { TreelistView.Node node = new TreelistView.Node(new object[] { host, "" }); node.Italic = true; node.Image = global::renderdocui.Properties.Resources.hourglass; hosts.Nodes.Add(node); refresh.Enabled = false; Thread th = Helpers.NewThread(new ParameterizedThreadStart(LookupHostConnections)); th.Start(node); }
private void SetDrawcallTimes(TreelistView.Node n, Dictionary <uint, List <CounterResult> > times) { if (n == null || times == null) { return; } // parent nodes take the value of the sum of their children double duration = 0.0; // look up leaf nodes in the dictionary if (n.Nodes.IsEmpty()) { uint eid = GetNodeEventID(n); DeferredEvent def = n.Tag as DeferredEvent; if (def != null && def.marker) { duration = -1.0; } else if (times.ContainsKey(eid)) { duration = times[eid][0].value.d; } else { duration = -1.0; } n["Duration"] = duration; return; } for (int i = 0; i < n.Nodes.Count; i++) { SetDrawcallTimes(n.Nodes[i], times); double nd = (double)n.Nodes[i]["Duration"]; if (nd > 0.0) { duration += nd; } } n["Duration"] = duration; }
public void OnLogfileLoaded() { FetchFrameInfo[] frameList = m_Core.FrameInfo; findEventButton.Enabled = true; jumpEventButton.Enabled = true; timeDraws.Enabled = true; toggleBookmark.Enabled = true; ClearBookmarks(); eventView.BeginUpdate(); eventView.Nodes.Clear(); m_FrameNodes.Clear(); for (int curFrame = 0; curFrame < frameList.Length; curFrame++) { TreelistView.Node frame = eventView.Nodes.Add(MakeMarker("Frame #" + frameList[curFrame].frameNumber.ToString())); m_FrameNodes.Add(frame); } eventView.EndUpdate(); for (int curFrame = 0; curFrame < frameList.Length; curFrame++) { AddFrameDrawcalls(m_FrameNodes[curFrame], m_Core.GetDrawcalls((UInt32)curFrame)); } if (frameList.Length > 0) { // frame 1 -> event 1 TreelistView.Node node = eventView.Nodes[0].Nodes[0]; ExpandNode(node); DeferredEvent evt = eventView.Nodes[0].Nodes.LastNode.Tag as DeferredEvent; m_Core.SetEventID(null, evt.frameID, evt.eventID + 1); eventView.NodesSelection.Clear(); eventView.NodesSelection.Add(eventView.Nodes[0]); eventView.FocusedNode = eventView.Nodes[0]; } }
// we kick off a thread per host to query for any open connections. The // interfaces on the C++ side should be thread-safe to cope with this private void AddHost(RemoteHost host) { TreelistView.Node node = new TreelistView.Node(new object[] { host.Hostname, "..." }); node.Italic = true; node.Image = global::renderdocui.Properties.Resources.hourglass; node.Tag = host; hosts.Nodes.Add(node); refreshOne.Enabled = refreshAll.Enabled = false; UpdateLookupsStatus(); Thread th = Helpers.NewThread(new ParameterizedThreadStart(LookupHostConnections)); th.Start(node); }
private bool SelectEvent(UInt32 frameID, UInt32 eventID) { if (eventView.Nodes.Count == 0) { return(false); } TreelistView.Node found = null; SelectEvent(ref found, eventView.Nodes[0].Nodes, frameID, eventID); if (found != null) { eventView.FocusedNode = found; ExpandNode(found); return(true); } return(false); }
public void OnLogfileLoaded() { findEventButton.Enabled = true; jumpEventButton.Enabled = true; timeDraws.Enabled = true; toggleBookmark.Enabled = true; export.Enabled = true; prevDraw.Enabled = false; nextDraw.Enabled = false; ClearBookmarks(); eventView.BeginUpdate(); eventView.Nodes.Clear(); { m_FrameNode = eventView.Nodes.Add(MakeMarker("Frame #" + m_Core.FrameInfo.frameNumber.ToString())); AddFrameDrawcalls(m_FrameNode, m_Core.GetDrawcalls()); } eventView.EndUpdate(); { // frame 1 -> event 1 TreelistView.Node node = eventView.Nodes[0].Nodes[0]; ExpandNode(node); DeferredEvent evt = eventView.Nodes[0].Nodes.LastNode.Tag as DeferredEvent; m_Core.SetEventID(null, evt.eventID + 1); m_FrameNode.Tag = evt; eventView.NodesSelection.Clear(); eventView.NodesSelection.Add(eventView.Nodes[0]); eventView.FocusedNode = eventView.Nodes[0]; } }
private void AddVariables(TreelistView.NodeCollection root, ShaderVariable[] vars) { foreach (var v in vars) { TreelistView.Node n = root.Add(new TreelistView.Node(new object[] { v.name, v, v.TypeString() })); if (v.rows > 1) { for (int i = 0; i < v.rows; i++) { n.Nodes.Add(new TreelistView.Node(new object[] { String.Format("{0}.row{1}", v.name, i), v.Row(i), v.RowTypeString() })); } } if (v.members.Length > 0) { AddVariables(n.Nodes, v.members); } } }
private bool FindEventNode(ref TreelistView.Node found, UInt32 eventID) { bool ret = FindEventNode(ref found, eventView.Nodes[0].Nodes, eventID); while (found != null && found.NextSibling != null && found.NextSibling.Tag is DeferredEvent) { DeferredEvent def = found.NextSibling.Tag as DeferredEvent; if (def.eventID == eventID) { found = found.NextSibling; } else { break; } } return(ret); }
public void AddModification(EnvironmentModification mod, bool silent) { TreelistView.Node node = new TreelistView.Node(); int idx = ExistingIndex(); if (idx >= 0) { node = variables.Nodes[idx]; } if (mod.variable.Trim() == "") { if (!silent) { MessageBox.Show("Environment variable cannot be just whitespace", "Invalid variable", MessageBoxButtons.OK, MessageBoxIcon.Error); } return; } variables.BeginUpdate(); if (idx < 0) { variables.Nodes.Add(node); } node.SetData(new object[] { mod.variable, mod.GetTypeString(), mod.value }); node.Tag = mod; variables.EndUpdate(); variables.NodesSelection.Clear(); variables.NodesSelection.Add(node); varName.AutoCompleteCustomSource.Clear(); for (int i = 0; i < variables.Nodes.Count; i++) { varName.AutoCompleteCustomSource.Add((string)variables.Nodes[i][0]); } }
private void ToggleBookmark(UInt32 EID) { int index = m_Bookmark.IndexOf(EID); TreelistView.Node found = null; FindEventNode(ref found, EID); if (index >= 0) { bookmarkStrip.Items.Remove(m_BookmarkButtons[index]); m_Bookmark.RemoveAt(index); m_BookmarkButtons.RemoveAt(index); found.Image = null; } else { ToolStripButton but = new ToolStripButton(); but.DisplayStyle = ToolStripItemDisplayStyle.Text; but.Name = "bookmarkButton" + EID.ToString(); but.Text = EID.ToString(); but.Tag = EID; but.Size = new Size(23, 22); but.Click += new EventHandler(this.bookmarkButton_Click); but.Checked = true; bookmarkStrip.Items.Add(but); found.Image = global::renderdocui.Properties.Resources.asterisk_orange; m_Bookmark.Add(EID); m_BookmarkButtons.Add(but); } bookmarkStrip.Visible = m_BookmarkButtons.Count > 0; eventView.Invalidate(); }
private void AddFrameDrawcalls(TreelistView.Node frame, FetchDrawcall[] drawcalls) { eventView.BeginUpdate(); frame["Duration"] = -1.0; DeferredEvent startEv = new DeferredEvent(); startEv.eventID = 0; frame.Nodes.Clear(); frame.Nodes.Add(MakeNode(0, 0, "Frame Start", -1.0)).Tag = startEv; for (int i = 0; i < drawcalls.Length; i++) { AddDrawcall(drawcalls[i], frame); } frame.Tag = frame.Nodes.LastNode.Tag; eventView.EndUpdate(); }
private void AddFrameDrawcalls(TreelistView.Node frame, FetchDrawcall[] drawcalls) { eventView.BeginUpdate(); frame["Duration"] = -1.0; DeferredEvent startEv = new DeferredEvent(); startEv.frameID = m_Core.CurFrame; startEv.eventID = 0; if (frame.Nodes.Count == 0) { frame.Nodes.Add(MakeNode(0, 0, "Frame Start", -1.0)).Tag = startEv; } for (int i = 0; i < drawcalls.Length; i++) { TreelistView.Node d = frame.Nodes.Count > (i + 1) ? frame.Nodes[i + 1] : null; TreelistView.Node newD = AddDrawcall(d, drawcalls[i], frame); if (newD != null) { d = newD; if ((double)d["Duration"] > 0.0) { frame["Duration"] = Math.Max(0.0, (double)frame["Duration"]) + (double)d["Duration"]; } } } frame.Tag = frame.Nodes.LastNode.Tag; eventView.EndUpdate(); }
private static void SetRemoteServerLive(TreelistView.Node node, bool live, bool busy) { RemoteHost host = node.Tag as RemoteHost; host.ServerRunning = live; host.Busy = busy; if (host.Hostname == "localhost") { node.Image = null; node["running"] = ""; } else { string text = live ? RemoteServerLiveText : RemoteServerDeadText; if (host.Connected) { text += " (Active Context)"; } else if (host.VersionMismatch) { text += " (Version Mismatch)"; } else if (host.Busy) { text += " (Busy)"; } node["running"] = text; node.Image = live ? global::renderdocui.Properties.Resources.connect : global::renderdocui.Properties.Resources.disconnect; } }
private void refreshOne_Click(object sender, EventArgs e) { if (lookupsInProgress > 0 || hosts.SelectedNode == null) { return; } refreshOne.Enabled = refreshAll.Enabled = false; hosts.BeginUpdate(); TreelistView.Node n = hosts.SelectedNode; { n.Nodes.Clear(); n.Italic = true; n.Image = global::renderdocui.Properties.Resources.hourglass; n.Bold = false; Thread th = Helpers.NewThread(new ParameterizedThreadStart(LookupHostConnections)); th.Start(n); } hosts.EndUpdate(); UpdateLookupsStatus(); }
private void regsList_MouseMove(object sender, MouseEventArgs e) { if (m_Trace == null || m_Trace.states.Length == 0) return; // ignore mousemove events that are identical to the last we saw if (prevSender == sender && prevPoint.X == e.X && prevPoint.Y == e.Y) return; prevSender = sender; prevPoint = new Point(e.X, e.Y); ListView list = sender as ListView; if (m_HoverItem != null && m_HoverItem.ListView != null) variableHover.Hide(m_HoverItem.ListView); if (m_HoverNode != null && m_HoverNode.OwnerView != null) variableHover.Hide(m_HoverNode.OwnerView); hoverTimer.Enabled = false; m_HoverItem = null; m_HoverNode = null; if (list != null) { ListViewItem item = list.GetItemAt(e.X, e.Y); if (item != null) { m_HoverItem = item; m_HoverNode = null; hoverTimer.Enabled = true; hoverTimer.Start(); } } TreelistView.TreeListView treelist = sender as TreelistView.TreeListView; if (treelist != null) { TreelistView.Node node = treelist.GetHitNode(); if (node != null) { m_HoverNode = node; m_HoverItem = null; hoverTimer.Enabled = true; hoverTimer.Start(); } } }
private void regsList_Leave(object sender, EventArgs e) { hoverTimer.Enabled = false; m_HoverItem = null; m_HoverNode = null; }
private TreelistView.Node MakeEventNode(List<TreelistView.Node> nodes, List<PixelModification> mods) { bool uintTex = (texture.format.compType == FormatComponentType.UInt); bool sintTex = (texture.format.compType == FormatComponentType.SInt); bool floatTex = (!uintTex && !sintTex); bool depth = false; if (texture.format.compType == FormatComponentType.Depth || (texture.format.special && texture.format.specialFormat == SpecialFormat.D24S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.D32S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.S8)) depth = true; var drawcall = m_Core.GetDrawcall(mods[0].eventID); if (drawcall == null) return null; string name = ""; var drawstack = new List<FetchDrawcall>(); var parent = drawcall.parent; while (parent != null) { drawstack.Add(parent); parent = parent.parent; } drawstack.Reverse(); if (drawstack.Count > 0) { name += "> " + drawstack[0].name; if (drawstack.Count > 3) name += " ..."; name += "\n"; if (drawstack.Count > 2) name += "> " + drawstack[drawstack.Count - 2].name + "\n"; if (drawstack.Count > 1) name += "> " + drawstack[drawstack.Count - 1].name + "\n"; name += "\n"; } bool passed = true; bool uavnowrite = false; if (mods[0].uavWrite) { name += String.Format("EID {0}\n{1}\nBound as UAV or copy - potential modification", mods[0].eventID, drawcall.name); if (mods[0].preMod.col.value.u[0] == mods[0].postMod.col.value.u[0] && mods[0].preMod.col.value.u[1] == mods[0].postMod.col.value.u[1] && mods[0].preMod.col.value.u[2] == mods[0].postMod.col.value.u[2] && mods[0].preMod.col.value.u[3] == mods[0].postMod.col.value.u[3]) { name += "\nNo change in tex value"; uavnowrite = true; } } else { passed = mods.Any(m => m.EventPassed()); string failure = passed ? "" : FailureString(mods[0]); name += String.Format("EID {0}\n{1}{2}\n{3} Fragments touching pixel\n", mods[0].eventID, drawcall.name, failure, nodes.Count); } string preModVal = "Tex Before\n\n" + ModificationValueString(mods.First().preMod, texture.format, depth); string postModVal = "Tex After\n\n" + ModificationValueString(mods.Last().postMod, texture.format, depth); var node = new TreelistView.Node(new object[] { name, preModVal, "", postModVal, "" }); node.DefaultBackColor = passed ? Color.FromArgb(235, 255, 235) : Color.FromArgb(255, 235, 235); node.Tag = new EventTag(mods[0].eventID, uint.MaxValue); if (uavnowrite) node.DefaultBackColor = Color.FromArgb(235, 235, 235); if (floatTex || depth) { node.IndexedBackColor[2] = ModificationValueColor(mods.First().preMod, depth); node.IndexedBackColor[4] = ModificationValueColor(mods.Last().postMod, depth); } if ((drawcall.flags & DrawcallFlags.Clear) == 0) { foreach (var child in nodes) node.Nodes.Add(child); } return node; }
private void AddResourceRegister(ShaderResource slot, D3D11PipelineState.ShaderStage.ResourceView res) { bool found = false; var name = slot.bindPoint + " (" + slot.name + ")"; foreach (var tex in m_Core.CurTextures) { if (tex.ID == res.Resource) { var node = new TreelistView.Node(new object[] { "t" + name, "Texture", tex.width + "x" + tex.height + "x" + (tex.depth > 1 ? tex.depth : tex.arraysize) + "[" + tex.mips + "] @ " + tex.format + " - " + tex.name }); node.Tag = null; constantRegs.Nodes.Add(node); found = true; break; } } if (!found) { foreach (var buf in m_Core.CurBuffers) { if (buf.ID == res.Resource) { string prefix = "u"; if (slot.IsSRV) prefix = "t"; var node = new TreelistView.Node(new object[] { prefix + name, "Buffer", buf.length + " - " + buf.name }); node.Tag = null; constantRegs.Nodes.Add(node); found = true; break; } } } if (!found) { string prefix = "u"; if (slot.IsSRV) prefix = "t"; var node = new TreelistView.Node(new object[] { prefix + name, "Resource", "unknown" }); node.Tag = null; constantRegs.Nodes.Add(node); } }
public void FillAPIView() { apiEvents.BeginUpdate(); apiEvents.Nodes.Clear(); Regex rgxopen = new Regex("^\\s*{"); Regex rgxclose = new Regex("^\\s*}"); FetchDrawcall draw = m_Core.CurDrawcall; if (draw != null && draw.events != null && draw.events.Length > 0) { foreach (var ev in draw.events) { string[] lines = ev.eventDesc.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); TreelistView.Node root = new TreelistView.Node(new object[] { ev.eventID, lines[0] }); int i=1; if (i < lines.Length && lines[i].Trim() == "{") i++; List<TreelistView.Node> nodestack = new List<TreelistView.Node>(); nodestack.Add(root); for (; i < lines.Length; i++) { if (rgxopen.IsMatch(lines[i])) nodestack.Add(nodestack.Last().Nodes.LastNode); else if (rgxclose.IsMatch(lines[i])) nodestack.RemoveAt(nodestack.Count - 1); else if(lines[i].Trim().Length > 0 && nodestack.Count > 0) nodestack.Last().Nodes.Add(new TreelistView.Node(new object[] { "", lines[i].Trim() })); } if (ev.eventID == draw.eventID) root.Bold = true; root.Tag = (object)ev; apiEvents.Nodes.Add(root); } if (apiEvents.Nodes.Count > 0) apiEvents.NodesSelection.Add(apiEvents.Nodes[0]); } apiEvents.EndUpdate(); }
private void hosts_NodeDoubleClicked(TreelistView.Node node) { ConnectToHost(node); }
public void UpdateDebugging() { if (m_Trace == null || m_Trace.states == null || m_Trace.states.Length == 0) { //curInstruction.Text = "0"; for (int i = 0; i < m_DisassemblyView.Lines.Count; i++) { m_DisassemblyView.Lines[i].DeleteMarkerSet(CurrentLineMarkers); m_DisassemblyView.Lines[i].DeleteMarkerSet(FinishedMarkers); } return; } var state = m_Trace.states[CurrentStep]; //curInstruction.Text = CurrentStep.ToString(); UInt32 nextInst = state.nextInstruction; bool done = false; if (CurrentStep == m_Trace.states.Length - 1) { nextInst--; done = true; } // add current instruction marker for (int i = 0; i < m_DisassemblyView.Lines.Count; i++) { m_DisassemblyView.Lines[i].DeleteMarkerSet(CurrentLineMarkers); m_DisassemblyView.Lines[i].DeleteMarkerSet(FinishedMarkers); if (m_DisassemblyView.Lines[i].Text.Trim().StartsWith(nextInst.ToString() + ":")) { m_DisassemblyView.Lines[i].AddMarkerSet(done ? FinishedMarkers : CurrentLineMarkers); m_DisassemblyView.Caret.LineNumber = i; if (!m_DisassemblyView.Lines[i].IsVisible) m_DisassemblyView.Scrolling.ScrollToCaret(); } } m_DisassemblyView.Invalidate(); hoverTimer_Tick(hoverTimer, new EventArgs()); if (constantRegs.Nodes.IsEmpty()) { constantRegs.BeginUpdate(); for (int i = 0; i < m_Trace.cbuffers.Length; i++) { for (int j = 0; j < m_Trace.cbuffers[i].variables.Length; j++) { if (m_Trace.cbuffers[i].variables[j].rows > 0 || m_Trace.cbuffers[i].variables[j].columns > 0) constantRegs.Nodes.Add(new TreelistView.Node(new object[] { m_Trace.cbuffers[i].variables[j].name, "cbuffer", StringRep(m_Trace.cbuffers[i].variables[j], false) })).Tag = m_Trace.cbuffers[i].variables[j]; } } foreach (var input in m_Trace.inputs) { if (input.rows > 0 || input.columns > 0) { var node = new TreelistView.Node(new object[] { input.name, input.type.ToString() + " input", StringRep(input, true) }); node.Tag = input; constantRegs.Nodes.Add(node); } } var pipestate = m_Core.CurD3D11PipelineState; foreach (var slot in m_ShaderDetails.Resources) { if (slot.IsSampler) continue; var res = m_Stage.SRVs[slot.bindPoint]; if (slot.IsReadWrite) { if(m_Stage.stage == ShaderStageType.Pixel) res = pipestate.m_OM.UAVs[slot.bindPoint - pipestate.m_OM.UAVStartSlot]; else res = m_Stage.UAVs[slot.bindPoint]; } bool found = false; var name = slot.bindPoint + " (" + slot.name + ")"; foreach (var tex in m_Core.CurTextures) { if (tex.ID == res.Resource) { var node = new TreelistView.Node(new object[] { "t" + name, "Texture", tex.width + "x" + tex.height + "x" + (tex.depth > 1 ? tex.depth : tex.arraysize) + "[" + tex.mips + "] @ " + tex.format + " - " + tex.name }); node.Tag = null; constantRegs.Nodes.Add(node); found = true; break; } } if (!found) { foreach (var buf in m_Core.CurBuffers) { if (buf.ID == res.Resource) { string prefix = "u"; if (slot.IsSRV) prefix = "t"; var node = new TreelistView.Node(new object[] { prefix + name, "Buffer", buf.length + " - " + buf.name }); node.Tag = null; constantRegs.Nodes.Add(node); found = true; break; } } } if (!found) { string prefix = "u"; if (slot.IsSRV) prefix = "t"; var node = new TreelistView.Node(new object[] { prefix + name, "Resource", "unknown" }); node.Tag = null; constantRegs.Nodes.Add(node); } } constantRegs.EndUpdate(); } else { constantRegs.BeginUpdate(); int c = 0; for (int i = 0; i < m_Trace.cbuffers.Length; i++) { for (int j = 0; j < m_Trace.cbuffers[i].variables.Length; j++) { if (m_Trace.cbuffers[i].variables[j].rows > 0 || m_Trace.cbuffers[i].variables[j].columns > 0) constantRegs.Nodes[c++].SetData(new object[] { m_Trace.cbuffers[i].variables[j].name, "cbuffer", StringRep(m_Trace.cbuffers[i].variables[j], false) }); } } constantRegs.EndUpdate(); } if (variableRegs.Nodes.IsEmpty()) { for (int i = 0; i < state.registers.Length; i++) variableRegs.Nodes.Add("a"); for (int i = 0; i < state.indexableTemps.Length; i++) { var node = variableRegs.Nodes.Add(new object[] { String.Format("x{0}", i), "indexable array", "" }); for (int t = 0; t < state.indexableTemps[i].temps.Length; t++) node.Nodes.Add("a"); } for (int i = 0; i < state.outputs.Length; i++) variableRegs.Nodes.Add("a"); } variableRegs.BeginUpdate(); int v = 0; for (int i = 0; i < state.registers.Length; i++) { variableRegs.Nodes[v].SetData(new object[] { state.registers[i].name, "register", StringRep(state.registers[i], false) }); variableRegs.Nodes[v].Tag = state.registers[i]; v++; } for (int i = 0; i < state.indexableTemps.Length; i++) { var node = variableRegs.Nodes[v++]; for (int t = 0; t < state.indexableTemps[i].temps.Length; t++) { node.Nodes[t].SetData(new object[] { state.indexableTemps[i].temps[t].name, "register", StringRep(state.indexableTemps[i].temps[t], false) }); node.Nodes[t].Tag = state.indexableTemps[i].temps[t]; } node.Tag = null; } for (int i = 0; i < state.outputs.Length; i++) { variableRegs.Nodes[v].SetData(new object[] { state.outputs[i].name, "register", StringRep(state.outputs[i], false) }); variableRegs.Nodes[v].Tag = state.outputs[i]; v++; } variableRegs.EndUpdate(); watchRegs.BeginUpdate(); for (int i = 0; i < watchRegs.Items.Count-1; i++) { ListViewItem item = watchRegs.Items[i]; item.SubItems[1].Text = "register"; string reg = item.SubItems[0].Text.Trim(); var regexp = "^([rvo])([0-9]+)(\\.[xyzwrgba]+)?(,[xfiudb])?$"; var match = Regex.Match(reg, regexp); // try indexable temps if (!match.Success) { regexp = "^(x[0-9]+)\\[([0-9]+)\\](\\.[xyzwrgba]+)?(,[xfiudb])?$"; match = Regex.Match(reg, regexp); } if (match.Success) { var regtype = match.Groups[1].Value; var regidx = match.Groups[2].Value; var swizzle = match.Groups[3].Value.Replace(".", ""); var regcast = match.Groups[4].Value.Replace(",", ""); if (regcast.Length == 0) { if (displayInts.Checked) regcast = "i"; else regcast = "f"; } ShaderVariable[] vars = null; if (regtype == "r") { vars = state.registers; } else if (regtype == "v") { vars = m_Trace.inputs; } else if (regtype == "o") { vars = state.outputs; } else if (regtype[0] == 'x') { string tempArrayIndexStr = regtype.Substring(1); int tempArrayIndex = -1; if (int.TryParse(tempArrayIndexStr, out tempArrayIndex)) { if (tempArrayIndex >= 0 && tempArrayIndex < state.indexableTemps.Length) { vars = state.indexableTemps[tempArrayIndex].temps; } } } int regindex = -1; if (vars != null && int.TryParse(regidx, out regindex)) { if (regindex >= 0 && regindex < vars.Length) { ShaderVariable vr = vars[regindex]; item.Tag = vr; if (swizzle.Length == 0) { swizzle = "xyzw".Substring(0, (int)vr.columns); if (regcast == "d") swizzle = "xy"; } string val = ""; for (int s = 0; s < swizzle.Length; s++) { char swiz = swizzle[s]; int elindex = 0; if (swiz == 'x' || swiz == 'r') elindex = 0; if (swiz == 'y' || swiz == 'g') elindex = 1; if (swiz == 'z' || swiz == 'b') elindex = 2; if (swiz == 'w' || swiz == 'a') elindex = 3; if (regcast == "i") val += vr.value.iv[elindex]; else if (regcast == "f") val += Formatter.Format(vr.value.fv[elindex]); else if (regcast == "u") val += vr.value.uv[elindex]; else if (regcast == "x") val += String.Format("0x{0:X8}", vr.value.uv[elindex]); else if (regcast == "b") val += String.Format("{0}", Convert.ToString(vr.value.uv[elindex], 2).PadLeft(32, '0')); else if (regcast == "d") { if (elindex < 2) val += vr.value.dv[elindex]; else val += "-"; } if (s < swizzle.Length - 1) val += ", "; } item.SubItems[2].Text = val; continue; } } } item.SubItems[2].Text = "Error evaluating expression"; } watchRegs.EndUpdate(); }
private TreelistView.Node AddDrawcall(FetchDrawcall drawcall, TreelistView.Node root) { if (m_Core.Config.EventBrowser_HideEmpty) { if ((drawcall.children == null || drawcall.children.Length == 0) && (drawcall.flags & DrawcallFlags.PushMarker) != 0) { return(null); } } UInt32 eventNum = drawcall.eventID; TreelistView.Node drawNode = null; if (drawcall.children.Length > 0) { drawNode = MakeNode(eventNum, GetEndEventID(drawcall), drawcall.drawcallID, drawcall.name, 0.0); } else { drawNode = MakeNode(eventNum, drawcall.drawcallID, drawcall.name, 0.0); } DeferredEvent def = new DeferredEvent(); def.eventID = eventNum; def.marker = (drawcall.flags & DrawcallFlags.SetMarker) != 0; if (drawcall.context != m_Core.FrameInfo.immContextId) { def.defCtx = drawcall.context; def.lastDefEv = drawcall.eventID; FetchDrawcall parent = drawcall.parent; while (!parent.name.Contains("ExecuteCommand")) { parent = parent.parent; } def.eventID = parent.eventID - 1; def.firstDefEv = parent.children[0].eventID; if (parent.children[0].events.Length > 0) { def.firstDefEv = parent.children[0].events[0].eventID; } } drawNode.Tag = def; if (drawcall.children != null && drawcall.children.Length > 0) { for (int i = 0; i < drawcall.children.Length; i++) { AddDrawcall(drawcall.children[i], drawNode); if (i > 0 && drawNode.Nodes.Count >= 2 && (drawcall.children[i - 1].flags & DrawcallFlags.SetMarker) > 0) { drawNode.Nodes[drawNode.Nodes.Count - 2].Tag = drawNode.Nodes.LastNode.Tag; } } bool found = false; for (int i = drawNode.Nodes.Count - 1; i >= 0; i--) { DeferredEvent t = drawNode.Nodes[i].Tag as DeferredEvent; if (t != null && !t.marker) { drawNode.Tag = drawNode.Nodes[i].Tag; found = true; break; } } if (!found && !drawNode.Nodes.IsEmpty()) { drawNode.Tag = drawNode.Nodes.LastNode.Tag; } } if (drawNode.Nodes.IsEmpty() && (drawcall.flags & DrawcallFlags.PushMarker) != 0 && m_Core.Config.EventBrowser_HideEmpty) { return(null); } root.Nodes.Add(drawNode); return(drawNode); }
// this function looks up the remote connections and for each one open // queries it for the API, target (usually executable name) and if any user is already connected private static void LookupHostConnections(object o) { { lookupMutex.WaitOne(); lookupsInProgress++; lookupMutex.ReleaseMutex(); } TreelistView.Node node = o as TreelistView.Node; Control p = node.OwnerView; while (p.Parent != null) { p = p.Parent; } RemoteManager rhs = p as RemoteManager; string hostname = node["hostname"] as string; string username = System.Security.Principal.WindowsIdentity.GetCurrent().Name; RemoteHost host = node.Tag as RemoteHost; host.CheckStatus(); SetRemoteServerLive(node, host.ServerRunning, host.Busy); StaticExports.EnumerateRemoteTargets(hostname, (UInt32 i) => { try { var conn = StaticExports.CreateTargetControl(hostname, i, username, false); if (node.OwnerView.Visible) { string target = conn.Target; string api = conn.API; string busy = conn.BusyClient; string running; if (busy != "") { running = String.Format("Running {0}, {1} is connected", api, busy); } else { running = String.Format("Running {0}", api); } node.OwnerView.BeginInvoke((MethodInvoker) delegate { node.OwnerView.BeginUpdate(); node.Nodes.Add(new TreelistView.Node(new object[] { target, running })).Tag = new RemoteConnect(hostname, i); node.OwnerView.EndUpdate(); node.Expand(); }); } conn.Shutdown(); } catch (ReplayCreateException) { } }); if (node.OwnerView.Visible) { node.OwnerView.BeginInvoke((MethodInvoker) delegate { node.OwnerView.BeginUpdate(); node.Italic = false; node.OwnerView.EndUpdate(); }); } { lookupMutex.WaitOne(); lookupsInProgress--; lookupMutex.ReleaseMutex(); } if (!rhs.IsDisposed && rhs.Visible) { rhs.BeginInvoke((MethodInvoker) delegate { rhs.LookupComplete(); }); } }
private static bool IsRemoteServerLive(TreelistView.Node node) { return((node.Tag as RemoteHost).ServerRunning); }
void scintilla1_Leave(object sender, EventArgs e) { ScintillaNET.Scintilla scintilla1 = sender as ScintillaNET.Scintilla; variableHover.Hide(scintilla1); hoverTimer.Enabled = false; m_HoverScintilla = null; m_HoverItem = null; m_HoverNode = null; m_HoverPos = Point.Empty; }
// we kick off a thread per host to query for any open connections. The // interfaces on the C++ side should be thread-safe to cope with this private void AddHost(RemoteHost host) { TreelistView.Node node = new TreelistView.Node(new object[] { host.Hostname, "..." }); node.Italic = true; node.Image = global::renderdocui.Properties.Resources.hourglass; node.Tag = host; hosts.Nodes.Add(node); refreshOne.Enabled = refreshAll.Enabled = false; { lookupMutex.WaitOne(); lookupsInProgress++; lookupMutex.ReleaseMutex(); } Thread th = Helpers.NewThread(new ParameterizedThreadStart(LookupHostConnections)); th.Start(node); UpdateLookupsStatus(); }
void scintilla1_Leave(object sender, EventArgs e) { ScintillaNET.Scintilla scintilla1 = sender as ScintillaNET.Scintilla; System.Diagnostics.Trace.WriteLine("leave"); variableHover.Hide(scintilla1); hoverTimer.Enabled = false; m_HoverScintilla = null; m_HoverItem = null; m_HoverNode = null; m_HoverPos = Point.Empty; }
void scintilla1_MouseMove(object sender, MouseEventArgs e) { if (m_Trace == null || m_Trace.states.Length == 0) return; ScintillaNET.Scintilla scintilla1 = sender as ScintillaNET.Scintilla; var pt = scintilla1.PointToClient(Cursor.Position); if (pt.X == m_HoverPos.X && pt.Y == m_HoverPos.Y) return; m_HoverPos = pt; variableHover.Hide(scintilla1); hoverTimer.Enabled = false; m_HoverItem = null; m_HoverNode = null; m_HoverScintilla = null; int pos = scintilla1.PositionFromPoint(pt.X, pt.Y); string word = scintilla1.GetWordFromPosition(pos); var match = Regex.Match(word, "^[rvo][0-9]+$"); if (match.Success) { m_HoverReg = word; m_HoverScintilla = scintilla1; hoverTimer.Enabled = true; hoverTimer.Start(); } }
private TreelistView.Node MakeFragmentNode(PixelModification mod) { bool uintTex = (texture.format.compType == FormatComponentType.UInt); bool sintTex = (texture.format.compType == FormatComponentType.SInt); bool floatTex = (!uintTex && !sintTex); bool depth = false; if (texture.format.compType == FormatComponentType.Depth || (texture.format.special && texture.format.specialFormat == SpecialFormat.D16S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.D24S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.D32S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.S8)) depth = true; TreelistView.Node node = null; if (mod.uavWrite) { string name = "Potential UAV/Copy write"; string preModVal = "Tex Before\n\n" + ModificationValueString(mod.preMod, texture.format, depth); string postModVal = "Tex After\n\n" + ModificationValueString(mod.postMod, texture.format, depth); if (mod.preMod.col.value.u[0] == mod.postMod.col.value.u[0] && mod.preMod.col.value.u[1] == mod.postMod.col.value.u[1] && mod.preMod.col.value.u[2] == mod.postMod.col.value.u[2] && mod.preMod.col.value.u[3] == mod.postMod.col.value.u[3]) { name += "\nNo change in tex value"; } node = new TreelistView.Node(new object[] { name, preModVal, "", postModVal, "" }); } else { string name = String.Format("Primitive {0}\n", mod.primitiveID); if (mod.shaderDiscarded) name += FailureString(mod); ResourceFormat fmt = new ResourceFormat(floatTex ? FormatComponentType.Float : texture.format.compType, 4, 4); string shadOutVal; string postModVal = "Tex After\n\n" + ModificationValueString(mod.postMod, texture.format, depth); if (mod.unboundPS) shadOutVal = "No Pixel\nShader\nBound"; else shadOutVal = "Shader Out\n\n" + ModificationValueString(mod.shaderOut, fmt, depth); if (!mod.EventPassed() && hideFailedEventsToolStripMenuItem.Checked) return null; node = new TreelistView.Node(new object[] { name, shadOutVal, "", postModVal, "" }); if (mod.shaderDiscarded) node.DefaultBackColor = Color.FromArgb(255, 235, 235); } node.Tag = new EventTag(mod.eventID, mod.uavWrite ? uint.MaxValue : mod.primitiveID); if (floatTex || depth) { node.IndexedBackColor[2] = ModificationValueColor(mod.shaderOut, depth); node.IndexedBackColor[4] = ModificationValueColor(mod.postMod, depth); } return node; }
// this function looks up the remote connections and for each one open // queries it for the API, target (usually executable name) and if any user is already connected private static void LookupHostConnections(object o) { { lookupMutex.WaitOne(); lookupsInProgress++; lookupMutex.ReleaseMutex(); } TreelistView.Node node = o as TreelistView.Node; Control p = node.OwnerView; while (p.Parent != null) { p = p.Parent; } RemoteHostSelect rhs = p as RemoteHostSelect; string hostname = node["Hostname"] as string; string username = System.Security.Principal.WindowsIdentity.GetCurrent().Name; StaticExports.EnumerateRemoteConnections(hostname, (UInt32 i) => { try { var conn = StaticExports.CreateRemoteAccessConnection(hostname, i, username, false); if (node.OwnerView.Visible) { string target = conn.Target; string api = conn.API; string busy = conn.BusyClient; node.OwnerView.BeginInvoke((MethodInvoker) delegate { node.OwnerView.BeginUpdate(); node.Nodes.Add(new TreelistView.Node(new object[] { target, api, busy })).Tag = new RemoteConnect(hostname, i); node.OwnerView.EndUpdate(); node.Expand(); }); } conn.Shutdown(); } catch (ApplicationException) { } }); if (node.OwnerView.Visible) { node.OwnerView.BeginInvoke((MethodInvoker) delegate { node.OwnerView.BeginUpdate(); node.Italic = false; node.Image = null; node.OwnerView.EndUpdate(); }); } { lookupMutex.WaitOne(); lookupsInProgress--; lookupMutex.ReleaseMutex(); } if (!rhs.IsDisposed && rhs.Visible) { rhs.BeginInvoke((MethodInvoker) delegate { rhs.LookupComplete(); }); } }
public void FillAPIView() { apiEvents.BeginUpdate(); apiEvents.Nodes.Clear(); Regex rgxopen = new Regex("^\\s*{"); Regex rgxclose = new Regex("^\\s*}"); FetchDrawcall draw = m_Core.CurDrawcall; if (draw != null && draw.events != null && draw.events.Length > 0) { foreach (var ev in draw.events) { // hack until I have a proper interface. Skip events associated with this draw that // come from another context (means they will just be completely omitted/invisible). if (ev.context != draw.context) continue; string[] lines = ev.eventDesc.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); TreelistView.Node root = new TreelistView.Node(new object[] { ev.eventID, lines[0] }); int i=1; if (i < lines.Length && lines[i].Trim() == "{") i++; List<TreelistView.Node> nodestack = new List<TreelistView.Node>(); nodestack.Add(root); for (; i < lines.Length; i++) { if (rgxopen.IsMatch(lines[i])) nodestack.Add(nodestack.Last().Nodes.LastNode); else if (rgxclose.IsMatch(lines[i])) nodestack.RemoveAt(nodestack.Count - 1); else if(lines[i].Trim().Length > 0 && nodestack.Count > 0) nodestack.Last().Nodes.Add(new TreelistView.Node(new object[] { "", lines[i].Trim() })); } if (ev.eventID == draw.eventID) root.Bold = true; root.Tag = (object)ev; apiEvents.Nodes.Add(root); } if (apiEvents.Nodes.Count > 0) apiEvents.NodesSelection.Add(apiEvents.Nodes[0]); } apiEvents.EndUpdate(); }
private void textureCell_MouseMove(object sender, MouseEventArgs e) { TreelistView.TreeListView view = sender as TreelistView.TreeListView; if (view == null) { HideViewDetailsTooltip(); return; } TreelistView.Node node = view.GetHitNode(); if (node == null) { HideViewDetailsTooltip(); return; } if (m_ViewDetailNodes.Contains(node)) { if (node != m_CurViewDetailNode) { // round y up to the next row int y = (e.Location.Y - view.Columns.Options.HeaderHeight) / view.RowOptions.ItemHeight; y = view.Columns.Options.HeaderHeight + (y + 1) * view.RowOptions.ItemHeight; string text = ""; ViewTexTag tex = (node.Tag as ViewTexTag); ViewBufTag buf = (node.Tag as ViewBufTag); if (tex != null) { if (tex.tex.format != tex.view.Format) text += String.Format("The texture is format {0}, the view treats it as {1}.\n", tex.tex.format, tex.view.Format); if (tex.tex.mips > 1 && (tex.tex.mips != tex.view.NumMipLevels || tex.view.HighestMip > 0)) { if (tex.view.NumMipLevels == 1) text += String.Format("The texture has {0} mips, the view covers mip {1}.\n", tex.tex.mips, tex.view.HighestMip, tex.view.HighestMip); else text += String.Format("The texture has {0} mips, the view covers mips {1}-{2}.\n", tex.tex.mips, tex.view.HighestMip, tex.view.HighestMip + tex.view.NumMipLevels - 1); } if (tex.tex.arraysize > 1 && (tex.tex.arraysize != tex.view.ArraySize || tex.view.FirstArraySlice > 0)) { if (tex.view.ArraySize == 1) text += String.Format("The texture has {0} array slices, the view covers slice {1}.\n", tex.tex.arraysize, tex.view.FirstArraySlice, tex.view.FirstArraySlice); else text += String.Format("The texture has {0} array slices, the view covers slices {1}-{2}.\n", tex.tex.arraysize, tex.view.FirstArraySlice, tex.view.FirstArraySlice + tex.view.ArraySize); } } else if (buf != null) { text += String.Format("The view covers bytes {0}-{1} ({2} elements).\nThe buffer is {3} bytes in length ({4} elements).", buf.view.FirstElement * buf.view.ElementSize, (buf.view.FirstElement + buf.view.NumElements) * buf.view.ElementSize, buf.view.NumElements, buf.buf.length, buf.buf.length / buf.view.ElementSize); } toolTip.Show(text.TrimEnd(), view, e.Location.X + Cursor.Size.Width, y); m_CurViewDetailNode = node; } } else { HideViewDetailsTooltip(); } }
public void OnLogfileClosed() { eventView.BeginUpdate(); eventView.Nodes.Clear(); m_FrameNode = null; eventView.EndUpdate(); prevDraw.Enabled = false; nextDraw.Enabled = false; ClearBookmarks(); findEventButton.Enabled = false; jumpEventButton.Enabled = false; timeDraws.Enabled = false; toggleBookmark.Enabled = false; export.Enabled = false; }
private void resource_MouseMove(object sender, MouseEventArgs e) { TreelistView.TreeListView treeview = (TreelistView.TreeListView)sender; if (m_Core.CurVulkanPipelineState == null) return; Point mousePoint = treeview.PointToClient(Cursor.Position); var hoverNode = treeview.CalcHitNode(mousePoint); MakeNodesTransparent(treeview); if (hoverNode != null) { if (hoverNode.Tag is SamplerData) { SamplerData data = (SamplerData)hoverNode.Tag; foreach (var imgnode in data.images) imgnode.DefaultBackColor = Color.Wheat; } else if (m_CombinedImageSamplers.ContainsKey(hoverNode)) { m_CombinedImageSamplers[hoverNode].DefaultBackColor = Color.LightCyan; } if (m_ViewDetailNodes.Contains(hoverNode)) { if (hoverNode != m_CurViewDetailNode) { // round y up to the next row int y = (e.Location.Y - treeview.Columns.Options.HeaderHeight) / treeview.RowOptions.ItemHeight; y = treeview.Columns.Options.HeaderHeight + (y + 1) * treeview.RowOptions.ItemHeight; string text = ""; ViewTexTag tex = (hoverNode.Tag as ViewTexTag); BufferResTag buf = (hoverNode.Tag as BufferResTag); if (tex != null) { if(m_Core.CurVulkanPipelineState.Images.ContainsKey(tex.tex.ID)) text += String.Format("Texture is in the '{0}' layout\n\n", m_Core.CurVulkanPipelineState.Images[tex.tex.ID].layouts[0].name); if (tex.tex.format != tex.fmt) text += String.Format("The texture is format {0}, the view treats it as {1}.\n", tex.tex.format, tex.fmt); if (tex.tex.mips > 1 && (tex.tex.mips != tex.numMip || tex.baseMip > 0)) { if (tex.numMip == 1) text += String.Format("The texture has {0} mips, the view covers mip {1}.\n", tex.tex.mips, tex.baseMip); else text += String.Format("The texture has {0} mips, the view covers mips {1}-{2}.\n", tex.tex.mips, tex.baseMip, tex.baseMip + tex.numMip - 1); } if (tex.tex.arraysize > 1 && (tex.tex.arraysize != tex.numLayer || tex.baseLayer > 0)) { if (tex.numLayer == 1) text += String.Format("The texture has {0} array slices, the view covers slice {1}.\n", tex.tex.arraysize, tex.baseLayer); else text += String.Format("The texture has {0} array slices, the view covers slices {1}-{2}.\n", tex.tex.arraysize, tex.baseLayer, tex.baseLayer + tex.numLayer); } } else if (buf != null) { text += String.Format("The view covers bytes {0}-{1}.\nThe buffer is {3} bytes in length.", buf.offset, buf.size, m_Core.GetBuffer(buf.ID).length); } toolTip.Show(text.TrimEnd(), treeview, e.Location.X + Cursor.Size.Width, y); m_CurViewDetailNode = hoverNode; } } else // node is not in view details list { HideViewDetailsTooltip(); } } else { HideViewDetailsTooltip(); } }
private void HideViewDetailsTooltip() { if (m_CurViewDetailNode != null) toolTip.Hide(m_CurViewDetailNode.OwnerView); m_CurViewDetailNode = null; }
private TreelistView.Node AddDrawcall(FetchDrawcall drawcall, TreelistView.Node root) { if (m_Core.Config.EventBrowser_HideEmpty) { if ((drawcall.children == null || drawcall.children.Length == 0) && (drawcall.flags & DrawcallFlags.PushMarker) != 0) { return(null); } } UInt32 eventNum = drawcall.eventID; TreelistView.Node drawNode = null; if (drawcall.children.Length > 0) { drawNode = MakeNode(eventNum, GetEndEventID(drawcall), drawcall.drawcallID, GetEndDrawID(drawcall), drawcall.name, 0.0); } else { drawNode = MakeNode(eventNum, drawcall.drawcallID, drawcall.name, 0.0); } if (m_Core.Config.EventBrowser_ApplyColours) { // if alpha isn't 0, assume the colour is valid if ((drawcall.flags & (DrawcallFlags.PushMarker | DrawcallFlags.SetMarker)) > 0 && drawcall.markerColour[3] > 0.0f) { float red = drawcall.markerColour[0]; float green = drawcall.markerColour[1]; float blue = drawcall.markerColour[2]; float alpha = drawcall.markerColour[3]; drawNode.TreeLineColor = drawcall.GetColor(); drawNode.TreeLineWidth = 3.0f; if (m_Core.Config.EventBrowser_ColourEventRow) { drawNode.BackColor = drawcall.GetColor(); drawNode.ForeColor = drawcall.GetTextColor(eventView.ForeColor); } } } DeferredEvent def = new DeferredEvent(); def.eventID = eventNum; def.marker = (drawcall.flags & DrawcallFlags.SetMarker) != 0; drawNode.Tag = def; if (drawcall.children != null && drawcall.children.Length > 0) { for (int i = 0; i < drawcall.children.Length; i++) { AddDrawcall(drawcall.children[i], drawNode); if (i > 0 && drawNode.Nodes.Count >= 2 && (drawcall.children[i - 1].flags & DrawcallFlags.SetMarker) > 0) { drawNode.Nodes[drawNode.Nodes.Count - 2].Tag = drawNode.Nodes.LastNode.Tag; } } bool found = false; for (int i = drawNode.Nodes.Count - 1; i >= 0; i--) { DeferredEvent t = drawNode.Nodes[i].Tag as DeferredEvent; if (t != null && !t.marker) { drawNode.Tag = drawNode.Nodes[i].Tag; found = true; break; } } if (!found && !drawNode.Nodes.IsEmpty()) { drawNode.Tag = drawNode.Nodes.LastNode.Tag; } } if (drawNode.Nodes.IsEmpty() && (drawcall.flags & DrawcallFlags.PushMarker) != 0 && m_Core.Config.EventBrowser_HideEmpty) { return(null); } root.Nodes.Add(drawNode); return(drawNode); }
// this function looks up the remote connections and for each one open // queries it for the API, target (usually executable name) and if any user is already connected private static void LookupHostConnections(object o) { { lookupMutex.WaitOne(); lookupsInProgress++; lookupMutex.ReleaseMutex(); } TreelistView.Node node = o as TreelistView.Node; Control p = node.OwnerView; while (p.Parent != null) { p = p.Parent; } RemoteHostSelect rhs = p as RemoteHostSelect; string hostname = node["Hostname"] as string; var idents = StaticExports.EnumerateRemoteConnections(hostname); var remotes = new Dictionary <UInt32, AvailableRemote>(); string username = System.Security.Principal.WindowsIdentity.GetCurrent().Name; foreach (var i in idents) { if (i != 0) { try { var conn = StaticExports.CreateRemoteAccessConnection(hostname, i, username, false); var data = new AvailableRemote(conn.Target, conn.API, conn.BusyClient); conn.Shutdown(); remotes.Add(i, data); } catch (ApplicationException) { } } } if (node.OwnerView.Visible) { node.OwnerView.BeginInvoke((MethodInvoker) delegate { node.OwnerView.BeginUpdate(); node.Italic = false; node.Image = null; foreach (var kv in remotes) { node.Nodes.Add(new TreelistView.Node(new object[] { kv.Value.Target, kv.Value.API, kv.Value.Busy })).Tag = new RemoteConnect(hostname, kv.Key); node.Bold = true; } node.OwnerView.EndUpdate(); }); } { lookupMutex.WaitOne(); lookupsInProgress--; lookupMutex.ReleaseMutex(); } if (!rhs.IsDisposed && rhs.Visible) { rhs.BeginInvoke((MethodInvoker) delegate { rhs.LookupComplete(); }); } }
public SamplerData(TreelistView.Node n) { node = n; }