expected
This commit is contained in:
@@ -29,23 +29,36 @@
|
||||
#include <vector>
|
||||
namespace renderive::web {
|
||||
namespace {
|
||||
Gallery_Render_Result gallery_render_error(Plot_Render_Result error) {
|
||||
switch (error) {
|
||||
case Plot_Render_Result::none:
|
||||
return Gallery_Render_Result::none;
|
||||
case Plot_Render_Result::view_inactive:
|
||||
return Gallery_Render_Result::inactive;
|
||||
case Plot_Render_Result::cancelled:
|
||||
Gallery_Render_Result gallery_render_result(
|
||||
const tl::expected<Plot_Render_Status, Plot_Render_Frame_Error>& result) {
|
||||
if (result) {
|
||||
switch (*result) {
|
||||
case Plot_Render_Status::rendered:
|
||||
return Gallery_Render_Result::none;
|
||||
case Plot_Render_Status::view_inactive:
|
||||
return Gallery_Render_Result::inactive;
|
||||
case Plot_Render_Status::empty_viewport:
|
||||
case Plot_Render_Status::model_unchanged:
|
||||
return Gallery_Render_Result::frame_unavailable;
|
||||
}
|
||||
::renderive::error::unexpected<std::logic_error>("unknown plot render status");
|
||||
}
|
||||
switch (result.error()) {
|
||||
case Plot_Render_Frame_Error::cancelled:
|
||||
return Gallery_Render_Result::cancelled;
|
||||
case Plot_Render_Result::deadline_exceeded:
|
||||
case Plot_Render_Frame_Error::deadline_exceeded:
|
||||
return Gallery_Render_Result::deadline_exceeded;
|
||||
case Plot_Render_Result::external_failure:
|
||||
case Plot_Render_Frame_Error::external_failure:
|
||||
return Gallery_Render_Result::backend_failure;
|
||||
case Plot_Render_Result::scene_shutting_down:
|
||||
case Plot_Render_Frame_Error::scene_shutting_down:
|
||||
return Gallery_Render_Result::shutting_down;
|
||||
default:
|
||||
case Plot_Render_Frame_Error::painter_unavailable:
|
||||
case Plot_Render_Frame_Error::manual_refresh_not_supported:
|
||||
case Plot_Render_Frame_Error::no_pending_frame:
|
||||
case Plot_Render_Frame_Error::renderer_unavailable:
|
||||
return Gallery_Render_Result::frame_unavailable;
|
||||
}
|
||||
::renderive::error::unexpected<std::logic_error>("unknown plot render error");
|
||||
}
|
||||
template <class Update>
|
||||
void update_axis_state(const renderive_Owner<Abs_Axis>& axis, Update&& update) {
|
||||
@@ -209,11 +222,14 @@ public:
|
||||
plot_, *primary_, feedback_policy_);
|
||||
register_controls();
|
||||
set_performance_plot_name(plot_, case_id_ + "/" + gallery_enum_id(frame_mode_));
|
||||
if (frame_mode_ == Gallery_Frame_Mode::Low_Latency)
|
||||
static_cast<void>(plot_.set_max_render_fps(30.0));
|
||||
if (frame_mode_ == Gallery_Frame_Mode::Low_Latency &&
|
||||
!plot_.set_max_render_fps(30.0))
|
||||
::renderive::error::unexpected<std::logic_error>(
|
||||
"validated gallery frame rate was rejected");
|
||||
plot_.activate_view();
|
||||
update_model();
|
||||
if (plot_.render_frame(true) != Plot_Render_Result::none)
|
||||
const auto initial_render = plot_.render_frame(true);
|
||||
if (!initial_render || *initial_render != Plot_Render_Status::rendered)
|
||||
plot_.request_redraw();
|
||||
}
|
||||
~Gallery_Scene() {
|
||||
@@ -354,12 +370,12 @@ public:
|
||||
return Gallery_Render_Result::inactive;
|
||||
update_model();
|
||||
const auto started = std::chrono::steady_clock::now();
|
||||
const auto error = plot_.render_frame(true);
|
||||
const bool rendered = error == Plot_Render_Result::none;
|
||||
const auto result = plot_.render_frame(true);
|
||||
const bool rendered = result && *result == Plot_Render_Status::rendered;
|
||||
record_performance(started, rendered);
|
||||
if (rendered)
|
||||
rendered_since_last_pixel_ = true;
|
||||
return gallery_render_error(error);
|
||||
return gallery_render_result(result);
|
||||
}
|
||||
[[nodiscard]] std::optional<std::string> encode_latest_pixels() {
|
||||
if (!plot_.view_active())
|
||||
@@ -420,7 +436,7 @@ public:
|
||||
}
|
||||
if (request.id == "mode_prepare" || request.id == "mode_enqueue") {
|
||||
update_model();
|
||||
const bool prepared = plot_.prepare_frame() == Plot_Render_Result::none;
|
||||
const bool prepared = plot_.prepare_frame().has_value();
|
||||
last_action_result_ = prepared ? "frame prepared" : "prepare rejected";
|
||||
return prepared ? "Kernel 帧已准备/入队" : "Kernel 拒绝准备帧";
|
||||
}
|
||||
@@ -432,19 +448,19 @@ public:
|
||||
int prepared{};
|
||||
for (int index = 0; index < count; ++index) {
|
||||
update_model();
|
||||
prepared += plot_.prepare_frame() == Plot_Render_Result::none ? 1 : 0;
|
||||
prepared += plot_.prepare_frame().has_value() ? 1 : 0;
|
||||
}
|
||||
last_action_result_ = "enqueued=" + std::to_string(prepared);
|
||||
return "回放帧已批量压入 Flow 队列";
|
||||
}
|
||||
if (request.id == "mode_refresh") {
|
||||
const bool refreshed = plot_.refresh_manual_frame() == Plot_Render_Result::none;
|
||||
const bool refreshed = plot_.refresh_manual_frame().has_value();
|
||||
last_action_result_ = refreshed ? "manual refresh succeeded" : "manual refresh failed";
|
||||
return refreshed ? "Manual 待处理帧已提交刷新" : "当前没有可刷新的 Manual 帧";
|
||||
}
|
||||
if (request.id == "mode_render" || request.id == "mode_dequeue") {
|
||||
const auto started = std::chrono::steady_clock::now();
|
||||
const bool rendered = plot_.render_prepared_frame() == Plot_Render_Result::none;
|
||||
const bool rendered = plot_.render_prepared_frame().has_value();
|
||||
record_performance(started, rendered);
|
||||
rendered_since_last_pixel_ = rendered;
|
||||
last_action_result_ = rendered ? "prepared frame rendered" : "no prepared frame";
|
||||
@@ -458,7 +474,8 @@ public:
|
||||
if (request.id == "mode_cycle") {
|
||||
update_model();
|
||||
const auto started = std::chrono::steady_clock::now();
|
||||
const bool rendered = plot_.render_frame(true) == Plot_Render_Result::none;
|
||||
const auto result = plot_.render_frame(true);
|
||||
const bool rendered = result && *result == Plot_Render_Status::rendered;
|
||||
record_performance(started, rendered);
|
||||
rendered_since_last_pixel_ = rendered;
|
||||
last_action_result_ = rendered ? "full frame cycle rendered" : "frame cycle skipped";
|
||||
@@ -916,7 +933,7 @@ private:
|
||||
consumer_manual_interval_ns_ = frequency_to_ns(feedback_policy_.manual_fps);
|
||||
consumer_feedback_source_ = "none";
|
||||
if (!feedback_policy_.enabled) {
|
||||
if (plot_.clear_consumer_feedback() != Plot_Control_Error::none)
|
||||
if (!plot_.clear_consumer_feedback())
|
||||
::renderive::error::unexpected<std::logic_error>("low-latency feedback clearing failed");
|
||||
consumer_feedback_source_ = "disabled";
|
||||
return;
|
||||
@@ -944,11 +961,11 @@ private:
|
||||
select_source(feedback_policy_.manual,
|
||||
consumer_manual_interval_ns_, "manual");
|
||||
if (interval_ns == 0) {
|
||||
if (plot_.clear_consumer_feedback() != Plot_Control_Error::none)
|
||||
if (!plot_.clear_consumer_feedback())
|
||||
::renderive::error::unexpected<std::logic_error>("low-latency feedback clearing failed");
|
||||
return;
|
||||
}
|
||||
if (plot_.set_consumer_feedback({interval_ns}) != Plot_Control_Error::none)
|
||||
if (!plot_.set_consumer_feedback({interval_ns}))
|
||||
::renderive::error::unexpected<std::logic_error>("validated low-latency feedback was rejected");
|
||||
}
|
||||
void record_performance(std::chrono::steady_clock::time_point started, bool rendered) {
|
||||
|
||||
Reference in New Issue
Block a user