Flutter Impeller
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 }
float Scalar
Definition: scalar.h:19

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