1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2019-2021 Collabora, Ltd. 3*61046927SAndroid Build Coastguard Worker * Author: Antonio Caggiano <[email protected]> 4*61046927SAndroid Build Coastguard Worker * Author: Robert Beckett <[email protected]> 5*61046927SAndroid Build Coastguard Worker * Author: Corentin Noël <[email protected]> 6*61046927SAndroid Build Coastguard Worker * 7*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 8*61046927SAndroid Build Coastguard Worker */ 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker #pragma once 11*61046927SAndroid Build Coastguard Worker 12*61046927SAndroid Build Coastguard Worker #include "pps.h" 13*61046927SAndroid Build Coastguard Worker #include "pps_driver.h" 14*61046927SAndroid Build Coastguard Worker 15*61046927SAndroid Build Coastguard Worker namespace pps 16*61046927SAndroid Build Coastguard Worker { 17*61046927SAndroid Build Coastguard Worker struct GpuIncrementalState { 18*61046927SAndroid Build Coastguard Worker bool was_cleared = true; 19*61046927SAndroid Build Coastguard Worker }; 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Worker struct GpuDataSourceTraits : public perfetto::DefaultDataSourceTraits { 22*61046927SAndroid Build Coastguard Worker using IncrementalStateType = GpuIncrementalState; 23*61046927SAndroid Build Coastguard Worker }; 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker class Driver; 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker /// @brief This datasource samples performance counters at a specified rate. 28*61046927SAndroid Build Coastguard Worker /// Once the data is available, it sends a protobuf packet to the perfetto service. 29*61046927SAndroid Build Coastguard Worker /// At the very beginning, it sends a description of the counters. 30*61046927SAndroid Build Coastguard Worker /// After that, it sends counter values using the IDs set in the description. 31*61046927SAndroid Build Coastguard Worker class GpuDataSource : public perfetto::DataSource<GpuDataSource, GpuDataSourceTraits> 32*61046927SAndroid Build Coastguard Worker { 33*61046927SAndroid Build Coastguard Worker public: 34*61046927SAndroid Build Coastguard Worker void OnSetup(const SetupArgs &args) override; 35*61046927SAndroid Build Coastguard Worker void OnStart(const StartArgs &args) override; 36*61046927SAndroid Build Coastguard Worker void OnStop(const StopArgs &args) override; 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Worker /// Blocks until the data source starts 39*61046927SAndroid Build Coastguard Worker static void wait_started(); 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Worker /// @brief Perfetto trace callback 42*61046927SAndroid Build Coastguard Worker static void trace_callback(TraceContext ctx); 43*61046927SAndroid Build Coastguard Worker static void register_data_source(const std::string &driver_name); 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker void trace(TraceContext &ctx); 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Worker private: 48*61046927SAndroid Build Coastguard Worker State state = State::Stop; 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker /// Time between trace callbacks 51*61046927SAndroid Build Coastguard Worker std::chrono::nanoseconds time_to_sleep = std::chrono::nanoseconds(1000000); 52*61046927SAndroid Build Coastguard Worker 53*61046927SAndroid Build Coastguard Worker /// Used to check whether the datasource is quick enough 54*61046927SAndroid Build Coastguard Worker std::chrono::nanoseconds time_to_trace; 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker /// Last CPU timestamp at which we correlated CPU/GPU timestamps 57*61046927SAndroid Build Coastguard Worker uint64_t last_correlation_timestamp = 0; 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Worker /// A data source supports one driver at a time, but if you need more 60*61046927SAndroid Build Coastguard Worker /// than one gpu datasource you can just run another producer 61*61046927SAndroid Build Coastguard Worker Driver *driver = nullptr; 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard Worker /// CPU timestamp of packet sent with counter descriptors 64*61046927SAndroid Build Coastguard Worker uint64_t descriptor_timestamp = 0; 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker /// GPU timestamp of packet sent with counter descriptors 67*61046927SAndroid Build Coastguard Worker uint64_t descriptor_gpu_timestamp = 0; 68*61046927SAndroid Build Coastguard Worker 69*61046927SAndroid Build Coastguard Worker /// Used to track the first available counters 70*61046927SAndroid Build Coastguard Worker bool got_first_counters = false; 71*61046927SAndroid Build Coastguard Worker }; 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker } // namespace pps 74