2
3
4
5
10#include "Render/FrameInfo.h"
11#include "Core/Library/ProcessLibrary.h"
13#include <NvPerfCounterConfiguration.h>
14#include <NvPerfCpuMarkerTrace.h>
15#include <NvPerfVulkan.h>
16#include <NvPerfReportGeneratorVulkan.h>
33
34
38
39
43
44
45
53 if (!m_NsightPerfGPUProfilerOneshotCollection)
55 m_NsightPerfGPUProfilerOneshotCollection = std::make_shared<NsightPerfGPUProfilerOneshotCollection>(state);
64
65
66 constexpr size_t samplingIntervalInNanoSeconds = 1024 * 16;
67 constexpr size_t maxIntervalPerFrameInNanoSeconds = 100 * 1000 * 1000;
70
71
72 auto onStopSampling = [
this](
const char* outputDirectory) {
77
78
81 state.m_PhysicalDevice ,
83 samplingIntervalInNanoSeconds ,
84 maxIntervalPerFrameInNanoSeconds ,
90
91
92 m_PeriodicSamplerOneShot.m_outputOption.directoryName = SPICES_GPUPROFILEONESHOT_PATH;
93 m_PeriodicSamplerOneShot.m_outputOption.appendDateTime = nv::perf::sampler::PeriodicSamplerOneShotVulkan::AppendDateTime::yes;
96
97
106
107
111 m_PeriodicSamplerOneShot.StartCollectionOnFrameEnd();
115
116
117 auto& apiTracer = m_ApiTracers[FrameInfo::Get().m_FrameIndex];
118 apiTracer.ClearData();
119 apiTracer.ResetQueries(commandBuffer);
123 VkCommandBuffer cmd ,
124 const std::string& name ,
125 size_t nestingLevel ,
131 auto& apiTracer = m_ApiTracers[FrameInfo::Get().m_FrameIndex];
132 NSPERF_CHECK(apiTracer.BeginRange(cmd, name.c_str(), nestingLevel, m_FrameLevelTraceIndice[index]))
139 auto& apiTracer = m_ApiTracers[FrameInfo::Get().m_FrameIndex];
148
149
155
156
157 std::vector<nv::perf::mini_trace::APITraceData> apiTraceData;
158 for (
auto& apiTracer : m_ApiTracers)
164
165
166 const std::string yamlText = SerializeAPITraceDataToYaml(apiTraceData);
167 const std::string filename = std::string(m_OutputDirectory) + NV_PERF_PATH_SEPARATOR +
"traces.yaml";
168 std::ofstream file(filename);
175 std::stringstream ss;
176 ss <<
"Failed to open file: " << filename;
177 SPICES_CORE_WARN(ss.str());
181
182
183 std::stringstream ss;
184 ss << SPICES_EXTENT_PROCESS_PATH <<
"TimelineViewer/TimelineViewer.exe";
188
189
192 SPICES_CORE_INFO(
"Nsight Perf: One-Shot sampling Finished.");
196
197
204
205
206 SamplerStatus samplerStatus = m_PeriodicSamplerOneShot.GetSamplerStatus();
207 if (samplerStatus == SamplerStatus::Failed)
209 SPICES_CORE_ERROR(
"Nsight Perf: Failed to initialize");
211 else if (samplerStatus == SamplerStatus::Sampling)
213 SPICES_CORE_INFO(
"Nsight Perf: One-Shot is sampling.");
222
223
224 m_FrameLevelTraceIndice.resize(numFramesToSample, 0);
225 m_ApiTracers.resize(numFramesToSample);
226 for (
auto& apiTracer : m_ApiTracers)
228 NSPERF_CHECK(apiTracer.Initialize(state.m_Instance, state.m_PhysicalDevice, state.m_Device, numRangesPerFrame))
254
255
256 for (
auto& apiTracer : m_ApiTracers)
#define NSPERF_CHECK(val)
#define SPICES_PROFILE_ZONE
bool m_EnableCaptureNextFrame
True if want capture next frame.
static std::shared_ptr< NsightPerfGPUProfilerOneshotCollection > m_NsightPerfGPUProfilerOneshotCollection
This Single Instance.
std::string m_OutputDirectory
OutFile Directory.
void BeginRange(VkCommandBuffer cmd, const std::string &name, size_t nestingLevel, uint32_t index)
Begin recording a Oneshot Collection Range.
void Create(VulkanState &state)
Create this.
NsightPerfGPUProfilerOneshotCollection(VulkanState &state)
Constructor Function.
void CaptureFrame()
Capture this frame.
bool m_IsInSession
True if in Session.
void Reset()
Reset Session.
void EndRange(VkCommandBuffer cmd, size_t index)
End recording a Oneshot Collection Range.
void EndFrame()
End a Frmae.
void BeginFrame(VulkanState &state, VkCommandBuffer commandBuffer)
Begin a Frame.
VulkanState & m_VulkanState
VulkanState.
void InitApiTracer(VulkanState &state)
Init Api Tracer.
static void CreateInstance(VulkanState &state)
Create this Single Instance.
void Quit()
Quit application.
void DestroyQueryPool()
Destroy Query Pool.
Wrapper of Nvidia Nsight Performance OneshotCollection.
static bool OpenProcess(const char *processPath, const char *commandLine="")
Open a Process with command.
Process Static Function Library.
constexpr size_t numFramesToSample
constexpr size_t numRangesPerFrame
This struct contains all Vulkan object in used global.