Example #1
0
        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]);
        }
Example #2
0
        public void ExpandNode(TreelistView.Node node)
        {
            var n = node;

            while (node != null)
            {
                node.Expand();
                node = node.Parent;
            }
            eventView.EnsureVisible(n);
        }
Example #3
0
 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();
     }
 }
Example #4
0
        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();
                }
            }
        }
Example #5
0
        private uint GetNodeEventID(TreelistView.Node n)
        {
            DeferredEvent def = n.Tag as DeferredEvent;

            if (def != null)
            {
                return(def.eventID);
            }

            return(0);
        }
Example #6
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);
        }
Example #7
0
        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;
        }
Example #8
0
        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;
        }
Example #9
0
        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);
                }
            }
        }
Example #10
0
        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();
        }
Example #11
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(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);
        }
Example #12
0
        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;
        }
Example #13
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(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);
        }
Example #14
0
        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];
            }
        }
Example #15
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);
        }
Example #16
0
        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);
        }
Example #17
0
        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);
                }
            }
        }
Example #19
0
        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);
        }
Example #20
0
        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]);
            }
        }
Example #21
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();
        }
Example #22
0
        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();
        }
Example #23
0
        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();
        }
Example #24
0
        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;
            }
        }
Example #25
0
        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();
        }
Example #26
0
        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();
                }
            }
        }
Example #27
0
 private void regsList_Leave(object sender, EventArgs e)
 {
     hoverTimer.Enabled = false;
     m_HoverItem = null;
     m_HoverNode = null;
 }
Example #28
0
        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;
        }
Example #29
0
        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);
            }
        }
Example #30
0
        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();
        }
Example #31
0
 private void hosts_NodeDoubleClicked(TreelistView.Node node)
 {
     ConnectToHost(node);
 }
Example #32
0
        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();
        }
Example #33
0
        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);
        }
Example #34
0
        // 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(); });
            }
        }
Example #35
0
 private static bool IsRemoteServerLive(TreelistView.Node node)
 {
     return((node.Tag as RemoteHost).ServerRunning);
 }
Example #36
0
        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;
        }
Example #37
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;

            {
                lookupMutex.WaitOne();
                lookupsInProgress++;
                lookupMutex.ReleaseMutex();
            }

            Thread th = Helpers.NewThread(new ParameterizedThreadStart(LookupHostConnections));
            th.Start(node);

            UpdateLookupsStatus();
        }
Example #38
0
        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;
        }
Example #39
0
        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();
            }
        }
Example #40
0
        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;
        }
Example #41
0
        // 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(); });
            }
        }
Example #42
0
        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];
            }
        }
Example #43
0
        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();
            }
        }
Example #45
0
        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;
 }
Example #48
0
        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);
        }
Example #49
0
        // 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;
 }