内核优化
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user