From 18cfeedbff75e27cd5885b70cc0f1bf7e0669510 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Mon, 15 Jun 2026 05:46:28 +0100 Subject: [PATCH] implements PLN-0100 --- .../console/prometeu-drivers/src/hardware.rs | 12 +++++++++-- .../firmware/firmware_step_crash_screen.rs | 9 ++++++-- .../firmware/firmware_step_splash_screen.rs | 9 ++++++-- crates/console/prometeu-hal/src/lib.rs | 4 ++-- crates/console/prometeu-hal/src/platform.rs | 21 +++++++++++++++++++ .../src/programs/prometeu_hub/prometeu_hub.rs | 7 +++++-- .../src/services/vm_runtime/tests.rs | 3 ++- .../src/services/vm_runtime/tick.rs | 13 +++++++----- 8 files changed, 62 insertions(+), 16 deletions(-) diff --git a/crates/console/prometeu-drivers/src/hardware.rs b/crates/console/prometeu-drivers/src/hardware.rs index 4159b9fa..3eba94ea 100644 --- a/crates/console/prometeu-drivers/src/hardware.rs +++ b/crates/console/prometeu-drivers/src/hardware.rs @@ -302,7 +302,11 @@ mod tests { color: Color::BLUE, }]; - hardware.publish_render_submission(&RenderSubmission::game2d(FrameId::ZERO, packet)); + RenderSubmissionSink::submit_render_submission( + &mut hardware, + RenderSubmission::game2d(FrameId::ZERO, packet), + ) + .expect("local sink should publish Game2D packet"); assert_eq!(hardware.gfx.front_buffer()[0], Color::BLUE.raw()); } @@ -340,7 +344,11 @@ mod tests { ); hardware.begin_frame(); - hardware.publish_render_submission(&RenderSubmission::game2d(FrameId::ZERO, packet)); + RenderSubmissionSink::submit_render_submission( + &mut hardware, + RenderSubmission::game2d(FrameId::ZERO, packet), + ) + .expect("local sink should publish Game2D packet"); assert_eq!(hardware.gfx.front_buffer()[0], Color::RED.raw()); } diff --git a/crates/console/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs index 8c5d6a52..7bbf14ac 100644 --- a/crates/console/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs @@ -2,7 +2,10 @@ use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep}; use crate::firmware::prometeu_context::PrometeuContext; use prometeu_hal::color::Color; use prometeu_hal::log::{LogLevel, LogSource}; -use prometeu_hal::{FrameId, GfxUiCommand, RenderSubmission, ShellUiFramePacket}; +use prometeu_hal::{ + FrameId, GfxUiCommand, LegacyHardwareRenderSubmissionSink, RenderSubmission, + RenderSubmissionSink, ShellUiFramePacket, +}; use prometeu_system::CrashReport; #[derive(Debug, Clone)] @@ -24,7 +27,9 @@ impl AppCrashesStep { ctx.hw.pad_mut().begin_frame(ctx.signals); let packet = ShellUiFramePacket::new(vec![GfxUiCommand::Clear { color: Color::RED }]); - ctx.hw.publish_render_submission(&RenderSubmission::shell_ui(FrameId::ZERO, packet)); + LegacyHardwareRenderSubmissionSink::new(ctx.hw) + .submit_render_submission(RenderSubmission::shell_ui(FrameId::ZERO, packet)) + .expect("firmware crash render submission should publish"); // If START is pressed, return to the Hub if ctx.hw.pad().start().down { diff --git a/crates/console/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs index 5ba02ae9..0e49e7d5 100644 --- a/crates/console/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs @@ -3,7 +3,10 @@ use crate::firmware::prometeu_context::PrometeuContext; use prometeu_hal::color::Color; use prometeu_hal::log::{LogLevel, LogSource}; use prometeu_hal::primitives::Rect; -use prometeu_hal::{FrameId, GfxUiCommand, RenderSubmission, ShellUiFramePacket}; +use prometeu_hal::{ + FrameId, GfxUiCommand, LegacyHardwareRenderSubmissionSink, RenderSubmission, + RenderSubmissionSink, ShellUiFramePacket, +}; #[derive(Debug, Clone)] pub struct SplashScreenStep { @@ -44,7 +47,9 @@ impl SplashScreenStep { color: Color::WHITE, }, ]); - ctx.hw.publish_render_submission(&RenderSubmission::shell_ui(FrameId::ZERO, packet)); + LegacyHardwareRenderSubmissionSink::new(ctx.hw) + .submit_render_submission(RenderSubmission::shell_ui(FrameId::ZERO, packet)) + .expect("firmware splash render submission should publish"); // Transition logic // If any button is pressed at any time after the animation ends diff --git a/crates/console/prometeu-hal/src/lib.rs b/crates/console/prometeu-hal/src/lib.rs index 70067fa1..59c60edd 100644 --- a/crates/console/prometeu-hal/src/lib.rs +++ b/crates/console/prometeu-hal/src/lib.rs @@ -49,8 +49,8 @@ pub use native_interface::{NativeInterface, SyscallId}; pub use pad_bridge::PadBridge; pub use platform::{ AssetStoragePlatform, AudioPlatform, ClockPacingPlatform, Game2DFrameComposer, InputPlatform, - RenderBackend, RenderSubmissionSink, RenderSubmitError, RuntimePlatform, TelemetryPlatform, - TestPlatform, + LegacyHardwareRenderSubmissionSink, RenderBackend, RenderSubmissionSink, RenderSubmitError, + RuntimePlatform, TelemetryPlatform, TestPlatform, }; pub use render_submission::{ BoundScenePacket, Camera2D, ComposerFramePacket, FrameId, Game2DFramePacket, GameSpritePacket, diff --git a/crates/console/prometeu-hal/src/platform.rs b/crates/console/prometeu-hal/src/platform.rs index 0cd8d3fc..7d448fda 100644 --- a/crates/console/prometeu-hal/src/platform.rs +++ b/crates/console/prometeu-hal/src/platform.rs @@ -1,6 +1,7 @@ use crate::asset_bridge::AssetBridge; use crate::audio_bridge::AudioBridge; use crate::composer_status::ComposerOpStatus; +use crate::hardware_bridge::HardwareBridge; use crate::pad_bridge::PadBridge; use crate::render_submission::{Game2DFramePacket, RenderSubmission}; use crate::sprite::Sprite; @@ -20,6 +21,26 @@ pub trait RenderSubmissionSink { ) -> Result<(), RenderSubmitError>; } +pub struct LegacyHardwareRenderSubmissionSink<'a> { + hw: &'a mut dyn HardwareBridge, +} + +impl<'a> LegacyHardwareRenderSubmissionSink<'a> { + pub fn new(hw: &'a mut dyn HardwareBridge) -> Self { + Self { hw } + } +} + +impl RenderSubmissionSink for LegacyHardwareRenderSubmissionSink<'_> { + fn submit_render_submission( + &mut self, + submission: RenderSubmission, + ) -> Result<(), RenderSubmitError> { + self.hw.publish_render_submission(&submission); + Ok(()) + } +} + pub trait RenderBackend { fn render_frame(&mut self); } diff --git a/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs b/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs index f2fb3624..d10f2db8 100644 --- a/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs +++ b/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs @@ -2,7 +2,8 @@ use crate::{CrashReport, SystemOS}; use prometeu_hal::color::Color; use prometeu_hal::primitives::Rect; use prometeu_hal::{ - FrameId, GfxUiCommand, HardwareBridge, InputSignals, RenderSubmission, ShellUiFramePacket, + FrameId, GfxUiCommand, HardwareBridge, InputSignals, LegacyHardwareRenderSubmissionSink, + RenderSubmission, RenderSubmissionSink, ShellUiFramePacket, }; use prometeu_vm::VirtualMachine; @@ -142,7 +143,9 @@ impl PrometeuHub { } ShellUiFramePacket::new(commands) }; - hw.publish_render_submission(&RenderSubmission::shell_ui(FrameId::ZERO, packet)); + LegacyHardwareRenderSubmissionSink::new(hw) + .submit_render_submission(RenderSubmission::shell_ui(FrameId::ZERO, packet)) + .expect("hub render submission should publish"); } pub fn update_shell_profile( diff --git a/crates/console/prometeu-system/src/services/vm_runtime/tests.rs b/crates/console/prometeu-system/src/services/vm_runtime/tests.rs index 66ed5bb4..49c75e91 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/tests.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/tests.rs @@ -858,7 +858,8 @@ fn tick_game_submissions_are_immutable_and_latest_complete_wins() { first_packet.gfx2d[0], prometeu_hal::Gfx2dCommand::Clear { color } if color == Color::from_raw(0x11223344) )); - prometeu_hal::HardwareBridge::publish_render_submission(&mut hardware, latest); + prometeu_hal::RenderSubmissionSink::submit_render_submission(&mut hardware, latest.clone()) + .expect("local sink should publish latest submission"); assert_eq!(hardware.gfx.front_buffer()[0], Color::from_raw(0x55667788).raw()); } diff --git a/crates/console/prometeu-system/src/services/vm_runtime/tick.rs b/crates/console/prometeu-system/src/services/vm_runtime/tick.rs index a09672e8..1dd25816 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/tick.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/tick.rs @@ -9,8 +9,8 @@ use crate::services::memcard::MemcardService; use prometeu_hal::asset::{BankTelemetry, BankType}; use prometeu_hal::log::{LogLevel, LogService, LogSource}; use prometeu_hal::{ - FrameId, HardwareBridge, HostContext, InputSignals, RenderSubmission, RenderSubmissionPacket, - ShellUiFramePacket, + FrameId, HardwareBridge, HostContext, InputSignals, LegacyHardwareRenderSubmissionSink, + RenderSubmission, RenderSubmissionPacket, RenderSubmissionSink, ShellUiFramePacket, }; use prometeu_vm::LogicalFrameEndingReason; use std::collections::HashMap; @@ -18,12 +18,14 @@ use std::panic::{AssertUnwindSafe, catch_unwind}; use std::sync::atomic::Ordering; struct HardwareRenderSurface<'a> { - hw: &'a mut dyn HardwareBridge, + sink: &'a mut dyn RenderSubmissionSink, } impl RenderSurface for HardwareRenderSurface<'_> { fn consume_submission(&mut self, submission: &RenderSubmission) { - self.hw.publish_render_submission(submission); + self.sink + .submit_render_submission(submission.clone()) + .expect("local render submission sink should publish"); } } @@ -262,7 +264,8 @@ impl VirtualMachineRuntime { } let render_outcome = catch_unwind(AssertUnwindSafe(|| { - let mut surface = HardwareRenderSurface { hw }; + let mut sink = LegacyHardwareRenderSubmissionSink::new(hw); + let mut surface = HardwareRenderSurface { sink: &mut sink }; match self .render_manager .active_render_policy()