xref: /aosp_15_r20/external/mesa3d/src/tool/pps/pps_datasource.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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