大重构改完

This commit is contained in:
2026-08-12 21:31:02 +08:00
parent 7c00b8565d
commit 15c3d21f2d
73 changed files with 4303 additions and 1727 deletions
@@ -74,7 +74,7 @@ using Threading_Test_Triple_State = Triple_State_Strategy<Threading_Test_State_B
struct Threading_Test_Scene_Renderable : Renderable_Base {
Threading_Test_Scene_Renderable(Scene_Base& scene, std::atomic<int>& render_count, std::atomic<std::uint64_t>& maximum_sequence)
: Renderable_Base(scene, {.cache_enabled = false}), render_count(&render_count), maximum_sequence(&maximum_sequence) {}
void render(const Scene_Render_Context& context) override {
void prepare(const Scene_Render_Context& context) override {
render_count->fetch_add(1, std::memory_order_relaxed);
std::uint64_t maximum = maximum_sequence->load(std::memory_order_acquire);
while (maximum < context.render_sequence && !maximum_sequence->compare_exchange_weak(maximum, context.render_sequence, std::memory_order_acq_rel)) {}
@@ -82,13 +82,17 @@ struct Threading_Test_Scene_Renderable : Renderable_Base {
std::atomic<int>* render_count;
std::atomic<std::uint64_t>* maximum_sequence;
};
struct Threading_Test_Task_Graph_Renderable : Renderable_Base {
Threading_Test_Task_Graph_Renderable(Scene_Base& scene, std::atomic<int>& executed) : Renderable_Base(scene, {.cache_enabled = false}), executed(&executed) {}
void build_task_graph(Renderable_Task_Graph& graph) override {
graph.emplace([this](const Scene_Render_Context&) {
struct Threading_Test_Render_Graph_Renderable : Renderable_Base {
Threading_Test_Render_Graph_Renderable(Scene_Base& scene, std::atomic<int>& executed) : Renderable_Base(scene, {.cache_enabled = false}), executed(&executed) {}
void build_prepare_graph(Renderable_Graph_Builder& graph) override {
graph.emplace("prepare", "Prepare", Render_Node_Kind::prepare,
[this](const Scene_Render_Context&) {
executed->fetch_add(1, std::memory_order_relaxed);
});
}
void request_graph_rebuild() noexcept {
rebuild_render_graph();
}
std::atomic<int>* executed;
};
}
@@ -530,11 +534,11 @@ TEST(threading_contract_test, scene_serializes_multiple_render_submitters_withou
EXPECT_EQ(executed.load(std::memory_order_acquire), render_count);
EXPECT_EQ(maximum_sequence.load(std::memory_order_acquire), render_count);
}
TEST(threading_contract_test, scene_render_and_task_graph_rebuild_can_run_concurrently) {
TEST(threading_contract_test, scene_render_and_render_graph_rebuild_can_run_concurrently) {
Scene2D_Context<> scene;
constexpr int render_count = 300;
std::atomic<int> executed{};
auto renderable = std::make_shared<Threading_Test_Task_Graph_Renderable>(scene, executed);
auto renderable = std::make_shared<Threading_Test_Render_Graph_Renderable>(scene, executed);
scene.attach_renderable(renderable);
std::atomic<bool> start{};
std::atomic<bool> renderer_done{};
@@ -549,7 +553,7 @@ TEST(threading_contract_test, scene_render_and_task_graph_rebuild_can_run_concur
std::thread rebuilder([&] {
wait_start(start);
while (!renderer_done.load(std::memory_order_acquire)) {
renderable->rebuild_task_graph();
renderable->request_graph_rebuild();
std::this_thread::yield();
}
});