内核优化

This commit is contained in:
2026-08-10 15:47:51 +08:00
parent 302b1dcdfd
commit 3f37c8e6d5
25 changed files with 1081 additions and 32 deletions
@@ -215,3 +215,54 @@ TEST(scene_base_test, all_waiters_receive_the_same_render_failure) {
second.join();
EXPECT_EQ(failures.load(), 2);
}
struct Scene_Base_Throw_Once_Renderable : Renderable_Base {
explicit Scene_Base_Throw_Once_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = false}) {}
void render(const Scene_Render_Context&) override {
if (render_count.fetch_add(1, std::memory_order_acq_rel) == 0) {
throw std::runtime_error("first render failed");
}
}
std::atomic<int> render_count{};
};
TEST(scene_base_test, unobserved_render_failure_survives_next_successful_submission) {
Scene2D_Context<> scene;
auto renderable = std::make_shared<Scene_Base_Throw_Once_Renderable>(scene);
scene.attach_renderable(renderable);
scene.render();
scene.render();
EXPECT_THROW(scene.wait_for_render(), std::runtime_error);
EXPECT_EQ(renderable->render_count.load(std::memory_order_acquire), 2);
scene.render();
EXPECT_NO_THROW(scene.wait_for_render());
EXPECT_EQ(renderable->render_count.load(std::memory_order_acquire), 3);
}
struct Scene_Base_Render_Execution_Renderable : Renderable_Base {
explicit Scene_Base_Render_Execution_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = false}) {}
void render(const Scene_Render_Context& context) override {
context.scene->wait_for_render();
wait_returned.store(true, std::memory_order_release);
try {
context.scene->render();
} catch (const std::logic_error&) {
nested_render_rejected.store(true, std::memory_order_release);
}
try {
context.scene->set_renderable_configuration(*this, {.cache_enabled = true});
} catch (const std::logic_error&) {
mutation_rejected.store(true, std::memory_order_release);
}
}
std::atomic<bool> wait_returned{};
std::atomic<bool> nested_render_rejected{};
std::atomic<bool> mutation_rejected{};
};
TEST(scene_base_test, taskflow_execution_thread_cannot_wait_on_or_mutate_current_scene) {
Scene2D_Context<> scene;
auto renderable = std::make_shared<Scene_Base_Render_Execution_Renderable>(scene);
scene.attach_renderable(renderable);
scene.render();
scene.wait_for_render();
EXPECT_TRUE(renderable->wait_returned.load(std::memory_order_acquire));
EXPECT_TRUE(renderable->nested_render_rejected.load(std::memory_order_acquire));
EXPECT_TRUE(renderable->mutation_rejected.load(std::memory_order_acquire));
}