所有权添加完成

This commit is contained in:
2026-08-13 06:20:13 +08:00
parent 3e9b924776
commit a517804d27
51 changed files with 1961 additions and 1108 deletions
@@ -8,9 +8,9 @@
static_assert(std::same_as<decltype(std::declval<const Scene2D_Context<>&>().topology_snapshot()), Scene_Base::Topology_Snapshot>);
struct Scene2D_Context_Test_Renderable : Renderable_Base {
explicit Scene2D_Context_Test_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = false}) {}
void prepare(const Scene_Render_Context& context) override {
void prepare(const Prepare_Render_Context&) override {
++render_count;
scene_is_2d = dynamic_cast<Scene_2D_Base*>(context.scene) != nullptr;
scene_is_2d = dynamic_cast<Scene_2D_Base*>(&scene()) != nullptr;
render_thread = std::this_thread::get_id();
}
std::atomic<int> render_count{};
@@ -28,7 +28,7 @@ TEST(scene2d_context_test, swaps_renderable_cache_and_renders_in_background) {
EXPECT_EQ(first->render_count.load(), 1);
EXPECT_TRUE(first->scene_is_2d);
EXPECT_NE(first->render_thread, caller_thread);
scene.detach_renderable(*first);
scene.detach_renderable(first);
scene.attach_renderable(second);
scene.render();
scene.wait_for_render();
@@ -38,7 +38,7 @@ TEST(scene2d_context_test, swaps_renderable_cache_and_renders_in_background) {
}
struct Scene2D_Final_Cache_Blocking_Renderable : Renderable_Base {
explicit Scene2D_Final_Cache_Blocking_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = false}) {}
void prepare(const Scene_Render_Context&) override {
void prepare(const Prepare_Render_Context&) override {
while (!release.load(std::memory_order_acquire)) {
started.store(true, std::memory_order_release);
std::this_thread::yield();
@@ -73,13 +73,13 @@ TEST(scene2d_context_test, final_color_cache_access_waits_for_render_completion)
}
struct Scene2D_Cached_Renderable : Renderable_Base {
Scene2D_Cached_Renderable(Scene_Base& scene, std::uint64_t value) : Renderable_Base(scene, {.cache_enabled = true}), value(value) {}
void prepare(const Scene_Render_Context&) override {
void prepare(const Prepare_Render_Context&) override {
++render_count;
}
void build_paint_graph(Renderable_Graph_Builder& graph) override {
graph.emplace("paint", "Paint", Render_Node_Kind::paint,
[this](const Scene_Render_Context& context) {
dynamic_cast<Recording_Color_Cache&>(*context.color_cache).append(value);
graph.emplace("paint", "Paint",
[this](const Paint_Render_Context& context) {
dynamic_cast<Recording_Color_Cache&>(context.color_cache).append(value);
});
}
std::uint64_t value;
@@ -92,7 +92,7 @@ TEST(scene2d_context_test, reattached_cached_renderable_rebuilds_removed_color_c
scene.render();
scene.wait_for_render();
EXPECT_EQ(renderable->render_count, 1);
scene.detach_renderable(*renderable);
scene.detach_renderable(renderable);
scene.attach_renderable(renderable);
scene.render();
scene.wait_for_render();
@@ -110,13 +110,13 @@ TEST(scene2d_context_test, dependency_reparent_invalidates_cached_child) {
scene.attach_renderable(first_parent);
scene.attach_renderable(second_parent);
scene.attach_renderable(child);
scene.set_dependency_parent(*child, first_parent.get());
scene.set_dependency_parent(child, first_parent);
scene.render();
scene.wait_for_render();
EXPECT_EQ(first_parent->render_count, 1);
EXPECT_EQ(second_parent->render_count, 1);
EXPECT_EQ(child->render_count, 1);
scene.set_dependency_parent(*child, second_parent.get());
scene.set_dependency_parent(child, second_parent);
scene.render();
scene.wait_for_render();
EXPECT_EQ(first_parent->render_count, 1);
@@ -131,8 +131,8 @@ TEST(scene2d_context_test, multiple_dependency_parents_invalidate_cached_child)
scene.attach_renderable(first_parent);
scene.attach_renderable(second_parent);
scene.attach_renderable(child);
scene.set_dependency_parent(*child, first_parent.get());
scene.add_dependency_parent(*child, *second_parent);
scene.set_dependency_parent(child, first_parent);
scene.add_dependency_parent(child, second_parent);
scene.render();
scene.wait_for_render();
EXPECT_EQ(child->render_count, 1);
@@ -159,7 +159,7 @@ TEST(scene2d_context_test, final_color_cache_callback_can_reenter_scene_control_
scene.render();
scene.wait_for_render();
scene.with_final_color_cache([&](const Recording_Color_Cache&) {
scene.set_renderable_configuration(*renderable, {.cache_enabled = false});
scene.set_renderable_configuration(renderable, {.cache_enabled = false});
});
EXPECT_FALSE(renderable->configuration().cache_enabled);
}
@@ -171,14 +171,14 @@ TEST(scene2d_context_test, detach_dependency_parent_invalidates_promoted_cached_
scene.attach_renderable(grandparent);
scene.attach_renderable(parent);
scene.attach_renderable(child);
scene.set_dependency_parent(*parent, grandparent.get());
scene.set_dependency_parent(*child, parent.get());
scene.set_dependency_parent(parent, grandparent);
scene.set_dependency_parent(child, parent);
scene.render();
scene.wait_for_render();
EXPECT_EQ(grandparent->render_count, 1);
EXPECT_EQ(parent->render_count, 1);
EXPECT_EQ(child->render_count, 1);
scene.detach_renderable(*parent);
scene.detach_renderable(parent);
scene.render();
scene.wait_for_render();
EXPECT_EQ(grandparent->render_count, 1);
@@ -216,8 +216,8 @@ TEST(scene2d_context_test, failed_attach_leaves_renderable_fully_detached) {
}
struct Scene2D_Viewport_Snapshot_Renderable : Renderable_Base {
explicit Scene2D_Viewport_Snapshot_Renderable(Scene_Base& scene) : Renderable_Base(scene) {}
void prepare(const Scene_Render_Context& context) override {
viewport = context.viewport;
void prepare(const Prepare_Render_Context& context) override {
viewport = context.frame.viewport;
}
Frame_Viewport viewport;
};