核心第一版
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
#include "render.hpp"
|
||||
#include "scene.hpp"
|
||||
#include <gtest/gtest.h>
|
||||
namespace {
|
||||
struct Direct_State_Tag {};
|
||||
struct Graph_State_Tag {};
|
||||
struct Direct_Renderable : double_buffer::Impl<Direct_Renderable, aethera::Renderable, double_buffer::State_Type<Direct_State_Tag>> {
|
||||
struct Direct_Renderable : double_buffer::Def<Direct_Renderable, aethera::Renderable, double_buffer::State_Type<Direct_State_Tag>> {
|
||||
struct Prop : Prev_Prop {};
|
||||
struct State : Prev_State<Direct_State_Tag> {
|
||||
bool operator==(const State&) const = default;
|
||||
@@ -19,7 +19,7 @@ struct Direct_Renderable : double_buffer::Impl<Direct_Renderable, aethera::Rende
|
||||
}
|
||||
};
|
||||
};
|
||||
struct Graph_Renderable : double_buffer::Impl<Graph_Renderable, aethera::Renderable, double_buffer::State_Type<Graph_State_Tag>> {
|
||||
struct Graph_Renderable : double_buffer::Def<Graph_Renderable, aethera::Renderable, double_buffer::State_Type<Graph_State_Tag>> {
|
||||
struct Prop : Prev_Prop {};
|
||||
struct State : Prev_State<Graph_State_Tag> {
|
||||
bool operator==(const State&) const = default;
|
||||
@@ -43,11 +43,11 @@ struct Graph_Renderable : double_buffer::Impl<Graph_Renderable, aethera::Rendera
|
||||
}
|
||||
};
|
||||
};
|
||||
using Direct = double_buffer::Attach_Object<Direct_Renderable>;
|
||||
using Graph = double_buffer::Attach_Object<Graph_Renderable>;
|
||||
using Scene = double_buffer::Attach_Object<aethera::Scene>;
|
||||
using Direct = double_buffer::Impl<Direct_Renderable>;
|
||||
using Graph = double_buffer::Impl<Graph_Renderable>;
|
||||
using Scene = double_buffer::Impl<aethera::Scene>;
|
||||
struct Dependency_State_Tag {};
|
||||
struct Dependency_Renderable : double_buffer::Impl<Dependency_Renderable, aethera::Renderable, double_buffer::State_Type<Dependency_State_Tag>> {
|
||||
struct Dependency_Renderable : double_buffer::Def<Dependency_Renderable, aethera::Renderable, double_buffer::State_Type<Dependency_State_Tag>> {
|
||||
struct Prop : Prev_Prop {};
|
||||
struct State : Prev_State<Dependency_State_Tag> {
|
||||
int revision{};
|
||||
@@ -66,10 +66,10 @@ struct Dependency_Renderable : double_buffer::Impl<Dependency_Renderable, aether
|
||||
}
|
||||
};
|
||||
};
|
||||
using Dependency = double_buffer::Attach_Object<Dependency_Renderable>;
|
||||
using Dependency = double_buffer::Impl<Dependency_Renderable>;
|
||||
template <typename Renderable>
|
||||
void add_renderable(Scene& scene, Renderable* renderable) {
|
||||
ASSERT_TRUE((scene.edit_rely<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
|
||||
ASSERT_TRUE((scene.edit_dependency_graph<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
|
||||
[&](auto& prepare, auto& paint) {
|
||||
prepare.add(renderable);
|
||||
paint.add(renderable);
|
||||
@@ -142,12 +142,39 @@ TEST(renderable_state, scene_and_renderable_callbacks_publish_at_stage_boundarie
|
||||
EXPECT_EQ(runtime_updates, 1);
|
||||
aethera::clear_runtime_state_callback<aethera::Task_Runtime_State_Tag>();
|
||||
}
|
||||
TEST(scene_state, structural_statistics_survive_a_process_without_rebuild) {
|
||||
aethera::initialize_runtime(2);
|
||||
Direct renderable;
|
||||
Scene scene;
|
||||
add_renderable(scene, &renderable);
|
||||
std::size_t task_count{};
|
||||
std::size_t dependency_count{};
|
||||
int updates{};
|
||||
scene.set_state_callback<aethera::Scene_State_Tag>([&](const auto& state) {
|
||||
EXPECT_EQ(state.renderable_count, 1u);
|
||||
EXPECT_GT(state.taskflow_task_count, 0u);
|
||||
if (updates == 0) {
|
||||
EXPECT_TRUE(state.taskflow_rebuilt);
|
||||
task_count = state.taskflow_task_count;
|
||||
dependency_count = state.taskflow_dependency_count;
|
||||
}
|
||||
else {
|
||||
EXPECT_FALSE(state.taskflow_rebuilt);
|
||||
EXPECT_EQ(state.taskflow_task_count, task_count);
|
||||
EXPECT_EQ(state.taskflow_dependency_count, dependency_count);
|
||||
}
|
||||
++updates;
|
||||
});
|
||||
scene.process([](const auto&) {});
|
||||
scene.process([](const auto&) {});
|
||||
EXPECT_EQ(updates, 2);
|
||||
}
|
||||
TEST(scene_condition, upstream_change_makes_downstream_run_in_same_taskflow) {
|
||||
aethera::initialize_runtime(2);
|
||||
Dependency source;
|
||||
Dependency target;
|
||||
Scene scene;
|
||||
ASSERT_TRUE((scene.edit_rely<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
|
||||
ASSERT_TRUE((scene.edit_dependency_graph<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
|
||||
[&](auto& prepare, auto& paint) {
|
||||
prepare.add(&source);
|
||||
prepare.add(&target);
|
||||
|
||||
Reference in New Issue
Block a user