This commit is contained in:
2026-08-17 22:55:51 +08:00
parent 93064c5ab9
commit 5ff0f6369d
14 changed files with 24 additions and 85 deletions
@@ -141,26 +141,16 @@ void Renderable_Base::Impl::set_configuration(
if (previous == value) return;
configuration.store(value, std::memory_order_release);
invalidate_prepare();
notify_scene_model_dirty();
}
void Renderable_Base::Impl::set_visible(bool value) {
if (visible.exchange(value, std::memory_order_acq_rel) == value) return;
invalidate_prepare();
notify_scene_model_dirty();
}
void Renderable_Base::Impl::discard_stale_frame_on_latest_data_update(
bool enabled) noexcept {
real_time_data_state->discard_stale_frame_on_latest_data_update.store(
enabled, std::memory_order_release);
}
void Renderable_Base::Impl::notify_scene_model_dirty() {
const auto& state = real_time_data_state;
if (!state->attached.load(std::memory_order_acquire) ||
!state->scene_lifetime)
return;
auto lease = state->scene_lifetime->acquire();
if (lease) lease.scene().notify_model_dirty();
}
void Renderable_Base::Impl::build_prepare_graph(
Renderable_Graph_Builder& builder) {
builder.emplace("prepare", "Prepare",
@@ -251,11 +241,9 @@ void Renderable_Base::discard_stale_frame_on_latest_data_update(
}
void Renderable_Base::Impl::changed() {
invalidate_prepare();
notify_scene_model_dirty();
}
void Renderable_Base::Impl::paint_changed() {
invalidate_paint();
notify_scene_model_dirty();
}
void Renderable_Base::Impl::render_graph_changed() {
rebuild_render_graph();
@@ -39,7 +39,6 @@ public:
[[nodiscard]] static Render_State_View render_state_view() noexcept;
[[nodiscard]] Real_Time_Data_Binding bind_real_time_data(
Real_Time_Data_Base& data);
void notify_scene_model_dirty();
void bind_scene(std::shared_ptr<Scene_Lifetime> lifetime);
[[nodiscard]] std::shared_ptr<const Renderable_Graph> render_graph_snapshot();
void mark_prepared(std::uint64_t revision) noexcept;
+1 -22
View File
@@ -224,8 +224,7 @@ struct Scene_Base::Impl::Compiled_Render_Plan {
};
class Scene_Base::Impl::Renderable_Edit_Transaction {
public:
explicit Renderable_Edit_Transaction(Impl& scene) : scene_(scene), dependency_(scene.dependency_resolver_.resolve()),
model_dirty_(scene.model_dirty_.load(std::memory_order_acquire)) {
explicit Renderable_Edit_Transaction(Impl& scene) : scene_(scene), dependency_(scene.dependency_resolver_.resolve()) {
renderables_.reserve(scene.renderables_.size());
color_caches_.reserve(scene.color_caches_.size());
for (const auto& [id, renderable] : scene.renderables_) {
@@ -262,7 +261,6 @@ public:
data.real_time_data_state->attached.store(state.attached, std::memory_order_release);
data.prepare_revision.store(state.prepare_revision, std::memory_order_release);
}
scene_.model_dirty_.store(model_dirty_, std::memory_order_release);
}
private:
struct Renderable_State {
@@ -277,7 +275,6 @@ private:
std::optional<renderive::scene::dependency::Resolution<Renderable_Id>> display_;
std::vector<std::pair<Renderable_Id, std::shared_ptr<Color_Cache>>> color_caches_;
std::vector<Renderable_State> renderable_states_;
bool model_dirty_{};
};
Scene_Base::Impl::Impl(std::pmr::memory_resource& upstream_memory_resource) : memory_domain_(std::allocate_shared<Scene_Memory_Domain>(
std::pmr::polymorphic_allocator<Scene_Memory_Domain>(
@@ -415,7 +412,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::attach(Renderable renderable) {
}
renderable_data.real_time_data_state->attached.store(true, std::memory_order_release);
renderable_data.invalidate_prepare();
scene_data.model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
Scene_Edit_Error Scene_Base::Renderable_Editor::detach(
@@ -432,7 +428,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::detach(
renderable_data.real_time_data_state->attached.store(false, std::memory_order_release);
scene_data.color_caches_.erase(id);
scene_data.renderables_.erase(id);
scene_data.model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
Scene_Edit_Error Scene_Base::Renderable_Editor::set_dependency_parent(
@@ -453,7 +448,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::set_dependency_parent(
if (!result) return fail(relationship_error(result.error, false));
if (!result.changed) return Scene_Edit_Error::none;
child->d_func().invalidate_prepare();
scene_data.model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
Scene_Edit_Error Scene_Base::Renderable_Editor::add_dependency_parent(
@@ -474,7 +468,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::add_dependency_parent(
if (!result) return fail(relationship_error(result.error, false));
if (!result.changed) return Scene_Edit_Error::none;
child->d_func().invalidate_prepare();
scene_data.model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
Scene_Edit_Error Scene_Base::Renderable_Editor::clear_dependency_parent(
@@ -491,7 +484,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::clear_dependency_parent(
if (!result) return fail(relationship_error(result.error, false));
if (!result.changed) return Scene_Edit_Error::none;
child->d_func().invalidate_prepare();
scene_data.model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
void Scene_Base::Renderable_Editor::replace_frame_control_strategy(
@@ -602,7 +594,6 @@ Scene_Edit_Error Scene_2D_Base::Impl::set_display_parent_locked(
const auto result = display_resolver_.replace_parents(
child->renderable_id(), {parent->renderable_id()});
if (!result) return relationship_error(result.error, true);
if (result.changed) model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
Scene_Edit_Error Scene_2D_Base::Impl::add_display_parent_locked(
@@ -618,7 +609,6 @@ Scene_Edit_Error Scene_2D_Base::Impl::add_display_parent_locked(
const auto result = display_resolver_.add_parent(
child->renderable_id(), parent->renderable_id());
if (!result) return relationship_error(result.error, true);
if (result.changed) model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
Scene_Edit_Error Scene_2D_Base::Impl::clear_display_parent_locked(
@@ -629,7 +619,6 @@ Scene_Edit_Error Scene_2D_Base::Impl::clear_display_parent_locked(
if (!is_renderable_attached_locked(child)) return Scene_Edit_Error::renderable_not_attached;
const auto result = display_resolver_.clear_parents(child->renderable_id());
if (!result) return relationship_error(result.error, true);
if (result.changed) model_dirty_.store(true, std::memory_order_release);
return Scene_Edit_Error::none;
}
Scene_3D_Base::Scene_3D_Base() : Scene_3D_Base(*std::pmr::get_default_resource()) {}
@@ -922,7 +911,6 @@ void Scene_Base::Impl::request_render_graph_rebuild(
if (renderable_scene_error(renderable) != Scene_Edit_Error::none) ::renderive::error::unexpected<std::logic_error>("attached renderable scene invariant violated");
if (active_renderable_edit_scene_ == owner_) {
renderable_data.reset_render_graph();
model_dirty_.store(true, std::memory_order_release);
return;
}
Renderable owner;
@@ -936,13 +924,11 @@ void Scene_Base::Impl::request_render_graph_rebuild(
std::lock_guard<std::recursive_mutex> lock(task_mutex_);
if (!runtime_started_) {
owner->d_func().reset_render_graph();
model_dirty_.store(true, std::memory_order_release);
return;
}
}
static_cast<void>(enqueue_renderable_edit([owner = std::move(owner)] {
owner->d_func().reset_render_graph();
owner->d_func().notify_scene_model_dirty();
return Scene_Edit_Error::none;
}));
}
@@ -1016,16 +1002,12 @@ void Scene_Base::Impl::publish_frame_state_locked() {
}
publish_observation();
}
void Scene_Base::notify_model_dirty() noexcept {
d_func().model_dirty_.store(true, std::memory_order_release);
}
void Scene_Base::Impl::invalidate_renderables() {
std::lock_guard lock(model_mutex_);
for (const auto& [id, renderable] : renderables_) {
static_cast<void>(id);
renderable->d_func().invalidate_prepare();
}
model_dirty_.store(true, std::memory_order_release);
}
std::size_t Scene_Base::renderable_count() const {
const auto& implementation = d_func();
@@ -1294,9 +1276,6 @@ std::unique_lock<std::recursive_mutex> Scene_Base::Impl::lock_render_idle() {
bool Scene_Base::Impl::is_render_execution_context() const noexcept {
return active_execution_scene_ == owner_;
}
bool Scene_Base::Impl::consume_model_dirty() noexcept {
return model_dirty_.exchange(false, std::memory_order_acq_rel);
}
void Scene_Base::Impl::shutdown() {
std::shared_ptr<Compiled_Render_Plan> compiled_plan;
{
@@ -158,7 +158,6 @@ public:
Scene_Render_Result wait_for_render();
void publish_frame_state();
void publish_frame_state(Abstract_Frame& frame);
void notify_model_dirty() noexcept;
[[nodiscard]] Edit_Operation edit_renderables(Renderable_Edit edit);
[[nodiscard]] std::size_t renderable_count() const;
[[nodiscard]] Topology_Snapshot topology_snapshot() const;
@@ -119,7 +119,6 @@ public:
[[nodiscard]] Scene_Edit_Error cleanup_detached_topology_locked();
[[nodiscard]] std::unique_lock<std::recursive_mutex> lock_render_idle();
[[nodiscard]] bool is_render_execution_context() const noexcept;
[[nodiscard]] bool consume_model_dirty() noexcept;
void invalidate_renderables();
void shutdown();
[[nodiscard]] Scene_Base::Edit_Operation enqueue_renderable_edit(
@@ -131,7 +130,6 @@ public:
std::shared_ptr<Scene_Lifetime> scene_lifetime_;
std::shared_ptr<Scene_Memory_Domain> memory_domain_;
std::unique_ptr<Execution_Context> execution_context_;
std::atomic_bool model_dirty_{true};
std::pmr::unordered_map<Renderable_Id, Renderable> renderables_;
renderive::scene::dependency::Dependency_Resolver<Renderable_Id>
dependency_resolver_;