blob: ac2c3916d0207fbcac7ecdfc2698c3d608803167 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <Metal/Metal.h>
#include <memory>
#include <optional>
#include "impeller/base/thread.h"
#include "impeller/base/thread_safety.h"
#include "impeller/geometry/scalar.h"
namespace impeller {
class ContextMTL;
/// @brief 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.
class GPUTracerMTL : public std::enable_shared_from_this<GPUTracerMTL> {
public:
GPUTracerMTL() = default;
~GPUTracerMTL() = default;
/// @brief Record that the current frame has ended. Any additional cmd buffers
/// will be attributed to the "next" frame.
void MarkFrameEnd();
/// @brief Record the current cmd buffer GPU execution timestamps into an
/// aggregate frame workload metric.
void RecordCmdBuffer(id<MTLCommandBuffer> buffer);
private:
struct GPUTraceState {
Scalar smallest_timestamp = std::numeric_limits<float>::max();
Scalar largest_timestamp = 0;
size_t pending_buffers = 0;
};
mutable Mutex trace_state_mutex_;
GPUTraceState trace_states_[16] IPLR_GUARDED_BY(trace_state_mutex_);
size_t current_state_ IPLR_GUARDED_BY(trace_state_mutex_) = 0u;
};
} // namespace impeller