diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 4c83b4639..72871b504 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -399,6 +399,8 @@ enum ResourceUsage eUsage_Copy, eUsage_CopySrc, eUsage_CopyDst, + + eUsage_Barrier, }; enum DrawcallFlags diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 2487ace27..1462c31d7 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -2521,6 +2521,8 @@ void WrappedVulkan::AddDrawcall(const FetchDrawcall &d, bool hasEvents) { VulkanDrawcallTreeNode node(draw); + node.resourceUsage.swap(m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage); + if(m_LastCmdBufferID != ResourceId()) AddUsage(node, m_BakedCmdBufferInfo[m_LastCmdBufferID].debugMessages); diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 7234db4ba..9d69519bc 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -331,6 +331,8 @@ private: vector debugMessages; list drawStack; + vector > resourceUsage; + struct CmdBufferState { ResourceId pipeline; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 0c46c04b0..571636081 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1745,6 +1745,13 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( ResourceId cmd = GetResID(commandBuffer); GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts, (uint32_t)imgBarriers.size(), &imgBarriers[0]); + + for(size_t i = 0; i < imgBarriers.size(); i++) + { + m_BakedCmdBufferInfo[cmdid].resourceUsage.push_back( + std::make_pair(GetResourceManager()->GetNonDispWrapper(imgBarriers[i].image)->id, + EventUsage(m_BakedCmdBufferInfo[cmdid].curEventID, eUsage_Barrier))); + } } SAFE_DELETE_ARRAY(memBarriers); diff --git a/renderdocui/Code/CommonPipelineState.cs b/renderdocui/Code/CommonPipelineState.cs index 09627d6e9..4169c74b7 100644 --- a/renderdocui/Code/CommonPipelineState.cs +++ b/renderdocui/Code/CommonPipelineState.cs @@ -146,13 +146,15 @@ namespace renderdocui.Code { get { - if (LogLoaded) - { - if (IsLogVK) - return true; - } + return LogLoaded && IsLogVK; + } + } - return false; + public bool SupportsBarriers + { + get + { + return LogLoaded && IsLogVK; } } diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 07aaddf71..86ff730a1 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -403,6 +403,8 @@ namespace renderdoc Copy, CopySrc, CopyDst, + + Barrier, }; [Flags] @@ -665,6 +667,8 @@ namespace renderdoc case ResourceUsage.Copy: return "Copy"; case ResourceUsage.CopySrc: return "Copy - Source"; case ResourceUsage.CopyDst: return "Copy - Dest"; + + case ResourceUsage.Barrier: return "Barrier"; } } else if (apitype == APIPipelineStateType.OpenGL || apitype == APIPipelineStateType.Vulkan) @@ -712,6 +716,8 @@ namespace renderdoc case ResourceUsage.Copy: return "Copy"; case ResourceUsage.CopySrc: return "Copy - Source"; case ResourceUsage.CopyDst: return "Copy - Dest"; + + case ResourceUsage.Barrier: return "Barrier"; } } diff --git a/renderdocui/Windows/TimelineBar.cs b/renderdocui/Windows/TimelineBar.cs index 65ce6fda1..07c0e55d9 100644 --- a/renderdocui/Windows/TimelineBar.cs +++ b/renderdocui/Windows/TimelineBar.cs @@ -153,8 +153,7 @@ namespace renderdocui.Windows using(var brush = new SolidBrush(col)) g.FillPie(brush, x, y, width, height, 0.0f, 360.0f); } - - if (type == 1 || type == 2 || type == 3 || type == 4) + else { height += 2; width += 4; @@ -177,6 +176,10 @@ namespace renderdocui.Windows { uptri[0] = new PointF(x + width / 2.0f, y + height - 2); } + if (type == 5) + { + update = false; + } type = 1; } @@ -599,7 +602,8 @@ namespace renderdocui.Windows { foreach (var u in m_HighlightUsage) { - if (u.eventID == s.draws[d].eventID) + if ((u.eventID == s.draws[d].eventID) || + (u.eventID < s.draws[d].eventID && s.draws[d].events.Length > 0 && u.eventID >= s.draws[d].events[0].eventID)) { var barcol = Color.Black; @@ -641,7 +645,8 @@ namespace renderdocui.Windows { foreach (var u in m_HighlightUsage) { - if (u.eventID == s.draws[d].eventID) + if ((u.eventID == s.draws[d].eventID) || + (u.eventID < s.draws[d].eventID && s.draws[d].events.Length > 0 && u.eventID >= s.draws[d].events[0].eventID)) { // read/write if ( @@ -671,6 +676,12 @@ namespace renderdocui.Windows DrawPip(g, Color.Silver, highlightBarRect, 1, d, s.draws.Count, start, widths[i], ""); MarkWrite(s.draws[d].eventID); } + // barrier + else if (u.usage == ResourceUsage.Barrier) + { + DrawPip(g, Color.Tomato, highlightBarRect, 5, d, s.draws.Count, start, widths[i], ""); + MarkWrite(s.draws[d].eventID); + } // read else { @@ -823,6 +834,19 @@ namespace renderdocui.Windows DrawPip(g, Color.Black, new RectangleF(barRect.X, barRect.Y - pipRadius, pipRadius * 2, pipRadius * 2), 2, 0, 1, 0.0f, 1.0f, ""); DrawPip(g, Color.Silver, new RectangleF(barRect.X, barRect.Y - pipRadius, pipRadius * 2, pipRadius * 2), 1, 0, 1, 0.0f, 1.0f, ""); + if (m_Core.CurPipelineState.SupportsBarriers) + { + barRect.X += pipRadius * 2; + barRect.X += pipRadius; + + g.DrawString(", Barriers ", barFont, Brushes.Black, barRect.X, barRect.Y + 2); + barRect.X += (int)Math.Ceiling(g.MeasureString(", Barriers ", barFont).Width); + barRect.X += pipRadius; + + DrawPip(g, Color.Black, new RectangleF(barRect.X, barRect.Y - pipRadius, pipRadius * 2, pipRadius * 2), 2, 0, 1, 0.0f, 1.0f, ""); + DrawPip(g, Color.Tomato, new RectangleF(barRect.X, barRect.Y - pipRadius, pipRadius * 2, pipRadius * 2), 1, 0, 1, 0.0f, 1.0f, ""); + } + barRect.X += pipRadius * 2; barRect.X += pipRadius;