所有权指针明确
This commit is contained in:
+18
-18
@@ -1162,7 +1162,7 @@ void Plot::Private::render_frame(Plot_Render_Tick tick) {
|
||||
|
||||
void Plot::Private::publish_completed_frame(
|
||||
not_null<Render_Frame*> completed) {
|
||||
std::optional<not_null<Managed_Frame*>> managed;
|
||||
Managed_Frame* managed{};
|
||||
for (auto& slot : frame_slots) {
|
||||
const auto frame = std::visit(
|
||||
[](const auto& value) -> not_null<Render_Frame*> {
|
||||
@@ -1175,7 +1175,7 @@ void Plot::Private::publish_completed_frame(
|
||||
}
|
||||
if (!managed)
|
||||
throw std::logic_error("completed frame has no owning Plot policy slot");
|
||||
if ((*managed)->state.load(std::memory_order_acquire) !=
|
||||
if (managed->state.load(std::memory_order_acquire) !=
|
||||
Frame_State::rendering)
|
||||
throw std::logic_error("completed Plot frame is not rendering");
|
||||
const auto frame = completed;
|
||||
@@ -1188,7 +1188,7 @@ void Plot::Private::publish_completed_frame(
|
||||
std::uint32_t width{};
|
||||
std::uint32_t height{};
|
||||
if (auto *frame_2d =
|
||||
std::get_if<std::unique_ptr<Frame_2D>>(&(*managed)->frame)) {
|
||||
std::get_if<std::unique_ptr<Frame_2D>>(&managed->frame)) {
|
||||
pixel_layout = Plot_Pixel_Layout::bgra8;
|
||||
const auto image = (*frame_2d)->image();
|
||||
width = static_cast<std::uint32_t>(image.width);
|
||||
@@ -1201,7 +1201,7 @@ void Plot::Private::publish_completed_frame(
|
||||
height = static_cast<std::uint32_t>(output.height);
|
||||
}
|
||||
} else {
|
||||
auto &frame_3d = std::get<std::unique_ptr<Frame_3D>>((*managed)->frame);
|
||||
auto &frame_3d = std::get<std::unique_ptr<Frame_3D>>(managed->frame);
|
||||
rendered_identity = frame_3d->rendered_identity();
|
||||
const auto extent = frame_3d->extent();
|
||||
width = extent.width;
|
||||
@@ -1211,7 +1211,7 @@ void Plot::Private::publish_completed_frame(
|
||||
}
|
||||
|
||||
auto pixels = std::make_shared<const Plot_Pixel_Frame>(Plot_Pixel_Frame{
|
||||
std::move(pixel_storage), pixel_layout, (*managed)->presentation_time,
|
||||
std::move(pixel_storage), pixel_layout, managed->presentation_time,
|
||||
identity.sequence, identity.correlation_id, rendered_identity.sequence,
|
||||
rendered_identity.correlation_id, width, height});
|
||||
|
||||
@@ -1225,14 +1225,14 @@ void Plot::Private::publish_completed_frame(
|
||||
std::chrono::steady_clock::now() - publish_started)
|
||||
.count())));
|
||||
auto expected = Frame_State::rendering;
|
||||
if (!(*managed)->state.compare_exchange_strong(
|
||||
if (!managed->state.compare_exchange_strong(
|
||||
expected, Frame_State::consuming, std::memory_order_acq_rel,
|
||||
std::memory_order_acquire))
|
||||
throw std::logic_error("Plot frame left rendering before pixel publish");
|
||||
}
|
||||
|
||||
void Plot::Private::consume_completed_frame(not_null<Render_Frame*> frame) {
|
||||
std::optional<not_null<Managed_Frame*>> managed;
|
||||
Managed_Frame* managed{};
|
||||
for (auto& slot : frame_slots) {
|
||||
const auto address = std::visit(
|
||||
[](const auto& value) -> not_null<Render_Frame*> {
|
||||
@@ -1253,7 +1253,7 @@ void Plot::Private::consume_completed_frame(not_null<Render_Frame*> frame) {
|
||||
* 释放 Plot 的 view/update 门,并立刻唤醒 busy 期间保留的 latest tick。
|
||||
* 之后外接 DAG 仍在当前 Frame trace 内执行,但不会阻塞下一帧渲染。
|
||||
*/
|
||||
if (std::holds_alternative<std::unique_ptr<Frame_2D>>((*managed)->frame))
|
||||
if (std::holds_alternative<std::unique_ptr<Frame_2D>>(managed->frame))
|
||||
release_render_admission(lifetime);
|
||||
if (post_publish_graph.empty()) return;
|
||||
|
||||
@@ -1336,7 +1336,7 @@ void Plot::Private::consume_retired_frames() {
|
||||
}
|
||||
|
||||
void Plot::Private::retire_completed_frame(not_null<Render_Frame*> frame) {
|
||||
std::optional<not_null<Managed_Frame*>> managed;
|
||||
Managed_Frame* managed{};
|
||||
for (auto& slot : frame_slots) {
|
||||
const auto address = std::visit(
|
||||
[](const auto& value) -> not_null<Render_Frame*> {
|
||||
@@ -1352,15 +1352,15 @@ void Plot::Private::retire_completed_frame(not_null<Render_Frame*> frame) {
|
||||
|
||||
auto* head = retired_frames.load(std::memory_order_relaxed);
|
||||
do {
|
||||
(*managed)->retired_next.store(head, std::memory_order_relaxed);
|
||||
managed->retired_next.store(head, std::memory_order_relaxed);
|
||||
} while (!retired_frames.compare_exchange_weak(
|
||||
head, managed->get(), std::memory_order_release,
|
||||
head, managed, std::memory_order_release,
|
||||
std::memory_order_relaxed));
|
||||
arm_tick_consumer(lifetime);
|
||||
}
|
||||
|
||||
void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
|
||||
std::optional<not_null<Managed_Frame*>> managed;
|
||||
Managed_Frame* managed{};
|
||||
for (auto& slot : frame_slots) {
|
||||
const auto address = std::visit(
|
||||
[](const auto& value) -> not_null<Render_Frame*> {
|
||||
@@ -1376,9 +1376,9 @@ void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
|
||||
throw std::logic_error("retired frame has no owned Plot slot");
|
||||
|
||||
const auto completion_latency =
|
||||
(*managed)->submitted_at.time_since_epoch().count() == 0
|
||||
managed->submitted_at.time_since_epoch().count() == 0
|
||||
? std::chrono::steady_clock::duration::zero()
|
||||
: std::chrono::steady_clock::now() - (*managed)->submitted_at;
|
||||
: std::chrono::steady_clock::now() - managed->submitted_at;
|
||||
std::optional<Datoviz_Frame_Observation> datoviz_observation;
|
||||
if (auto* frame_3d = dynamic_cast<Frame_3D*>(frame.get())) {
|
||||
datoviz_observation = frame_3d->take_datoviz_observation();
|
||||
@@ -1400,8 +1400,8 @@ void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
|
||||
completed_frame_statistics.reset();
|
||||
applied_statistics_generation = statistics_generation_value;
|
||||
}
|
||||
(*managed)->statistics = completed_frame_statistics.submit(*frame);
|
||||
(*managed)->statistics_generation = statistics_generation_value;
|
||||
managed->statistics = completed_frame_statistics.submit(*frame);
|
||||
managed->statistics_generation = statistics_generation_value;
|
||||
|
||||
std::optional<Taskflow_Frame_Trace> captured_trace;
|
||||
nlohmann::json captured_components;
|
||||
@@ -1430,11 +1430,11 @@ void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
|
||||
}
|
||||
|
||||
auto expected = Frame_State::consuming;
|
||||
if (!(*managed)->state.compare_exchange_strong(
|
||||
if (!managed->state.compare_exchange_strong(
|
||||
expected, Frame_State::available, std::memory_order_acq_rel,
|
||||
std::memory_order_acquire))
|
||||
throw std::logic_error("retired Plot frame is not consuming");
|
||||
latest_statistics_frame.store(managed->get(), std::memory_order_release);
|
||||
latest_statistics_frame.store(managed, std::memory_order_release);
|
||||
|
||||
/* 物理槽是唯一背压原因;归还任意槽后只解除一次耗尽状态。 */
|
||||
auto admission = Render_Admission_State::frame_slots_exhausted;
|
||||
|
||||
Reference in New Issue
Block a user