コード例 #1
0
ファイル: vktCmdBufProfiler.cpp プロジェクト: imace/CodeXL
//-----------------------------------------------------------------------------
/// 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;
}
コード例 #2
0
/**
***************************************************************************************************
*   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;
}