载入中...
搜索中...
未找到
RenderFlow.hpp
浏览该文件的文档.
1#pragma once
2
3#include "common/Export.h"
5
6#include <cstdint>
7#include <iterator>
8#include <string>
9#include <unordered_map>
10#include <unordered_set>
11#include <vector>
12
13namespace eve::dev {
14
15enum class RenderEventKind : uint8_t {
16 FrameBegin = 0,
19 PassEnd,
20 Target,
21 Bind,
22 Draw,
23 Error,
24};
25
27 uint32_t id = 0;
28 RenderEventKind kind = RenderEventKind::Draw;
29 std::string name; // pass / api / resource kind / "error"
30 std::string detail; // resource name, draw detail, error message
31 uint32_t parentId = 0; // control predecessor
32 uint32_t passId = 0; // enclosing PassBegin event
33};
34
36 uint32_t eventId = 0; // 0 ⇒ last Error, else last event
37 std::string resource; // optional: focus on a bound resource name
38};
39
41 std::vector<uint32_t> eventIds;
42 std::vector<RenderEvent> path; // chronological events in the slice
43 std::vector<std::string> passes; // nested pass names at criterion
44 std::string summary;
45};
46
57public:
59 ~RenderFlow() override;
60
61 void clear();
62 void setMaxEvents(size_t n);
63 size_t maxEvents() const { return maxEvents_; }
64 size_t eventCount() const { return count_; }
65
68 public:
70 public:
71 using iterator_category = std::forward_iterator_tag;
73 using difference_type = std::ptrdiff_t;
74 using pointer = const RenderEvent*;
75 using reference = const RenderEvent&;
76
77 const_iterator() = default;
78 reference operator*() const { return (*g_)[idx_]; }
79 pointer operator->() const { return &(*g_)[idx_]; }
81 ++idx_;
82 return *this;
83 }
85 const_iterator t = *this;
86 ++(*this);
87 return t;
88 }
89 bool operator==(const const_iterator& o) const {
90 return g_ == o.g_ && idx_ == o.idx_;
91 }
92 bool operator!=(const const_iterator& o) const { return !(*this == o); }
93
94 private:
95 friend class EventsView;
96 const_iterator(const RenderFlow* g, size_t idx) : g_(g), idx_(idx) {}
97 const RenderFlow* g_ = nullptr;
98 size_t idx_ = 0;
99 };
100
101 explicit EventsView(const RenderFlow* g) : g_(g) {}
102
103 const_iterator begin() const { return const_iterator(g_, 0); }
104 const_iterator end() const { return const_iterator(g_, g_ ? g_->count_ : 0); }
105 bool empty() const { return !g_ || g_->count_ == 0; }
106 size_t size() const { return g_ ? g_->count_ : 0; }
107 const RenderEvent& operator[](size_t i) const { return (*g_)[i]; }
108 const RenderEvent& front() const { return (*g_)[0]; }
109 const RenderEvent& back() const { return (*g_)[g_->count_ - 1]; }
110
111 private:
112 const RenderFlow* g_ = nullptr;
113 };
114
115 EventsView events() const { return EventsView(this); }
116 const RenderEvent* event(uint32_t id) const;
117
118 // IRenderTracer
119 void frameBegin() override;
120 void frameEnd() override;
121 void passBegin(const char* name) override;
122 void passEnd(const char* name) override;
123 void target(const char* name) override;
124 void bind(const char* kind, const char* name) override;
125 void draw(const char* api, const char* detail) override;
126 void error(const char* message) override;
127
128 RenderSliceResult sliceBackward(const RenderSliceCriterion& c = {}) const;
129 std::string formatErrorReport(const std::string& errorMessage,
130 const RenderSliceCriterion& c = {}) const;
131
132private:
133 friend class EventsView;
135
136 uint32_t append(RenderEventKind kind, const std::string& name, const std::string& detail);
137 void retireSlot(size_t physical);
138 void ensureRing();
139 uint32_t findSeed(const RenderSliceCriterion& c) const;
140
141 size_t physicalIndex(size_t chrono) const {
142 return (head_ + chrono) % maxEvents_;
143 }
144 const RenderEvent& operator[](size_t chrono) const {
145 return slots_[physicalIndex(chrono)];
146 }
147 RenderEvent& operator[](size_t chrono) { return slots_[physicalIndex(chrono)]; }
148 RenderEvent& newest() { return (*this)[count_ - 1]; }
149
150 size_t maxEvents_ = 50000;
151 uint32_t nextEventId_ = 1;
152 uint32_t lastEventId_ = 0;
153
154 std::vector<RenderEvent> slots_;
155 size_t head_ = 0;
156 size_t count_ = 0;
157
158 std::vector<uint32_t> passStack_; // PassBegin event ids
159
160 // last Bind event id for (kind, name) — resource reaching-def for draws
161 std::unordered_map<std::string, uint32_t> lastBind_;
162 // Draw/Error → Bind / Pass deps
163 std::unordered_map<uint32_t, std::vector<uint32_t>> dataDeps_;
164};
165
166} // namespace eve::dev
Tok kind
#define EVENGINE_API
宿主(eve / libmain)导出宏;插件从进程导入同一批符号。
Definition Export.h:16
glm::vec3 n
Definition Grass.cpp:64
std::string error
uint32_t c
int idx
const char * name
Definition RockMesh.cpp:21
Optional render-pipeline tracer. Graphics / RenderSystem call the rt* helpers; when no tracer is inst...
Definition RenderTrace.h:14
bool operator!=(const const_iterator &o) const
bool operator==(const const_iterator &o) const
Chronological view over the live ring window (oldest → newest).
const RenderEvent & operator[](size_t i) const
const_iterator begin() const
EventsView(const RenderFlow *g)
const RenderEvent & back() const
const_iterator end() const
const RenderEvent & front() const
Render-pipeline flow tracer with a Weiser-style backward slice.
size_t eventCount() const
~RenderFlow() override
EventsView events() const
size_t maxEvents() const
std::vector< std::string > passes
std::vector< uint32_t > eventIds
std::vector< RenderEvent > path