Files
Aethera/kernel/src/kernel/frame.hpp
T
2026-08-24 16:27:27 +08:00

77 lines
2.7 KiB
C++

#pragma once
#include "double_buffer/mechanism.hpp"
#include <cstdint>
#include <memory>
#include <vector>
namespace aethera {
enum class Frame_Dimension : std::uint8_t;
struct Frame_Statistics_Sample;
enum class Frame_Trace_Marker : std::uint8_t {
created,
scene_render_requested,
scene_render_started,
event_dispatch_started,
event_dispatch_finished,
prepare_started,
prepare_finished,
paint_started,
paint_finished,
backend_queue_entered,
backend_prepare_started,
backend_prepare_finished,
backend_submit_queued,
backend_queue_left,
gpu_submitted,
gpu_completed,
readback_started,
readback_finished,
scene_render_finished,
callback_started,
callback_finished,
frame_ready,
count
};
enum class Frame_Trace_Measurement : std::uint8_t {
backend_apply_ns,
backend_plan_ns,
backend_execute_ns,
backend_submit_ns,
gpu_fence_wait_ns,
gpu_render_ns,
gpu_transition_ns,
gpu_copy_ns,
gpu_total_ns,
readback_ns,
count
};
struct Frame_Identity {
friend bool operator==(const Frame_Identity&, const Frame_Identity&) = default;
std::uint64_t sequence{}; /* 外部帧管理器分配的单调帧序号。 */
std::uint64_t correlation_id{}; /* 与调用方请求关联的标识;零值表示未关联。 */
};
struct Frame_Trace_Point {
Frame_Trace_Marker marker{}; /* 本时间点在端到端帧流水线中的固定语义。 */
std::uint64_t elapsed_ns{}; /* 相对 Frame 创建时刻的单调时钟偏移,单位为纳秒。 */
};
struct Frame_Trace_Value {
Frame_Trace_Measurement measurement{}; /* 无法表达为公共时间点的原始后端测量类型。 */
std::uint64_t value_ns{}; /* 后端直接记录的持续时间,单位为纳秒。 */
};
class Render_Frame : public double_buffer::Pinned {
public:
explicit Render_Frame(Frame_Identity identity);
virtual ~Render_Frame();
[[nodiscard]] Frame_Identity identity() const noexcept;
[[nodiscard]] std::uint64_t created_time_unix_ns() const noexcept;
void mark(Frame_Trace_Marker marker) noexcept;
void record(Frame_Trace_Measurement measurement, std::uint64_t value_ns) noexcept;
[[nodiscard]] Frame_Statistics_Sample statistics(Frame_Dimension dimension) const;
protected:
/* 物理帧槽再次承载新逻辑帧时,重建其唯一身份和诊断时间原点。 */
void begin(Frame_Identity identity) noexcept;
private:
struct Private;
std::unique_ptr<Private> d; /* 帧身份、时钟原点与原子诊断槽位的唯一所有权。 */
};
}