builder 和 运行时修改隔离开

This commit is contained in:
2026-08-13 11:25:38 +08:00
parent 9e598a0318
commit 4a48e62aea
57 changed files with 1512 additions and 2592 deletions
@@ -72,8 +72,8 @@ struct Threading_Test_State_Value {
using Threading_Test_Double_State = Double_State_Strategy<Threading_Test_State_Base, Threading_Test_State_Value, Atomic_Wait_Mutex>;
using Threading_Test_Triple_State = Triple_State_Strategy<Threading_Test_State_Base, Threading_Test_State_Value, Atomic_Wait_Mutex>;
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) {}
Threading_Test_Scene_Renderable(std::atomic<int>& render_count, std::atomic<std::uint64_t>& maximum_sequence)
: Renderable_Base({.cache_enabled = false}), render_count(&render_count), maximum_sequence(&maximum_sequence) {}
void prepare(const Prepare_Render_Context& context) override {
render_count->fetch_add(1, std::memory_order_relaxed);
std::uint64_t maximum = maximum_sequence->load(std::memory_order_acquire);
@@ -83,7 +83,7 @@ struct Threading_Test_Scene_Renderable : Renderable_Base {
std::atomic<std::uint64_t>* maximum_sequence;
};
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) {}
Threading_Test_Render_Graph_Renderable(std::atomic<int>& executed) : Renderable_Base({.cache_enabled = false}), executed(&executed) {}
void build_prepare_graph(Renderable_Graph_Builder& graph) override {
graph.emplace("prepare", "Prepare",
[this](const Prepare_Render_Context&) {
@@ -513,8 +513,11 @@ TEST(threading_contract_test, scene_serializes_multiple_render_submitters_withou
constexpr int render_count = submitter_count * renders_per_submitter;
std::atomic<int> executed{};
std::atomic<std::uint64_t> maximum_sequence{};
auto renderable = std::make_shared<Threading_Test_Scene_Renderable>(scene, executed, maximum_sequence);
scene.attach_renderable(renderable);
auto renderable = renderive_Owner<Threading_Test_Scene_Renderable>::make(executed, maximum_sequence);
{
auto attach = scene.attach_builder();
attach.attach(renderable);
}
std::atomic<bool> start{};
std::vector<std::thread> submitters;
submitters.reserve(submitter_count);
@@ -538,8 +541,11 @@ TEST(threading_contract_test, scene_render_and_render_graph_rebuild_are_serializ
Scene2D_Context<> scene;
constexpr int render_count = 300;
std::atomic<int> executed{};
auto renderable = std::make_shared<Threading_Test_Render_Graph_Renderable>(scene, executed);
scene.attach_renderable(renderable).wait();
auto renderable = renderive_Owner<Threading_Test_Render_Graph_Renderable>::make(executed);
{
auto attach = scene.attach_builder();
attach.attach(renderable);
}
std::atomic<bool> start{};
std::thread renderer([&] {
wait_start(start);
@@ -563,12 +569,16 @@ TEST(threading_contract_test, scene_render_and_render_graph_rebuild_are_serializ
TEST(threading_contract_test, real_time_data_updates_can_race_with_scene_destruction) {
using Data = Latest_Real_Time_Data<int, std::mutex, Observer_State<Frame_Strategy_Real_Time_Data_Observer>>;
struct Renderable : Renderable_Base {
explicit Renderable(Scene_Base& scene) : Renderable_Base(scene) {}
explicit Renderable() : Renderable_Base() {}
};
using Attachment = Attach_Real_Time_Data<Renderable, Data>;
auto data = std::make_shared<Data>();
auto scene = std::make_unique<Scene2D_Context<>>();
auto renderable = std::make_shared<Attachment>(With_Real_Time_Data(data), *scene);
auto renderable = renderive_Owner<Attachment>::make(With_Real_Time_Data(data));
{
auto attach = scene->attach_builder();
attach.attach(renderable);
}
std::atomic<bool> start{};
std::atomic<bool> stop{};
std::atomic<int> updates{};