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
@@ -8,6 +8,7 @@
#include "renderive/real_time_data/Real_Time_Data.hpp"
#include "renderive/renderable/Renderable.hpp"
#include "renderive/scene/Scene.hpp"
#include "Scene_Test_Helpers.hpp"
class Scene_Memory_Resource_Test_Resource : public std::pmr::memory_resource {
public:
std::size_t allocation_count() const noexcept {
@@ -32,7 +33,8 @@ private:
std::atomic<std::size_t> deallocation_count_{};
};
struct Scene_Memory_Resource_Test_Renderable : Renderable_Base {
explicit Scene_Memory_Resource_Test_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = false}) {}
explicit Scene_Memory_Resource_Test_Renderable(std::pmr::memory_resource& memory_resource = *std::pmr::get_default_resource())
: Renderable_Base({.cache_enabled = false}, memory_resource) {}
void build_prepare_graph(Renderable_Graph_Builder& graph) override {
auto first = graph.emplace("first", "prepare_memory_resource_test",
[](const Prepare_Render_Context&) {});
@@ -55,31 +57,24 @@ struct Scene_Memory_Resource_Test_Property_Product {
Scene_Memory_Resource_Test_Property_Product(const Scene_Memory_Resource_Test_Properties& properties, int offset) : value(properties.value + offset) {}
int value;
};
TEST(scene_memory_resource_test, propagates_thread_safe_scene_memory_domain) {
TEST(scene_memory_resource_test, renderable_builder_can_use_scene_memory_domain_explicitly) {
Scene_Memory_Resource_Test_Resource upstream;
Scene2D_Context<> scene(upstream);
EXPECT_EQ(&scene.upstream_memory_resource(), &upstream);
EXPECT_NE(&scene.memory_resource(), &upstream);
auto factory_renderable = scene.make_renderable<Scene_Memory_Resource_Test_Renderable>();
auto independent_renderable = std::make_shared<Scene_Memory_Resource_Test_Renderable>(scene);
EXPECT_EQ(&factory_renderable->memory_resource(), &scene.memory_resource());
EXPECT_EQ(&independent_renderable->memory_resource(), &scene.memory_resource());
scene.attach_renderable(factory_renderable);
scene.attach_renderable(independent_renderable);
auto renderable = renderive_Owner<Scene_Memory_Resource_Test_Renderable>::make(scene.memory_resource());
EXPECT_EQ(&renderable->memory_resource(), &scene.memory_resource());
attach_initial(scene, renderable);
scene.render();
scene.wait_for_render();
EXPECT_GT(upstream.allocation_count(), 0);
}
TEST(scene_memory_resource_test, keeps_factory_memory_domain_alive_until_renderable_release) {
TEST(scene_memory_resource_test, explicit_scene_memory_domain_remains_valid_while_scene_is_alive) {
Scene_Memory_Resource_Test_Resource upstream;
std::shared_ptr<Scene_Memory_Resource_Test_Renderable> renderable;
{
Scene2D_Context<> scene(upstream);
renderable = scene.make_renderable<Scene_Memory_Resource_Test_Renderable>();
renderable->build_graph_for_test();
}
renderable.reset();
EXPECT_GT(upstream.deallocation_count(), 0);
Scene2D_Context<> scene(upstream);
auto renderable = renderive_Owner<Scene_Memory_Resource_Test_Renderable>::make(scene.memory_resource());
renderable->build_graph_for_test();
EXPECT_EQ(&renderable->memory_resource(), &scene.memory_resource());
}
TEST(scene_memory_resource_test, supports_independent_resource_aware_components) {
Scene_Memory_Resource_Test_Resource memory_resource;
@@ -101,17 +96,10 @@ TEST(scene_memory_resource_test, supports_independent_resource_aware_components)
EXPECT_EQ(unique_product->value, 8);
EXPECT_GT(memory_resource.allocation_count(), 0);
}
TEST(scene_memory_resource_test, keeps_independent_renderable_memory_domain_alive_until_renderable_release) {
Scene_Memory_Resource_Test_Resource upstream;
std::shared_ptr<Scene_Memory_Resource_Test_Renderable> renderable;
{
Scene2D_Context<> scene(upstream);
renderable = std::make_shared<Scene_Memory_Resource_Test_Renderable>(scene);
renderable->build_graph_for_test();
}
auto& memory_resource = renderable->memory_resource();
void* storage = memory_resource.allocate(32, alignof(std::max_align_t));
memory_resource.deallocate(storage, 32, alignof(std::max_align_t));
renderable.reset();
EXPECT_GT(upstream.deallocation_count(), 0);
TEST(scene_memory_resource_test, supports_explicit_independent_renderable_memory_resource) {
Scene_Memory_Resource_Test_Resource memory_resource;
auto renderable = renderive_Owner<Scene_Memory_Resource_Test_Renderable>::make(memory_resource);
renderable->build_graph_for_test();
EXPECT_EQ(&renderable->memory_resource(), &memory_resource);
EXPECT_GT(memory_resource.allocation_count(), 0);
}