builder 和 运行时修改隔离开
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
#include "renderive/renderable/Renderable.hpp"
|
||||
#include "renderive/scene/Scene.hpp"
|
||||
struct Renderable_Base_Test_Renderable : Renderable_Base {
|
||||
Renderable_Base_Test_Renderable(Scene_Base& scene, bool cache_enabled) : Renderable_Base(scene, {.cache_enabled = cache_enabled}) {}
|
||||
Renderable_Base_Test_Renderable(bool cache_enabled) : Renderable_Base({.cache_enabled = cache_enabled}) {}
|
||||
void prepare(const Prepare_Render_Context&) override {
|
||||
++render_count;
|
||||
}
|
||||
@@ -16,19 +16,30 @@ struct Renderable_Base_Test_Renderable : Renderable_Base {
|
||||
TEST(renderable_base_test, exposes_scene_and_strategy_through_accessors) {
|
||||
Scene2D_Context<> low_latency_scene;
|
||||
Scene2D_Context<Manual_Refresh_Strategy<Scene2D_Frame_Data>> manual_scene;
|
||||
Renderable_Base_Test_Renderable low_latency_renderable(low_latency_scene, true);
|
||||
Renderable_Base_Test_Renderable manual_renderable(manual_scene, true);
|
||||
EXPECT_EQ(&low_latency_renderable.scene(), &low_latency_scene);
|
||||
EXPECT_EQ(&low_latency_renderable.scene().frame_control_strategy(), &low_latency_scene.frame_control);
|
||||
EXPECT_DOUBLE_EQ(low_latency_renderable.scene().frame_control_strategy().frequency_hz(), 60.0);
|
||||
EXPECT_TRUE(std::isnan(manual_renderable.scene().frame_control_strategy().frequency_hz()));
|
||||
auto low_latency_renderable = renderive_Owner<Renderable_Base_Test_Renderable>::make(true);
|
||||
auto manual_renderable = renderive_Owner<Renderable_Base_Test_Renderable>::make(true);
|
||||
{
|
||||
auto attach = low_latency_scene.attach_builder();
|
||||
attach.attach(low_latency_renderable);
|
||||
}
|
||||
{
|
||||
auto attach = manual_scene.attach_builder();
|
||||
attach.attach(manual_renderable);
|
||||
}
|
||||
EXPECT_EQ(&low_latency_renderable->scene(), &low_latency_scene);
|
||||
EXPECT_EQ(&low_latency_renderable->scene().frame_control_strategy(), &low_latency_scene.frame_control);
|
||||
EXPECT_DOUBLE_EQ(low_latency_renderable->scene().frame_control_strategy().frequency_hz(), 60.0);
|
||||
EXPECT_TRUE(std::isnan(manual_renderable->scene().frame_control_strategy().frequency_hz()));
|
||||
}
|
||||
TEST(renderable_base_test, controls_cache_with_configuration) {
|
||||
Scene2D_Context<> scene;
|
||||
auto cached = std::make_shared<Renderable_Base_Test_Renderable>(scene, true);
|
||||
auto uncached = std::make_shared<Renderable_Base_Test_Renderable>(scene, false);
|
||||
scene.attach_renderable(cached);
|
||||
scene.attach_renderable(uncached);
|
||||
auto cached = renderive_Owner<Renderable_Base_Test_Renderable>::make(true);
|
||||
auto uncached = renderive_Owner<Renderable_Base_Test_Renderable>::make(false);
|
||||
{
|
||||
auto attach = scene.attach_builder();
|
||||
attach.attach(cached);
|
||||
attach.attach(uncached);
|
||||
}
|
||||
scene.render();
|
||||
scene.wait_for_render();
|
||||
scene.render();
|
||||
@@ -43,18 +54,21 @@ TEST(renderable_base_test, controls_cache_with_configuration) {
|
||||
}
|
||||
TEST(renderable_base_test, changes_configuration_through_scene) {
|
||||
Scene2D_Context<> scene;
|
||||
auto renderable = std::make_shared<Renderable_Base_Test_Renderable>(scene, false);
|
||||
scene.attach_renderable(renderable);
|
||||
auto renderable = renderive_Owner<Renderable_Base_Test_Renderable>::make(false);
|
||||
{
|
||||
auto attach = scene.attach_builder();
|
||||
attach.attach(renderable);
|
||||
}
|
||||
scene.render();
|
||||
scene.wait_for_render();
|
||||
scene.set_renderable_configuration(renderable, {.cache_enabled = true});
|
||||
renderable->set_configuration({.cache_enabled = true});
|
||||
scene.render();
|
||||
scene.wait_for_render();
|
||||
EXPECT_TRUE(renderable->configuration().cache_enabled);
|
||||
EXPECT_EQ(renderable->render_count, 1);
|
||||
}
|
||||
struct Renderable_Base_Cache_Invalidation_Test_Renderable : Renderable_Base {
|
||||
explicit Renderable_Base_Cache_Invalidation_Test_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = true}) {}
|
||||
explicit Renderable_Base_Cache_Invalidation_Test_Renderable() : Renderable_Base({.cache_enabled = true}) {}
|
||||
void prepare(const Prepare_Render_Context&) override {
|
||||
const int count = render_count.fetch_add(1, std::memory_order_acq_rel) + 1;
|
||||
if (count != 1) {
|
||||
@@ -86,8 +100,11 @@ struct Renderable_Base_Cache_Invalidation_Test_Renderable : Renderable_Base {
|
||||
};
|
||||
TEST(renderable_base_test, preserves_cache_invalidation_that_happens_during_render) {
|
||||
Scene2D_Context<> scene;
|
||||
auto renderable = std::make_shared<Renderable_Base_Cache_Invalidation_Test_Renderable>(scene);
|
||||
scene.attach_renderable(renderable);
|
||||
auto renderable = renderive_Owner<Renderable_Base_Cache_Invalidation_Test_Renderable>::make();
|
||||
{
|
||||
auto attach = scene.attach_builder();
|
||||
attach.attach(renderable);
|
||||
}
|
||||
scene.render();
|
||||
renderable->wait_started();
|
||||
renderable->invalidate_prepare();
|
||||
@@ -100,7 +117,7 @@ TEST(renderable_base_test, preserves_cache_invalidation_that_happens_during_rend
|
||||
EXPECT_TRUE(renderable->prepare_cache_valid());
|
||||
}
|
||||
struct Renderable_Base_Render_Graph_Rebuild_Test_Renderable : Renderable_Base {
|
||||
explicit Renderable_Base_Render_Graph_Rebuild_Test_Renderable(Scene_Base& scene) : Renderable_Base(scene) {}
|
||||
explicit Renderable_Base_Render_Graph_Rebuild_Test_Renderable() : Renderable_Base() {}
|
||||
void build_prepare_graph(Renderable_Graph_Builder& graph) override {
|
||||
const int count = build_count.fetch_add(1, std::memory_order_acq_rel) + 1;
|
||||
if (count == 1) {
|
||||
@@ -138,8 +155,7 @@ struct Renderable_Base_Render_Graph_Rebuild_Test_Renderable : Renderable_Base {
|
||||
bool release_build{};
|
||||
};
|
||||
TEST(renderable_base_test, preserves_rebuild_request_that_arrives_during_render_graph_build) {
|
||||
Scene2D_Context<> scene;
|
||||
Renderable_Base_Render_Graph_Rebuild_Test_Renderable renderable(scene);
|
||||
Renderable_Base_Render_Graph_Rebuild_Test_Renderable renderable;
|
||||
std::shared_ptr<const Renderable_Graph> first_graph;
|
||||
std::thread builder([&] {
|
||||
first_graph = renderable.graph_snapshot();
|
||||
@@ -156,8 +172,7 @@ TEST(renderable_base_test, preserves_rebuild_request_that_arrives_during_render_
|
||||
EXPECT_NE(first_graph.get(), second_graph.get());
|
||||
}
|
||||
TEST(renderable_base_test, render_graph_snapshots_remain_valid_during_concurrent_rebuilds) {
|
||||
Scene2D_Context<> scene;
|
||||
Renderable_Base_Render_Graph_Rebuild_Test_Renderable renderable(scene);
|
||||
Renderable_Base_Render_Graph_Rebuild_Test_Renderable renderable;
|
||||
renderable.release();
|
||||
std::atomic<bool> running{true};
|
||||
std::thread rebuilder([&] {
|
||||
@@ -178,12 +193,15 @@ TEST(renderable_base_test, render_graph_snapshots_remain_valid_during_concurrent
|
||||
}
|
||||
TEST(renderable_base_test, configuration_snapshot_is_safe_during_scene_updates) {
|
||||
Scene2D_Context<> scene;
|
||||
auto renderable = std::make_shared<Renderable_Base_Test_Renderable>(scene, false);
|
||||
scene.attach_renderable(renderable);
|
||||
auto renderable = renderive_Owner<Renderable_Base_Test_Renderable>::make(false);
|
||||
{
|
||||
auto attach = scene.attach_builder();
|
||||
attach.attach(renderable);
|
||||
}
|
||||
std::atomic<bool> running{true};
|
||||
std::thread writer([&] {
|
||||
for (int index = 0; index < 1000; ++index) {
|
||||
scene.set_renderable_configuration(renderable, {.cache_enabled = index % 2 != 0});
|
||||
renderable->set_configuration({.cache_enabled = index % 2 != 0});
|
||||
}
|
||||
running.store(false, std::memory_order_release);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user