错误处理

This commit is contained in:
2026-08-16 17:53:46 +08:00
parent 00a3c54820
commit 8612b5ff86
47 changed files with 744 additions and 544 deletions
@@ -9,7 +9,7 @@ TEST(Renderive_Core2_Frame_Pipeline, ManualLifecycleSeparatesPrepareRefreshAndRe
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Manual});
plot.init();
plot.set_viewport_size({96, 54});
ASSERT_TRUE(plot.prepare_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
auto snapshot = plot.frame_status();
EXPECT_EQ(snapshot.mode, Plot_Frame_Mode::Manual);
EXPECT_EQ(snapshot.last_event, "prepared");
@@ -18,14 +18,14 @@ TEST(Renderive_Core2_Frame_Pipeline, ManualLifecycleSeparatesPrepareRefreshAndRe
EXPECT_EQ(snapshot.consumed_frame_count, 0u);
EXPECT_EQ(snapshot.pending_frame_count, 1u);
EXPECT_EQ(snapshot.latest_sequence, 1u);
ASSERT_TRUE(plot.refresh_manual_frame());
ASSERT_EQ(plot.refresh_manual_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "refresh_succeeded");
EXPECT_EQ(snapshot.produced_frame_count, 1u);
EXPECT_EQ(snapshot.consumed_frame_count, 0u);
EXPECT_EQ(snapshot.pending_frame_count, 0u);
EXPECT_EQ(snapshot.latest_sequence, 1u);
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "rendered");
EXPECT_EQ(snapshot.produced_frame_count, 1u);
@@ -39,7 +39,7 @@ TEST(Renderive_Core2_Frame_Pipeline, HighFrequencyLowLatencyLifecycleExposesKern
plot.init();
plot.set_viewport_size({96, 54});
EXPECT_EQ(plot.set_max_render_fps(1'000'000'000.0), Plot_Control_Error::none);
ASSERT_TRUE(plot.prepare_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
auto snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "published");
EXPECT_EQ(snapshot.limit_state, "frequency_limited");
@@ -48,7 +48,7 @@ TEST(Renderive_Core2_Frame_Pipeline, HighFrequencyLowLatencyLifecycleExposesKern
EXPECT_EQ(snapshot.produced_frame_count, 1u);
EXPECT_EQ(snapshot.consumed_frame_count, 0u);
EXPECT_EQ(snapshot.pending_frame_count, 1u);
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "lifecycle_completed");
EXPECT_DOUBLE_EQ(snapshot.frequency_hz, 1'000'000'000.0);
@@ -73,8 +73,8 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyConsumerFeedbackFlowsThroughCore2
plot.set_viewport_size({96, 54});
EXPECT_EQ(plot.set_max_render_fps(100.0), Plot_Control_Error::none);
EXPECT_EQ(plot.set_consumer_feedback({40'000'000}), Plot_Control_Error::none);
ASSERT_TRUE(plot.prepare_frame());
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
const auto snapshot = plot.frame_status();
EXPECT_TRUE(snapshot.frequency_limit_enabled);
EXPECT_TRUE(snapshot.consumer_feedback_enabled);
@@ -96,8 +96,8 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyLimitsCanBeClearedIndependently)
EXPECT_EQ(plot.set_consumer_feedback({40'000'000}), Plot_Control_Error::none);
plot.clear_consumer_feedback();
plot.clear_max_render_fps();
ASSERT_TRUE(plot.prepare_frame());
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
const auto snapshot = plot.frame_status();
EXPECT_FALSE(snapshot.frequency_limit_enabled);
EXPECT_FALSE(snapshot.consumer_feedback_enabled);
@@ -110,15 +110,15 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyReplacementRetiresOldFrameWithout
Plot_Scene plot;
plot.init();
plot.set_viewport_size({64, 40});
ASSERT_TRUE(plot.prepare_frame());
ASSERT_TRUE(plot.prepare_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
auto snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "published");
EXPECT_EQ(snapshot.produced_frame_count, 2u);
EXPECT_EQ(snapshot.dropped_frame_count, 1u);
EXPECT_EQ(snapshot.pending_frame_count, 1u);
EXPECT_EQ(snapshot.latest_sequence, 2u);
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "lifecycle_completed");
EXPECT_EQ(snapshot.produced_frame_count, 2u);
@@ -131,7 +131,7 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyDiscardAndEmptyRenderRemainObserv
Plot_Scene plot;
plot.init();
plot.set_viewport_size({64, 40});
ASSERT_TRUE(plot.prepare_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_TRUE(plot.discard_pending_frame());
auto snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "manually_discarded");
@@ -140,7 +140,7 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyDiscardAndEmptyRenderRemainObserv
EXPECT_EQ(snapshot.dropped_frame_count, 1u);
EXPECT_EQ(snapshot.pending_frame_count, 0u);
EXPECT_EQ(snapshot.latest_sequence, 1u);
EXPECT_FALSE(plot.render_prepared_frame());
EXPECT_NE(plot.render_prepared_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "swap_failed");
EXPECT_EQ(snapshot.failed_operation_count, 1u);
@@ -151,7 +151,7 @@ TEST(Renderive_Core2_Frame_Pipeline, ManualDiscardAndFailedRefreshUpdateObserver
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Manual});
plot.init();
plot.set_viewport_size({64, 40});
ASSERT_TRUE(plot.prepare_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_TRUE(plot.discard_pending_frame());
auto snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "manually_discarded");
@@ -160,7 +160,7 @@ TEST(Renderive_Core2_Frame_Pipeline, ManualDiscardAndFailedRefreshUpdateObserver
EXPECT_EQ(snapshot.pending_frame_count, 0u);
EXPECT_EQ(snapshot.latest_sequence, 1u);
const auto last_paint_duration_ns = snapshot.paint_duration_ns;
EXPECT_FALSE(plot.refresh_manual_frame());
EXPECT_NE(plot.refresh_manual_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "refresh_failed");
EXPECT_EQ(snapshot.failed_operation_count, 1u);
@@ -172,16 +172,16 @@ TEST(Renderive_Core2_Frame_Pipeline, PlaybackPreservesQueueDepthAndEmptyAcquireF
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Playback});
plot.init();
plot.set_viewport_size({64, 40});
ASSERT_TRUE(plot.prepare_frame());
ASSERT_TRUE(plot.prepare_frame());
ASSERT_TRUE(plot.prepare_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
auto snapshot = plot.frame_status();
EXPECT_EQ(snapshot.produced_frame_count, 3u);
EXPECT_EQ(snapshot.pending_frame_count, 3u);
EXPECT_EQ(snapshot.latest_sequence, 3u);
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_TRUE(plot.render_prepared_frame());
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "rendered");
EXPECT_EQ(snapshot.consumed_frame_count, 3u);
@@ -190,7 +190,7 @@ TEST(Renderive_Core2_Frame_Pipeline, PlaybackPreservesQueueDepthAndEmptyAcquireF
const auto last_paint_duration_ns = snapshot.paint_duration_ns;
const auto last_render_duration_ns = snapshot.render_duration_ns;
const auto last_queue_wait_ns = snapshot.queue_wait_ns;
EXPECT_FALSE(plot.render_prepared_frame());
EXPECT_NE(plot.render_prepared_frame(), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.last_event, "queue_empty");
EXPECT_EQ(snapshot.failed_operation_count, 1u);
@@ -204,13 +204,13 @@ TEST(Renderive_Core2_Frame_Pipeline, PlaybackFullCyclePreservesPreviouslyQueuedF
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Playback});
plot.init();
plot.set_viewport_size({96, 54});
ASSERT_TRUE(plot.prepare_frame());
ASSERT_TRUE(plot.prepare_frame());
ASSERT_TRUE(plot.prepare_frame());
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Error::none);
auto snapshot = plot.frame_status();
ASSERT_EQ(snapshot.pending_frame_count, 3u);
ASSERT_EQ(snapshot.produced_frame_count, 3u);
ASSERT_TRUE(plot.render_frame(true));
ASSERT_EQ(plot.render_frame(true), Plot_Render_Error::none);
snapshot = plot.frame_status();
EXPECT_EQ(snapshot.mode, Plot_Frame_Mode::Playback);
EXPECT_EQ(snapshot.last_event, "rendered");
@@ -228,19 +228,19 @@ TEST(Renderive_Core2_Frame_Pipeline, EveryModeHonorsActiveDirtyAndForceRenderGat
scene.init();
scene.set_viewport_size({80, 45});
EXPECT_FALSE(scene.view_active());
EXPECT_FALSE(scene.render_frame(false));
EXPECT_NE(scene.render_frame(false), Plot_Render_Error::none);
EXPECT_EQ(scene.frame_status().observation_count, 0u);
scene.activate_view();
ASSERT_TRUE(scene.render_frame(false));
ASSERT_EQ(scene.render_frame(false), Plot_Render_Error::none);
const auto completed = scene.frame_status();
EXPECT_EQ(completed.mode, mode);
EXPECT_EQ(completed.consumed_frame_count, 1u);
EXPECT_FALSE(scene.render_frame(false));
EXPECT_NE(scene.render_frame(false), Plot_Render_Error::none);
EXPECT_EQ(scene.frame_status().consumed_frame_count, 1u);
scene.deactivate_view();
scene.set_background_color(Color{8, 16, 24, 255});
EXPECT_FALSE(scene.render_frame(false));
ASSERT_TRUE(scene.render_frame(true));
EXPECT_NE(scene.render_frame(false), Plot_Render_Error::none);
ASSERT_EQ(scene.render_frame(true), Plot_Render_Error::none);
EXPECT_EQ(scene.frame_status().consumed_frame_count, 2u);
};
verify(Plot_Frame_Mode::Manual);
@@ -261,7 +261,7 @@ TEST(Renderive_Core2_Frame_Pipeline, FrequencyConfigurationRejectsInvalidValuesA
Plot_Scene playback({.frame_mode = Plot_Frame_Mode::Playback});
EXPECT_EQ(manual.set_max_render_fps(60.0), Plot_Control_Error::unsupported_frame_mode);
EXPECT_EQ(playback.set_max_render_fps(60.0), Plot_Control_Error::unsupported_frame_mode);
EXPECT_FALSE(playback.refresh_manual_frame());
EXPECT_NE(playback.refresh_manual_frame(), Plot_Render_Error::none);
EXPECT_FALSE(playback.discard_pending_frame());
}
} // namespace