diff --git a/crates/console/prometeu-drivers/src/hardware.rs b/crates/console/prometeu-drivers/src/hardware.rs index c04868cc..4159b9fa 100644 --- a/crates/console/prometeu-drivers/src/hardware.rs +++ b/crates/console/prometeu-drivers/src/hardware.rs @@ -12,6 +12,7 @@ use prometeu_hal::cartridge::AssetsPayloadSource; use prometeu_hal::sprite::Sprite; use prometeu_hal::{AssetBridge, AudioBridge, GfxBridge, HardwareBridge, PadBridge, TouchBridge}; use prometeu_hal::{Game2DFramePacket, RenderSubmission, RenderSubmissionPacket}; +use prometeu_hal::{RenderSubmissionSink, RenderSubmitError}; use std::sync::Arc; /// Aggregate structure for all virtual hardware peripherals. @@ -138,6 +139,16 @@ impl HardwareBridge for Hardware { } } +impl RenderSubmissionSink for Hardware { + fn submit_render_submission( + &mut self, + submission: RenderSubmission, + ) -> Result<(), RenderSubmitError> { + self.publish_render_submission(&submission); + Ok(()) + } +} + impl Hardware { /// Internal hardware width in pixels. pub const W: usize = 480; @@ -197,6 +208,7 @@ mod tests { use prometeu_hal::tilemap::TileMap; use prometeu_hal::{ BoundScenePacket, Camera2D, ComposerFramePacket, FrameId, GameSpritePacket, Gfx2dCommand, + GfxUiCommand, ShellUiFramePacket, }; fn make_glyph_bank() -> GlyphBank { @@ -332,4 +344,31 @@ mod tests { assert_eq!(hardware.gfx.front_buffer()[0], Color::RED.raw()); } + + #[test] + fn render_submission_sink_accepts_owned_game2d_submission() { + let mut hardware = Hardware::new(); + let packet = Game2DFramePacket::new( + ComposerFramePacket::default(), + vec![Gfx2dCommand::Clear { color: Color::BLUE }], + ); + let submission = RenderSubmission::game2d(FrameId::ZERO, packet); + + RenderSubmissionSink::submit_render_submission(&mut hardware, submission) + .expect("local sink should accept owned Game2D submissions"); + + assert_eq!(hardware.gfx.front_buffer()[0], Color::BLUE.raw()); + } + + #[test] + fn render_submission_sink_accepts_owned_shell_ui_submission() { + let mut hardware = Hardware::new(); + let packet = ShellUiFramePacket::new(vec![GfxUiCommand::Clear { color: Color::RED }]); + let submission = RenderSubmission::shell_ui(FrameId::ZERO, packet); + + RenderSubmissionSink::submit_render_submission(&mut hardware, submission) + .expect("local sink should accept owned ShellUi submissions"); + + assert_eq!(hardware.gfx.front_buffer()[0], Color::RED.raw()); + } }