From 93a4f5bdcbacdf824a4f87bf9e2f5967dffa13d8 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 27 Oct 2026 17:54:06 +0800 Subject: [PATCH] chore(explorer): remove [explorer] debug output Drop startup/input/frame tracing from the desktop shell and window server, including the one-shot diagnostic counters. --- Apps/Explorer/desk_server.vp | 88 ------------------------------------ Apps/Explorer/main.vp | 55 ++-------------------- 2 files changed, 4 insertions(+), 139 deletions(-) diff --git a/Apps/Explorer/desk_server.vp b/Apps/Explorer/desk_server.vp index 500ad33..8b958cf 100644 --- a/Apps/Explorer/desk_server.vp +++ b/Apps/Explorer/desk_server.vp @@ -6,15 +6,6 @@ import vpsdk.syscall as syscall import vpsdk.vpui as vpui # 复用它的 8x16 点阵字体表 from stdint import * import string -import viperlib - - -# 【诊断·临时】首个鼠标包已收到的标记(0 = 未收到) -_mouse_logged: int = 0 -# 首次读到键盘字节时打一次(区分"内核没数据"与"事件没送达 app") -_kbd_logged: int = 0 -# 【诊断·临时】累计收到的 DESK_REQ_FLUSH 次数(=0 说明 app 从没请求过合成) -_flush_cnt: int = 0 # ============================================================================ @@ -375,7 +366,6 @@ class DeskServer: uint64(syscall.MAP_PRIVATE | syscall.MAP_ANONYMOUS), syscall.MMAP_FD_ANON, 0) if back_va == 0: - devfs.serial_puts("[explorer] back buffer alloc FAILED\n") self.back = self.fb # 退化:直写 framebuffer,保留原行为 else: self.back = uint32*(back_va) @@ -1660,25 +1650,12 @@ class DeskServer: # ---------------- 请求处理 ---------------- def handle_request(self, m: desk.DeskMsg): - global _flush_cnt if m.type == uint32(desk.DESK_REQ_CREATE): # pid 随请求携带(窗口还没诞生),标题内联在消息里 - _sb: [96]char - viperlib.snprintf(&_sb, 96, "[explorer] create style=%d w=%d h=%d\n", - int(m.style), m.c, m.d) - devfs.serial_puts(&_sb) nw: int = self.alloc_window(m.pid, m.a, m.b, m.c, m.d, int(m.style)) if nw >= 0: ns: desk.WinSlot* = self.slot(nw) string.memcpy(&ns.title, &m.title, uint64(desk.DESK_TITLE_MAX)) - # 【临时诊断】分配成功后立刻回读槽位:坐标/尺寸/缓冲偏移是否真的落进去了。 - _sb2: [160]char - viperlib.snprintf(&_sb2, 160, "[explorer] slot%d x=%d y=%d w=%d h=%d off=%u\n", - nw, ns.ux, ns.uy, ns.w, ns.h, ns.fb_off) - devfs.serial_puts(&_sb2) - else: - # 【临时诊断】建窗失败(多半是 arena 分配不到)会让 app 拿到 win_id=-1 - devfs.serial_puts("[explorer] alloc_window FAILED\n") self.mark_all_windows() self.mark_titles() self.push_event_pid(m.pid, nw, uint32(desk.DESK_EVT_CREATED), nw, 0, 0, 0) @@ -1711,12 +1688,6 @@ class DeskServer: if self.hit_test(self.cx, self.cy) == win: self._mark_cursor_band() elif ty == uint32(desk.DESK_REQ_FLUSH): - # 【临时诊断】首条 FLUSH:证明 app 的"请合成"真的到达了合成器 - if _flush_cnt == 0: - _fb1: [128]char - viperlib.snprintf(&_fb1, 128, "[explorer] first FLUSH win=%d uy=%d h=%d\n", win, s.uy, s.h) - devfs.serial_puts(&_fb1) - _flush_cnt += 1 # 最小化窗口仍在后台绘制/FLUSH:不要置脏,否则合成器每帧都要重画背景。 if s.minimized == 0: self.mark(s.uy, s.h) @@ -1793,7 +1764,6 @@ class DeskServer: return sent def poll_input(self): - global _mouse_logged, _kbd_logged # --- 键盘:设备侧已给出 ASCII,逐字符投给焦点窗口(无焦点/失效则顶层窗口)--- # 单轮预算内的投递 + 一次补读:洪流时一轮只推进最多 KB_DELIVER_MAX 字节, # 其余留在 kb_pend,保证请求/输入/渲染仍能每轮推进,不会被一次洪流拖死。 @@ -1802,12 +1772,6 @@ class DeskServer: kb: [16]char kn: int = fs.read(self.kfd, &kb, uint32(16)) if kn > 0: - # 【诊断·临时】首个键盘字节:证明 内核 → devfs → explorer 这段是通的 - if _kbd_logged == 0: - _kbd_logged = 1 - _kb: [96]char - viperlib.snprintf(&_kb, 96, "[explorer] kbd n=%d ch=%d\n", kn, int(kb[0])) - devfs.serial_puts(&_kb) if kn > 16: kn = 16 for i in range(kn): self.kb_pend[i] = kb[i] @@ -1820,12 +1784,6 @@ class DeskServer: mp: [16]uint8 mn: int = fs.read(self.mfd, &mp, uint32(16)) if mn > 0: - # 【诊断·临时】首个鼠标包:证明 中断→devfs→本进程 链路已通 - if _mouse_logged == 0: - _mouse_logged = 1 - _mb: [128]char - viperlib.snprintf(&_mb, 128, "[explorer] mouse pkt n=%d btn=%d\n", mn, int(mp[0])) - devfs.serial_puts(&_mb) moved: int = 0 wheel: int = 0 if mn >= 10: @@ -2019,54 +1977,8 @@ class DeskServer: # 脏行里,只靠后续增量渲染会永远留在屏幕上。 self.mark_all() self.render() - # 【临时诊断】首帧结果:back[0] 是"合成出来的像素",fb[0] 是"提交到屏幕的像素"。 - # 两者都等于背景色 ⇒ 通路正常(问题在别处);back 有值而 fb 为 0 ⇒ 提交路径断了。 - _f1: [176]char - # 额外取一个任务栏行上的像素(底边往上 8 行):期望 0xff202020(任务栏底色 32,32,32)。 - # 它能证明"首帧确实把任务栏也提交到了 fb",从而把问题限定在"窗口合成"或"显示侧"。 - _tb_y: int = self.fb_h - 8 - _tb_px: uint32 = self.fb[_tb_y * self.pitch_px + 2] - viperlib.snprintf(&_f1, 176, "[explorer] frame1 back0=0x%x fb0=0x%x tb=0x%x w=%d h=%d pitch_px=%d\n", - self.back[0], self.fb[0], _tb_px, self.fb_w, self.fb_h, self.pitch_px) - devfs.serial_puts(&_f1) - _fc: int = 0 # 【临时诊断】帧计数 while True: self.poll_requests() self.poll_input() self.render() - # 【临时诊断】每 240 帧打一次:槽位数、最上层窗口的矩形/缓冲偏移,以及该窗口中心 - # 已合成出来的像素(用来判断"窗口到底有没有被合成")。 - _fc = _fc + 1 - if (_fc % 240) == 0: - # 【临时诊断】统计槽位 + 最上层窗口的矩形/缓冲偏移,并取窗口中心那个已合成像素。 - _uc: int = 0 - _tz: int = -1 - _tw: int = -1 - for _i in range(desk.DESK_MAX_WIN): - _s: desk.WinSlot* = self.slot(_i) - if _s.used != 0: _uc += 1 - if _s.used != 0 and _s.active != 0 and _s.minimized == 0 and _s.z_order > _tz: - _tz = _s.z_order - _tw = _i - _px: uint32 = uint32(0) - _spx: uint32 = uint32(0) - _wx: int = -1 - _wy: int = -1 - _ww: int = -1 - _wh: int = -1 - _woff: uint32 = uint32(0) - if _tw >= 0: - _ws: desk.WinSlot* = self.slot(_tw) - _wx = _ws.ux; _wy = _ws.uy; _ww = _ws.w; _wh = _ws.h; _woff = _ws.fb_off - _cxp: int = _wx + _ww / 2 - _cyp: int = _wy + _wh / 2 - if _cxp >= 0 and _cxp < self.fb_w and _cyp >= 0 and _cyp < self.fb_h: - _px = self.back[_cyp * self.fb_w + _cxp] - # 共享区里该窗口缓冲的首像素:app 到底有没有往这块内存里画 - _sbuf: uint32* = uint32*(self.shm + uint64(_woff)) - _spx = _sbuf[0] - _f2: [256]char - viperlib.snprintf(&_f2, 256, "[explorer] frame%d dirty=%d used=%d top=%d rect=%d,%d,%d,%d off=%u px=0x%x shm0=0x%x flush=%d\n", - _fc, self.dirty_any, _uc, _tw, _wx, _wy, _ww, _wh, _woff, _px, _spx, _flush_cnt) - devfs.serial_puts(&_f2) process.yield_cpu() diff --git a/Apps/Explorer/main.vp b/Apps/Explorer/main.vp index 2bcc680..43e774a 100644 --- a/Apps/Explorer/main.vp +++ b/Apps/Explorer/main.vp @@ -2,99 +2,52 @@ import vpsdk.devfs as devfs import vpsdk.desk as desk import vpsdk.process as process from stdint import * -import viperlib import desk_server -def _dbg(msg: const str): - # S4:改走 /dev/serial0(SERIAL_PUTS 私有 syscall 已删除) - devfs.serial_puts(msg) - - @__attribute__(section(".text.startup"), aligned(16)) export def _start() -> int: - _dbg("[explorer] start\n") - # 1) 打开 framebuffer 设备,问几何,再映射成线性地址 fb_fd: int = devfs.fb_open() if fb_fd < 0: - _dbg("[explorer] open /dev/fb0 FAILED\n") process.exit(1) return 0 - # fb_get_info 改为出参 + 返回码:必须判返回码,否则拿到的是"未写入的残留" - # (旧写法按值返回 FbInfo,只见前 16 字节有效 ⇒ size/phys 打出垃圾)。 + # fb_get_info returns the geometry through an out parameter and a status code. info: devfs.FbInfo _fb_ret: int = devfs.fb_get_info(fb_fd, &info) if _fb_ret != 0: - _dbg("[explorer] FB_GET_INFO FAILED\n") process.exit(1) return 0 - buf: [160]char - viperlib.snprintf(&buf, 160, - "[explorer] fb %ux%u pitch=%u fmt=%u size=%lu phys=0x%lx\n", - info.width, info.height, info.pitch, info.format, info.size, info.phys) - _dbg(&buf) - if info.pitch == 0 or info.size == 0: - # 几何为 0 ⇒ 内核侧登记/回填没成功(例如注册时传进去的 width/height 是 0)。 - # 继续走只会以 pitch=0 画崩,这里 fail-fast 并把原因说清楚。 - _dbg("[explorer] fb geometry invalid (pitch/size=0)\n") process.exit(1) return 0 fb_va: uint64 = devfs.fb_map(fb_fd, info.size) if fb_va == 0: - _dbg("[explorer] mmap /dev/fb0 FAILED\n") process.exit(1) return 0 - buf2: [96]char - viperlib.snprintf(&buf2, 96, "[explorer] fb mapped at 0x%lx\n", fb_va) - _dbg(&buf2) - - # 2) 屏幕几何/映射地址已打印(上面两行),像素通路由此验证;真正的绘制在服务端。 fb: uint32* = uint32*(fb_va) - # 【临时诊断】写一个哨兵像素再回读:区分"映射不可写/不可回读"与"合成逻辑没画东西"。 - # 确认后删除。 - fb[0] = uint32(0x0000FF00) - buf_s: [96]char - viperlib.snprintf(&buf_s, 96, "[explorer] fb[0] wrote=0xFF00 readback=0x%x\n", fb[0]) - _dbg(&buf_s) - - # 4) 输入设备可达性:能 open 到就说明 /dev/* 通路已打通 - # (真正读事件、接管窗口合成放到 S3 —— 内核桌面此刻还在抢同一个 PS/2 口)。 + # Input devices are reachable once they can be opened. kfd: int = devfs.kbd_open() mfd: int = devfs.mouse_open() - buf3: [96]char - viperlib.snprintf(&buf3, 96, "[explorer] input: kbd=%d mouse=%d\n", kfd, mfd) - _dbg(&buf3) - # 5) 挂上 /dev/desk 共享区并格式化 —— explorer 是图形壳,共享区由它初始化, - # app 侧只 desk_ready() 校验。这里先把头打出来证明 IPC 底座可用。 + # Attach and format the /dev/desk shared area used by the window server. desk_fd: int = desk.desk_open() if desk_fd < 0: - _dbg("[explorer] open /dev/desk FAILED\n") process.exit(1) return 0 shm: uint64 = desk.desk_map(desk_fd) if shm == 0: - _dbg("[explorer] mmap /dev/desk FAILED\n") process.exit(1) return 0 desk.desk_format(shm, info.width, info.height, info.pitch) - hdr: desk.DeskHeader* = desk.DeskHeader*(shm + desk.desk_header_off()) - buf4: [144]char - viperlib.snprintf(&buf4, 144, - "[explorer] desk shm=0x%lx ready=%d slot=%lu arena=%u\n", - shm, hdr.ready, uint64(desk.desk_slot_size()), hdr.arena_off) - _dbg(&buf4) - # 6) 进入窗口服务端主循环(永不返回):请求环 + 输入 + 合成。 + # Enter the window server loop: request ring, input and composition. srv: desk_server.DeskServer = desk_server.DeskServer() srv.init(fb, int(info.width), int(info.height), int(info.pitch), info.format, shm, kfd, mfd, fb_fd) - _dbg("[explorer] desk server running\n") srv.serve() return 0