//----------------------------------------------------------------------------- /// Begin profiling a GPU command. /// \param pIdInfo The identifying metadata for the new measurement. /// \returns A profiler result code indicating measurement success. //----------------------------------------------------------------------------- ProfilerResultCode VktCmdBufProfiler::BeginCmdMeasurement(const ProfilerMeasurementId* pIdInfo) { ProfilerResultCode profilerResultCode = PROFILER_FAIL; if (m_cmdBufData.state != PROFILER_STATE_MEASUREMENT_BEGAN) { const UINT measurementId = m_cmdBufData.cmdBufMeasurementCount % m_config.measurementsPerGroup; // Create new measurement group if full if (measurementId == 0) { VkResult result = VK_INCOMPLETE; result = SetupNewMeasurementGroup(); VKT_ASSERT(result == VK_SUCCESS); if (result != VK_SUCCESS) { Log(logERROR, "SetupNewMeasurementGroup() failed in VktCmdBufProfiler::BeginCmdMeasurement()\n"); } m_pDeviceDT->CmdResetQueryPool(m_config.cmdBuf, m_cmdBufData.pActiveMeasurementGroup->gpuRes.timestampQueryPool, 0, m_maxQueriesPerGroup); } if (m_config.measurementTypeFlags & PROFILER_MEASUREMENT_TYPE_TIMESTAMPS) { const UINT offset = measurementId * ProfilerTimestampsPerMeasurement; // Inject timestamp m_pDeviceDT->CmdWriteTimestamp( m_config.cmdBuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, m_cmdBufData.pActiveMeasurementGroup->gpuRes.timestampQueryPool, offset); // Inject timestamp m_pDeviceDT->CmdWriteTimestamp( m_config.cmdBuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, m_cmdBufData.pActiveMeasurementGroup->gpuRes.timestampQueryPool, offset + 1); } m_cmdBufData.cmdBufMeasurementCount++; // Add a new measurement ProfilerMeasurementInfo clientData = ProfilerMeasurementInfo(); clientData.measurementNum = m_cmdBufData.cmdBufMeasurementCount; if (pIdInfo != nullptr) { memcpy(&clientData.idInfo, pIdInfo, sizeof(ProfilerMeasurementId)); } m_cmdBufData.pActiveMeasurementGroup->measurementInfos.push_back(clientData); m_cmdBufData.pActiveMeasurementGroup->groupMeasurementCount++; m_cmdBufData.state = PROFILER_STATE_MEASUREMENT_BEGAN; profilerResultCode = PROFILER_SUCCESS; } else { profilerResultCode = PROFILER_ERROR_MEASUREMENT_ALREADY_BEGAN; VKT_ASSERT_ALWAYS(); } return profilerResultCode; }
/** *************************************************************************************************** * DX12CmdListProfiler::BeginGrCmdMeasurement * * @brief * Begin profiling a grCmd* function. *************************************************************************************************** */ ProfilerResultCode DX12CmdListProfiler::BeginCmdMeasurement( ID3D12GraphicsCommandList* pCmdList, ///< [in] Handle to cmd buf being measured const ProfilerMeasurementId* pIdInfo) ///< [in] Pointer to measurement id data { DX12ProfilerCriticalSection lock(m_cs); PROFILER_ASSERT(pCmdList != nullptr); PROFILER_ASSERT(pIdInfo != nullptr); ProfilerResultCode profilerResultCode = PROFILER_FAIL; // If command list has not yet been measured, allocate memory objects for it if (IsCmdListBeingMeasured(pCmdList) == false) { ProfilerCmdListData newCmdListData = {}; m_cmdListMap[pCmdList] = newCmdListData; } ProfilerCmdListData& cmdListData = m_cmdListMap[pCmdList]; PROFILER_ASSERT(cmdListData.state != PROFILER_STATE_STARTED); const UINT measurementId = cmdListData.cmdListMeasurementCount % m_config.measurementsPerGroup; // Create new measurement group if full if (measurementId == 0) { HRESULT result = E_FAIL; result = SetupNewMeasurementGroup(cmdListData); PROFILER_ASSERT(result == S_OK); } if (m_config.measurementTypeFlags & PROFILER_MEASUREMENT_TYPE_PIPE_STATS) { // Begin pipe stats query pCmdList->BeginQuery(cmdListData.pActiveMeasurementGroup->pPipeStatsQueryHeap, D3D12_QUERY_TYPE_PIPELINE_STATISTICS, measurementId); } if (m_config.measurementTypeFlags & PROFILER_MEASUREMENT_TYPE_TIMESTAMPS) { const UINT offset = measurementId * 2; // Inject timestamp pCmdList->EndQuery(cmdListData.pActiveMeasurementGroup->pTimestampQueryHeap, D3D12_QUERY_TYPE_TIMESTAMP, offset); } cmdListData.cmdListMeasurementCount++; // Add a new measurement ProfilerMeasurementInfo clientData = {}; clientData.measurementNum = cmdListData.cmdListMeasurementCount; if (pIdInfo != nullptr) { memcpy(&clientData.idInfo, pIdInfo, sizeof(ProfilerMeasurementId)); } cmdListData.pActiveMeasurementGroup->measurementInfos.push_back(clientData); cmdListData.pActiveMeasurementGroup->groupMeasurementCount++; cmdListData.state = PROFILER_STATE_STARTED; profilerResultCode = PROFILER_SUCCESS; return profilerResultCode; }