From 295666b31038bba24bda046b1a3e7d6693ad129a Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Mon, 25 May 2026 14:21:12 +0100 Subject: [PATCH] implements PLN-0083 remove fade pipeline state --- .../prometeu-drivers/src/frame_composer.rs | 10 --- crates/console/prometeu-drivers/src/gfx.rs | 80 +------------------ .../console/prometeu-drivers/src/hardware.rs | 2 - crates/console/prometeu-hal/src/gfx_bridge.rs | 9 --- .../src/services/vm_runtime/tests.rs | 4 - discussion/index.ndjson | 2 +- .../workflow/plans/PLN-0083-fade-removal.md | 2 +- 7 files changed, 4 insertions(+), 105 deletions(-) diff --git a/crates/console/prometeu-drivers/src/frame_composer.rs b/crates/console/prometeu-drivers/src/frame_composer.rs index 0ddc660e..bdbdebc9 100644 --- a/crates/console/prometeu-drivers/src/frame_composer.rs +++ b/crates/console/prometeu-drivers/src/frame_composer.rs @@ -804,8 +804,6 @@ mod tests { })); let mut gfx = Gfx::new(16, 16, Arc::clone(&banks) as Arc); - gfx.scene_fade_level = 31; - gfx.hud_fade_level = 31; frame_composer.render_frame(&mut gfx); gfx.present(); @@ -895,8 +893,6 @@ mod tests { assert!(frame_composer.bind_scene(0)); let mut gfx = Gfx::new(16, 16, Arc::clone(&banks) as Arc); - gfx.scene_fade_level = 31; - gfx.hud_fade_level = 31; frame_composer.render_frame(&mut gfx); gfx.present(); @@ -932,8 +928,6 @@ mod tests { let expected_update = expected_resolver.update(&scene, 40, 0); let mut gfx = Gfx::new(16, 16, Arc::clone(&banks) as Arc); - gfx.scene_fade_level = 31; - gfx.hud_fade_level = 31; frame_composer.render_frame(&mut gfx); frame_composer.set_camera(40, 0); @@ -965,8 +959,6 @@ mod tests { make_glyph_slot_index(&[(0, 0), (1, 1)]), ); let mut gfx = Gfx::new(16, 16, Arc::clone(&banks) as Arc); - gfx.scene_fade_level = 31; - gfx.hud_fade_level = 31; assert!(frame_composer.bind_scene(0)); frame_composer.render_frame(&mut gfx); @@ -1044,8 +1036,6 @@ mod tests { assert!(frame_composer.bind_scene(0)); let mut gfx = Gfx::new(16, 16, Arc::clone(&banks) as Arc); - gfx.scene_fade_level = 31; - gfx.hud_fade_level = 31; frame_composer.render_frame(&mut gfx); gfx.present(); diff --git a/crates/console/prometeu-drivers/src/gfx.rs b/crates/console/prometeu-drivers/src/gfx.rs index e3334e83..958e1806 100644 --- a/crates/console/prometeu-drivers/src/gfx.rs +++ b/crates/console/prometeu-drivers/src/gfx.rs @@ -33,7 +33,7 @@ pub enum BlendMode { /// /// `Gfx` owns the framebuffer backend and the canonical game-frame raster path /// consumed by `FrameComposer`. That canonical path covers scene composition, -/// sprite composition, and fades. Public `gfx.*` primitives remain valid. +/// sprite composition, and primitive packet consumption. pub struct Gfx { /// Width of the internal framebuffer in pixels. w: usize, @@ -49,15 +49,6 @@ pub struct Gfx { /// Hardware sprite list (512 slots). Equivalent to OAM (Object Attribute Memory). pub sprites: [Sprite; 512], - /// Scene brightness/fade level (0 = black/invisible, 31 = fully visible). - pub scene_fade_level: u8, - /// Target color for the scene fade effect (usually Black). - pub scene_fade_color: Color, - /// HUD brightness/fade level (independent from the scene). - pub hud_fade_level: u8, - /// Target color for the HUD fade effect. - pub hud_fade_color: Color, - /// Internal sprite count for the current frame state. sprite_count: usize, /// Internal cache used to sort sprites by layer while keeping stable priority order. @@ -305,31 +296,6 @@ impl GfxBridge for Gfx { self.sprite_count = self.sprite_count.max(index.saturating_add(1)).min(self.sprites.len()); &mut self.sprites[index] } - - fn scene_fade_level(&self) -> u8 { - self.scene_fade_level - } - fn set_scene_fade_level(&mut self, level: u8) { - self.scene_fade_level = level; - } - fn scene_fade_color(&self) -> Color { - self.scene_fade_color - } - fn set_scene_fade_color(&mut self, color: Color) { - self.scene_fade_color = color; - } - fn hud_fade_level(&self) -> u8 { - self.hud_fade_level - } - fn set_hud_fade_level(&mut self, level: u8) { - self.hud_fade_level = level; - } - fn hud_fade_color(&self) -> Color { - self.hud_fade_color - } - fn set_hud_fade_color(&mut self, color: Color) { - self.hud_fade_color = color; - } } impl Gfx { @@ -358,10 +324,6 @@ impl Gfx { glyph_banks, sprites: [EMPTY_SPRITE; 512], sprite_count: 0, - scene_fade_level: 31, - scene_fade_color: Color::BLACK, - hud_fade_level: 31, - hud_fade_color: Color::BLACK, layer_buckets: [ Vec::with_capacity(128), Vec::with_capacity(128), @@ -637,20 +599,13 @@ impl Gfx { &*self.glyph_banks, ); } - - // 2. Scene-only fallback path: sprites and fades still work even before a - // cache-backed world composition request is issued for the frame. - Self::apply_fade_to_buffer(&mut self.back, self.scene_fade_level, self.scene_fade_color); - - // 3. HUD Fade: independent from scene fade; HUD composition itself remains external. - Self::apply_fade_to_buffer(&mut self.back, self.hud_fade_level, self.hud_fade_color); } /// Composes the world from the viewport cache using resolver copy requests. /// /// This is the cache-backed world path accepted by DEC-0013. The canonical scene /// is not consulted here; the renderer only consumes prepared cache materialization - /// plus sprite state and fade controls. + /// plus sprite state. pub fn render_scene_from_cache( &mut self, cache: &SceneViewportCache, @@ -681,9 +636,6 @@ impl Gfx { &*self.glyph_banks, ); } - - Self::apply_fade_to_buffer(&mut self.back, self.scene_fade_level, self.scene_fade_color); - Self::apply_fade_to_buffer(&mut self.back, self.hud_fade_level, self.hud_fade_color); } pub fn render_game2d_frame_packet(&mut self, packet: &Game2DFramePacket) { @@ -916,30 +868,6 @@ impl Gfx { } } - /// Applies the fade effect to the entire back buffer. - /// level: 0 (full color) to 31 (visible) - fn apply_fade_to_buffer(back: &mut [u32], level: u8, fade_color: Color) { - if level >= 31 { - return; - } // Fully visible, skip processing - - let weight = level as u16; - let inv_weight = 31 - weight; - let (fr, fg, fb, fa) = unpack_rgba8888(fade_color.raw()); - - for px in back.iter_mut() { - let (sr, sg, sb, sa) = unpack_rgba8888(*px); - - // Formula: (src * weight + fade * inv_weight) / 31 - let r = ((sr as u16 * weight + fr as u16 * inv_weight) / 31) as u8; - let g = ((sg as u16 * weight + fg as u16 * inv_weight) / 31) as u8; - let b = ((sb as u16 * weight + fb as u16 * inv_weight) / 31) as u8; - let a = ((sa as u16 * weight + fa as u16 * inv_weight) / 31) as u8; - - *px = pack_rgba8888(r, g, b, a); - } - } - pub fn draw_text(&mut self, x: i32, y: i32, text: &str, color: Color) { let mut cx = x; let mut cy = y; @@ -1312,8 +1240,6 @@ mod tests { let update = resolver.update(&scene, 0, 0); let mut gfx = Gfx::new(16, 16, banks); - gfx.scene_fade_level = 31; - gfx.hud_fade_level = 31; gfx.render_scene_from_cache(&cache, &update, &[0, 0, 0, 0]); assert_eq!(gfx.back[0], Color::RED.raw()); @@ -1344,8 +1270,6 @@ mod tests { let update = resolver.update(&scene, 0, 0); let mut gfx = Gfx::new(16, 16, Arc::clone(&banks) as Arc); - gfx.scene_fade_level = 31; - gfx.hud_fade_level = 31; gfx.sprites[0] = Sprite { glyph: Glyph { glyph_id: 0, palette_id: 4 }, diff --git a/crates/console/prometeu-drivers/src/hardware.rs b/crates/console/prometeu-drivers/src/hardware.rs index 8148df82..1cdaa9c9 100644 --- a/crates/console/prometeu-drivers/src/hardware.rs +++ b/crates/console/prometeu-drivers/src/hardware.rs @@ -241,8 +241,6 @@ mod tests { let mut resolver = SceneViewportResolver::new(16, 16, 4, 4, 12, 20); let update = resolver.update(&scene, 0, 0); - hardware.gfx.scene_fade_level = 31; - hardware.gfx.hud_fade_level = 31; hardware.gfx.render_scene_from_cache(&cache, &update, &[0, 0, 0, 0]); hardware.gfx.present(); diff --git a/crates/console/prometeu-hal/src/gfx_bridge.rs b/crates/console/prometeu-hal/src/gfx_bridge.rs index ad0b7424..7dd85190 100644 --- a/crates/console/prometeu-hal/src/gfx_bridge.rs +++ b/crates/console/prometeu-hal/src/gfx_bridge.rs @@ -73,13 +73,4 @@ pub trait GfxBridge { fn sprite(&self, index: usize) -> &Sprite; fn sprite_mut(&mut self, index: usize) -> &mut Sprite; - - fn scene_fade_level(&self) -> u8; - fn set_scene_fade_level(&mut self, level: u8); - fn scene_fade_color(&self) -> Color; - fn set_scene_fade_color(&mut self, color: Color); - fn hud_fade_level(&self) -> u8; - fn set_hud_fade_level(&mut self, level: u8); - fn hud_fade_color(&self) -> Color; - fn set_hud_fade_color(&mut self, color: Color); } 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 a1c748da..dd1526e4 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/tests.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/tests.rs @@ -710,8 +710,6 @@ fn tick_renders_scene_through_public_composer_syscalls() { let mut slots = [None; 16]; slots[0] = Some(0); glyph_slot_index.rebuild_from_slots(&slots); - hardware.gfx.scene_fade_level = 31; - hardware.gfx.hud_fade_level = 31; runtime.initialize_vm(&mut log_service, &mut vm, &cartridge).expect("runtime must initialize"); let report = runtime.tick( @@ -759,8 +757,6 @@ fn tick_draw_text_survives_no_scene_frame_path() { ); let cartridge = cartridge_with_program(program, caps::GFX); let mut hardware = Hardware::new(); - hardware.gfx.scene_fade_level = 31; - hardware.gfx.hud_fade_level = 31; runtime.initialize_vm(&mut log_service, &mut vm, &cartridge).expect("runtime must initialize"); let report = runtime.tick( diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 0f5f2c16..1fcf0b5c 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,5 +1,5 @@ {"type":"meta","next_id":{"DSC":39,"AGD":39,"DEC":31,"PLN":87,"LSN":47,"CLSN":1}} -{"type":"discussion","id":"DSC-0038","status":"in_progress","ticket":"render-frame-packet-boundary","title":"Logical Render Pipelines and Command Packets","created_at":"2026-05-25","updated_at":"2026-05-25","tags":["gfx","renderer","runtime","frame-composer","architecture","ui","pipeline"],"agendas":[{"id":"AGD-0038","file":"AGD-0038-renderframepacket-boundary-for-classic-2d-renderer.md","status":"accepted","created_at":"2026-05-25","updated_at":"2026-05-25"}],"decisions":[{"id":"DEC-0030","file":"DEC-0030-logical-render-pipeline-command-boundary.md","status":"accepted","created_at":"2026-05-25","updated_at":"2026-05-25","ref_agenda":"AGD-0038"}],"plans":[{"id":"PLN-0073","file":"PLN-0073-render-contract-specs.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0074","file":"PLN-0074-hal-render-submission-types.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0075","file":"PLN-0075-rendermanager-core.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0076","file":"PLN-0076-capabilities-and-abi-domain-split.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0077","file":"PLN-0077-composer-buffer-and-game2d-packet.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0078","file":"PLN-0078-classic2d-game-renderer-consumer.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0079","file":"PLN-0079-gfx2d-primitive-domain.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0080","file":"PLN-0080-shell-ui-packet-and-gfxui-domain.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0081","file":"PLN-0081-shell-hub-migration.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0082","file":"PLN-0082-frame-publication-and-present-boundary.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0083","file":"PLN-0083-fade-removal.md","status":"open","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0084","file":"PLN-0084-host-debug-overlay-removal.md","status":"open","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0085","file":"PLN-0085-pbs-stdlib-and-syscall-declarations.md","status":"open","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0086","file":"PLN-0086-end-to-end-render-boundary-validation.md","status":"open","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]}],"lessons":[]} +{"type":"discussion","id":"DSC-0038","status":"in_progress","ticket":"render-frame-packet-boundary","title":"Logical Render Pipelines and Command Packets","created_at":"2026-05-25","updated_at":"2026-05-25","tags":["gfx","renderer","runtime","frame-composer","architecture","ui","pipeline"],"agendas":[{"id":"AGD-0038","file":"AGD-0038-renderframepacket-boundary-for-classic-2d-renderer.md","status":"accepted","created_at":"2026-05-25","updated_at":"2026-05-25"}],"decisions":[{"id":"DEC-0030","file":"DEC-0030-logical-render-pipeline-command-boundary.md","status":"accepted","created_at":"2026-05-25","updated_at":"2026-05-25","ref_agenda":"AGD-0038"}],"plans":[{"id":"PLN-0073","file":"PLN-0073-render-contract-specs.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0074","file":"PLN-0074-hal-render-submission-types.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0075","file":"PLN-0075-rendermanager-core.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0076","file":"PLN-0076-capabilities-and-abi-domain-split.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0077","file":"PLN-0077-composer-buffer-and-game2d-packet.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0078","file":"PLN-0078-classic2d-game-renderer-consumer.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0079","file":"PLN-0079-gfx2d-primitive-domain.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0080","file":"PLN-0080-shell-ui-packet-and-gfxui-domain.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0081","file":"PLN-0081-shell-hub-migration.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0082","file":"PLN-0082-frame-publication-and-present-boundary.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0083","file":"PLN-0083-fade-removal.md","status":"done","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0084","file":"PLN-0084-host-debug-overlay-removal.md","status":"open","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0085","file":"PLN-0085-pbs-stdlib-and-syscall-declarations.md","status":"open","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]},{"id":"PLN-0086","file":"PLN-0086-end-to-end-render-boundary-validation.md","status":"open","created_at":"2026-05-25","updated_at":"2026-05-25","ref_decisions":["DEC-0030"]}],"lessons":[]} {"type":"discussion","id":"DSC-0035","status":"done","ticket":"task-owned-shell-windows","title":"Agenda - Task-Owned Shell Windows","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","task","window-manager","shell","lifecycle"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0044","file":"discussion/lessons/DSC-0035-task-owned-shell-windows/LSN-0044-task-window-liveness-belongs-to-the-task.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} {"type":"discussion","id":"DSC-0034","status":"done","ticket":"system-os-domain-facades","title":"Agenda - SystemOS Domain Facades","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","services","api-surface","lifecycle","fs"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0043","file":"discussion/lessons/DSC-0034-system-os-domain-facades/LSN-0043-systemos-domain-facades.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} {"type":"discussion","id":"DSC-0023","status":"done","ticket":"perf-full-migration-to-atomic-telemetry","title":"Agenda - [PERF] Full Migration to Atomic Telemetry","created_at":"2026-04-10","updated_at":"2026-04-10","tags":["perf","runtime","telemetry"],"agendas":[{"id":"AGD-0021","file":"AGD-0021-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"decisions":[{"id":"DEC-0008","file":"DEC-0008-full-migration-to-atomic-telemetry.md","status":"accepted","created_at":"2026-04-10","updated_at":"2026-04-10"}],"plans":[{"id":"PLN-0007","file":"PLN-0007-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"lessons":[{"id":"LSN-0028","file":"discussion/lessons/DSC-0023-perf-full-migration-to-atomic-telemetry/LSN-0028-converging-to-single-atomic-telemetry-source.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]} diff --git a/discussion/workflow/plans/PLN-0083-fade-removal.md b/discussion/workflow/plans/PLN-0083-fade-removal.md index 0ebbd5bb..ce47a208 100644 --- a/discussion/workflow/plans/PLN-0083-fade-removal.md +++ b/discussion/workflow/plans/PLN-0083-fade-removal.md @@ -2,7 +2,7 @@ id: PLN-0083 ticket: render-frame-packet-boundary title: Fade Removal -status: open +status: done created: 2026-05-25 ref_decisions: [DEC-0030] tags: [gfx, renderer, runtime, frame-composer, architecture, ui, pipeline]