| Flutter Impeller |

Classes | Public Member Functions | List of all members
impeller::GPUTracerMTL Class Referenceabstract

Approximate the GPU frame time by computing a difference between the smallest GPUStartTime and largest GPUEndTime for all command buffers submitted in a frame workload. More...

`#include <gpu_tracer_mtl.h>`

Inheritance diagram for impeller::GPUTracerMTL:

## Public Member Functions
| GPUTracerMTL ()=default
| ~GPUTracerMTL ()=default
void | MarkFrameEnd ()
| Record that the current frame has ended. Any additional cmd buffers will be attributed to the "next" frame. More...
void | RecordCmdBuffer (id< MTLCommandBuffer > buffer)
| Record the current cmd buffer GPU execution timestamps into an aggregate frame workload metric. More...

## Detailed Description

Approximate the GPU frame time by computing a difference between the smallest GPUStartTime and largest GPUEndTime for all command buffers submitted in a frame workload.

Definition at line 23 of file gpu_tracer_mtl.h.

## Constructor & Destructor Documentation

## ◆ GPUTracerMTL()

impeller::GPUTracerMTL::GPUTracerMTL | ( |  | ) |
| default

## ◆ ~GPUTracerMTL()

impeller::GPUTracerMTL::~GPUTracerMTL | ( |  | ) |
| default

## Member Function Documentation

## ◆ MarkFrameEnd()

void impeller::GPUTracerMTL::MarkFrameEnd | ( |  | ) |

Record that the current frame has ended. Any additional cmd buffers will be attributed to the "next" frame.

Definition at line 16 of file gpu_tracer_mtl.mm.

16 {
17 if (@available(ios 10.3, tvos 10.2, macos 10.15, macCatalyst 13.0, *)) {
18 Lock lock(trace_state_mutex_);
19 current_state_ = (current_state_ + 1) % 16;
20 }
21 }

## ◆ RecordCmdBuffer()

void impeller::GPUTracerMTL::RecordCmdBuffer | ( | id< MTLCommandBuffer > | buffer | ) |

Record the current cmd buffer GPU execution timestamps into an aggregate frame workload metric.

Definition at line 23 of file gpu_tracer_mtl.mm.

23 {
24 if (@available(ios 10.3, tvos 10.2, macos 10.15, macCatalyst 13.0, *)) {
25 Lock lock(trace_state_mutex_);
26 auto current_state = current_state_;
27 trace_states_[current_state].pending_buffers += 1;
28
29 auto weak_self = weak_from_this();
30 [buffer addCompletedHandler:^(id<MTLCommandBuffer> buffer) {
31 auto self = weak_self.lock();
32 if (!self) {
33 return;
34 }
35 Lock lock(self->trace_state_mutex_);
36 auto& state = self->trace_states_[current_state];
37 state.pending_buffers--;
38 state.smallest_timestamp = std::min(
39 state.smallest_timestamp, static_cast<Scalar>(buffer.GPUStartTime));
40 state.largest_timestamp = std::max(
41 state.largest_timestamp, static_cast<Scalar>(buffer.GPUEndTime));
42
43 if (state.pending_buffers == 0) {
44 auto gpu_ms =
45 (state.largest_timestamp - state.smallest_timestamp) * 1000;
46 state.smallest_timestamp = std::numeric_limits<float>::max();
47 state.largest_timestamp = 0;
48 FML_TRACE_COUNTER("flutter", "GPUTracer",
49 reinterpret_cast<int64_t>(this), // Trace Counter ID
50 "FrameTimeMS", gpu_ms);
51 }
52 }];
53 }
54 }

The documentation for this class was generated from the following files:

- impeller/renderer/backend/metal/gpu_tracer_mtl.h
- impeller/renderer/backend/metal/gpu_tracer_mtl.mm

impeller::Scalar
float Scalar
Definition: scalar.h:18