还是一堆bug的状态
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
#include "Core/architecture/Frame_Scheduler.h"
|
||||
#include "Core/architecture/Triple_Buffer.h"
|
||||
#include "Core/plot/Latency_Eager_Refresh_Strategy.h"
|
||||
#include "Core/plot/Plot_Frame_Pipeline.h"
|
||||
#include "Core/plot/Plot_Core.h"
|
||||
#include "Core/plottable/export.h"
|
||||
#include <array>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace renderive {
|
||||
namespace {
|
||||
|
||||
bool unique_roles(const Triple_Buffer_View& view) {
|
||||
std::array<bool, 3> seen{};
|
||||
for (std::uint8_t index : view.index) {
|
||||
if (index >= seen.size() || seen[index])
|
||||
return false;
|
||||
seen[index] = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Frame_Lifecycle_Record render_frame(std::uint64_t begin_ns, std::uint64_t end_ns) {
|
||||
Frame_Lifecycle_Record frame;
|
||||
frame.render_role_enter_ns = begin_ns;
|
||||
frame.render_begin_ns = begin_ns;
|
||||
frame.render_end_ns = end_ns;
|
||||
return frame;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(Renderive_Triple_Buffer, RoleSwapsAreTryOnlyAndDeterministic) {
|
||||
Triple_Role_Buffer_Control control;
|
||||
control.reset();
|
||||
EXPECT_TRUE(unique_roles(control.read_view()));
|
||||
|
||||
auto first = control.try_swap_role(Frame_Rendering, Frame_Middle, [](const Triple_Buffer_View&) {
|
||||
return true;
|
||||
});
|
||||
EXPECT_EQ(first.result, Triple_Buffer_Result::Success);
|
||||
EXPECT_TRUE(unique_roles(control.read_view()));
|
||||
|
||||
auto painting = control.try_mark_use_role(Frame_Painting);
|
||||
ASSERT_EQ(painting.result, Triple_Buffer_Result::Success);
|
||||
auto blocked = control.try_swap_role(Frame_Middle, Frame_Painting, [](const Triple_Buffer_View&) {
|
||||
return true;
|
||||
});
|
||||
EXPECT_EQ(blocked.result, Triple_Buffer_Result::Busy);
|
||||
control.unmark_use(painting.lease);
|
||||
|
||||
for (int i = 0; i < 1000000; ++i) {
|
||||
auto a = control.try_swap_role(Frame_Rendering, Frame_Middle, [](const Triple_Buffer_View&) {
|
||||
return true;
|
||||
});
|
||||
ASSERT_EQ(a.result, Triple_Buffer_Result::Success);
|
||||
auto b = control.try_swap_role(Frame_Middle, Frame_Painting, [](const Triple_Buffer_View&) {
|
||||
return true;
|
||||
});
|
||||
ASSERT_EQ(b.result, Triple_Buffer_Result::Success);
|
||||
ASSERT_TRUE(unique_roles(control.read_view()));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(Renderive_Frame_Pipeline, PublishAndPaintUseMiddleVersionOnly) {
|
||||
Plot_Frame_Pipeline pipeline;
|
||||
auto lease = pipeline.try_begin_render();
|
||||
ASSERT_TRUE(static_cast<bool>(lease));
|
||||
lease.frame->metadata.frame_id = 1;
|
||||
lease.frame->metadata.render_begin_ns = 10;
|
||||
lease.frame->metadata.render_end_ns = 20;
|
||||
lease.frame->version.store(1, std::memory_order_release);
|
||||
lease.reset();
|
||||
|
||||
auto published = pipeline.try_publish_rendered(25);
|
||||
EXPECT_TRUE(pipeline.middle_has_new_frame());
|
||||
EXPECT_TRUE(published.request_present);
|
||||
EXPECT_EQ(published.dropped_frame, nullptr);
|
||||
|
||||
auto painting = pipeline.try_begin_paint(30);
|
||||
EXPECT_TRUE(painting.new_frame);
|
||||
EXPECT_TRUE(static_cast<bool>(painting.lease));
|
||||
EXPECT_FALSE(pipeline.middle_has_new_frame());
|
||||
}
|
||||
|
||||
TEST(Renderive_Frame_Feedback, SelectsRenderPaintAndUserSources) {
|
||||
Frame_Feedback_Controller controller;
|
||||
controller.set_max_render_fps(200.0);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
auto render_limited = render_frame(0, 20000000);
|
||||
controller.on_render_completed(render_limited);
|
||||
}
|
||||
EXPECT_EQ(controller.state().source, Refresh_Limit_Source::Render);
|
||||
|
||||
controller.reset();
|
||||
controller.set_max_render_fps(200.0);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
auto frame = render_frame(0, 5000000);
|
||||
controller.on_render_completed(frame);
|
||||
frame.transition_12_ns = 0;
|
||||
frame.paint_begin_ns = 0;
|
||||
frame.paint_end_ns = 25000000;
|
||||
controller.on_frame_presented(frame);
|
||||
}
|
||||
EXPECT_EQ(controller.state().source, Refresh_Limit_Source::Paint);
|
||||
|
||||
controller.reset();
|
||||
controller.set_max_render_fps(30.0);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
auto frame = render_frame(0, 5000000);
|
||||
controller.on_render_completed(frame);
|
||||
frame.paint_begin_ns = 0;
|
||||
frame.paint_end_ns = 8000000;
|
||||
controller.on_frame_presented(frame);
|
||||
}
|
||||
EXPECT_EQ(controller.state().source, Refresh_Limit_Source::User);
|
||||
}
|
||||
|
||||
TEST(Renderive_Performance_Shower, ToggleDoesNotReenterRenderableTreeUnsafely) {
|
||||
Plot_Core plot(std::make_unique<Latency_Eager_Refresh_Strategy>());
|
||||
plot.init();
|
||||
set_performance_shower_enabled(plot, true);
|
||||
EXPECT_TRUE(performance_shower_enabled(plot));
|
||||
set_performance_shower_enabled(plot, false);
|
||||
EXPECT_FALSE(performance_shower_enabled(plot));
|
||||
}
|
||||
|
||||
} // namespace renderive
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Reference in New Issue
Block a user