Compare commits
3 Commits
6f2ff67300
...
a47968496e
| Author | SHA1 | Date | |
|---|---|---|---|
| a47968496e | |||
| a14f028402 | |||
| 65f92df8b7 |
59
MEMORY.md
@ -1,7 +1,66 @@
|
||||
# 继续开发前必读
|
||||
|
||||
## 2026-11-05 Ubuntu 深度响应调优(最新)
|
||||
- Ubuntu VM102 已在正常会话中启用 KMS 捕获 + 原生独立光标:virtio_gpu atomic 唯一 primary plane,2K geometry,cursor hotspot plane 不暴露;盒子客户端 SHA 未变。KMS 守护按 `CRTC_W/H=2560x1440` 校验,不能依赖 virtio atomic 客户端的 legacy `crtc_id/fb_id=0`。
|
||||
- KMS 45FPS 与 X11 45FPS 长按框选回显 P50/P95=195.9/246.6ms vs 250.1/311.5ms;更新约16.0/s vs10.6/s。28次原生光标点击、7种形状/热点/隐显通过,像素差0;正常退出、空闲重连、guard强杀恢复、再次重连通过。证据 `docs/evidence/ubuntu-deep-latency-20261105/`,报告 `docs/ubuntu-deep-latency-20261105.md`。
|
||||
- 真实GTK按钮/ masked entry 定量仅为当前应用内回显,不能代表真实后端认证;KMS按钮约304/378ms、字符约165/182ms。硬编和 `min_threads=4` 均失败/无收益并已撤回;Ubuntu仍软件x264,未达到Windows约90ms或零延迟。
|
||||
- 盒子 Ubuntu 卡片暂保持45FPS请求用于当前联调,2K/30Mbps;若收尾要回30FPS,先正常退出并改仅 Ubuntu 对象。当前现场应保持 `vdi-sunshine.service capture=kms` 与 guard active;检查时不要用 `fb_id/crtc_id` 作为活动判据。
|
||||
|
||||
完整对话总结在:`D:\DAIMA\vdi-cloud\PROJECT_CONTEXT.md`
|
||||
|
||||
## 2026-11-05 Ubuntu框选/渲染后续(优先于旧VM102硬件描述)
|
||||
- 后续用户要求清理锁屏Sunshine卡片:已确认是Stream Started/Paused通知,非多份安装。Ubuntu sunshine.conf新增system_tray=disabled(同时移除托盘图标),正常退出/入口重连后新进程日志确认生效;仅当前4条通知均为Sunshine时,通过GNOME通知面板清除并确认0剩余。原配置备份~/vdi-terminal/backups/sunshine-notifications-20261105/sunshine.conf;不改全局通知或锁屏策略,串流/guard active,退回普通桌面。下方“Sunshine配置与原配置一致”仅指渲染调优结束时,现多此一项。
|
||||
- 用户要求先只处理Ubuntu,已明确允许正常关闭启动、A/B及必要回退。本轮VM102正常关闭启动3次,最终4核/6144MB、cpu=host、vga=virtio-gl;宿主Intel i915共享渲染,Windows/麒麟/独占NVIDIA配置未动。宿主仅补GL/EGL/Mesa依赖,0升级10新增0移除。
|
||||
- Xorg确认virgl Intel HD4600/glamor生效,x264确认AVX2/FMA3/BMI2。仍X11捕获/libx264软件编码,renderD128不代表硬件编码。最终2K30/30Mbps/limited、默认线程;45FPS及min_threads=4试验无明显延迟收益,已撤回。盒子desktops JSON结构与本轮备份完全相同,客户端SHA仍5d4330…。
|
||||
- 受控60Hz长按框选:基线回显P50/P95=398.3/634.6ms,最终224.4/308.3ms;独立编号更新2.0→12.4/s,不等于总视频FPS。有效轮次最终编号300及释放均见;中位改善约44%,短样本未随机重复,非USB/光子延迟,尚未达到Windows/原生目标。
|
||||
- 回归16编号点击+2快速点击,源18按/18放,最大坐标误差1.375px;2K及12灰阶核对通过。临时测试服务已停,最后留Ubuntu普通桌面,Sunshine/guard active。不要自动进一步改麒麟。
|
||||
- 备份PVE /root/vdi-ubuntu-render-20261105/102.conf.before,Ubuntu/盒子各自~/vdi-terminal/backups/ubuntu-render-20261105/。回退只还原cpu/删除vga字段,需正常关闭启动;别整份覆盖VM配置。
|
||||
- 报告docs/ubuntu-drag-render-20261105.md,原始证据docs/evidence/ubuntu-drag-20261105/。剩余瓶颈为捕获/GPU读回/软件编码;未部署硬编方案或更换协议。
|
||||
|
||||
## 2026-11-05 Linux原生独立光标(优先于下方旧样式/原型状态)
|
||||
- 用户要求保留原生样式并直接实施低延迟方案;Ubuntu恢复Adwaita/24、default加速,关闭动画保留。两Linux真实2560×1440/30FPS请求/30Mbps/limited/软件编码保留。
|
||||
- 已部署0005 + terminal/native-cursor:受限独立SSH密钥/固定主机公钥同步XFixes真实形状、热点、显隐,本地X11指针移动不等待视频。单座席X11/2K/绝对鼠标,最多128×128;状态2秒过期或源几何改变则结束串流恢复原服务,不做运行中帧交接。
|
||||
- 私有原版Sunshine精确SHA + 进程级adapter只清除捕获副本像素。Ubuntu原/usr/bin/sunshine的capabilities保留,租约内用同SHA无cap副本;麒麟仅host.py/私有sunshine/.so认证KYSEC。guard按需启动,ExecStopPost恢复;原服务永久文件不改。
|
||||
- 盒子最终客户端SHA 5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03,.71/.72 profile固定该值;helper在远端租约前核验,旧备份实测拒绝且原服务PID不变。修改二进制须停用profile并重新验证。备份~/vdi-terminal/backups/native-cursor-20261105/;回退先退出等恢复,再停用两JSON。
|
||||
- 最终版两系统七种光标形状/热点一致、静态像素最大差0、视频无混入指针;各28编号点击与源事件完全匹配,Ubuntu误差最大1.055px、麒麟0.829px。较早各16次40ms短按和双击补测通过;最终版暂停Moonlight指针仍移动,较早服务器主动warp(400,600)两台读回正确。
|
||||
- 最终页面视频回显Ubuntu P50/P95 188.38/522.42ms,麒麟134.37/165.56ms;不是本地指针或物理USB延迟,未定量证明Windows等效。Ubuntu两次强制暂停恢复后首击未回显,根因未定;完整SDL失焦未验收,不可称全部场景无丢输入。
|
||||
- agent/guard SIGKILL恢复、Ubuntu bridge冻结退出、麒麟真实分辨率变化退出及恢复2K重连均已测。4项单测和清洁patch应用通过。构建器会规范CRLF但严格上下文;现场本轮未重建部署其他任务0004,不能据构建器宣称现场包含0004。
|
||||
- 普通Ubuntu初次收尾约4分42秒触发stale/mismatched退出,发现校验时间在读取前取得的原子替换竞态,改为读后取时间。该轮未区分未来/实际过期,不能认定唯一根因。仅修时序版先6分钟通过,之后9分32秒真实heartbeat超时;最终状态等待上限改2秒、主机TTL4秒,增加X11读耗时诊断。已测暂停Ubuntu代理1.1秒时指针继续移动且会话存活。旧1da552…形状/点击证据保留;最终版持续运行另记。
|
||||
- Ubuntu原Sunshine在11:12:07恢复测试阶段停止超过10秒、看门狗SIGTRAP,11:12:14恢复;未修复上游停止看门狗问题,原crash报告保留且未外发。
|
||||
- 最终2秒策略Ubuntu6分钟/65960次状态读取存活,含1.1秒暂停;读前时间出现1次合法未来值、读后0次,证实竞态检查顺序需要修正。随后同会话七形状/28点击通过;bridge冻结2.6秒后2.904秒检查客户端退出,原服务恢复。详见ubuntu-final-soak/release-probe/final-stale-state等最终证据。
|
||||
- 最终新SHA的Windows2K45/RKMPP/EGL无独立光标env回归;麒麟2K30七形状/28点击及普通桌面重连后退出,原服务active且无临时drop-in。Ubuntu保留2K30/原生指针PID299860/父235482,guard按设计active,临时GTK源/盒子探针均已停。报告docs/linux-native-cursor-20261105.md,证据docs/evidence/native-cursor-20261105/。
|
||||
|
||||
## 2026-11-05 Ubuntu画质与鼠标样式调优
|
||||
- Ubuntu .72/test2 已由1080p升级真实2560×1440,盒子只改Ubuntu对象为2K30,自动请求30Mbps。原VM虚拟VGA在当前内核可直接切2K,未改PVE硬件或重启VM/GDM。
|
||||
- 用户服务启动前newmode/addmode/output创建2K;删模式后服务启动重建通过。GNOME monitors.xml保存单屏2K/100%缩放,最终锁屏/解锁仍2K;整机重启恢复未验收。DisplayConfig持久调用曾待确认后回退,已重新保存显示配置并重新核验最终尺寸。
|
||||
- DMZ-White/24px、flat鼠标加速、关闭GNOME动画;不是复制Windows整套主题,也没有叠加本地假箭头。无GPU render节点,仍X11/libx264 ultrafast/zerolatency默认线程。
|
||||
- .72 host-color-range=0,正常kiosk最终PID240476/父235482,2K30/30Mbps、RKMPP/EGL、服务端MPEG和真实源2K核对;最终保留Ubuntu普通桌面连接,临时GTK服务已停止。
|
||||
- 正常入口2K短测:45请求full21.49FPS/F9 P50 373.2ms;limited22.83/376.7ms;单线程+无动画17.98/402.9ms(单线程已撤回);最终30请求limited/默认线程/无动画21.40/320.9ms。F9每轮24翻转无超时,但一轮客体有额外F9事件且无序号,不能证明逐键延迟。四轮启动快速点击只记录24/24/23/21且单线程有坐标重复,不能说全部通过;补做稳定正常会话24次慢速交替点击24/24、误差<1px、F8收到,见final-input-check.json。源GTK本身约15–20绘制/秒,视频含重复帧;不能声称独立运动21–23帧、稳定30/45或物理延迟降低/Windows等效。
|
||||
- limited灰阶保持黑白层次,未显著截断;单像素/彩字仍受4:2:0限制。两端备份~/vdi-terminal/backups/ubuntu-quality-20261105/,Ubuntu monitors.xml原不存在;.72 range原不存在。原Sunshine配置/服务、gsettings原值均保留。测试仅补装python3-gi-cairo,无整体升级。
|
||||
- 文档docs/ubuntu-quality-20261105.md、证据docs/evidence/ubuntu-quality-20261105/。Windows/麒麟卡片结构比较未变,未改客户端二进制、全局渲染或USB任务修改。
|
||||
|
||||
## 2026-11-05 Windows固定PCI设备不再可弹出
|
||||
- 用户要求日常体验像普通电脑、托盘只留真实U盘,授权“你自己保存然后重启”。交互会话仅设置/系统窗口,无打开文档;未强制关闭应用。
|
||||
- 09:28正常shutdown.exe /s /t 0后冷启动VM100。原args保留GPU子厂商设置,追加三个global:ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off、pci-bridge.shpc=off、pcie-root-port.hotplug=off。PCI增删须关机,USB设备级热插拔保留;没改总线/设备地址/驱动,没有重启USB隧道。
|
||||
- 原托盘四项(GTX965M/VirtIO网卡/串口/附加AHCI)Capabilities从6变0,InstanceId相同,Status OK;GPU错误0,系统盘Online/Healthy,IP .70、Sunshine及Guest Agent正常。
|
||||
- PVE备份/工具/root/vdi-fixed-pci-20261105/(backup/plan.json、vm.conf.before),set-fixed-pci.py支持prepare/apply/restore且拒绝在线变更。4项单测和无磁盘/网络后端/直通GPU的隔离QEMU测试通过(PCI关闭、usb-redir添加/删除)。
|
||||
- 盒子无物理U盘,仅键鼠,USB服务active;Moonlight随关机退出,用户须重连Windows。托盘UIA未暴露传统图标子项,外观与真实U盘插拔待用户验收,不冒充目视完成。文档docs/fixed-pci-tray-20261105.md及evidence/fixed-pci-20261105。
|
||||
|
||||
## 2026-11-04 云桌面图形关机/重启按钮限制
|
||||
- 用户明确要求Windows/Ubuntu/麒麟桌面内图形关机、重启按钮也禁用,前面的快捷键补丁不足。本轮已通过PVE Guest Agent实际部署,不依赖未构建的Moonlight 0004。
|
||||
- Windows VM100/test HKU Explorer NoClose=1,交互用户任务广播Policy并SHRestricted(2)=1;无Explorer重启/注销/VM重启,任务已删除。首次原值备份C:\ProgramData\VDI\power-policy\original.clixml。
|
||||
- 麒麟VM101/test1使用polkit .pkla,Ubuntu VM102/test2使用.rules。两台均额外部署/etc/dbus-1/system.d/zz-vdi-desktop-power.conf,按客户UID拒绝login1电源方法和Can*查询,只ReloadConfig。root CanPowerOff仍yes。
|
||||
- 两台实际图形进程pkcheck基础reboot仍授权(内部原因未确定),所以不能只靠polkit宣称已屏蔽。D-Bus错误签名安全探测八项全部Access denied,七项Can*拒绝;并未发送有效关机请求。麒麟定位时仅重启过polkit一次,Sunshine保持active。
|
||||
- 三台running,Windows LastBoot及Linux boot ID与部署前一致;未逐项目视验收菜单外观、未重启验收。限制当前客户账户图形电源入口,不防管理员命令/改策略,不涉及注销/锁屏,不实现盒子开关联动VM生命周期。新用户需重新针对账户应用。
|
||||
- 工具tools/deploy-guest-power-policy.py apply/query/restore --vm 100或--vm 101 --user test1或--vm 102 --user test2;Linux首次备份/var/lib/vdi/power-policy。详见docs/guest-power-policy-20261104.md及evidence/guest-power-policy-20261104。
|
||||
|
||||
## 2026-11-04 盒子过夜重启观察(最新)
|
||||
- 用户要求今晚开机观察并记录重启/原因。19:35启用vdi-overnight-observer.service,active/enabled,每60秒fsync心跳、boot ID/uptime计数、温度/负载/内存/网络/进程/桌面几何;跨午夜分日志。当前计数0是启用后范围,不代表历史没重启。
|
||||
- 中文汇总~/vdi-terminal/logs/overnight-summary.txt;JSON行overnight-health-YYYYMMDD.log;持久状态~/vdi-terminal/state/overnight-state.json。同boot的服务重启不计为整机重启;11项状态/证据/跨日测试通过,实际分钟样本和服务重启状态保持已验证,未实际重启盒子。
|
||||
- /var/log是zram,journal链接到eMMC /var/log.hdd/journal。新增70-vdi-observer-journal.conf配置persistent/64MB/7day/30s,flush/sync确认磁盘journal;只重启journald和本观察服务,不动Moonlight/显示/网络/GPU。
|
||||
- root拥有/usr/local/libexec/vdi-observer-pstore只读采集pstore到/var/lib/vdi-observer/pstore.json(root:systemd-journal 640),观察服务低权限读取。旧归档41字节reboot行仅基线;仅内容变化作为新线索。无法确认的断电/硬复位明确标原因未确认,不能伪造重启因果。
|
||||
- 最后Windows串流PID137139、2K45和显示守护保留,boot ID afb6a02f-ba7c-478a-8704-c78a993d23c6。文档docs/overnight-box-observation-20261104.md及evidence/overnight-observer-20261104;备份~/vdi-terminal/backups/overnight-observer-20261104-*。明早读取两天日志和汇总,无明早自动通知任务。
|
||||
|
||||
## 2026-11-04 麒麟鼠标掉帧继续排查(最新)
|
||||
- 保留原版Sunshine SHA256 1c3099bf924db3aee759b3d7c05e012569ef8650c400d1479144398795decc71、单线程、暂停合成器、真实2K30/30Mbps。未改PVE或其他桌面。
|
||||
- wrapper支持~/.config/vdi-terminal/host-color-range/<host>的0/1协商;仅.71设0,消除软件full-range额外转换。同场景2K45请求:原full21.42FPS,limited28.81FPS;不代表真实45或物理延迟与Windows一致。
|
||||
|
||||
10
README.md
@ -66,7 +66,7 @@ vdi-cloud/
|
||||
- 会话退出后返回桌面列表。
|
||||
|
||||
不同客户部署环境的桌面地址不同:换环境时在“设置”里改地址即可,不需要改代码。
|
||||
VPN 属于网络层能力(盒子上的 VPN 客户端建立隧道后),地址字段直接填隧道地址即可。
|
||||
这里的 VPN 仅指网络层能力:盒子上的 VPN 客户端建立隧道后,桌面地址字段可以填写隧道地址。让云桌面内部浏览器和应用通过 Clash/Mihomo 访问 GPT 等外部服务属于后续规划,见“下一步计划”第 8 项。
|
||||
|
||||
设备身份自动登录是正式认证 API 上线前的临时实现。后续通过 `DesktopService` 适配层接入真实的用户认证、桌面列表和一次性连接票据接口,页面流程不需要重写。
|
||||
|
||||
@ -86,7 +86,9 @@ VPN 属于网络层能力(盒子上的 VPN 客户端建立隧道后),地
|
||||
- `vsync`、`frame-pacing`、性能叠图等低延迟参数可配置;
|
||||
- 独立 Moonlight 启动脚本保留作调试用途,但不再作为产品开机入口。
|
||||
|
||||
2026-11-04 现场已接通 Windows、Ubuntu、麒麟三种桌面的正常选择与连接流程。Ubuntu 当前采用 1080p / 30 FPS 配置,麒麟已升级真实 2K / 30 FPS 配置与30Mbps;两者使用 `libx264` 软件编码,盒子使用 RKMPP 硬解。麒麟后续采用逐主机limited视频范围协商,同场景动态短测由约21提高至29FPS,仍未达到Windows水平,长期性能及物理输入延迟尚未验收。配置、备份与证据见 [Linux 桌面接入记录](docs/linux-desktop-onboarding-20261104.md)、[麒麟2K调优记录](docs/kylin-quality-20261104.md) 和 [鼠标掉帧继续排查](docs/kylin-mouse-20261104.md)。
|
||||
2026-11-04 现场已接通 Windows、Ubuntu、麒麟三种桌面的正常选择与连接流程。Ubuntu 与麒麟现均为真实 2K / 30 FPS 请求配置与30Mbps,使用 `libx264` 软件编码和逐主机limited范围协商,盒子使用 RKMPP 硬解。2026-11-05 两套 Linux 已启用受限 X11 原生独立光标:同步实际形状/热点/显隐,由盒子显示指针位置,移动不再等待视频;Ubuntu恢复Adwaita/24px及默认鼠标加速,保留关闭动画。Windows保持原视频光标路径。形状、编号点击、断线恢复已实测,完整失焦与物理输入延迟尚未验收;点击页面及拖窗内容仍受软件编码限制,不能称定量等同Windows。方案和边界见 [原生独立光标实施记录](docs/linux-native-cursor-20261105.md);历史画质证据见 [Linux接入](docs/linux-desktop-onboarding-20261104.md)、[Ubuntu调优](docs/ubuntu-quality-20261105.md)、[麒麟2K调优](docs/kylin-quality-20261104.md)。
|
||||
|
||||
2026-11-05 后续只对 Ubuntu VM102 启用 `cpu=host`(AVX2)及 `virtio-gl`(共享Intel核显渲染)。受控长按框选的回显中位数约398→224ms,2K与原生光标保留;45FPS和4编码线程未继续改善延迟,最终仍用30FPS及默认线程。尚未达到Windows/原生目标,仍需解决捕获和软件编码瓶颈,详见 [Ubuntu框选与渲染调优](docs/ubuntu-drag-render-20261105.md)。
|
||||
|
||||
### 3. 状态机
|
||||
|
||||
@ -250,7 +252,9 @@ Moonlight 调试配置路径:
|
||||
4. 实现 Ubuntu、麒麟桌面连接配置;
|
||||
5. 适配 RK3528 MPP/VPU 硬解;
|
||||
6. 切换到 Weston/Wayland 正式显示路径;
|
||||
7. 开发 `vdt-agent`、OTA、USB、云端服务和 Web 控制台。
|
||||
7. 开发 `vdt-agent`、OTA、USB、云端服务和 Web 控制台;
|
||||
8. **云桌面内上网代理(规划)**:在终端登录首页提供代理配置入口,支持导入/更新 Clash 或 Mihomo 订阅、选择节点、启停和连通性测试;由云端服务将策略分别下发到 Windows、Ubuntu 和麒麟云桌面,使桌面内的浏览器和应用可以访问 GPT 等外部服务,同时为 Moonlight 串流、管理平台和必要内网地址保留稳定的直连/专用路由。该功能当前不实现、不部署;
|
||||
9. **云桌面软件白名单与商业合规(规划)**:建立按客户/桌面生效的软件允许列表、版本校验、策略下发、审计和回滚流程。Windows 与麒麟计划通过签名的系统插件或代理组件执行白名单策略;Ubuntu 计划在系统底层实施,并在定版前完成权限模型、更新机制和例外流程评审。该功能当前不实现、不部署,正式销售前必须完成授权范围和合规审查。
|
||||
|
||||
## 十、开发规范
|
||||
|
||||
|
||||
37
docs/evidence/fixed-pci-20261105/after-start.txt
Normal file
@ -0,0 +1,37 @@
|
||||
status: running
|
||||
agent: 1
|
||||
args: -set device.hostpci0.x-pci-sub-vendor-id=0x1558 -set device.hostpci0.x-pci-sub-device-id=0x6557 -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -global pci-bridge.shpc=off -global pcie-root-port.hotplug=off
|
||||
balloon: 0
|
||||
bios: seabios
|
||||
boot: order=sata0;ide2
|
||||
cores: 4
|
||||
cpu: host,hidden=1
|
||||
hostpci0: 0000:01:00.0,pcie=1,rombar=1,romfile=gtx965m-clevo-readback-20261103.rom
|
||||
ide0: none,media=cdrom
|
||||
ide2: none,media=cdrom
|
||||
machine: pc-q35-11.0
|
||||
memory: 8192
|
||||
meta: creation-qemu=11.0.0,ctime=1792722917
|
||||
name: win10-test
|
||||
net0: virtio=BC:24:11:B4:01:43,bridge=vmbr0,firewall=1
|
||||
numa: 0
|
||||
onboot: 1
|
||||
ostype: win10
|
||||
sata0: local-lvm:base-100-disk-0,size=60G
|
||||
scsihw: virtio-scsi-single
|
||||
smbios1: uuid=52fd3777-0bb4-40a7-8136-b02c40947a11
|
||||
sockets: 1
|
||||
template: 0
|
||||
vmgenid: a1963978-050f-4b3c-8c9a-7a4d13d72f43
|
||||
{
|
||||
"vm": 100,
|
||||
"device_present": false,
|
||||
"channels": [],
|
||||
"usb": " Device 0.1, Port 1, Speed 480 Mb/s, Product QEMU USB Tablet, ID: tablet\r\n",
|
||||
"vm_status": {
|
||||
"status": "running",
|
||||
"running": true
|
||||
}
|
||||
}
|
||||
|
||||
EXIT 0
|
||||
3
docs/evidence/fixed-pci-20261105/apply.txt
Normal file
@ -0,0 +1,3 @@
|
||||
{"vm": 100, "action": "apply", "args": "-set device.hostpci0.x-pci-sub-vendor-id=0x1558 -set device.hostpci0.x-pci-sub-device-id=0x6557 -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -global pci-bridge.shpc=off -global pcie-root-port.hotplug=off", "next_step": "cold start and verify Windows"}
|
||||
|
||||
EXIT 0
|
||||
2
docs/evidence/fixed-pci-20261105/cold-start.txt
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
EXIT 0
|
||||
11
docs/evidence/fixed-pci-20261105/isolated-qemu-test.txt
Normal file
@ -0,0 +1,11 @@
|
||||
QEMU_VERSION {'qemu': {'micro': 3, 'minor': 0, 'major': 11}, 'package': 'pve-qemu-kvm_11.0.3-4'}
|
||||
PCIE_PORT_HOTPLUG_OFF: 4/4
|
||||
PCI_BRIDGE_SHPC_OFF: 4/4
|
||||
ACPI_PCI_HOTPLUG_OFF
|
||||
USB_REDIR_ADD_OK
|
||||
USB_REDIR_REMOVE_OK
|
||||
ISOLATED_SMOKE_PASS (Windows UI and physical USB not tested)
|
||||
QEMU_STDERR: kvm: warning: nic diagnet has no peer
|
||||
|
||||
|
||||
EXIT 0
|
||||
35
docs/evidence/fixed-pci-20261105/prepare.txt
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"vm": 100,
|
||||
"created": "2026-11-05T09:24:07.989788+08:00",
|
||||
"original_args": "-set device.hostpci0.x-pci-sub-vendor-id=0x1558 -set device.hostpci0.x-pci-sub-device-id=0x6557",
|
||||
"proposed_args": "-set device.hostpci0.x-pci-sub-vendor-id=0x1558 -set device.hostpci0.x-pci-sub-device-id=0x6557 -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -global pci-bridge.shpc=off -global pcie-root-port.hotplug=off",
|
||||
"original_config": {
|
||||
"agent": "1",
|
||||
"args": "-set device.hostpci0.x-pci-sub-vendor-id=0x1558 -set device.hostpci0.x-pci-sub-device-id=0x6557",
|
||||
"balloon": "0",
|
||||
"bios": "seabios",
|
||||
"boot": "order=sata0;ide2",
|
||||
"cores": "4",
|
||||
"cpu": "host,hidden=1",
|
||||
"hostpci0": "0000:01:00.0,pcie=1,rombar=1,romfile=gtx965m-clevo-readback-20261103.rom",
|
||||
"ide0": "none,media=cdrom",
|
||||
"ide2": "none,media=cdrom",
|
||||
"machine": "pc-q35-11.0",
|
||||
"memory": "8192",
|
||||
"meta": "creation-qemu=11.0.0,ctime=1792722917",
|
||||
"name": "win10-test",
|
||||
"net0": "virtio=BC:24:11:B4:01:43,bridge=vmbr0,firewall=1",
|
||||
"numa": "0",
|
||||
"onboot": "1",
|
||||
"ostype": "win10",
|
||||
"sata0": "local-lvm:base-100-disk-0,size=60G",
|
||||
"scsihw": "virtio-scsi-single",
|
||||
"smbios1": "uuid=52fd3777-0bb4-40a7-8136-b02c40947a11",
|
||||
"sockets": "1",
|
||||
"template": "0",
|
||||
"vmgenid": "a1963978-050f-4b3c-8c9a-7a4d13d72f43"
|
||||
},
|
||||
"status": "prepared; not applied"
|
||||
}
|
||||
|
||||
EXIT 0
|
||||
13
docs/evidence/fixed-pci-20261105/running-state.txt
Normal file
@ -0,0 +1,13 @@
|
||||
status: running
|
||||
{
|
||||
"vm": 100,
|
||||
"device_present": false,
|
||||
"channels": [],
|
||||
"usb": " Device 0.1, Port 1, Speed 480 Mb/s, Product QEMU USB Tablet, ID: tablet\r\n",
|
||||
"vm_status": {
|
||||
"status": "running",
|
||||
"running": true
|
||||
}
|
||||
}
|
||||
|
||||
EXIT 0
|
||||
8
docs/evidence/fixed-pci-20261105/shutdown.txt
Normal file
@ -0,0 +1,8 @@
|
||||
SHUTDOWN_REQUEST 0 {
|
||||
"exitcode" : 0,
|
||||
"exited" : 1
|
||||
}
|
||||
|
||||
VM_STOPPED_NORMALLY
|
||||
|
||||
EXIT 0
|
||||
62
docs/evidence/fixed-pci-20261105/tray-after.json
Normal file
@ -0,0 +1,62 @@
|
||||
{
|
||||
"time": "2026-11-05T09:29:55.1484833+08:00",
|
||||
"user": "DESKTOP-Q072ICM\\test",
|
||||
"tray": [
|
||||
{
|
||||
"class": "Shell_TrayWnd",
|
||||
"name": "",
|
||||
"items": [
|
||||
{
|
||||
"name": "开始",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "Start"
|
||||
},
|
||||
{
|
||||
"name": "搜索突出显示图标打开搜索主页窗口",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "DynamicContent1"
|
||||
},
|
||||
{
|
||||
"name": "在此键入进行搜索",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "Button"
|
||||
},
|
||||
{
|
||||
"name": "任务视图",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "TrayButton"
|
||||
},
|
||||
{
|
||||
"name": "运行中的应用程序",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "MSTaskSwWClass"
|
||||
},
|
||||
{
|
||||
"name": "运行中的应用程序",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "MSTaskListWClass"
|
||||
},
|
||||
{
|
||||
"name": "用户提示通知区域",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "ToolbarWindow32"
|
||||
},
|
||||
{
|
||||
"name": "任务栏输入指示",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "TrayInputIndicatorWClass"
|
||||
},
|
||||
{
|
||||
"name": "系统时钟, 9:29, 2026/11/5",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "TrayClockWClass"
|
||||
},
|
||||
{
|
||||
"name": "操作中心,3 个新通知",
|
||||
"type": "ControlType.Pane",
|
||||
"class": "TrayButton"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
64
docs/evidence/fixed-pci-20261105/user-session-before.json
Normal file
@ -0,0 +1,64 @@
|
||||
{
|
||||
"time": "2026-11-05T09:27:06.7691671+08:00",
|
||||
"processes": [
|
||||
"ApplicationFrameHost",
|
||||
"ChsIME",
|
||||
"conhost",
|
||||
"csrss",
|
||||
"ctfmon",
|
||||
"DefenderSessionHelper",
|
||||
"dllhost",
|
||||
"dwm",
|
||||
"explorer",
|
||||
"FileCoAuth",
|
||||
"fontdrvhost",
|
||||
"M365Copilot",
|
||||
"msedge",
|
||||
"msedgewebview2",
|
||||
"NVDisplay.Container",
|
||||
"OneDrive",
|
||||
"PhoneExperienceHost",
|
||||
"powershell",
|
||||
"RuntimeBroker",
|
||||
"SearchApp",
|
||||
"SecurityHealthSystray",
|
||||
"ShellExperienceHost",
|
||||
"sihost",
|
||||
"StartMenuExperienceHost",
|
||||
"sunshine",
|
||||
"svchost",
|
||||
"SystemSettings",
|
||||
"TabTip",
|
||||
"taskhostw",
|
||||
"TextInputHost",
|
||||
"UserOOBEBroker",
|
||||
"winlogon"
|
||||
],
|
||||
"user": "DESKTOP-Q072ICM\\test",
|
||||
"windows": [
|
||||
{
|
||||
"Id": 6208,
|
||||
"ProcessName": "ApplicationFrameHost",
|
||||
"SessionId": 1,
|
||||
"MainWindowTitle": "设置"
|
||||
},
|
||||
{
|
||||
"Id": 6256,
|
||||
"ProcessName": "explorer",
|
||||
"SessionId": 1,
|
||||
"MainWindowTitle": ""
|
||||
},
|
||||
{
|
||||
"Id": 8684,
|
||||
"ProcessName": "SystemSettings",
|
||||
"SessionId": 1,
|
||||
"MainWindowTitle": "设置"
|
||||
},
|
||||
{
|
||||
"Id": 4652,
|
||||
"ProcessName": "TextInputHost",
|
||||
"SessionId": 1,
|
||||
"MainWindowTitle": "Microsoft Text Input Application"
|
||||
}
|
||||
]
|
||||
}
|
||||
107
docs/evidence/fixed-pci-20261105/windows-after.json
Normal file
@ -0,0 +1,107 @@
|
||||
{
|
||||
"boot": "2026-11-05T09:28:17.5000000+08:00",
|
||||
"devices": [
|
||||
{
|
||||
"name": "Red Hat VirtIO Ethernet Adapter",
|
||||
"status": "OK",
|
||||
"instance": "PCI\\VEN_1AF4\u0026DEV_1000\u0026SUBSYS_00011AF4\u0026REV_00\\5\u0026226B9205\u00260\u00269008F0",
|
||||
"capabilities": 0
|
||||
},
|
||||
{
|
||||
"name": "Standard SATA AHCI Controller",
|
||||
"status": "OK",
|
||||
"instance": "PCI\\VEN_8086\u0026DEV_2922\u0026SUBSYS_11001AF4\u0026REV_02\\3\u002611583659\u00261\u0026FA",
|
||||
"capabilities": 0
|
||||
},
|
||||
{
|
||||
"name": "NVIDIA GeForce GTX 965M",
|
||||
"status": "OK",
|
||||
"instance": "PCI\\VEN_10DE\u0026DEV_13D9\u0026SUBSYS_65571558\u0026REV_A1\\4\u00263335B6E8\u00260\u002600E0",
|
||||
"capabilities": 0
|
||||
},
|
||||
{
|
||||
"name": "VirtIO Serial Driver",
|
||||
"status": "OK",
|
||||
"instance": "PCI\\VEN_1AF4\u0026DEV_1003\u0026SUBSYS_00031AF4\u0026REV_00\\5\u0026226B9205\u00260\u00264008F0",
|
||||
"capabilities": 0
|
||||
},
|
||||
{
|
||||
"name": "Standard SATA AHCI Controller",
|
||||
"status": "OK",
|
||||
"instance": "PCI\\VEN_8086\u0026DEV_2922\u0026SUBSYS_11001AF4\u0026REV_02\\5\u0026226B9205\u00260\u00263808F0",
|
||||
"capabilities": 0
|
||||
}
|
||||
],
|
||||
"ip": [
|
||||
{
|
||||
"InterfaceAlias": "以太网",
|
||||
"IPAddress": "192.168.1.70"
|
||||
},
|
||||
{
|
||||
"InterfaceAlias": "Loopback Pseudo-Interface 1",
|
||||
"IPAddress": "127.0.0.1"
|
||||
}
|
||||
],
|
||||
"disk": [
|
||||
{
|
||||
"Number": 0,
|
||||
"FriendlyName": "QEMU HARDDISK",
|
||||
"OperationalStatus": "Online",
|
||||
"HealthStatus": "Healthy",
|
||||
"IsBoot": true,
|
||||
"BusType": "SATA"
|
||||
}
|
||||
],
|
||||
"ejectOrRemovable": [
|
||||
{
|
||||
"InstanceId": "SWD\\PRINTENUM\\{E254A0CC-C950-4956-A2C8-6CBC391E11FE}",
|
||||
"Data": 244
|
||||
},
|
||||
{
|
||||
"InstanceId": "{6FDE7547-1B65-48AE-B628-80BE62016026}\\VIOSERIALPORT\\6\u0026201398F9\u00260\u002601",
|
||||
"Data": 230
|
||||
},
|
||||
{
|
||||
"InstanceId": "DISPLAY\\MTT1337\\1\u002623323A80\u00260\u0026UID256",
|
||||
"Data": 228
|
||||
},
|
||||
{
|
||||
"InstanceId": "DISPLAY\\DEFAULT_MONITOR\\4\u002618756DEA\u00260\u0026UID0",
|
||||
"Data": 228
|
||||
},
|
||||
{
|
||||
"InstanceId": "SWD\\PRINTENUM\\{FEA805B9-BFF7-40E5-A50E-37CBA79B87D2}",
|
||||
"Data": 244
|
||||
},
|
||||
{
|
||||
"InstanceId": "USB\\VID_0627\u0026PID_0001\\28754-0000:00:1D.7-1",
|
||||
"Data": 148
|
||||
},
|
||||
{
|
||||
"InstanceId": "SWD\\PRINTENUM\\{FAA68C95-DAED-418D-BBBF-DE2DAD0E10B9}",
|
||||
"Data": 244
|
||||
},
|
||||
{
|
||||
"InstanceId": "SWD\\PRINTENUM\\{5B90D326-0123-4713-9B92-00DC0665DA58}",
|
||||
"Data": 244
|
||||
},
|
||||
{
|
||||
"InstanceId": "SWD\\PRINTENUM\\{FD12D2CE-A457-4909-9B7D-3CFB018A7323}",
|
||||
"Data": 244
|
||||
}
|
||||
],
|
||||
"time": "2026-11-05T09:29:02.2662944+08:00",
|
||||
"sunshine": [
|
||||
{
|
||||
"Id": 5764,
|
||||
"SessionId": 1
|
||||
}
|
||||
],
|
||||
"gpu": [
|
||||
{
|
||||
"Name": "NVIDIA GeForce GTX 965M",
|
||||
"ConfigManagerErrorCode": 0
|
||||
}
|
||||
],
|
||||
"user": "DESKTOP-Q072ICM\\test"
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
{"vm": 101, "exitcode": 0, "out-data": "{\"action\": \"apply\", \"user\": \"test1\", \"backend\": \"pkla\", \"path\": \"/etc/polkit-1/localauthority/90-mandatory.d/99-vdi-power.pkla\", \"backup\": \"/var/lib/vdi/power-policy\", \"policy_matches\": true, \"dbus_policy_matches\": true, \"dbus_denials\": {\"PowerOff\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"Reboot\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"Halt\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"Suspend\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"Hibernate\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"HybridSleep\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"SuspendThenHibernate\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"ScheduleShutdown\": {\"code\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}}, \"boot_id\": \"6c83a4b3-eae9-45eb-94f2-43bb372c44a2\", \"capabilities\": {\"CanPowerOff\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanReboot\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanHalt\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanSuspend\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanHybridSleep\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanSuspendThenHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}}}\n", "exited": 1}
|
||||
@ -0,0 +1 @@
|
||||
{"vm": 101, "exited": 1, "out-data": "{\"action\": \"query\", \"user\": \"test1\", \"backend\": \"pkla\", \"path\": \"/etc/polkit-1/localauthority/90-mandatory.d/99-vdi-power.pkla\", \"backup\": \"/var/lib/vdi/power-policy\", \"policy_matches\": true, \"dbus_policy_matches\": true, \"dbus_denials\": {}, \"boot_id\": \"6c83a4b3-eae9-45eb-94f2-43bb372c44a2\", \"capabilities\": {\"CanPowerOff\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanReboot\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanHalt\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanSuspend\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanHybridSleep\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"CanSuspendThenHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}}}\n", "exitcode": 0}
|
||||
@ -0,0 +1 @@
|
||||
{"vm": 102, "exitcode": 0, "out-data": "{\"action\": \"apply\", \"user\": \"test2\", \"backend\": \"rules\", \"path\": \"/etc/polkit-1/rules.d/00-vdi-power.rules\", \"backup\": \"/var/lib/vdi/power-policy\", \"policy_matches\": true, \"dbus_policy_matches\": true, \"dbus_denials\": {\"PowerOff\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}, \"Reboot\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}, \"Halt\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}, \"Suspend\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}, \"Hibernate\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}, \"HybridSleep\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}, \"SuspendThenHibernate\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}, \"ScheduleShutdown\": {\"code\": 1, \"error\": \"Call failed: Access denied\"}}, \"boot_id\": \"b82ac3c5-f2ee-454f-971b-d3e2a64d990b\", \"capabilities\": {\"CanPowerOff\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanReboot\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanHalt\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanSuspend\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanHybridSleep\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanSuspendThenHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}}}\n", "exited": 1}
|
||||
@ -0,0 +1 @@
|
||||
{"vm": 102, "exited": 1, "out-data": "{\"action\": \"query\", \"user\": \"test2\", \"backend\": \"rules\", \"path\": \"/etc/polkit-1/rules.d/00-vdi-power.rules\", \"backup\": \"/var/lib/vdi/power-policy\", \"policy_matches\": true, \"dbus_policy_matches\": true, \"dbus_denials\": {}, \"boot_id\": \"b82ac3c5-f2ee-454f-971b-d3e2a64d990b\", \"capabilities\": {\"CanPowerOff\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanReboot\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanHalt\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanSuspend\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanHybridSleep\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}, \"CanSuspendThenHibernate\": {\"code\": 1, \"value\": \"\", \"error\": \"Call failed: Access denied\"}}}\n", "exitcode": 0}
|
||||
17
docs/evidence/guest-power-policy-20261104/vm-health.json
Normal file
@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"vm": 100,
|
||||
"status": "running",
|
||||
"uptime": 1736
|
||||
},
|
||||
{
|
||||
"vm": 101,
|
||||
"status": "running",
|
||||
"uptime": 27815
|
||||
},
|
||||
{
|
||||
"vm": 102,
|
||||
"status": "running",
|
||||
"uptime": 112734
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"exited": 1,
|
||||
"out-data": "{\"user\": \"test1\", \"graphical_subject\": \"1257,635,1000\", \"polkit_active_session\": {\"power-off\": {\"exitcode\": 1, \"error\": \"Not authorized.\"}, \"reboot\": {\"exitcode\": 0, \"error\": \"\"}, \"suspend\": {\"exitcode\": 1, \"error\": \"Not authorized.\"}, \"hibernate\": {\"exitcode\": 1, \"error\": \"Not authorized.\"}}, \"dbus_invalid_signature_denial_probes\": {\"PowerOff\": {\"exitcode\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}, \"Reboot\": {\"exitcode\": 1, \"error\": \"\\u001b[0;1;31mCall failed: Access denied\\u001b[0m\"}}, \"sunshine\": \"active\", \"boot_id\": \"6c83a4b3-eae9-45eb-94f2-43bb372c44a2\", \"root_can_poweroff\": \"s \\\"yes\\\"\"}\n",
|
||||
"exitcode": 0
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"exitcode": 0,
|
||||
"out-data": "{\"user\": \"test2\", \"graphical_subject\": \"7174,7356579,1000\", \"polkit_active_session\": {\"power-off\": {\"exitcode\": 1, \"error\": \"Not authorized.\"}, \"reboot\": {\"exitcode\": 0, \"error\": \"\"}, \"suspend\": {\"exitcode\": 1, \"error\": \"Not authorized.\"}, \"hibernate\": {\"exitcode\": 1, \"error\": \"Not authorized.\"}}, \"dbus_invalid_signature_denial_probes\": {\"PowerOff\": {\"exitcode\": 1, \"error\": \"Call failed: Access denied\"}, \"Reboot\": {\"exitcode\": 1, \"error\": \"Call failed: Access denied\"}}, \"sunshine\": \"active\", \"boot_id\": \"b82ac3c5-f2ee-454f-971b-d3e2a64d990b\", \"root_can_poweroff\": \"s \\\"yes\\\"\"}\n",
|
||||
"exited": 1
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
{"vm": 100, "exitcode": 0, "out-truncated": 0, "exited": 1, "out-data": "{\"Action\":\"Apply\",\"User\":\"DESKTOP-Q072ICM\\\\test\",\"Sid\":\"S-1-5-21-911627089-847994065-1864506460-1003\",\"NoClose\":1,\"Backup\":\"C:\\\\ProgramData\\\\VDI\\\\power-policy\\\\original.clixml\",\"EffectiveShellNoClose\":1,\"LastBoot\":\"2026-11-04T20:31:16.5000000+08:00\",\"Scope\":\"Desktop power menus only; privileged administration remains available\"}\r\n"}
|
||||
@ -0,0 +1 @@
|
||||
{"vm": 100, "exitcode": 0, "exited": 1, "out-truncated": 0, "out-data": "{\"Action\":\"Query\",\"User\":\"DESKTOP-Q072ICM\\\\test\",\"Sid\":\"S-1-5-21-911627089-847994065-1864506460-1003\",\"NoClose\":1,\"Backup\":\"C:\\\\ProgramData\\\\VDI\\\\power-policy\\\\original.clixml\",\"EffectiveShellNoClose\":1,\"LastBoot\":\"2026-11-04T20:31:16.5000000+08:00\",\"Scope\":\"Desktop power menus only; privileged administration remains available\"}\r\n"}
|
||||
28
docs/evidence/native-cursor-20261105/capture-isolation.json
Normal file
@ -0,0 +1,28 @@
|
||||
[
|
||||
{
|
||||
"host": "192.168.1.72",
|
||||
"normal": {
|
||||
"width": 24,
|
||||
"height": 24,
|
||||
"visible_pixels": 240
|
||||
},
|
||||
"adapter": {
|
||||
"width": 24,
|
||||
"height": 24,
|
||||
"visible_pixels": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"host": "192.168.1.71",
|
||||
"normal": {
|
||||
"width": 16,
|
||||
"height": 16,
|
||||
"visible_pixels": 0
|
||||
},
|
||||
"adapter": {
|
||||
"width": 16,
|
||||
"height": 16,
|
||||
"visible_pixels": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
16
docs/evidence/native-cursor-20261105/click-verification.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"ubuntu": {
|
||||
"measured_clicks": 28,
|
||||
"matched_source_events": 28,
|
||||
"max_coordinate_error_pixels": 0.9814453125,
|
||||
"p50_ms": 188.9504005,
|
||||
"p95_ms": 468.920931
|
||||
},
|
||||
"kylin": {
|
||||
"measured_clicks": 28,
|
||||
"matched_source_events": 28,
|
||||
"max_coordinate_error_pixels": 0.74267578125,
|
||||
"p50_ms": 127.61443249999999,
|
||||
"p95_ms": 168.630841
|
||||
}
|
||||
}
|
||||
1
docs/evidence/native-cursor-20261105/client-sha.txt
Normal file
@ -0,0 +1 @@
|
||||
5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03
|
||||
13
docs/evidence/native-cursor-20261105/deployment-final.json
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"192.168.1.71": {
|
||||
"host_py_sha256": "41f6a9a7dcbe3b916864eb3a4bb1b2cbaf669c779256f913fbeef4f53cf09b65",
|
||||
"client_sha256": "5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03",
|
||||
"status": "600\nActiveState=inactive\n"
|
||||
},
|
||||
"192.168.1.72": {
|
||||
"host_py_sha256": "41f6a9a7dcbe3b916864eb3a4bb1b2cbaf669c779256f913fbeef4f53cf09b65",
|
||||
"client_sha256": "5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03",
|
||||
"status": "600\nActiveState=active\n39181 /usr/bin/python3 /home/test2/vdi-terminal/native-cursor-v1/host.py stream\n"
|
||||
},
|
||||
"box_helper_sha256": "44b3e8a0ca591fbde42cf3372d343ab4cb603c089e7805bbccf6d261b2e173ac"
|
||||
}
|
||||
103
docs/evidence/native-cursor-20261105/fast-input.py
Normal file
@ -0,0 +1,103 @@
|
||||
"""Run only with the controlled GTK acceptance window filling the stream."""
|
||||
import ctypes as C
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import signal
|
||||
import statistics
|
||||
import struct
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
os.environ.update(DISPLAY=':0', XAUTHORITY='/home/armbian/.Xauthority')
|
||||
x = C.CDLL('libX11.so.6')
|
||||
fix = C.CDLL('libXfixes.so.3')
|
||||
test = C.CDLL('libXtst.so.6')
|
||||
class Cursor(C.Structure):
|
||||
_fields_ = [('x', C.c_short), ('y', C.c_short), ('w', C.c_ushort),
|
||||
('h', C.c_ushort), ('hx', C.c_ushort), ('hy', C.c_ushort),
|
||||
('serial', C.c_ulong), ('pixels', C.POINTER(C.c_ulong)),
|
||||
('atom', C.c_ulong), ('name', C.c_char_p)]
|
||||
x.XOpenDisplay.argtypes = [C.c_char_p]
|
||||
x.XOpenDisplay.restype = C.c_void_p
|
||||
x.XDefaultRootWindow.argtypes = [C.c_void_p]
|
||||
x.XDefaultRootWindow.restype = C.c_ulong
|
||||
x.XFree.argtypes = [C.c_void_p]
|
||||
x.XSync.argtypes = [C.c_void_p, C.c_int]
|
||||
x.XWarpPointer.argtypes = [C.c_void_p, C.c_ulong, C.c_ulong, C.c_int,
|
||||
C.c_int, C.c_uint, C.c_uint, C.c_int, C.c_int]
|
||||
x.XGetImage.argtypes = [C.c_void_p, C.c_ulong, C.c_int, C.c_int,
|
||||
C.c_uint, C.c_uint, C.c_ulong, C.c_int]
|
||||
x.XGetImage.restype = C.c_void_p
|
||||
x.XGetPixel.argtypes = [C.c_void_p, C.c_int, C.c_int]
|
||||
x.XGetPixel.restype = C.c_ulong
|
||||
x.XDestroyImage.argtypes = [C.c_void_p]
|
||||
fix.XFixesGetCursorImage.argtypes = [C.c_void_p]
|
||||
fix.XFixesGetCursorImage.restype = C.POINTER(Cursor)
|
||||
test.XTestFakeButtonEvent.argtypes = [C.c_void_p, C.c_uint, C.c_int, C.c_ulong]
|
||||
d = x.XOpenDisplay(None)
|
||||
assert d
|
||||
root = x.XDefaultRootWindow(d)
|
||||
|
||||
|
||||
def native():
|
||||
p = fix.XFixesGetCursorImage(d)
|
||||
assert p
|
||||
try:
|
||||
c = p.contents
|
||||
return dict(x=c.x, y=c.y, w=c.w, h=c.h, hx=c.hx, hy=c.hy,
|
||||
pixels=[int(c.pixels[i]) & 0xffffffff for i in range(c.w*c.h)])
|
||||
finally:
|
||||
x.XFree(p)
|
||||
|
||||
|
||||
def warp(px, py):
|
||||
x.XWarpPointer(d, 0, root, 0, 0, 0, 0, px, py)
|
||||
x.XSync(d, 0)
|
||||
|
||||
|
||||
def decoded_sequence():
|
||||
im = x.XGetImage(d, root, 40, 1370, 640, 1, 0xffffffff, 2)
|
||||
assert im
|
||||
try:
|
||||
values = [x.XGetPixel(im, i*40+20, 0) & 0xffffff for i in range(16)]
|
||||
if any(0x202020 <= v <= 0xe0e0e0 for v in values):
|
||||
return -1
|
||||
return sum((1 << i) for i, v in enumerate(values) if v > 0xe0e0e0)
|
||||
finally:
|
||||
x.XDestroyImage(im)
|
||||
|
||||
|
||||
def flat_video_crop(px, py):
|
||||
im = x.XGetImage(d, root, px-40, py-40, 100, 100, 0xffffffff, 2)
|
||||
assert im
|
||||
try:
|
||||
pixels = [x.XGetPixel(im, a, b) & 0xffffff for b in range(100) for a in range(100)]
|
||||
# No baked-in pointer: uniform acceptance-window background at this point.
|
||||
ref = pixels[0]
|
||||
bad = sum(any(abs(((v >> s) & 255) - ((ref >> s) & 255)) > 8
|
||||
for s in (0, 8, 16)) for v in pixels)
|
||||
return dict(reference=ref, nonuniform_pixels=bad)
|
||||
finally:
|
||||
x.XDestroyImage(im)
|
||||
|
||||
|
||||
|
||||
start_sequence=decoded_sequence()
|
||||
results=[]
|
||||
for i in range(16):
|
||||
px,py=((300,800) if i%2==0 else (1500,900))
|
||||
warp(px,py);time.sleep(.18)
|
||||
start=time.monotonic_ns();test.XTestFakeButtonEvent(d,1,1,0);x.XSync(d,0)
|
||||
time.sleep(.04);test.XTestFakeButtonEvent(d,1,0,0);x.XSync(d,0)
|
||||
target=start_sequence+i+1
|
||||
while decoded_sequence()!=target and time.monotonic_ns()-start<2000000000:time.sleep(.002)
|
||||
seen=decoded_sequence();results.append(dict(seq=target,seen=seen,x=px,y=py));assert seen==target,results[-1]
|
||||
time.sleep(.08)
|
||||
# Two quick clicks before waiting for their combined numbered video update.
|
||||
start=decoded_sequence()
|
||||
for i in range(2):
|
||||
test.XTestFakeButtonEvent(d,1,1,0);x.XSync(d,0);time.sleep(.04);test.XTestFakeButtonEvent(d,1,0,0);x.XSync(d,0);time.sleep(.07)
|
||||
end=time.monotonic()+2
|
||||
while decoded_sequence()!=start+2 and time.monotonic()<end:time.sleep(.002)
|
||||
print(json.dumps(dict(clicks=results,double_click_start=start,double_click_end=decoded_sequence())))
|
||||
10
docs/evidence/native-cursor-20261105/final-services.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"192.168.1.71": {
|
||||
"status": "MainPID=194186\nExecStart={ path=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine ; argv[]=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine /home/test1/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 12:28:12 CST] ; stop_time=[n/a] ; pid=194186 ; code=(null) ; status=0/0 }\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=0\nExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 /home/test1/vdi-terminal/native-cursor-v1/host.py guard ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nId=vdi-native-cursor-guard.service\nActiveState=inactive\n\nMainPID=0\nId=vdi-native-cursor-source.service\nActiveState=inactive\nScreen 0: minimum 320 x 200, current 2560 x 1440, maximum 8192 x 8192\nVirtual-1 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 325mm x 203mm\n'Adwaita'\n24\n'default'\n1c3099bf924db3aee759b3d7c05e012569ef8650c400d1479144398795decc71 /opt/vdi-sunshine-0.21.0/usr/bin/sunshine\nno-runtime-dropin\n",
|
||||
"stderr": ""
|
||||
},
|
||||
"192.168.1.72": {
|
||||
"status": "MainPID=42901\nExecStart={ path=/home/test2/vdi-terminal/native-cursor-v1/sunshine ; argv[]=/home/test2/vdi-terminal/native-cursor-v1/sunshine /home/test2/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 12:29:41 CST] ; stop_time=[n/a] ; pid=42901 ; code=(null) ; status=0/0 }\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=42870\nExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 /home/test2/vdi-terminal/native-cursor-v1/host.py guard ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nId=vdi-native-cursor-guard.service\nActiveState=active\n\nMainPID=0\nId=vdi-native-cursor-source.service\nActiveState=inactive\nScreen 0: minimum 320 x 200, current 2560 x 1440, maximum 8192 x 8192\nVirtual-1 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 325mm x 203mm\n'Adwaita'\n24\n'default'\n61e1ecbc8db2df786b9760c652aa4b9885dff36c57d4af09616344314cb7c34c /usr/bin/sunshine\n/usr/bin/sunshine cap_sys_admin,cap_sys_nice=p\n",
|
||||
"stderr": ""
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,4 @@
|
||||
{
|
||||
"192.168.1.72": "MainPID=42703\nExecStart={ path=/usr/bin/sunshine ; argv[]=/usr/bin/sunshine /home/test2/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 12:25:39 CST] ; stop_time=[n/a] ; pid=42703 ; code=(null) ; status=0/0 }\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=0\nExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 /home/test2/vdi-terminal/native-cursor-v1/host.py guard ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nId=vdi-native-cursor-guard.service\nActiveState=inactive\n",
|
||||
"192.168.1.71": "MainPID=193092\nExecStart={ path=/home/test1/vdi-terminal/native-cursor-v1/sunshine ; argv[]=/home/test1/vdi-terminal/native-cursor-v1/sunshine /home/test1/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 12:26:14 CST] ; stop_time=[n/a] ; pid=193092 ; code=(null) ; status=0/0 }\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=193023\nExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 /home/test1/vdi-terminal/native-cursor-v1/host.py guard ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nId=vdi-native-cursor-guard.service\nActiveState=active\n"
|
||||
}
|
||||
96
docs/evidence/native-cursor-20261105/focus.py
Normal file
@ -0,0 +1,96 @@
|
||||
"""Run only with the controlled GTK acceptance window filling the stream."""
|
||||
import ctypes as C
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import signal
|
||||
import statistics
|
||||
import struct
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
os.environ.update(DISPLAY=':0', XAUTHORITY='/home/armbian/.Xauthority')
|
||||
x = C.CDLL('libX11.so.6')
|
||||
fix = C.CDLL('libXfixes.so.3')
|
||||
test = C.CDLL('libXtst.so.6')
|
||||
class Cursor(C.Structure):
|
||||
_fields_ = [('x', C.c_short), ('y', C.c_short), ('w', C.c_ushort),
|
||||
('h', C.c_ushort), ('hx', C.c_ushort), ('hy', C.c_ushort),
|
||||
('serial', C.c_ulong), ('pixels', C.POINTER(C.c_ulong)),
|
||||
('atom', C.c_ulong), ('name', C.c_char_p)]
|
||||
x.XOpenDisplay.argtypes = [C.c_char_p]
|
||||
x.XOpenDisplay.restype = C.c_void_p
|
||||
x.XDefaultRootWindow.argtypes = [C.c_void_p]
|
||||
x.XDefaultRootWindow.restype = C.c_ulong
|
||||
x.XFree.argtypes = [C.c_void_p]
|
||||
x.XSync.argtypes = [C.c_void_p, C.c_int]
|
||||
x.XWarpPointer.argtypes = [C.c_void_p, C.c_ulong, C.c_ulong, C.c_int,
|
||||
C.c_int, C.c_uint, C.c_uint, C.c_int, C.c_int]
|
||||
x.XGetImage.argtypes = [C.c_void_p, C.c_ulong, C.c_int, C.c_int,
|
||||
C.c_uint, C.c_uint, C.c_ulong, C.c_int]
|
||||
x.XGetImage.restype = C.c_void_p
|
||||
x.XGetPixel.argtypes = [C.c_void_p, C.c_int, C.c_int]
|
||||
x.XGetPixel.restype = C.c_ulong
|
||||
x.XDestroyImage.argtypes = [C.c_void_p]
|
||||
fix.XFixesGetCursorImage.argtypes = [C.c_void_p]
|
||||
fix.XFixesGetCursorImage.restype = C.POINTER(Cursor)
|
||||
test.XTestFakeButtonEvent.argtypes = [C.c_void_p, C.c_uint, C.c_int, C.c_ulong]
|
||||
d = x.XOpenDisplay(None)
|
||||
assert d
|
||||
root = x.XDefaultRootWindow(d)
|
||||
|
||||
|
||||
def native():
|
||||
p = fix.XFixesGetCursorImage(d)
|
||||
assert p
|
||||
try:
|
||||
c = p.contents
|
||||
return dict(x=c.x, y=c.y, w=c.w, h=c.h, hx=c.hx, hy=c.hy,
|
||||
pixels=[int(c.pixels[i]) & 0xffffffff for i in range(c.w*c.h)])
|
||||
finally:
|
||||
x.XFree(p)
|
||||
|
||||
|
||||
def warp(px, py):
|
||||
x.XWarpPointer(d, 0, root, 0, 0, 0, 0, px, py)
|
||||
x.XSync(d, 0)
|
||||
|
||||
|
||||
def decoded_sequence():
|
||||
im = x.XGetImage(d, root, 40, 1370, 640, 1, 0xffffffff, 2)
|
||||
assert im
|
||||
try:
|
||||
values = [x.XGetPixel(im, i*40+20, 0) & 0xffffff for i in range(16)]
|
||||
if any(0x202020 <= v <= 0xe0e0e0 for v in values):
|
||||
return -1
|
||||
return sum((1 << i) for i, v in enumerate(values) if v > 0xe0e0e0)
|
||||
finally:
|
||||
x.XDestroyImage(im)
|
||||
|
||||
|
||||
def flat_video_crop(px, py):
|
||||
im = x.XGetImage(d, root, px-40, py-40, 100, 100, 0xffffffff, 2)
|
||||
assert im
|
||||
try:
|
||||
pixels = [x.XGetPixel(im, a, b) & 0xffffff for b in range(100) for a in range(100)]
|
||||
# No baked-in pointer: uniform acceptance-window background at this point.
|
||||
ref = pixels[0]
|
||||
bad = sum(any(abs(((v >> s) & 255) - ((ref >> s) & 255)) > 8
|
||||
for s in (0, 8, 16)) for v in pixels)
|
||||
return dict(reference=ref, nonuniform_pixels=bad)
|
||||
finally:
|
||||
x.XDestroyImage(im)
|
||||
|
||||
|
||||
|
||||
focus=C.c_ulong();revert=C.c_int()
|
||||
x.XGetInputFocus.argtypes=[C.c_void_p,C.POINTER(C.c_ulong),C.POINTER(C.c_int)]
|
||||
x.XSetInputFocus.argtypes=[C.c_void_p,C.c_ulong,C.c_int,C.c_ulong]
|
||||
x.XGetInputFocus(d,C.byref(focus),C.byref(revert))
|
||||
before=native()
|
||||
try:
|
||||
x.XSetInputFocus(d,0,1,0);x.XSync(d,0);time.sleep(.25);unfocused=native()
|
||||
finally:
|
||||
x.XSetInputFocus(d,focus.value,revert.value,0);x.XSync(d,0)
|
||||
time.sleep(.3);after=native()
|
||||
print(json.dumps(dict(original_focus=focus.value,unfocused_shape_changed=before['pixels']!=unfocused['pixels'],native_restored=before['pixels']==after['pixels'],position=[after['x'],after['y']])))
|
||||
10
docs/evidence/native-cursor-20261105/idle-final.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"192.168.1.71": {
|
||||
"output": "MainPID=184769\nExecStart={ path=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine ; argv[]=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine /home/test1/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 11:33:00 CST] ; stop_time=[n/a] ; pid=184769 ; code=(null) ; status=0/0 }\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=0\nExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 /home/test1/vdi-terminal/native-cursor-v1/host.py guard ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nId=vdi-native-cursor-guard.service\nActiveState=inactive\n\nMainPID=0\nId=vdi-native-cursor-source.service\nActiveState=inactive\n",
|
||||
"stderr": "sha256sum: /usr/bin/sunshine: 没有那个文件或目录\n/usr/bin/sunshine (No such file or directory)\n"
|
||||
},
|
||||
"192.168.1.72": {
|
||||
"output": "MainPID=32278\nExecStart={ path=/usr/bin/sunshine ; argv[]=/usr/bin/sunshine /home/test2/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 11:43:42 CST] ; stop_time=[n/a] ; pid=32278 ; code=(null) ; status=0/0 }\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=0\nExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 /home/test2/vdi-terminal/native-cursor-v1/host.py guard ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nId=vdi-native-cursor-guard.service\nActiveState=inactive\n\nMainPID=0\nId=vdi-native-cursor-source.service\nActiveState=inactive\n61e1ecbc8db2df786b9760c652aa4b9885dff36c57d4af09616344314cb7c34c /usr/bin/sunshine\n/usr/bin/sunshine cap_sys_admin,cap_sys_nice=p\n",
|
||||
"stderr": ""
|
||||
}
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
{"clicks": [{"seq": 29, "seen": 29, "x": 300, "y": 800}, {"seq": 30, "seen": 30, "x": 1500, "y": 900}, {"seq": 31, "seen": 31, "x": 300, "y": 800}, {"seq": 32, "seen": 32, "x": 1500, "y": 900}, {"seq": 33, "seen": 33, "x": 300, "y": 800}, {"seq": 34, "seen": 34, "x": 1500, "y": 900}, {"seq": 35, "seen": 35, "x": 300, "y": 800}, {"seq": 36, "seen": 36, "x": 1500, "y": 900}, {"seq": 37, "seen": 37, "x": 300, "y": 800}, {"seq": 38, "seen": 38, "x": 1500, "y": 900}, {"seq": 39, "seen": 39, "x": 300, "y": 800}, {"seq": 40, "seen": 40, "x": 1500, "y": 900}, {"seq": 41, "seen": 41, "x": 300, "y": 800}, {"seq": 42, "seen": 42, "x": 1500, "y": 900}, {"seq": 43, "seen": 43, "x": 300, "y": 800}, {"seq": 44, "seen": 44, "x": 1500, "y": 900}], "double_click_start": 44, "double_click_end": 46}
|
||||
@ -0,0 +1 @@
|
||||
{"host": "192.168.1.71", "pid": 267646, "shapes": [{"name": "default", "source": {"w": 24, "h": 24, "hx": 4, "hy": 0, "x": 182, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 182, "y": 600, "w": 24, "h": 24, "hx": 4, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 300, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "text", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 548, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 548, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 216, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "ew-resize", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 914, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 914, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 204, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "wait", "source": {"w": 24, "h": 24, "hx": 12, "hy": 12, "x": 1280, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 1280, "y": 600, "w": 24, "h": 24, "hx": 12, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 290, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "none", "source": {"w": 1, "h": 1, "hx": 0, "hy": 0, "x": 1645, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 1645, "y": 600, "w": 1, "h": 1, "hx": 0, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 0, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "crosshair", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 2011, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 2011, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 252, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "custom", "source": {"w": 24, "h": 24, "hx": 7, "hy": 9, "x": 2377, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 2377, "y": 600, "w": 24, "h": 24, "hx": 7, "hy": 9}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 576, "video": {"reference": 15726074, "nonuniform_pixels": 0}}], "paused_client": {"position": [350, 700], "elapsed_ms": 249.580297, "same_shape": true, "steps": [{"target": [250, 650], "position": [250, 650], "query_ms": 2.364751}, {"target": [280, 670], "position": [280, 670], "query_ms": 2.234379}, {"target": [300, 690], "position": [300, 690], "query_ms": 2.128216}, {"target": [350, 700], "position": [350, 700], "query_ms": 2.286878}]}, "clicks": [{"seq": 1, "x": 182, "y": 750, "seen": 1, "decoded_ms": 108.930461}, {"seq": 2, "x": 548, "y": 850, "seen": 2, "decoded_ms": 98.691574}, {"seq": 3, "x": 914, "y": 750, "seen": 3, "decoded_ms": 152.320189}, {"seq": 4, "x": 1280, "y": 850, "seen": 4, "decoded_ms": 125.352183}, {"seq": 5, "x": 1645, "y": 750, "seen": 5, "decoded_ms": 135.816524}, {"seq": 6, "x": 2011, "y": 850, "seen": 6, "decoded_ms": 111.517755}, {"seq": 7, "x": 2377, "y": 750, "seen": 7, "decoded_ms": 108.898971}, {"seq": 8, "x": 182, "y": 850, "seen": 8, "decoded_ms": 119.075451}, {"seq": 9, "x": 548, "y": 750, "seen": 9, "decoded_ms": 134.943313}, {"seq": 10, "x": 914, "y": 850, "seen": 10, "decoded_ms": 146.081384}, {"seq": 11, "x": 1280, "y": 750, "seen": 11, "decoded_ms": 117.025403}, {"seq": 12, "x": 1645, "y": 850, "seen": 12, "decoded_ms": 152.719197}, {"seq": 13, "x": 2011, "y": 750, "seen": 13, "decoded_ms": 141.342555}, {"seq": 14, "x": 2377, "y": 850, "seen": 14, "decoded_ms": 130.95113}, {"seq": 15, "x": 182, "y": 750, "seen": 15, "decoded_ms": 143.698269}, {"seq": 16, "x": 548, "y": 850, "seen": 16, "decoded_ms": 114.9634}, {"seq": 17, "x": 914, "y": 750, "seen": 17, "decoded_ms": 159.173858}, {"seq": 18, "x": 1280, "y": 850, "seen": 18, "decoded_ms": 175.329882}, {"seq": 19, "x": 1645, "y": 750, "seen": 19, "decoded_ms": 119.051263}, {"seq": 20, "x": 2011, "y": 850, "seen": 20, "decoded_ms": 124.040341}, {"seq": 21, "x": 2377, "y": 750, "seen": 21, "decoded_ms": 121.588678}, {"seq": 22, "x": 182, "y": 850, "seen": 22, "decoded_ms": 129.876682}, {"seq": 23, "x": 548, "y": 750, "seen": 23, "decoded_ms": 124.467041}, {"seq": 24, "x": 914, "y": 850, "seen": 24, "decoded_ms": 153.052003}, {"seq": 25, "x": 1280, "y": 750, "seen": 25, "decoded_ms": 136.166846}, {"seq": 26, "x": 1645, "y": 850, "seen": 26, "decoded_ms": 168.630841}, {"seq": 27, "x": 2011, "y": 750, "seen": 27, "decoded_ms": 119.541845}, {"seq": 28, "x": 2377, "y": 850, "seen": 28, "decoded_ms": 110.41562}], "p50_ms": 127.61443249999999, "p95_ms": 168.630841, "method": "XTest click-down to unique decoded sequence; excludes USB and scanout"}
|
||||
BIN
docs/evidence/native-cursor-20261105/kylin-first.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
docs/evidence/native-cursor-20261105/kylin-first.xwd.gz
Normal file
1
docs/evidence/native-cursor-20261105/kylin-focus.json
Normal file
@ -0,0 +1 @@
|
||||
{"original_focus": 48234511, "unfocused_shape_changed": false, "native_restored": true, "position": [400, 600]}
|
||||
@ -0,0 +1 @@
|
||||
{"pid": 297530, "args": "/home/armbian/vdi-build/rkmpp-experiment/build/moonlight/app/moonlight stream 192.168.1.71 Desktop --resolution 2560x1440 --fps 30 --bitrate 30000 --display-mode fullscreen --video-codec H.264 --video-decoder hardware --absolute-mouse --capture-system-keys always --keep-awake --no-vsync --no-frame-pacing --audio-on-host ", "sha256": "5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03", "native": true, "shape": [24, 24, 4, 0]}
|
||||
BIN
docs/evidence/native-cursor-20261105/kylin-normal.png
Normal file
|
After Width: | Height: | Size: 3.8 MiB |
@ -0,0 +1 @@
|
||||
{"host": "192.168.1.71", "pid": 297530, "shapes": [{"name": "default", "source": {"w": 24, "h": 24, "hx": 4, "hy": 0, "x": 182, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 182, "y": 600, "w": 24, "h": 24, "hx": 4, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 300, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "text", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 548, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 548, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 216, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "ew-resize", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 914, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 914, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 204, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "wait", "source": {"w": 24, "h": 24, "hx": 12, "hy": 12, "x": 1280, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 1280, "y": 600, "w": 24, "h": 24, "hx": 12, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 290, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "none", "source": {"w": 1, "h": 1, "hx": 0, "hy": 0, "x": 1645, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 1645, "y": 600, "w": 1, "h": 1, "hx": 0, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 0, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "crosshair", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 2011, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 2011, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 252, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "custom", "source": {"w": 24, "h": 24, "hx": 7, "hy": 9, "x": 2377, "y": 600, "sw": 2560, "sh": 1440}, "local": {"x": 2377, "y": 600, "w": 24, "h": 24, "hx": 7, "hy": 9}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 576, "video": {"reference": 15726074, "nonuniform_pixels": 0}}], "paused_client": {"position": [350, 700], "elapsed_ms": 249.614056, "same_shape": true, "steps": [{"target": [250, 650], "position": [250, 650], "query_ms": 2.255936}, {"target": [280, 670], "position": [280, 670], "query_ms": 2.398262}, {"target": [300, 690], "position": [300, 690], "query_ms": 2.188272}, {"target": [350, 700], "position": [350, 700], "query_ms": 2.242227}]}, "clicks": [{"seq": 1, "x": 182, "y": 750, "seen": 1, "decoded_ms": 149.895203}, {"seq": 2, "x": 548, "y": 850, "seen": 2, "decoded_ms": 120.380242}, {"seq": 3, "x": 914, "y": 750, "seen": 3, "decoded_ms": 119.660739}, {"seq": 4, "x": 1280, "y": 850, "seen": 4, "decoded_ms": 147.265671}, {"seq": 5, "x": 1645, "y": 750, "seen": 5, "decoded_ms": 145.663335}, {"seq": 6, "x": 2011, "y": 850, "seen": 6, "decoded_ms": 129.562066}, {"seq": 7, "x": 2377, "y": 750, "seen": 7, "decoded_ms": 134.743571}, {"seq": 8, "x": 182, "y": 850, "seen": 8, "decoded_ms": 140.630877}, {"seq": 9, "x": 548, "y": 750, "seen": 9, "decoded_ms": 130.420116}, {"seq": 10, "x": 914, "y": 850, "seen": 10, "decoded_ms": 107.155271}, {"seq": 11, "x": 1280, "y": 750, "seen": 11, "decoded_ms": 117.124838}, {"seq": 12, "x": 1645, "y": 850, "seen": 12, "decoded_ms": 130.236678}, {"seq": 13, "x": 2011, "y": 750, "seen": 13, "decoded_ms": 111.917383}, {"seq": 14, "x": 2377, "y": 850, "seen": 14, "decoded_ms": 136.811123}, {"seq": 15, "x": 182, "y": 750, "seen": 15, "decoded_ms": 106.746093}, {"seq": 16, "x": 548, "y": 850, "seen": 16, "decoded_ms": 108.595469}, {"seq": 17, "x": 914, "y": 750, "seen": 17, "decoded_ms": 123.440014}, {"seq": 18, "x": 1280, "y": 850, "seen": 18, "decoded_ms": 150.429282}, {"seq": 19, "x": 1645, "y": 750, "seen": 19, "decoded_ms": 117.354684}, {"seq": 20, "x": 2011, "y": 850, "seen": 20, "decoded_ms": 147.688919}, {"seq": 21, "x": 2377, "y": 750, "seen": 21, "decoded_ms": 135.505122}, {"seq": 22, "x": 182, "y": 850, "seen": 22, "decoded_ms": 142.014237}, {"seq": 23, "x": 548, "y": 750, "seen": 23, "decoded_ms": 195.466041}, {"seq": 24, "x": 914, "y": 850, "seen": 24, "decoded_ms": 165.559673}, {"seq": 25, "x": 1280, "y": 750, "seen": 25, "decoded_ms": 142.88512}, {"seq": 26, "x": 1645, "y": 850, "seen": 26, "decoded_ms": 127.731718}, {"seq": 27, "x": 2011, "y": 750, "seen": 27, "decoded_ms": 146.832648}, {"seq": 28, "x": 2377, "y": 850, "seen": 28, "decoded_ms": 133.995845}], "p50_ms": 134.369708, "p95_ms": 165.559673, "method": "XTest click-down to unique decoded sequence; excludes USB and scanout"}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"recovered": true,
|
||||
"seconds": 3.555,
|
||||
"state": "ExecStart={ path=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine ; argv[]=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine /home/test1/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 11:33:00 CST] ; stop_time=[n/a] ; pid=184769 ; code=(null) ; status=0/0 }\nActiveState=active\nScreen 0: minimum 320 x 200, current 2560 x 1440, maximum 8192 x 8192\nVirtual-1 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 325mm x 203mm\n 1280x800 74.99 +\n 3840x2160 60.00 50.00 59.94 \n 1920x1440 60.00 \ninactive\n"
|
||||
}
|
||||
9
docs/evidence/native-cursor-20261105/kylin-warp.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"host": "192.168.1.71",
|
||||
"target": [
|
||||
400,
|
||||
600
|
||||
],
|
||||
"readback": "X=400\nY=600\nSCREEN=0\nWINDOW=48234511\n",
|
||||
"passed": true
|
||||
}
|
||||
BIN
docs/evidence/native-cursor-20261105/list.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/evidence/native-cursor-20261105/list.xwd.gz
Normal file
12
docs/evidence/native-cursor-20261105/normal-regression.json
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"192.168.1.71": {
|
||||
"status": "MainPID=186038\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=185981\nId=vdi-native-cursor-guard.service\nActiveState=active\n\nMainPID=0\nId=vdi-native-cursor-source.service\nActiveState=inactive\nScreen 0: minimum 320 x 200, current 2560 x 1440, maximum 8192 x 8192\nVirtual-1 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 325mm x 203mm\n 1280x800 74.99 +\n 3840x2160 60.00 50.00 59.94 \n 1920x1440 60.00 \n'Adwaita'\n24\n'default'\ntrue\n1c3099bf924db3aee759b3d7c05e012569ef8650c400d1479144398795decc71 /opt/vdi-sunshine-0.21.0/usr/bin/sunshine\n",
|
||||
"stderr": "",
|
||||
"profile_client_sha": "1da552e4855d1562fdd8d6f04f1553382db4ccd364c66fe7486b1688cc584f15"
|
||||
},
|
||||
"192.168.1.72": {
|
||||
"status": "MainPID=32278\nId=vdi-sunshine.service\nActiveState=active\n\nMainPID=0\nId=vdi-native-cursor-guard.service\nActiveState=inactive\n\nMainPID=0\nId=vdi-native-cursor-source.service\nActiveState=inactive\nScreen 0: minimum 320 x 200, current 2560 x 1440, maximum 8192 x 8192\nVirtual-1 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 325mm x 203mm\n 1280x800 74.99 +\n 1920x1440 60.00 \n 2560x1080 50.00 \n'Adwaita'\n24\n'default'\nfalse\n61e1ecbc8db2df786b9760c652aa4b9885dff36c57d4af09616344314cb7c34c /usr/bin/sunshine\n/usr/bin/sunshine cap_sys_admin,cap_sys_nice=p\n",
|
||||
"stderr": "",
|
||||
"profile_client_sha": "1da552e4855d1562fdd8d6f04f1553382db4ccd364c66fe7486b1688cc584f15"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
{
|
||||
"baseline": "de2467e433821664cdd2224aad8c89a625be1ad9",
|
||||
"patches": [
|
||||
"0001-vdi-input-and-latest-frame.patch",
|
||||
"0003-vdi-input-priority.patch",
|
||||
"0004-vdi-power-key-policy.patch",
|
||||
"0005-vdi-native-linux-cursor.patch",
|
||||
"0002-vdi-absolute-click-barrier.patch"
|
||||
],
|
||||
"native_patch_sha256": "6a5879901ae0d2986271df7441a38d0f1813c0d7fb3f616af5e1212c75eaaa02",
|
||||
"returncode": 0,
|
||||
"stdout": "PATCHES_OK\n",
|
||||
"stderr": ""
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
{"patches_apply_cleanly": ["0001-vdi-input-and-latest-frame.patch", "0003-vdi-input-priority.patch", "0004-vdi-power-key-policy.patch", "0005-vdi-native-linux-cursor.patch", "0002-vdi-absolute-click-barrier.patch"], "baseline": "de2467e433821664cdd2224aad8c89a625be1ad9"}
|
||||
188
docs/evidence/native-cursor-20261105/probe.py
Normal file
@ -0,0 +1,188 @@
|
||||
"""Run only with the controlled GTK acceptance window filling the stream."""
|
||||
import ctypes as C
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import signal
|
||||
import statistics
|
||||
import struct
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
os.environ.update(DISPLAY=':0', XAUTHORITY='/home/armbian/.Xauthority')
|
||||
x = C.CDLL('libX11.so.6')
|
||||
fix = C.CDLL('libXfixes.so.3')
|
||||
test = C.CDLL('libXtst.so.6')
|
||||
class Cursor(C.Structure):
|
||||
_fields_ = [('x', C.c_short), ('y', C.c_short), ('w', C.c_ushort),
|
||||
('h', C.c_ushort), ('hx', C.c_ushort), ('hy', C.c_ushort),
|
||||
('serial', C.c_ulong), ('pixels', C.POINTER(C.c_ulong)),
|
||||
('atom', C.c_ulong), ('name', C.c_char_p)]
|
||||
x.XOpenDisplay.argtypes = [C.c_char_p]
|
||||
x.XOpenDisplay.restype = C.c_void_p
|
||||
x.XDefaultRootWindow.argtypes = [C.c_void_p]
|
||||
x.XDefaultRootWindow.restype = C.c_ulong
|
||||
x.XFree.argtypes = [C.c_void_p]
|
||||
x.XSync.argtypes = [C.c_void_p, C.c_int]
|
||||
x.XWarpPointer.argtypes = [C.c_void_p, C.c_ulong, C.c_ulong, C.c_int,
|
||||
C.c_int, C.c_uint, C.c_uint, C.c_int, C.c_int]
|
||||
x.XGetImage.argtypes = [C.c_void_p, C.c_ulong, C.c_int, C.c_int,
|
||||
C.c_uint, C.c_uint, C.c_ulong, C.c_int]
|
||||
x.XGetImage.restype = C.c_void_p
|
||||
x.XGetPixel.argtypes = [C.c_void_p, C.c_int, C.c_int]
|
||||
x.XGetPixel.restype = C.c_ulong
|
||||
x.XDestroyImage.argtypes = [C.c_void_p]
|
||||
fix.XFixesGetCursorImage.argtypes = [C.c_void_p]
|
||||
fix.XFixesGetCursorImage.restype = C.POINTER(Cursor)
|
||||
test.XTestFakeButtonEvent.argtypes = [C.c_void_p, C.c_uint, C.c_int, C.c_ulong]
|
||||
d = x.XOpenDisplay(None)
|
||||
assert d
|
||||
root = x.XDefaultRootWindow(d)
|
||||
|
||||
|
||||
def native():
|
||||
p = fix.XFixesGetCursorImage(d)
|
||||
assert p
|
||||
try:
|
||||
c = p.contents
|
||||
return dict(x=c.x, y=c.y, w=c.w, h=c.h, hx=c.hx, hy=c.hy,
|
||||
pixels=[int(c.pixels[i]) & 0xffffffff for i in range(c.w*c.h)])
|
||||
finally:
|
||||
x.XFree(p)
|
||||
|
||||
|
||||
def warp(px, py):
|
||||
x.XWarpPointer(d, 0, root, 0, 0, 0, 0, px, py)
|
||||
x.XSync(d, 0)
|
||||
|
||||
|
||||
def decoded_sequence():
|
||||
im = x.XGetImage(d, root, 40, 1370, 640, 1, 0xffffffff, 2)
|
||||
assert im
|
||||
try:
|
||||
values = [x.XGetPixel(im, i*40+20, 0) & 0xffffff for i in range(16)]
|
||||
if any(0x202020 <= v <= 0xe0e0e0 for v in values):
|
||||
return -1
|
||||
return sum((1 << i) for i, v in enumerate(values) if v > 0xe0e0e0)
|
||||
finally:
|
||||
x.XDestroyImage(im)
|
||||
|
||||
|
||||
def flat_video_crop(px, py):
|
||||
im = x.XGetImage(d, root, px-40, py-40, 100, 100, 0xffffffff, 2)
|
||||
assert im
|
||||
try:
|
||||
pixels = [x.XGetPixel(im, a, b) & 0xffffff for b in range(100) for a in range(100)]
|
||||
# No baked-in pointer: uniform acceptance-window background at this point.
|
||||
ref = pixels[0]
|
||||
bad = sum(any(abs(((v >> s) & 255) - ((ref >> s) & 255)) > 8
|
||||
for s in (0, 8, 16)) for v in pixels)
|
||||
return dict(reference=ref, nonuniform_pixels=bad)
|
||||
finally:
|
||||
x.XDestroyImage(im)
|
||||
|
||||
|
||||
host = os.sys.argv[1]
|
||||
prefix = '/home/armbian/vdi-build/rkmpp-experiment/build/moonlight/app/moonlight stream ' + host + ' '
|
||||
items = [l.split(None, 1) for l in subprocess.check_output(['ps','-eo','pid,args'], text=True).splitlines()[1:]
|
||||
if len(l.split(None, 1)) == 2 and l.split(None, 1)[1].startswith(prefix)]
|
||||
assert len(items) == 1, items
|
||||
pid = int(items[0][0])
|
||||
focus = subprocess.check_output(['xdotool','getwindowfocus','getwindowpid'], text=True).strip()
|
||||
assert focus == str(pid), (focus, pid)
|
||||
env = dict(item.split('=', 1) for item in Path('/proc/%d/environ' % pid).read_bytes().decode().split('\0') if '=' in item)
|
||||
statepath = Path(env['VDI_NATIVE_CURSOR_STATE'])
|
||||
initial_sequence = decoded_sequence()
|
||||
assert 0 <= initial_sequence < 60000, 'test window not ready'
|
||||
reference = flat_video_crop(180, 600)['reference']
|
||||
assert all(abs(((reference >> s) & 255)-v) < 10 for s,v in [(16,240),(8,245),(0,250)]), 'acceptance window not visible'
|
||||
shapes = []
|
||||
for i, name in enumerate(['default','text','ew-resize','wait','none','crosshair','custom']):
|
||||
px = int((i+.5)*2560/7)
|
||||
warp(px, 600)
|
||||
time.sleep(.6)
|
||||
state = statepath.read_bytes()
|
||||
header = struct.unpack('<8sQQQIIIIiiII', state[:64])
|
||||
local = native()
|
||||
source = dict(zip(['w','h','hx','hy','x','y','sw','sh'], header[4:]))
|
||||
# Convert expected straight RGBA to XRender premultiplied ARGB.
|
||||
expected = []
|
||||
for j in range(64, len(state)-8, 4):
|
||||
r,g,b,a = state[j:j+4]
|
||||
expected.append((a << 24) | ((r*a+127)//255 << 16) |
|
||||
((g*a+127)//255 << 8) | ((b*a+127)//255))
|
||||
same_geometry = all(local[k] == source[k] for k in ['w','h','hx','hy'])
|
||||
# Busy frames animate; these snapshots can legitimately be adjacent frames.
|
||||
diff = max((abs(((a >> s) & 255)-((b >> s) & 255))
|
||||
for a,b in zip(local['pixels'],expected) for s in [0,8,16,24]), default=0)
|
||||
shapes.append(dict(name=name, source=source,
|
||||
local={k:v for k,v in local.items() if k != 'pixels'},
|
||||
geometry_matches=same_geometry, max_pixel_difference=diff,
|
||||
visible_pixels=sum(p >> 24 != 0 for p in local['pixels']),
|
||||
video=flat_video_crop(px, 600)))
|
||||
|
||||
Path('/tmp/native-%s-shapes.json' % host).write_text(json.dumps(shapes))
|
||||
samples = []
|
||||
for i in range(28):
|
||||
px = int(((i % 7)+.5)*2560/7)
|
||||
py = 750 if i % 2 == 0 else 850
|
||||
warp(px, py)
|
||||
time.sleep(.25)
|
||||
start = time.monotonic_ns()
|
||||
test.XTestFakeButtonEvent(d, 1, 1, 0)
|
||||
x.XSync(d, 0)
|
||||
expected = initial_sequence+i+1
|
||||
seen = -1
|
||||
released = False
|
||||
try:
|
||||
while time.monotonic_ns()-start < 3000000000:
|
||||
if not released and time.monotonic_ns()-start >= 80000000:
|
||||
test.XTestFakeButtonEvent(d, 1, 0, 0)
|
||||
x.XSync(d, 0)
|
||||
released = True
|
||||
seen = decoded_sequence()
|
||||
if seen == expected:
|
||||
break
|
||||
if seen > expected:
|
||||
raise RuntimeError('unexpected duplicate click %d instead of %d' % (seen,expected))
|
||||
time.sleep(.002)
|
||||
finally:
|
||||
if not released:
|
||||
time.sleep(max(0, .08-(time.monotonic_ns()-start)/1e9))
|
||||
test.XTestFakeButtonEvent(d, 1, 0, 0)
|
||||
x.XSync(d, 0)
|
||||
samples.append(dict(seq=expected, x=px, y=py, seen=seen,
|
||||
decoded_ms=(time.monotonic_ns()-start)/1e6))
|
||||
if seen != expected:
|
||||
Path('/tmp/native-%s-failed-clicks.json' % host).write_text(json.dumps(samples))
|
||||
raise AssertionError(samples[-1])
|
||||
time.sleep(.1)
|
||||
times = sorted(s['decoded_ms'] for s in samples)
|
||||
# A stopped Moonlight cannot capture input, receive video, or draw frames.
|
||||
# X11's native pointer must still move and keep its shape while it is stopped.
|
||||
warp(200, 600)
|
||||
time.sleep(.3)
|
||||
before = native()
|
||||
try:
|
||||
os.kill(pid, signal.SIGSTOP)
|
||||
start = time.monotonic_ns()
|
||||
steps = []
|
||||
for px,py in [(250,650),(280,670),(300,690),(350,700)]:
|
||||
step_start = time.monotonic_ns()
|
||||
warp(px, py)
|
||||
after = native()
|
||||
steps.append(dict(target=[px,py],position=[after['x'],after['y']],
|
||||
query_ms=(time.monotonic_ns()-step_start)/1e6))
|
||||
time.sleep(.06)
|
||||
paused_ms = (time.monotonic_ns()-start)/1e6
|
||||
finally:
|
||||
os.kill(pid, signal.SIGCONT)
|
||||
pause = dict(position=[after['x'],after['y']], elapsed_ms=paused_ms,
|
||||
same_shape=before['pixels']==after['pixels'], steps=steps)
|
||||
assert all(s['target']==s['position'] for s in steps) and pause['same_shape']
|
||||
time.sleep(.4)
|
||||
|
||||
print(json.dumps(dict(host=host,pid=pid,shapes=shapes,paused_client=pause,
|
||||
clicks=samples,p50_ms=statistics.median(times),
|
||||
p95_ms=times[int(len(times)*.95)],
|
||||
method='XTest click-down to unique decoded sequence; excludes USB and scanout')))
|
||||
@ -0,0 +1,17 @@
|
||||
{
|
||||
"client_sha256": "5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03",
|
||||
"ubuntu": {
|
||||
"measured_clicks": 28,
|
||||
"matched_source_events": 28,
|
||||
"max_coordinate_error_pixels": 1.0546875,
|
||||
"p50_ms": 188.3848435,
|
||||
"p95_ms": 522.420223
|
||||
},
|
||||
"kylin": {
|
||||
"measured_clicks": 28,
|
||||
"matched_source_events": 28,
|
||||
"max_coordinate_error_pixels": 0.82855224609375,
|
||||
"p50_ms": 134.369708,
|
||||
"p95_ms": 165.559673
|
||||
}
|
||||
}
|
||||
53
docs/evidence/native-cursor-20261105/soak.py
Normal file
@ -0,0 +1,53 @@
|
||||
"""Observe actual deployed state/receiver; keep the test seat awake with motion.
|
||||
|
||||
Run on the box only while a controlled native-cursor session is active.
|
||||
No clicks, protocol injection, or changes to the state producer are made.
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import struct
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
duration = float(sys.argv[1])
|
||||
output = Path(sys.argv[2])
|
||||
pid = int(subprocess.check_output(['pgrep', '-x', 'moonlight']).strip())
|
||||
proc = Path('/proc') / str(pid)
|
||||
env = dict(x.split('=', 1) for x in (proc / 'environ').read_bytes().decode().split('\0') if '=' in x)
|
||||
state = Path(env['VDI_NATIVE_CURSOR_STATE'])
|
||||
start = time.monotonic()
|
||||
last_motion = 0
|
||||
result = dict(pid=pid, requested_seconds=duration, samples=0,
|
||||
timestamp_after_pre_read_clock=0, timestamp_after_post_read_clock=0,
|
||||
max_age_ms=0, survived=False)
|
||||
try:
|
||||
while time.monotonic() - start < duration:
|
||||
if not proc.exists() or (proc / 'comm').read_text().strip() != 'moonlight':
|
||||
raise RuntimeError('receiver exited')
|
||||
before = time.monotonic_ns()
|
||||
packet = state.read_bytes()
|
||||
after = time.monotonic_ns()
|
||||
stamp = struct.unpack_from('<Q', packet, 24)[0]
|
||||
result['samples'] += 1
|
||||
result['timestamp_after_pre_read_clock'] += stamp > before
|
||||
result['timestamp_after_post_read_clock'] += stamp > after
|
||||
result['max_age_ms'] = max(result['max_age_ms'], (after - stamp) / 1e6)
|
||||
result['last_sequence'] = struct.unpack_from('<Q', packet, 16)[0]
|
||||
if stamp > after or after - stamp > 2_000_000_000:
|
||||
raise RuntimeError('invalid post-read timestamp')
|
||||
now = time.monotonic()
|
||||
if now - last_motion > 10:
|
||||
px = 1800 + (int(now - start) // 10 % 2) * 50
|
||||
motion_env = dict(os.environ, DISPLAY=':0', XAUTHORITY='/home/armbian/.Xauthority')
|
||||
subprocess.run(['xdotool', 'mousemove', str(px), '1100'], env=motion_env, check=True)
|
||||
last_motion = now
|
||||
time.sleep(.004)
|
||||
result['survived'] = True
|
||||
except Exception as error:
|
||||
result['error'] = str(error)
|
||||
finally:
|
||||
result['elapsed_seconds'] = round(time.monotonic() - start, 3)
|
||||
output.write_text(json.dumps(result, indent=2) + '\n')
|
||||
print(json.dumps(result), flush=True)
|
||||
92
docs/evidence/native-cursor-20261105/source.py
Normal file
@ -0,0 +1,92 @@
|
||||
"""Controlled GTK test window: real native cursors and unique click sequences."""
|
||||
import gi
|
||||
import json
|
||||
import time
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, Gdk, GdkPixbuf, GLib
|
||||
|
||||
win = Gtk.Window(title='VDI native cursor acceptance')
|
||||
area = Gtk.DrawingArea()
|
||||
win.add(area)
|
||||
area.set_can_focus(True)
|
||||
area.set_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.BUTTON_PRESS_MASK |
|
||||
Gdk.EventMask.BUTTON_RELEASE_MASK)
|
||||
display = Gdk.Display.get_default()
|
||||
names = ['default', 'text', 'ew-resize', 'wait', 'none', 'crosshair', 'custom']
|
||||
cursors = {name: Gdk.Cursor.new_from_name(display, name) for name in names[:4] + ['crosshair']}
|
||||
cursors['none'] = Gdk.Cursor.new_for_display(display, Gdk.CursorType.BLANK_CURSOR)
|
||||
pix = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 24, 24)
|
||||
pix.fill(0xff5030ff)
|
||||
cursors['custom'] = Gdk.Cursor.new_from_pixbuf(display, pix, 7, 9)
|
||||
current = None
|
||||
sequence = 0
|
||||
|
||||
|
||||
def report(**kw):
|
||||
kw['t'] = time.monotonic()
|
||||
print(json.dumps(kw), flush=True)
|
||||
|
||||
|
||||
def motion(widget, event):
|
||||
global current
|
||||
index = min(6, int(event.x // (2560/7)))
|
||||
name = names[index]
|
||||
if name != current:
|
||||
area.get_window().set_cursor(cursors[name])
|
||||
current = name
|
||||
report(event='shape', name=name)
|
||||
return False
|
||||
|
||||
|
||||
def button(widget, event):
|
||||
global sequence
|
||||
if event.type in (Gdk.EventType.BUTTON_PRESS, Gdk.EventType.DOUBLE_BUTTON_PRESS,
|
||||
Gdk.EventType.TRIPLE_BUTTON_PRESS):
|
||||
# GTK emits an extra double/triple notification, not another input.
|
||||
if event.type == Gdk.EventType.BUTTON_PRESS:
|
||||
sequence += 1
|
||||
area.queue_draw_area(0, 1300, 1000, 140)
|
||||
report(event=event.type.value_nick, seq=sequence, x=event.x_root,
|
||||
y=event.y_root, button=event.button)
|
||||
return False
|
||||
|
||||
|
||||
def draw(widget, cr):
|
||||
cr.set_source_rgb(.94, .96, .98)
|
||||
cr.paint()
|
||||
cr.select_font_face('sans')
|
||||
cr.set_font_size(25)
|
||||
for i, name in enumerate(names):
|
||||
cr.set_source_rgb(.1, .15, .2)
|
||||
cr.move_to(40 + i*2560/7, 100)
|
||||
cr.show_text(name)
|
||||
cr.set_source_rgb(.65, .7, .8)
|
||||
cr.rectangle(i*2560/7, 120, 2, 1100)
|
||||
cr.fill()
|
||||
# Unique monotonic sequence, read from the actual decoded video.
|
||||
for bit in range(16):
|
||||
v = 1 if sequence & (1 << bit) else 0
|
||||
cr.set_source_rgb(v, v, v)
|
||||
cr.rectangle(40 + bit*40, 1340, 40, 60)
|
||||
cr.fill()
|
||||
return False
|
||||
|
||||
|
||||
def key(widget, event):
|
||||
if event.keyval == Gdk.KEY_Escape:
|
||||
Gtk.main_quit()
|
||||
return False
|
||||
|
||||
|
||||
win.connect('destroy', Gtk.main_quit)
|
||||
win.connect('key-press-event', key)
|
||||
area.connect('motion-notify-event', motion)
|
||||
area.connect('button-press-event', button)
|
||||
area.connect('button-release-event', button)
|
||||
area.connect('draw', draw)
|
||||
win.fullscreen()
|
||||
win.show_all()
|
||||
win.present()
|
||||
area.grab_focus()
|
||||
report(event='ready')
|
||||
Gtk.main()
|
||||
4
docs/evidence/native-cursor-20261105/test1-manifest.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"sunshine": "1c3099bf924db3aee759b3d7c05e012569ef8650c400d1479144398795decc71",
|
||||
"capture-no-cursor.so": "cff4b7532aee69f0f205fa42946f45a89c1330486adc6358b90d13d2ccf1a0ea"
|
||||
}
|
||||
302
docs/evidence/native-cursor-20261105/test1-preflight-v2.json
Normal file
@ -0,0 +1,302 @@
|
||||
{
|
||||
"host": "192.168.1.71",
|
||||
"ready": true,
|
||||
"samples": [
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 1
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 2
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 3
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 4
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 5
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 6
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 7
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 8
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 9
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 10
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 11
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 12
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 13
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 14
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 15
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 16
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 17
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 18
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 19
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 20
|
||||
},
|
||||
{
|
||||
"w": 16,
|
||||
"h": 16,
|
||||
"hx": 8,
|
||||
"hy": 8,
|
||||
"x": 1814,
|
||||
"y": 554,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 166,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 21
|
||||
}
|
||||
],
|
||||
"stderr": "",
|
||||
"exit": 0
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
{
|
||||
"host": "192.168.1.71",
|
||||
"ready": false,
|
||||
"samples": [],
|
||||
"stderr": "RuntimeError: Permission denied by kysec\n",
|
||||
"exit": 1
|
||||
}
|
||||
16
docs/evidence/native-cursor-20261105/test1-recovery.json
Normal file
@ -0,0 +1,16 @@
|
||||
[
|
||||
{
|
||||
"case": "agent-sigkill",
|
||||
"host": "192.168.1.71",
|
||||
"recovered": true,
|
||||
"recovery_seconds": 3.22,
|
||||
"state": "ExecStart={ path=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine ; argv[]=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine /home/test1/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 11:11:57 CST] ; stop_time=[n/a] ; pid=180535 ; code=(null) ; status=0/0 }\nActiveState=active\n"
|
||||
},
|
||||
{
|
||||
"case": "guard-sigkill",
|
||||
"host": "192.168.1.71",
|
||||
"recovered": true,
|
||||
"recovery_seconds": 0.893,
|
||||
"state": "ExecStart={ path=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine ; argv[]=/opt/vdi-sunshine-0.21.0/usr/bin/sunshine /home/test1/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 11:12:00 CST] ; stop_time=[n/a] ; pid=180701 ; code=(null) ; status=0/0 }\nActiveState=active\n"
|
||||
}
|
||||
]
|
||||
4
docs/evidence/native-cursor-20261105/test2-manifest.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"sunshine": "61e1ecbc8db2df786b9760c652aa4b9885dff36c57d4af09616344314cb7c34c",
|
||||
"capture-no-cursor.so": "cff4b7532aee69f0f205fa42946f45a89c1330486adc6358b90d13d2ccf1a0ea"
|
||||
}
|
||||
316
docs/evidence/native-cursor-20261105/test2-preflight-v2.json
Normal file
@ -0,0 +1,316 @@
|
||||
{
|
||||
"host": "192.168.1.72",
|
||||
"ready": true,
|
||||
"samples": [
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 1
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 2
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 3
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 4
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 5
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 6
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 7
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 8
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 9
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 10
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 11
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 12
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 13
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 14
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 15
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 16
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 17
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 18
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 19
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 20
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 21
|
||||
},
|
||||
{
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 2548,
|
||||
"y": 1,
|
||||
"sw": 2560,
|
||||
"sh": 1440,
|
||||
"shape": 124,
|
||||
"type": "cursor",
|
||||
"version": 1,
|
||||
"seq": 22
|
||||
}
|
||||
],
|
||||
"stderr": "",
|
||||
"exit": 0
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
{
|
||||
"host": "192.168.1.72",
|
||||
"ready": false,
|
||||
"samples": [],
|
||||
"stderr": "Traceback (most recent call last):\n File \"/home/test2/vdi-terminal/native-cursor-v1/host.py\", line 211, in <module>\n main()\n File \"/home/test2/vdi-terminal/native-cursor-v1/host.py\", line 205, in main\n stream()\n File \"/home/test2/vdi-terminal/native-cursor-v1/host.py\", line 154, in stream\n raise RuntimeError('guard not ready')\nRuntimeError: guard not ready\n",
|
||||
"exit": 1
|
||||
}
|
||||
16
docs/evidence/native-cursor-20261105/test2-recovery.json
Normal file
@ -0,0 +1,16 @@
|
||||
[
|
||||
{
|
||||
"case": "agent-sigkill",
|
||||
"host": "192.168.1.72",
|
||||
"recovered": true,
|
||||
"recovery_seconds": 2.724,
|
||||
"state": "ExecStart={ path=/usr/bin/sunshine ; argv[]=/usr/bin/sunshine /home/test2/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 11:11:56 CST] ; stop_time=[n/a] ; pid=24296 ; code=(null) ; status=0/0 }\nActiveState=active\n"
|
||||
},
|
||||
{
|
||||
"case": "guard-sigkill",
|
||||
"host": "192.168.1.72",
|
||||
"recovered": true,
|
||||
"recovery_seconds": 0.771,
|
||||
"state": "ExecStart={ path=/usr/bin/sunshine ; argv[]=/usr/bin/sunshine /home/test2/.config/sunshine/sunshine.conf ; ignore_errors=no ; start_time=[Thu 2026-11-05 11:12:14 CST] ; stop_time=[n/a] ; pid=24470 ; code=(null) ; status=0/0 }\nActiveState=active\n"
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,11 @@
|
||||
{
|
||||
"pid": 285520,
|
||||
"requested_seconds": 360.0,
|
||||
"samples": 65658,
|
||||
"timestamp_after_pre_read_clock": 0,
|
||||
"timestamp_after_post_read_clock": 0,
|
||||
"max_age_ms": 308.103546,
|
||||
"survived": true,
|
||||
"last_sequence": 7956,
|
||||
"elapsed_seconds": 360.005
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
[{"file": "_usr_bin_sunshine.1000.crash", "ProblemType": "Crash", "Date": "Thu Nov 5 11:12:07 2026", "ExecutablePath": "/usr/bin/sunshine", "Package": "sunshine 2026.914.233613-1+ubuntu24.04 [origin: unknown]", "Signal": "5"}]
|
||||
@ -0,0 +1 @@
|
||||
{"clicks": [{"seq": 29, "seen": 29, "x": 300, "y": 800}, {"seq": 30, "seen": 30, "x": 1500, "y": 900}, {"seq": 31, "seen": 31, "x": 300, "y": 800}, {"seq": 32, "seen": 32, "x": 1500, "y": 900}, {"seq": 33, "seen": 33, "x": 300, "y": 800}, {"seq": 34, "seen": 34, "x": 1500, "y": 900}, {"seq": 35, "seen": 35, "x": 300, "y": 800}, {"seq": 36, "seen": 36, "x": 1500, "y": 900}, {"seq": 37, "seen": 37, "x": 300, "y": 800}, {"seq": 38, "seen": 38, "x": 1500, "y": 900}, {"seq": 39, "seen": 39, "x": 300, "y": 800}, {"seq": 40, "seen": 40, "x": 1500, "y": 900}, {"seq": 41, "seen": 41, "x": 300, "y": 800}, {"seq": 42, "seen": 42, "x": 1500, "y": 900}, {"seq": 43, "seen": 43, "x": 300, "y": 800}, {"seq": 44, "seen": 44, "x": 1500, "y": 900}], "double_click_start": 44, "double_click_end": 46}
|
||||
@ -0,0 +1 @@
|
||||
{"host": "192.168.1.72", "pid": 263384, "shapes": [{"name": "default", "source": {"w": 24, "h": 24, "hx": 3, "hy": 1, "x": 181, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 182, "y": 600, "w": 24, "h": 24, "hx": 3, "hy": 1}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 254, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "text", "source": {"w": 24, "h": 24, "hx": 11, "hy": 12, "x": 547, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 548, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 240, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "ew-resize", "source": {"w": 24, "h": 24, "hx": 12, "hy": 12, "x": 913, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 914, "y": 600, "w": 24, "h": 24, "hx": 12, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 301, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "wait", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 1280, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1280, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 433, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "none", "source": {"w": 1, "h": 1, "hx": 0, "hy": 0, "x": 1645, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1645, "y": 600, "w": 1, "h": 1, "hx": 0, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 0, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "crosshair", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 2011, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2011, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 281, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "custom", "source": {"w": 24, "h": 24, "hx": 7, "hy": 9, "x": 2377, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2377, "y": 600, "w": 24, "h": 24, "hx": 7, "hy": 9}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 576, "video": {"reference": 15726074, "nonuniform_pixels": 0}}], "paused_client": {"position": [250, 650], "elapsed_ms": 2.232537, "same_shape": true}, "clicks": [{"seq": 1, "x": 182, "y": 750, "seen": 1, "decoded_ms": 183.136301}, {"seq": 2, "x": 548, "y": 850, "seen": 2, "decoded_ms": 150.601919}, {"seq": 3, "x": 914, "y": 750, "seen": 3, "decoded_ms": 162.979614}, {"seq": 4, "x": 1280, "y": 850, "seen": 4, "decoded_ms": 562.228218}, {"seq": 5, "x": 1645, "y": 750, "seen": 5, "decoded_ms": 149.661983}, {"seq": 6, "x": 2011, "y": 850, "seen": 6, "decoded_ms": 187.689807}, {"seq": 7, "x": 2377, "y": 750, "seen": 7, "decoded_ms": 186.617722}, {"seq": 8, "x": 182, "y": 850, "seen": 8, "decoded_ms": 167.201514}, {"seq": 9, "x": 548, "y": 750, "seen": 9, "decoded_ms": 143.805796}, {"seq": 10, "x": 914, "y": 850, "seen": 10, "decoded_ms": 145.803285}, {"seq": 11, "x": 1280, "y": 750, "seen": 11, "decoded_ms": 505.147227}, {"seq": 12, "x": 1645, "y": 850, "seen": 12, "decoded_ms": 156.874419}, {"seq": 13, "x": 2011, "y": 750, "seen": 13, "decoded_ms": 164.724633}, {"seq": 14, "x": 2377, "y": 850, "seen": 14, "decoded_ms": 172.592036}, {"seq": 15, "x": 182, "y": 750, "seen": 15, "decoded_ms": 195.775758}, {"seq": 16, "x": 548, "y": 850, "seen": 16, "decoded_ms": 151.145679}, {"seq": 17, "x": 914, "y": 750, "seen": 17, "decoded_ms": 173.941806}, {"seq": 18, "x": 1280, "y": 850, "seen": 18, "decoded_ms": 352.426864}, {"seq": 19, "x": 1645, "y": 750, "seen": 19, "decoded_ms": 156.050885}, {"seq": 20, "x": 2011, "y": 850, "seen": 20, "decoded_ms": 158.266234}, {"seq": 21, "x": 2377, "y": 750, "seen": 21, "decoded_ms": 126.999009}, {"seq": 22, "x": 182, "y": 850, "seen": 22, "decoded_ms": 194.209712}, {"seq": 23, "x": 548, "y": 750, "seen": 23, "decoded_ms": 183.157837}, {"seq": 24, "x": 914, "y": 850, "seen": 24, "decoded_ms": 186.545894}, {"seq": 25, "x": 1280, "y": 750, "seen": 25, "decoded_ms": 506.013562}, {"seq": 26, "x": 1645, "y": 850, "seen": 26, "decoded_ms": 164.698513}, {"seq": 27, "x": 2011, "y": 750, "seen": 27, "decoded_ms": 177.684307}, {"seq": 28, "x": 2377, "y": 850, "seen": 28, "decoded_ms": 174.644202}], "p50_ms": 173.26692100000002, "p95_ms": 506.013562, "method": "XTest click-down to unique decoded sequence; excludes USB and scanout"}
|
||||
11
docs/evidence/native-cursor-20261105/ubuntu-final-soak.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"pid": 293859,
|
||||
"requested_seconds": 360.0,
|
||||
"samples": 65960,
|
||||
"timestamp_after_pre_read_clock": 1,
|
||||
"timestamp_after_post_read_clock": 0,
|
||||
"max_age_ms": 1109.787402,
|
||||
"survived": true,
|
||||
"last_sequence": 6538,
|
||||
"elapsed_seconds": 360.003
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
{"pid": 293859, "worker": 293861, "pause_seconds": 2.6, "exited": true, "check_seconds": 2.9042484689998673}
|
||||
BIN
docs/evidence/native-cursor-20261105/ubuntu-first.png
Normal file
|
After Width: | Height: | Size: 804 KiB |
BIN
docs/evidence/native-cursor-20261105/ubuntu-first.xwd.gz
Normal file
BIN
docs/evidence/native-cursor-20261105/ubuntu-normal-after-fix.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
@ -0,0 +1 @@
|
||||
{"pid": 299860, "ppid": 235482, "args": "/home/armbian/vdi-build/rkmpp-experiment/build/moonlight/app/moonlight stream 192.168.1.72 Desktop --resolution 2560x1440 --fps 30 --bitrate 30000 --display-mode fullscreen --video-codec H.264 --video-decoder hardware --absolute-mouse --capture-system-keys always --keep-awake --no-vsync --no-frame-pacing --audio-on-host ", "sha256": "5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03", "native": true, "shape": [24, 24, 3, 1]}
|
||||
BIN
docs/evidence/native-cursor-20261105/ubuntu-normal.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
@ -0,0 +1 @@
|
||||
{"host": "192.168.1.72", "pid": 256179, "shapes": [{"name": "default", "source": {"w": 24, "h": 24, "hx": 3, "hy": 1, "x": 181, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 182, "y": 600, "w": 24, "h": 24, "hx": 3, "hy": 1}, "geometry_matches": true, "max_pixel_difference": 162, "visible_pixels": 254, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "text", "source": {"w": 24, "h": 24, "hx": 11, "hy": 12, "x": 547, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 548, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 101, "visible_pixels": 240, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "ew-resize", "source": {"w": 24, "h": 24, "hx": 12, "hy": 12, "x": 913, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 914, "y": 600, "w": 24, "h": 24, "hx": 12, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 175, "visible_pixels": 301, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "wait", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 1280, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1280, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 129, "visible_pixels": 433, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "none", "source": {"w": 1, "h": 1, "hx": 0, "hy": 0, "x": 1645, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1645, "y": 600, "w": 1, "h": 1, "hx": 0, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 0, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "crosshair", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 2011, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2011, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 78, "visible_pixels": 281, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "custom", "source": {"w": 24, "h": 24, "hx": 7, "hy": 9, "x": 2377, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2377, "y": 600, "w": 24, "h": 24, "hx": 7, "hy": 9}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 576, "video": {"reference": 15726074, "nonuniform_pixels": 0}}], "paused_client": {"position": [250, 650], "elapsed_ms": 2.727055, "same_shape": true}, "clicks": [{"seq": 3, "x": 182, "y": 750, "seen": 3, "decoded_ms": 177.207219}, {"seq": 4, "x": 548, "y": 850, "seen": 4, "decoded_ms": 177.766631}, {"seq": 5, "x": 914, "y": 750, "seen": 5, "decoded_ms": 199.373737}, {"seq": 6, "x": 1280, "y": 850, "seen": 6, "decoded_ms": 182.446665}, {"seq": 7, "x": 1645, "y": 750, "seen": 7, "decoded_ms": 174.159044}, {"seq": 8, "x": 2011, "y": 850, "seen": 8, "decoded_ms": 211.839356}, {"seq": 9, "x": 2377, "y": 750, "seen": 9, "decoded_ms": 172.112732}, {"seq": 10, "x": 182, "y": 850, "seen": 10, "decoded_ms": 218.076291}, {"seq": 11, "x": 548, "y": 750, "seen": 11, "decoded_ms": 158.319669}, {"seq": 12, "x": 914, "y": 850, "seen": 12, "decoded_ms": 190.78387}, {"seq": 13, "x": 1280, "y": 750, "seen": 13, "decoded_ms": 475.373962}, {"seq": 14, "x": 1645, "y": 850, "seen": 14, "decoded_ms": 183.265657}, {"seq": 15, "x": 2011, "y": 750, "seen": 15, "decoded_ms": 190.493082}, {"seq": 16, "x": 2377, "y": 850, "seen": 16, "decoded_ms": 174.658874}, {"seq": 17, "x": 182, "y": 750, "seen": 17, "decoded_ms": 202.290292}, {"seq": 18, "x": 548, "y": 850, "seen": 18, "decoded_ms": 201.035264}, {"seq": 19, "x": 914, "y": 750, "seen": 19, "decoded_ms": 169.113849}, {"seq": 20, "x": 1280, "y": 850, "seen": 20, "decoded_ms": 389.791156}, {"seq": 21, "x": 1645, "y": 750, "seen": 21, "decoded_ms": 145.709303}, {"seq": 22, "x": 2011, "y": 850, "seen": 22, "decoded_ms": 142.136716}, {"seq": 23, "x": 2377, "y": 750, "seen": 23, "decoded_ms": 150.834416}, {"seq": 24, "x": 182, "y": 850, "seen": 24, "decoded_ms": 218.919785}, {"seq": 25, "x": 548, "y": 750, "seen": 25, "decoded_ms": 145.115185}, {"seq": 26, "x": 914, "y": 850, "seen": 26, "decoded_ms": 174.238963}, {"seq": 27, "x": 1280, "y": 750, "seen": 27, "decoded_ms": 476.883703}, {"seq": 28, "x": 1645, "y": 850, "seen": 28, "decoded_ms": 165.254265}, {"seq": 29, "x": 2011, "y": 750, "seen": 29, "decoded_ms": 182.507335}, {"seq": 30, "x": 2377, "y": 850, "seen": 30, "decoded_ms": 168.10207}], "p50_ms": 180.106648, "p95_ms": 475.373962, "method": "XTest click-down to unique decoded sequence; excludes USB and scanout"}
|
||||
@ -0,0 +1 @@
|
||||
{"host": "192.168.1.72", "pid": 293859, "shapes": [{"name": "default", "source": {"w": 24, "h": 24, "hx": 3, "hy": 1, "x": 181, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 182, "y": 600, "w": 24, "h": 24, "hx": 3, "hy": 1}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 254, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "text", "source": {"w": 24, "h": 24, "hx": 11, "hy": 12, "x": 547, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 548, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 240, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "ew-resize", "source": {"w": 24, "h": 24, "hx": 12, "hy": 12, "x": 913, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 914, "y": 600, "w": 24, "h": 24, "hx": 12, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 301, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "wait", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 1280, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1280, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 433, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "none", "source": {"w": 1, "h": 1, "hx": 0, "hy": 0, "x": 1645, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1645, "y": 600, "w": 1, "h": 1, "hx": 0, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 0, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "crosshair", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 2011, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2011, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 281, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "custom", "source": {"w": 24, "h": 24, "hx": 7, "hy": 9, "x": 2377, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2377, "y": 600, "w": 24, "h": 24, "hx": 7, "hy": 9}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 576, "video": {"reference": 15726074, "nonuniform_pixels": 0}}], "paused_client": {"position": [350, 700], "elapsed_ms": 249.623897, "same_shape": true, "steps": [{"target": [250, 650], "position": [250, 650], "query_ms": 2.255624}, {"target": [280, 670], "position": [280, 670], "query_ms": 2.353619}, {"target": [300, 690], "position": [300, 690], "query_ms": 2.202252}, {"target": [350, 700], "position": [350, 700], "query_ms": 2.288873}]}, "clicks": [{"seq": 1, "x": 182, "y": 750, "seen": 1, "decoded_ms": 186.428878}, {"seq": 2, "x": 548, "y": 850, "seen": 2, "decoded_ms": 181.712898}, {"seq": 3, "x": 914, "y": 750, "seen": 3, "decoded_ms": 207.490698}, {"seq": 4, "x": 1280, "y": 850, "seen": 4, "decoded_ms": 533.830025}, {"seq": 5, "x": 1645, "y": 750, "seen": 5, "decoded_ms": 190.340809}, {"seq": 6, "x": 2011, "y": 850, "seen": 6, "decoded_ms": 204.401567}, {"seq": 7, "x": 2377, "y": 750, "seen": 7, "decoded_ms": 166.595545}, {"seq": 8, "x": 182, "y": 850, "seen": 8, "decoded_ms": 195.011611}, {"seq": 9, "x": 548, "y": 750, "seen": 9, "decoded_ms": 181.070161}, {"seq": 10, "x": 914, "y": 850, "seen": 10, "decoded_ms": 191.989545}, {"seq": 11, "x": 1280, "y": 750, "seen": 11, "decoded_ms": 450.587655}, {"seq": 12, "x": 1645, "y": 850, "seen": 12, "decoded_ms": 166.558247}, {"seq": 13, "x": 2011, "y": 750, "seen": 13, "decoded_ms": 174.993944}, {"seq": 14, "x": 2377, "y": 850, "seen": 14, "decoded_ms": 195.413266}, {"seq": 15, "x": 182, "y": 750, "seen": 15, "decoded_ms": 242.226344}, {"seq": 16, "x": 548, "y": 850, "seen": 16, "decoded_ms": 206.124429}, {"seq": 17, "x": 914, "y": 750, "seen": 17, "decoded_ms": 181.78767}, {"seq": 18, "x": 1280, "y": 850, "seen": 18, "decoded_ms": 463.825494}, {"seq": 19, "x": 1645, "y": 750, "seen": 19, "decoded_ms": 194.360157}, {"seq": 20, "x": 2011, "y": 850, "seen": 20, "decoded_ms": 177.975533}, {"seq": 21, "x": 2377, "y": 750, "seen": 21, "decoded_ms": 229.660945}, {"seq": 22, "x": 182, "y": 850, "seen": 22, "decoded_ms": 159.611781}, {"seq": 23, "x": 548, "y": 750, "seen": 23, "decoded_ms": 149.18704}, {"seq": 24, "x": 914, "y": 850, "seen": 24, "decoded_ms": 179.366438}, {"seq": 25, "x": 1280, "y": 750, "seen": 25, "decoded_ms": 522.420223}, {"seq": 26, "x": 1645, "y": 850, "seen": 26, "decoded_ms": 154.151825}, {"seq": 27, "x": 2011, "y": 750, "seen": 27, "decoded_ms": 154.669796}, {"seq": 28, "x": 2377, "y": 850, "seen": 28, "decoded_ms": 145.580813}], "p50_ms": 188.3848435, "p95_ms": 522.420223, "method": "XTest click-down to unique decoded sequence; excludes USB and scanout"}
|
||||
BIN
docs/evidence/native-cursor-20261105/ubuntu-second.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
docs/evidence/native-cursor-20261105/ubuntu-second.xwd.gz
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"agent": 39181,
|
||||
"client": 293859,
|
||||
"pause_seconds": 1.1,
|
||||
"local_pointer": "x:650 y:900 screen:0 window:48234511",
|
||||
"survived": true
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"bridge_frozen_seconds": 1.2,
|
||||
"checked_after_seconds": 3.289,
|
||||
"remaining_clients": []
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
{"host": "192.168.1.72", "pid": 272099, "shapes": [{"name": "default", "source": {"w": 24, "h": 24, "hx": 3, "hy": 1, "x": 181, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 182, "y": 600, "w": 24, "h": 24, "hx": 3, "hy": 1}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 254, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "text", "source": {"w": 24, "h": 24, "hx": 11, "hy": 12, "x": 547, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 548, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 240, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "ew-resize", "source": {"w": 24, "h": 24, "hx": 12, "hy": 12, "x": 913, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 914, "y": 600, "w": 24, "h": 24, "hx": 12, "hy": 12}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 301, "video": {"reference": 15726330, "nonuniform_pixels": 0}}, {"name": "wait", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 1280, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1280, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 433, "video": {"reference": 15791866, "nonuniform_pixels": 0}}, {"name": "none", "source": {"w": 1, "h": 1, "hx": 0, "hy": 0, "x": 1645, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 1645, "y": 600, "w": 1, "h": 1, "hx": 0, "hy": 0}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 0, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "crosshair", "source": {"w": 24, "h": 24, "hx": 11, "hy": 11, "x": 2011, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2011, "y": 600, "w": 24, "h": 24, "hx": 11, "hy": 11}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 281, "video": {"reference": 15726074, "nonuniform_pixels": 0}}, {"name": "custom", "source": {"w": 24, "h": 24, "hx": 7, "hy": 9, "x": 2377, "y": 599, "sw": 2560, "sh": 1440}, "local": {"x": 2377, "y": 600, "w": 24, "h": 24, "hx": 7, "hy": 9}, "geometry_matches": true, "max_pixel_difference": 0, "visible_pixels": 576, "video": {"reference": 15726074, "nonuniform_pixels": 0}}], "paused_client": {"position": [350, 700], "elapsed_ms": 263.611753, "same_shape": true, "steps": [{"target": [250, 650], "position": [250, 650], "query_ms": 16.220678}, {"target": [280, 670], "position": [280, 670], "query_ms": 2.214575}, {"target": [300, 690], "position": [300, 690], "query_ms": 2.215451}, {"target": [350, 700], "position": [350, 700], "query_ms": 2.380822}]}, "clicks": [{"seq": 2, "x": 182, "y": 750, "seen": 2, "decoded_ms": 192.980398}, {"seq": 3, "x": 548, "y": 850, "seen": 3, "decoded_ms": 249.189423}, {"seq": 4, "x": 914, "y": 750, "seen": 4, "decoded_ms": 193.088898}, {"seq": 5, "x": 1280, "y": 850, "seen": 5, "decoded_ms": 374.099277}, {"seq": 6, "x": 1645, "y": 750, "seen": 6, "decoded_ms": 166.521582}, {"seq": 7, "x": 2011, "y": 850, "seen": 7, "decoded_ms": 207.861192}, {"seq": 8, "x": 2377, "y": 750, "seen": 8, "decoded_ms": 246.000709}, {"seq": 9, "x": 182, "y": 850, "seen": 9, "decoded_ms": 181.998527}, {"seq": 10, "x": 548, "y": 750, "seen": 10, "decoded_ms": 181.410831}, {"seq": 11, "x": 914, "y": 850, "seen": 11, "decoded_ms": 221.952754}, {"seq": 12, "x": 1280, "y": 750, "seen": 12, "decoded_ms": 507.168335}, {"seq": 13, "x": 1645, "y": 850, "seen": 13, "decoded_ms": 182.568433}, {"seq": 14, "x": 2011, "y": 750, "seen": 14, "decoded_ms": 164.879833}, {"seq": 15, "x": 2377, "y": 850, "seen": 15, "decoded_ms": 212.375805}, {"seq": 16, "x": 182, "y": 750, "seen": 16, "decoded_ms": 188.116394}, {"seq": 17, "x": 548, "y": 850, "seen": 17, "decoded_ms": 203.54084}, {"seq": 18, "x": 914, "y": 750, "seen": 18, "decoded_ms": 183.044427}, {"seq": 19, "x": 1280, "y": 850, "seen": 19, "decoded_ms": 316.917585}, {"seq": 20, "x": 1645, "y": 750, "seen": 20, "decoded_ms": 161.788239}, {"seq": 21, "x": 2011, "y": 850, "seen": 21, "decoded_ms": 180.879436}, {"seq": 22, "x": 2377, "y": 750, "seen": 22, "decoded_ms": 172.71762}, {"seq": 23, "x": 182, "y": 850, "seen": 23, "decoded_ms": 175.79901}, {"seq": 24, "x": 548, "y": 750, "seen": 24, "decoded_ms": 185.907366}, {"seq": 25, "x": 914, "y": 850, "seen": 25, "decoded_ms": 207.759418}, {"seq": 26, "x": 1280, "y": 750, "seen": 26, "decoded_ms": 468.920931}, {"seq": 27, "x": 1645, "y": 850, "seen": 27, "decoded_ms": 189.784407}, {"seq": 28, "x": 2011, "y": 750, "seen": 28, "decoded_ms": 186.12174}, {"seq": 29, "x": 2377, "y": 850, "seen": 29, "decoded_ms": 182.798273}], "p50_ms": 188.9504005, "p95_ms": 468.920931, "method": "XTest click-down to unique decoded sequence; excludes USB and scanout"}
|
||||
9
docs/evidence/native-cursor-20261105/ubuntu-warp-v3.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"host": "192.168.1.72",
|
||||
"target": [
|
||||
400,
|
||||
600
|
||||
],
|
||||
"readback": "X=400\nY=600\nSCREEN=0\nWINDOW=48234511\n",
|
||||
"passed": true
|
||||
}
|
||||
8
docs/evidence/native-cursor-20261105/ubuntu-warp.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"host": "192.168.1.72",
|
||||
"target": [
|
||||
400,
|
||||
600
|
||||
],
|
||||
"readback": "X=1500\nY=900\nSCREEN=0\nWINDOW=48234511\n"
|
||||
}
|
||||
1
docs/evidence/native-cursor-20261105/windows-final.json
Normal file
@ -0,0 +1 @@
|
||||
{"pid": 299142, "args": "/home/armbian/vdi-build/rkmpp-experiment/build/moonlight/app/moonlight stream 192.168.1.70 Desktop --resolution 2560x1440 --fps 45 --bitrate 30000 --display-mode fullscreen --video-codec H.264 --video-decoder hardware --absolute-mouse --capture-system-keys always --keep-awake --no-vsync --no-frame-pacing --audio-on-host ", "sha256": "5d4330f703d7f8e053bc3795ca42bdaf231c9e9dd8ebb00a612013adbcccee03", "native": false}
|
||||
BIN
docs/evidence/native-cursor-20261105/windows-normal.png
Normal file
|
After Width: | Height: | Size: 2.6 MiB |
@ -0,0 +1,9 @@
|
||||
盒子过夜观察汇总
|
||||
记录启用时间:2026-11-04T19:35:05+08:00
|
||||
最近记录时间:2026-11-04T19:40:14+08:00
|
||||
记录启用后重启次数:0
|
||||
当前启动编号:afb6a02f-ba7c-478a-8704-c78a993d23c6
|
||||
当前开机时长(秒):38110.05
|
||||
最近一次重启判断:观察期间尚未发现重启
|
||||
详细数据见同目录 overnight-health-YYYYMMDD.log;每分钟更新。
|
||||
服务重启不计为盒子重启;无故障证据时不推断具体断电原因。
|
||||
15
docs/evidence/overnight-observer-20261104/deploy-final.txt
Normal file
@ -0,0 +1,15 @@
|
||||
backup=/home/armbian/vdi-terminal/backups/overnight-observer-20261104-193449
|
||||
active
|
||||
enabled
|
||||
盒子过夜观察汇总
|
||||
记录启用时间:2026-11-04T19:35:05+08:00
|
||||
最近记录时间:2026-11-04T19:35:05+08:00
|
||||
记录启用后重启次数:0
|
||||
当前启动编号:afb6a02f-ba7c-478a-8704-c78a993d23c6
|
||||
当前开机时长(秒):37801.74
|
||||
最近一次重启判断:观察期间尚未发现重启
|
||||
详细数据见同目录 overnight-health-YYYYMMDD.log;每分钟更新。
|
||||
服务重启不计为盒子重启;无故障证据时不推断具体断电原因。
|
||||
11月 04 19:35:06 rk3528pro-ddr4 sshd[17776]: error: connect_to 127.0.0.1 port 40001: failed.
|
||||
11月 04 19:35:07 rk3528pro-ddr4 sudo[147206]: armbian : PWD=/home/armbian ; USER=root ; COMMAND=/usr/bin/journalctl --directory /var/log/journal -n 3 --no-pager
|
||||
11月 04 19:35:07 rk3528pro-ddr4 sudo[147206]: pam_unix(sudo:session): session opened for user root(uid=0) by armbian(uid=1000)
|
||||
15
docs/evidence/overnight-observer-20261104/deploy-pstore.txt
Normal file
@ -0,0 +1,15 @@
|
||||
backup=/home/armbian/vdi-terminal/backups/overnight-observer-20261104-193726
|
||||
active
|
||||
enabled
|
||||
盒子过夜观察汇总
|
||||
记录启用时间:2026-11-04T19:35:05+08:00
|
||||
最近记录时间:2026-11-04T19:37:45+08:00
|
||||
记录启用后重启次数:0
|
||||
当前启动编号:afb6a02f-ba7c-478a-8704-c78a993d23c6
|
||||
当前开机时长(秒):37961.73
|
||||
最近一次重启判断:观察期间尚未发现重启
|
||||
详细数据见同目录 overnight-health-YYYYMMDD.log;每分钟更新。
|
||||
服务重启不计为盒子重启;无故障证据时不推断具体断电原因。
|
||||
11月 04 19:37:46 rk3528pro-ddr4 sshd[17776]: error: connect_to 127.0.0.1 port 40001: failed.
|
||||
11月 04 19:37:47 rk3528pro-ddr4 sudo[149828]: armbian : PWD=/home/armbian ; USER=root ; COMMAND=/usr/bin/journalctl --directory /var/log/journal -n 3 --no-pager
|
||||
11月 04 19:37:47 rk3528pro-ddr4 sudo[149828]: pam_unix(sudo:session): session opened for user root(uid=0) by armbian(uid=1000)
|
||||
1
docs/evidence/overnight-observer-20261104/deploy.txt
Normal file
@ -0,0 +1 @@
|
||||
backup=/home/armbian/vdi-terminal/backups/overnight-observer-20261104-193329
|
||||
24
docs/evidence/overnight-observer-20261104/final-state.txt
Normal file
@ -0,0 +1,24 @@
|
||||
NRestarts=0
|
||||
MemoryCurrent=8458240
|
||||
CPUUsageNSec=1036254000
|
||||
ActiveState=active
|
||||
SubState=running
|
||||
UnitFileState=enabled
|
||||
盒子过夜观察汇总
|
||||
记录启用时间:2026-11-04T19:35:05+08:00
|
||||
最近记录时间:2026-11-04T19:40:14+08:00
|
||||
记录启用后重启次数:0
|
||||
当前启动编号:afb6a02f-ba7c-478a-8704-c78a993d23c6
|
||||
当前开机时长(秒):38110.05
|
||||
最近一次重启判断:观察期间尚未发现重启
|
||||
详细数据见同目录 overnight-health-YYYYMMDD.log;每分钟更新。
|
||||
服务重启不计为盒子重启;无故障证据时不推断具体断电原因。
|
||||
{"time": "2026-11-04T19:40:14+08:00", "event": "boot_evidence", "kernel": "6.1.115-vendor-rk35xx", "journal": {"code": 0, "text": "IDX BOOT ID FIRST ENTRY LAST ENTRY\n 0 afb6a02fba7c478a8704c78a993d23c6 Wed 2026-11-04 16:23:46 CST Wed 2026-11-04 19:40:13 CST\n", "error": ""}, "pstore": {"captured_at": "2026-11-04T19:40:13.613122+08:00", "boot_id": "afb6a02f-ba7c-478a-8704-c78a993d23c6", "sources": {"/sys/fs/pstore": {}, "/var/lib/systemd/pstore": {"console-ramoops-0": {"mtime": 1751465072.0266666, "text": "[ 2674.563324] reboot: Restarting system\n", "truncated": false}}}}, "watchdog_bootstatus": {}}
|
||||
{"time": "2026-11-04T19:40:14+08:00", "event": "sample", "boot_id": "afb6a02f-ba7c-478a-8704-c78a993d23c6", "reboots": 0, "uptime_seconds": 38110.05, "load": ["1.52", "1.34", "1.21"], "memory": {"MemTotal": "4014636 kB", "MemAvailable": "3039748 kB", "SwapFree": "2007316 kB"}, "temperatures_c": {"thermal_zone0": 62.704}, "processes": [{"pid": 2162, "name": "vdi-kiosk-monitor"}, {"pid": 92843, "name": "kiosk-shell"}, {"pid": 137139, "name": "moonlight", "host": "192.168.1.70", "resolution": "2560x1440", "fps": "45"}], "display": {"code": 0, "text": "Screen 0: minimum 320 x 200, current 2560 x 1440, maximum 16384 x 16384\nHDMI-1 disconnected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 0mm x 0mm", "error": ""}, "network": {"wlan0": {"operstate": "up", "rx_errors": "0", "tx_errors": "0"}, "end0": {"operstate": "down", "rx_errors": "0", "tx_errors": "0"}}, "root_available_mb": 22944}
|
||||
137139 /home/armbian/vdi-build/rkmpp-experiment/build/moonlight/app/moonlight stream 192.168.1.70 Desktop --resolution 2560x1440 --fps 45 --bitrate 30000 --display-mode fullscreen --video-codec H.264 --video-decoder hardware --absolute-mouse --keep-awake --no-vsync --no-frame-pacing --audio-on-host
|
||||
active
|
||||
root:root 755 /usr/local/libexec/vdi-observer-pstore
|
||||
root:systemd-journal 640 /var/lib/vdi-observer/pstore.json
|
||||
armbian:armbian 600 /home/armbian/vdi-terminal/state/overnight-state.json
|
||||
TARGET SOURCE FSTYPE OPTIONS
|
||||
/var/log.hdd /dev/mmcblk1p2[/var/log] ext4 rw,relatime,errors=remount-ro,commit=120
|
||||
16
docs/evidence/overnight-observer-20261104/tests.txt
Normal file
@ -0,0 +1,16 @@
|
||||
test_baseline_zero_reboots (test_overnight_observer.RebootEvidence.test_baseline_zero_reboots) ... ok
|
||||
test_boot_change_preserves_last_heartbeat (test_overnight_observer.RebootEvidence.test_boot_change_preserves_last_heartbeat) ... ok
|
||||
test_daily_rollover_uses_each_event_date (test_overnight_observer.RebootEvidence.test_daily_rollover_uses_each_event_date) ... ok
|
||||
test_durable_state_and_chinese_report (test_overnight_observer.RebootEvidence.test_durable_state_and_chinese_report) ... ok
|
||||
test_invalid_state_preserved (test_overnight_observer.RebootEvidence.test_invalid_state_preserved) ... ok
|
||||
test_multiple_boots_and_history_bound (test_overnight_observer.RebootEvidence.test_multiple_boots_and_history_bound) ... ok
|
||||
test_only_changed_pstore_is_a_new_clue (test_overnight_observer.RebootEvidence.test_only_changed_pstore_is_a_new_clue) ... ok
|
||||
test_oom_is_a_clue_not_a_proven_reboot_cause (test_overnight_observer.RebootEvidence.test_oom_is_a_clue_not_a_proven_reboot_cause) ... ok
|
||||
test_orderly_shutdown_requires_real_markers (test_overnight_observer.RebootEvidence.test_orderly_shutdown_requires_real_markers) ... ok
|
||||
test_service_restart_is_not_box_reboot (test_overnight_observer.RebootEvidence.test_service_restart_is_not_box_reboot) ... ok
|
||||
test_unknown_reason_is_not_reported_as_power_loss (test_overnight_observer.RebootEvidence.test_unknown_reason_is_not_reported_as_power_loss) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.053s
|
||||
|
||||
OK
|
||||
BIN
docs/evidence/ubuntu-deep-latency-20261105/box-now.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
docs/evidence/ubuntu-deep-latency-20261105/box-now.xwd
Normal file
BIN
docs/evidence/ubuntu-deep-latency-20261105/box2.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
docs/evidence/ubuntu-deep-latency-20261105/box2.xwd
Normal file
@ -0,0 +1,66 @@
|
||||
# To display the perf.data header info, please use --header/--header-only options.
|
||||
#
|
||||
#
|
||||
# Total Lost Samples: 0
|
||||
#
|
||||
# Samples: 870 of event 'cpu-clock'
|
||||
# Event count (approx.): 8787878700
|
||||
#
|
||||
# Overhead Command Shared Object Symbol IPC [IPC Coverage]
|
||||
# ........ ............... ................. ........................................... ....................
|
||||
#
|
||||
4.48% Xorg libc.so.6 [.] __memmove_avx_unaligned_erms - -
|
||||
|
|
||||
---__memmove_avx_unaligned_erms
|
||||
0x74d4c87b443d
|
||||
0x74d4c880cc9a
|
||||
0x74d4c87b4d39
|
||||
0x74d4c87b50d4
|
||||
0x74d4cb12577a
|
||||
0x74d4cb1178b1
|
||||
0x59b1b67f953d
|
||||
0x59b1b675babf
|
||||
0x59b1b675fed9
|
||||
__libc_start_call_main
|
||||
__libc_start_main_impl (inlined)
|
||||
_start
|
||||
|
||||
4.37% session::video libc.so.6 [.] __memmove_avx_unaligned_erms - -
|
||||
|
|
||||
---__memmove_avx_unaligned_erms
|
||||
|
|
||||
--4.25%--0x556749141015
|
||||
0x556749141d3c
|
||||
0x556749129542
|
||||
0x556749129747
|
||||
0x55674905a9fc
|
||||
0x55674905b4b4
|
||||
0x556748d841f8
|
||||
0x556748d89a5f
|
||||
0x556748d8a838
|
||||
0x556748d8aeed
|
||||
0x556748d717dc
|
||||
0x55674a019223
|
||||
start_thread
|
||||
__clone3 (inlined)
|
||||
|
||||
3.56% video::capture libc.so.6 [.] __memmove_avx_unaligned_erms - -
|
||||
2.99% session::video sunshine [.] 0x000000000065ff08 - -
|
||||
|
|
||||
--1.49%--0x556749090f08
|
||||
0x55674905dd70
|
||||
0x55674905907f
|
||||
0x55674905a5b3
|
||||
0x55674905b86c
|
||||
0x556749156dbd
|
||||
0x55674905abca
|
||||
0x55674905b51c
|
||||
0x556748d841f8
|
||||
0x556748d89a5f
|
||||
0x556748d8a838
|
||||
0x556748d8aeed
|
||||
0x556748d717dc
|
||||
0x55674a019223
|
||||
start_thread
|
||||
__clone3 (inlined)
|
||||
|
||||
@ -0,0 +1,457 @@
|
||||
{
|
||||
"host": "192.168.1.72",
|
||||
"pid": 40222,
|
||||
"shapes": [
|
||||
{
|
||||
"name": "default",
|
||||
"source": {
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1,
|
||||
"x": 181,
|
||||
"y": 599,
|
||||
"sw": 2560,
|
||||
"sh": 1440
|
||||
},
|
||||
"local": {
|
||||
"x": 182,
|
||||
"y": 600,
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 3,
|
||||
"hy": 1
|
||||
},
|
||||
"geometry_matches": true,
|
||||
"max_pixel_difference": 0,
|
||||
"visible_pixels": 254,
|
||||
"video": {
|
||||
"reference": 15726330,
|
||||
"nonuniform_pixels": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "text",
|
||||
"source": {
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 11,
|
||||
"hy": 12,
|
||||
"x": 547,
|
||||
"y": 599,
|
||||
"sw": 2560,
|
||||
"sh": 1440
|
||||
},
|
||||
"local": {
|
||||
"x": 548,
|
||||
"y": 600,
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 11,
|
||||
"hy": 12
|
||||
},
|
||||
"geometry_matches": true,
|
||||
"max_pixel_difference": 0,
|
||||
"visible_pixels": 240,
|
||||
"video": {
|
||||
"reference": 15791866,
|
||||
"nonuniform_pixels": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "ew-resize",
|
||||
"source": {
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 12,
|
||||
"hy": 12,
|
||||
"x": 913,
|
||||
"y": 599,
|
||||
"sw": 2560,
|
||||
"sh": 1440
|
||||
},
|
||||
"local": {
|
||||
"x": 914,
|
||||
"y": 600,
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 12,
|
||||
"hy": 12
|
||||
},
|
||||
"geometry_matches": true,
|
||||
"max_pixel_difference": 0,
|
||||
"visible_pixels": 301,
|
||||
"video": {
|
||||
"reference": 15726330,
|
||||
"nonuniform_pixels": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "wait",
|
||||
"source": {
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 11,
|
||||
"hy": 11,
|
||||
"x": 1280,
|
||||
"y": 599,
|
||||
"sw": 2560,
|
||||
"sh": 1440
|
||||
},
|
||||
"local": {
|
||||
"x": 1280,
|
||||
"y": 600,
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 11,
|
||||
"hy": 11
|
||||
},
|
||||
"geometry_matches": true,
|
||||
"max_pixel_difference": 0,
|
||||
"visible_pixels": 433,
|
||||
"video": {
|
||||
"reference": 15791866,
|
||||
"nonuniform_pixels": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "none",
|
||||
"source": {
|
||||
"w": 1,
|
||||
"h": 1,
|
||||
"hx": 0,
|
||||
"hy": 0,
|
||||
"x": 1645,
|
||||
"y": 599,
|
||||
"sw": 2560,
|
||||
"sh": 1440
|
||||
},
|
||||
"local": {
|
||||
"x": 1645,
|
||||
"y": 600,
|
||||
"w": 1,
|
||||
"h": 1,
|
||||
"hx": 0,
|
||||
"hy": 0
|
||||
},
|
||||
"geometry_matches": true,
|
||||
"max_pixel_difference": 0,
|
||||
"visible_pixels": 0,
|
||||
"video": {
|
||||
"reference": 15726074,
|
||||
"nonuniform_pixels": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "crosshair",
|
||||
"source": {
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 11,
|
||||
"hy": 11,
|
||||
"x": 2011,
|
||||
"y": 599,
|
||||
"sw": 2560,
|
||||
"sh": 1440
|
||||
},
|
||||
"local": {
|
||||
"x": 2011,
|
||||
"y": 600,
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 11,
|
||||
"hy": 11
|
||||
},
|
||||
"geometry_matches": true,
|
||||
"max_pixel_difference": 0,
|
||||
"visible_pixels": 281,
|
||||
"video": {
|
||||
"reference": 15726074,
|
||||
"nonuniform_pixels": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "custom",
|
||||
"source": {
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 7,
|
||||
"hy": 9,
|
||||
"x": 2377,
|
||||
"y": 599,
|
||||
"sw": 2560,
|
||||
"sh": 1440
|
||||
},
|
||||
"local": {
|
||||
"x": 2377,
|
||||
"y": 600,
|
||||
"w": 24,
|
||||
"h": 24,
|
||||
"hx": 7,
|
||||
"hy": 9
|
||||
},
|
||||
"geometry_matches": true,
|
||||
"max_pixel_difference": 0,
|
||||
"visible_pixels": 576,
|
||||
"video": {
|
||||
"reference": 15726074,
|
||||
"nonuniform_pixels": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"paused_client": {
|
||||
"position": [
|
||||
350,
|
||||
700
|
||||
],
|
||||
"elapsed_ms": 255.453621,
|
||||
"same_shape": true,
|
||||
"steps": [
|
||||
{
|
||||
"target": [
|
||||
250,
|
||||
650
|
||||
],
|
||||
"position": [
|
||||
250,
|
||||
650
|
||||
],
|
||||
"query_ms": 8.327664
|
||||
},
|
||||
{
|
||||
"target": [
|
||||
280,
|
||||
670
|
||||
],
|
||||
"position": [
|
||||
280,
|
||||
670
|
||||
],
|
||||
"query_ms": 2.16409
|
||||
},
|
||||
{
|
||||
"target": [
|
||||
300,
|
||||
690
|
||||
],
|
||||
"position": [
|
||||
300,
|
||||
690
|
||||
],
|
||||
"query_ms": 2.175173
|
||||
},
|
||||
{
|
||||
"target": [
|
||||
350,
|
||||
700
|
||||
],
|
||||
"position": [
|
||||
350,
|
||||
700
|
||||
],
|
||||
"query_ms": 2.244587
|
||||
}
|
||||
]
|
||||
},
|
||||
"clicks": [
|
||||
{
|
||||
"seq": 1,
|
||||
"x": 182,
|
||||
"y": 750,
|
||||
"seen": 1,
|
||||
"decoded_ms": 160.545435
|
||||
},
|
||||
{
|
||||
"seq": 2,
|
||||
"x": 548,
|
||||
"y": 850,
|
||||
"seen": 2,
|
||||
"decoded_ms": 135.850311
|
||||
},
|
||||
{
|
||||
"seq": 3,
|
||||
"x": 914,
|
||||
"y": 750,
|
||||
"seen": 3,
|
||||
"decoded_ms": 138.104231
|
||||
},
|
||||
{
|
||||
"seq": 4,
|
||||
"x": 1280,
|
||||
"y": 850,
|
||||
"seen": 4,
|
||||
"decoded_ms": 160.524437
|
||||
},
|
||||
{
|
||||
"seq": 5,
|
||||
"x": 1645,
|
||||
"y": 750,
|
||||
"seen": 5,
|
||||
"decoded_ms": 151.550171
|
||||
},
|
||||
{
|
||||
"seq": 6,
|
||||
"x": 2011,
|
||||
"y": 850,
|
||||
"seen": 6,
|
||||
"decoded_ms": 133.429855
|
||||
},
|
||||
{
|
||||
"seq": 7,
|
||||
"x": 2377,
|
||||
"y": 750,
|
||||
"seen": 7,
|
||||
"decoded_ms": 131.276556
|
||||
},
|
||||
{
|
||||
"seq": 8,
|
||||
"x": 182,
|
||||
"y": 850,
|
||||
"seen": 8,
|
||||
"decoded_ms": 132.176608
|
||||
},
|
||||
{
|
||||
"seq": 9,
|
||||
"x": 548,
|
||||
"y": 750,
|
||||
"seen": 9,
|
||||
"decoded_ms": 119.835754
|
||||
},
|
||||
{
|
||||
"seq": 10,
|
||||
"x": 914,
|
||||
"y": 850,
|
||||
"seen": 10,
|
||||
"decoded_ms": 146.008994
|
||||
},
|
||||
{
|
||||
"seq": 11,
|
||||
"x": 1280,
|
||||
"y": 750,
|
||||
"seen": 11,
|
||||
"decoded_ms": 147.967174
|
||||
},
|
||||
{
|
||||
"seq": 12,
|
||||
"x": 1645,
|
||||
"y": 850,
|
||||
"seen": 12,
|
||||
"decoded_ms": 153.74022
|
||||
},
|
||||
{
|
||||
"seq": 13,
|
||||
"x": 2011,
|
||||
"y": 750,
|
||||
"seen": 13,
|
||||
"decoded_ms": 122.392997
|
||||
},
|
||||
{
|
||||
"seq": 14,
|
||||
"x": 2377,
|
||||
"y": 850,
|
||||
"seen": 14,
|
||||
"decoded_ms": 211.141978
|
||||
},
|
||||
{
|
||||
"seq": 15,
|
||||
"x": 182,
|
||||
"y": 750,
|
||||
"seen": 15,
|
||||
"decoded_ms": 161.193497
|
||||
},
|
||||
{
|
||||
"seq": 16,
|
||||
"x": 548,
|
||||
"y": 850,
|
||||
"seen": 16,
|
||||
"decoded_ms": 204.8912
|
||||
},
|
||||
{
|
||||
"seq": 17,
|
||||
"x": 914,
|
||||
"y": 750,
|
||||
"seen": 17,
|
||||
"decoded_ms": 135.677069
|
||||
},
|
||||
{
|
||||
"seq": 18,
|
||||
"x": 1280,
|
||||
"y": 850,
|
||||
"seen": 18,
|
||||
"decoded_ms": 210.982152
|
||||
},
|
||||
{
|
||||
"seq": 19,
|
||||
"x": 1645,
|
||||
"y": 750,
|
||||
"seen": 19,
|
||||
"decoded_ms": 126.295068
|
||||
},
|
||||
{
|
||||
"seq": 20,
|
||||
"x": 2011,
|
||||
"y": 850,
|
||||
"seen": 20,
|
||||
"decoded_ms": 164.353012
|
||||
},
|
||||
{
|
||||
"seq": 21,
|
||||
"x": 2377,
|
||||
"y": 750,
|
||||
"seen": 21,
|
||||
"decoded_ms": 201.544444
|
||||
},
|
||||
{
|
||||
"seq": 22,
|
||||
"x": 182,
|
||||
"y": 850,
|
||||
"seen": 22,
|
||||
"decoded_ms": 201.614734
|
||||
},
|
||||
{
|
||||
"seq": 23,
|
||||
"x": 548,
|
||||
"y": 750,
|
||||
"seen": 23,
|
||||
"decoded_ms": 181.206665
|
||||
},
|
||||
{
|
||||
"seq": 24,
|
||||
"x": 914,
|
||||
"y": 850,
|
||||
"seen": 24,
|
||||
"decoded_ms": 208.485283
|
||||
},
|
||||
{
|
||||
"seq": 25,
|
||||
"x": 1280,
|
||||
"y": 750,
|
||||
"seen": 25,
|
||||
"decoded_ms": 159.208195
|
||||
},
|
||||
{
|
||||
"seq": 26,
|
||||
"x": 1645,
|
||||
"y": 850,
|
||||
"seen": 26,
|
||||
"decoded_ms": 164.559797
|
||||
},
|
||||
{
|
||||
"seq": 27,
|
||||
"x": 2011,
|
||||
"y": 750,
|
||||
"seen": 27,
|
||||
"decoded_ms": 177.386552
|
||||
},
|
||||
{
|
||||
"seq": 28,
|
||||
"x": 2377,
|
||||
"y": 850,
|
||||
"seen": 28,
|
||||
"decoded_ms": 156.205302
|
||||
}
|
||||
],
|
||||
"p50_ms": 157.7067485,
|
||||
"p95_ms": 210.982152,
|
||||
"method": "XTest click-down to unique decoded sequence; excludes USB and scanout"
|
||||
}
|
||||
351
docs/evidence/ubuntu-deep-latency-20261105/drag-before.json
Normal file
@ -0,0 +1,351 @@
|
||||
{
|
||||
"pid": 333281,
|
||||
"sent": 300,
|
||||
"elapsed": 6.029666734000784,
|
||||
"frames": [
|
||||
{
|
||||
"seq": 0,
|
||||
"t": 104512.239431477,
|
||||
"age_ms": null
|
||||
},
|
||||
{
|
||||
"seq": 1,
|
||||
"t": 104512.383192034,
|
||||
"age_ms": 144.5594520046143
|
||||
},
|
||||
{
|
||||
"seq": 4,
|
||||
"t": 104512.466121068,
|
||||
"age_ms": 177.34973100596108
|
||||
},
|
||||
{
|
||||
"seq": 7,
|
||||
"t": 104512.566346951,
|
||||
"age_ms": 227.791242999956
|
||||
},
|
||||
{
|
||||
"seq": 13,
|
||||
"t": 104512.599408487,
|
||||
"age_ms": 160.80744100327138
|
||||
},
|
||||
{
|
||||
"seq": 16,
|
||||
"t": 104512.699652746,
|
||||
"age_ms": 210.9896559995832
|
||||
},
|
||||
{
|
||||
"seq": 21,
|
||||
"t": 104512.767006974,
|
||||
"age_ms": 194.81691799592227
|
||||
},
|
||||
{
|
||||
"seq": 24,
|
||||
"t": 104512.799459786,
|
||||
"age_ms": 177.2593119967496
|
||||
},
|
||||
{
|
||||
"seq": 31,
|
||||
"t": 104512.933637389,
|
||||
"age_ms": 167.96715700183995
|
||||
},
|
||||
{
|
||||
"seq": 35,
|
||||
"t": 104513.017511149,
|
||||
"age_ms": 212.23217499209568
|
||||
},
|
||||
{
|
||||
"seq": 38,
|
||||
"t": 104513.077507896,
|
||||
"age_ms": 222.03037499275524
|
||||
},
|
||||
{
|
||||
"seq": 42,
|
||||
"t": 104513.132969697,
|
||||
"age_ms": 195.8896810101578
|
||||
},
|
||||
{
|
||||
"seq": 52,
|
||||
"t": 104513.260996184,
|
||||
"age_ms": 172.20925701258238
|
||||
},
|
||||
{
|
||||
"seq": 55,
|
||||
"t": 104513.366535776,
|
||||
"age_ms": 227.11804301070515
|
||||
},
|
||||
{
|
||||
"seq": 63,
|
||||
"t": 104513.465344117,
|
||||
"age_ms": 193.3882849989459
|
||||
},
|
||||
{
|
||||
"seq": 66,
|
||||
"t": 104513.516390558,
|
||||
"age_ms": 194.36976799624972
|
||||
},
|
||||
{
|
||||
"seq": 70,
|
||||
"t": 104513.54974114,
|
||||
"age_ms": 161.18718999496195
|
||||
},
|
||||
{
|
||||
"seq": 71,
|
||||
"t": 104513.599913142,
|
||||
"age_ms": 194.61827399209142
|
||||
},
|
||||
{
|
||||
"seq": 73,
|
||||
"t": 104513.716206753,
|
||||
"age_ms": 233.85862799477763
|
||||
},
|
||||
{
|
||||
"seq": 81,
|
||||
"t": 104513.819435121,
|
||||
"age_ms": 247.10120899544563
|
||||
},
|
||||
{
|
||||
"seq": 84,
|
||||
"t": 104513.85580132,
|
||||
"age_ms": 206.37856698886026
|
||||
},
|
||||
{
|
||||
"seq": 91,
|
||||
"t": 104513.967067338,
|
||||
"age_ms": 228.50377700524405
|
||||
},
|
||||
{
|
||||
"seq": 96,
|
||||
"t": 104513.99077197,
|
||||
"age_ms": 153.5435719997622
|
||||
},
|
||||
{
|
||||
"seq": 99,
|
||||
"t": 104514.04972977,
|
||||
"age_ms": 177.30712000047788
|
||||
},
|
||||
{
|
||||
"seq": 102,
|
||||
"t": 104514.099714514,
|
||||
"age_ms": 177.70408900105394
|
||||
},
|
||||
{
|
||||
"seq": 105,
|
||||
"t": 104514.149824094,
|
||||
"age_ms": 177.65946200233884
|
||||
},
|
||||
{
|
||||
"seq": 107,
|
||||
"t": 104514.216565505,
|
||||
"age_ms": 211.3130910001928
|
||||
},
|
||||
{
|
||||
"seq": 111,
|
||||
"t": 104514.299878954,
|
||||
"age_ms": 227.67745799501427
|
||||
},
|
||||
{
|
||||
"seq": 117,
|
||||
"t": 104514.34970561,
|
||||
"age_ms": 177.40133100596722
|
||||
},
|
||||
{
|
||||
"seq": 120,
|
||||
"t": 104514.433450736,
|
||||
"age_ms": 210.84291400620714
|
||||
},
|
||||
{
|
||||
"seq": 125,
|
||||
"t": 104514.499795178,
|
||||
"age_ms": 194.53979899117257
|
||||
},
|
||||
{
|
||||
"seq": 131,
|
||||
"t": 104514.599880169,
|
||||
"age_ms": 194.1547900059959
|
||||
},
|
||||
{
|
||||
"seq": 134,
|
||||
"t": 104514.633181748,
|
||||
"age_ms": 177.9598869907204
|
||||
},
|
||||
{
|
||||
"seq": 137,
|
||||
"t": 104514.683211993,
|
||||
"age_ms": 177.33920500904787
|
||||
},
|
||||
{
|
||||
"seq": 139,
|
||||
"t": 104514.766731654,
|
||||
"age_ms": 228.18322000966873
|
||||
},
|
||||
{
|
||||
"seq": 146,
|
||||
"t": 104514.8164396,
|
||||
"age_ms": 161.06146700622048
|
||||
},
|
||||
{
|
||||
"seq": 148,
|
||||
"t": 104514.916416666,
|
||||
"age_ms": 227.66141100146342
|
||||
},
|
||||
{
|
||||
"seq": 154,
|
||||
"t": 104514.967151008,
|
||||
"age_ms": 177.8076239861548
|
||||
},
|
||||
{
|
||||
"seq": 156,
|
||||
"t": 104515.050657538,
|
||||
"age_ms": 228.57900700182654
|
||||
},
|
||||
{
|
||||
"seq": 162,
|
||||
"t": 104515.133192794,
|
||||
"age_ms": 211.316576009267
|
||||
},
|
||||
{
|
||||
"seq": 167,
|
||||
"t": 104515.233260569,
|
||||
"age_ms": 227.95861400663853
|
||||
},
|
||||
{
|
||||
"seq": 173,
|
||||
"t": 104515.333358094,
|
||||
"age_ms": 227.58614699705504
|
||||
},
|
||||
{
|
||||
"seq": 181,
|
||||
"t": 104515.481023841,
|
||||
"age_ms": 242.47522400401067
|
||||
},
|
||||
{
|
||||
"seq": 187,
|
||||
"t": 104515.516803771,
|
||||
"age_ms": 177.49932099832222
|
||||
},
|
||||
{
|
||||
"seq": 190,
|
||||
"t": 104515.586970887,
|
||||
"age_ms": 198.40358999499585
|
||||
},
|
||||
{
|
||||
"seq": 195,
|
||||
"t": 104515.666858619,
|
||||
"age_ms": 183.13621100969613
|
||||
},
|
||||
{
|
||||
"seq": 198,
|
||||
"t": 104515.749984223,
|
||||
"age_ms": 228.0977430054918
|
||||
},
|
||||
{
|
||||
"seq": 204,
|
||||
"t": 104515.799814376,
|
||||
"age_ms": 177.78516100952402
|
||||
},
|
||||
{
|
||||
"seq": 206,
|
||||
"t": 104515.902322874,
|
||||
"age_ms": 234.46643899660558
|
||||
},
|
||||
{
|
||||
"seq": 212,
|
||||
"t": 104515.933265681,
|
||||
"age_ms": 177.80323899933137
|
||||
},
|
||||
{
|
||||
"seq": 218,
|
||||
"t": 104516.050162448,
|
||||
"age_ms": 194.68852499267086
|
||||
},
|
||||
{
|
||||
"seq": 221,
|
||||
"t": 104516.20082805,
|
||||
"age_ms": 295.25534600543324
|
||||
},
|
||||
{
|
||||
"seq": 227,
|
||||
"t": 104516.233473358,
|
||||
"age_ms": 228.16218600200955
|
||||
},
|
||||
{
|
||||
"seq": 232,
|
||||
"t": 104516.266585927,
|
||||
"age_ms": 177.10263100161683
|
||||
},
|
||||
{
|
||||
"seq": 234,
|
||||
"t": 104516.383193354,
|
||||
"age_ms": 261.2750469997991
|
||||
},
|
||||
{
|
||||
"seq": 244,
|
||||
"t": 104516.489367314,
|
||||
"age_ms": 190.34345900581684
|
||||
},
|
||||
{
|
||||
"seq": 248,
|
||||
"t": 104516.549978313,
|
||||
"age_ms": 194.10167701425962
|
||||
},
|
||||
{
|
||||
"seq": 251,
|
||||
"t": 104516.70027524,
|
||||
"age_ms": 295.0441739958478
|
||||
},
|
||||
{
|
||||
"seq": 258,
|
||||
"t": 104516.733220096,
|
||||
"age_ms": 210.86271599051543
|
||||
},
|
||||
{
|
||||
"seq": 261,
|
||||
"t": 104516.866613062,
|
||||
"age_ms": 294.4065740011865
|
||||
},
|
||||
{
|
||||
"seq": 268,
|
||||
"t": 104516.95033221,
|
||||
"age_ms": 251.20849900122266
|
||||
},
|
||||
{
|
||||
"seq": 277,
|
||||
"t": 104517.049994544,
|
||||
"age_ms": 210.87874499789905
|
||||
},
|
||||
{
|
||||
"seq": 279,
|
||||
"t": 104517.241374306,
|
||||
"age_ms": 369.3924030085327
|
||||
},
|
||||
{
|
||||
"seq": 290,
|
||||
"t": 104517.340214702,
|
||||
"age_ms": 284.98286299873143
|
||||
},
|
||||
{
|
||||
"seq": 296,
|
||||
"t": 104517.37882853,
|
||||
"age_ms": 223.49597098946106
|
||||
},
|
||||
{
|
||||
"seq": 300,
|
||||
"t": 104517.463400824,
|
||||
"age_ms": 241.15040600008797
|
||||
}
|
||||
],
|
||||
"fresh_video_updates_per_second": 12.4,
|
||||
"motion_to_decoded_marker_ms": {
|
||||
"p50": 206.37856698886026,
|
||||
"p95": 294.4065740011865,
|
||||
"maximum": 369.3924030085327
|
||||
},
|
||||
"frame_gap_ms": {
|
||||
"p50": 83.12560399645008,
|
||||
"p95": 147.66574700479396,
|
||||
"maximum": 191.3797620072728
|
||||
},
|
||||
"last_motion_seen": 300,
|
||||
"release_visible": true,
|
||||
"method": "60Hz XTest held drag to first observed unique decoded marker; no USB/scanout"
|
||||
}
|
||||
421
docs/evidence/ubuntu-deep-latency-20261105/drag-kms-async.json
Normal file
@ -0,0 +1,421 @@
|
||||
{
|
||||
"pid": 354371,
|
||||
"sent": 300,
|
||||
"elapsed": 5.965802310995059,
|
||||
"frames": [
|
||||
{
|
||||
"seq": 0,
|
||||
"t": 106125.563317136,
|
||||
"age_ms": null
|
||||
},
|
||||
{
|
||||
"seq": 1,
|
||||
"t": 106125.714375512,
|
||||
"age_ms": 151.8925330019556
|
||||
},
|
||||
{
|
||||
"seq": 4,
|
||||
"t": 106125.749306594,
|
||||
"age_ms": 136.80098700569943
|
||||
},
|
||||
{
|
||||
"seq": 6,
|
||||
"t": 106125.821857897,
|
||||
"age_ms": 176.10760599200148
|
||||
},
|
||||
{
|
||||
"seq": 10,
|
||||
"t": 106125.878653244,
|
||||
"age_ms": 163.65532200143207
|
||||
},
|
||||
{
|
||||
"seq": 14,
|
||||
"t": 106125.941070989,
|
||||
"age_ms": 161.94938200351316
|
||||
},
|
||||
{
|
||||
"seq": 15,
|
||||
"t": 106125.973142894,
|
||||
"age_ms": 177.1826769981999
|
||||
},
|
||||
{
|
||||
"seq": 19,
|
||||
"t": 106126.037015165,
|
||||
"age_ms": 174.32379099773243
|
||||
},
|
||||
{
|
||||
"seq": 23,
|
||||
"t": 106126.091339831,
|
||||
"age_ms": 161.95229899312835
|
||||
},
|
||||
{
|
||||
"seq": 27,
|
||||
"t": 106126.161715324,
|
||||
"age_ms": 165.82442399521824
|
||||
},
|
||||
{
|
||||
"seq": 30,
|
||||
"t": 106126.243443236,
|
||||
"age_ms": 197.618082005647
|
||||
},
|
||||
{
|
||||
"seq": 35,
|
||||
"t": 106126.292928912,
|
||||
"age_ms": 163.7372799887089
|
||||
},
|
||||
{
|
||||
"seq": 38,
|
||||
"t": 106126.393147834,
|
||||
"age_ms": 214.06423900043592
|
||||
},
|
||||
{
|
||||
"seq": 40,
|
||||
"t": 106126.460498776,
|
||||
"age_ms": 246.99188499653246
|
||||
},
|
||||
{
|
||||
"seq": 45,
|
||||
"t": 106126.506483739,
|
||||
"age_ms": 210.74756600137334
|
||||
},
|
||||
{
|
||||
"seq": 49,
|
||||
"t": 106126.558515346,
|
||||
"age_ms": 195.6083539989777
|
||||
},
|
||||
{
|
||||
"seq": 54,
|
||||
"t": 106126.611094405,
|
||||
"age_ms": 165.05193199554924
|
||||
},
|
||||
{
|
||||
"seq": 56,
|
||||
"t": 106126.660565498,
|
||||
"age_ms": 180.8705959992949
|
||||
},
|
||||
{
|
||||
"seq": 60,
|
||||
"t": 106126.757307082,
|
||||
"age_ms": 211.40385000035167
|
||||
},
|
||||
{
|
||||
"seq": 65,
|
||||
"t": 106126.816025658,
|
||||
"age_ms": 186.94115499965847
|
||||
},
|
||||
{
|
||||
"seq": 70,
|
||||
"t": 106126.877746619,
|
||||
"age_ms": 165.35134500009008
|
||||
},
|
||||
{
|
||||
"seq": 71,
|
||||
"t": 106126.921906811,
|
||||
"age_ms": 192.67438499082346
|
||||
},
|
||||
{
|
||||
"seq": 74,
|
||||
"t": 106126.96888068,
|
||||
"age_ms": 189.77524900401477
|
||||
},
|
||||
{
|
||||
"seq": 77,
|
||||
"t": 106127.017848945,
|
||||
"age_ms": 188.69784400158096
|
||||
},
|
||||
{
|
||||
"seq": 81,
|
||||
"t": 106127.074083131,
|
||||
"age_ms": 178.1332079990534
|
||||
},
|
||||
{
|
||||
"seq": 84,
|
||||
"t": 106127.171377709,
|
||||
"age_ms": 225.33719999773894
|
||||
},
|
||||
{
|
||||
"seq": 90,
|
||||
"t": 106127.218476994,
|
||||
"age_ms": 172.71351600356866
|
||||
},
|
||||
{
|
||||
"seq": 94,
|
||||
"t": 106127.282473805,
|
||||
"age_ms": 169.98646200227086
|
||||
},
|
||||
{
|
||||
"seq": 98,
|
||||
"t": 106127.368655127,
|
||||
"age_ms": 189.55737599753775
|
||||
},
|
||||
{
|
||||
"seq": 102,
|
||||
"t": 106127.432980935,
|
||||
"age_ms": 187.2170679998817
|
||||
},
|
||||
{
|
||||
"seq": 106,
|
||||
"t": 106127.515914292,
|
||||
"age_ms": 203.32652000070084
|
||||
},
|
||||
{
|
||||
"seq": 111,
|
||||
"t": 106127.567239198,
|
||||
"age_ms": 171.3380310102366
|
||||
},
|
||||
{
|
||||
"seq": 115,
|
||||
"t": 106127.631536423,
|
||||
"age_ms": 169.0268889942672
|
||||
},
|
||||
{
|
||||
"seq": 120,
|
||||
"t": 106127.707620062,
|
||||
"age_ms": 161.641385013354
|
||||
},
|
||||
{
|
||||
"seq": 127,
|
||||
"t": 106127.815789315,
|
||||
"age_ms": 153.22135100723244
|
||||
},
|
||||
{
|
||||
"seq": 130,
|
||||
"t": 106127.874282727,
|
||||
"age_ms": 161.84380000049714
|
||||
},
|
||||
{
|
||||
"seq": 133,
|
||||
"t": 106127.931842816,
|
||||
"age_ms": 169.38884400587995
|
||||
},
|
||||
{
|
||||
"seq": 138,
|
||||
"t": 106128.013466603,
|
||||
"age_ms": 167.70273601287045
|
||||
},
|
||||
{
|
||||
"seq": 141,
|
||||
"t": 106128.044233606,
|
||||
"age_ms": 148.4322359901853
|
||||
},
|
||||
{
|
||||
"seq": 145,
|
||||
"t": 106128.137089648,
|
||||
"age_ms": 174.65745299705304
|
||||
},
|
||||
{
|
||||
"seq": 149,
|
||||
"t": 106128.197354332,
|
||||
"age_ms": 168.1769810093101
|
||||
},
|
||||
{
|
||||
"seq": 153,
|
||||
"t": 106128.277546344,
|
||||
"age_ms": 181.73671000113245
|
||||
},
|
||||
{
|
||||
"seq": 154,
|
||||
"t": 106128.331110642,
|
||||
"age_ms": 218.22410900495015
|
||||
},
|
||||
{
|
||||
"seq": 160,
|
||||
"t": 106128.405224969,
|
||||
"age_ms": 192.82984000165015
|
||||
},
|
||||
{
|
||||
"seq": 164,
|
||||
"t": 106128.511843363,
|
||||
"age_ms": 232.710953001515
|
||||
},
|
||||
{
|
||||
"seq": 165,
|
||||
"t": 106128.549592498,
|
||||
"age_ms": 253.84868300170638
|
||||
},
|
||||
{
|
||||
"seq": 171,
|
||||
"t": 106128.594834178,
|
||||
"age_ms": 198.86777600913774
|
||||
},
|
||||
{
|
||||
"seq": 177,
|
||||
"t": 106128.66914042,
|
||||
"age_ms": 173.21013599575963
|
||||
},
|
||||
{
|
||||
"seq": 180,
|
||||
"t": 106128.731889494,
|
||||
"age_ms": 185.88008199003525
|
||||
},
|
||||
{
|
||||
"seq": 183,
|
||||
"t": 106128.790431905,
|
||||
"age_ms": 194.43107300321572
|
||||
},
|
||||
{
|
||||
"seq": 187,
|
||||
"t": 106128.853490435,
|
||||
"age_ms": 190.642948000459
|
||||
},
|
||||
{
|
||||
"seq": 191,
|
||||
"t": 106128.922401651,
|
||||
"age_ms": 192.91196500125807
|
||||
},
|
||||
{
|
||||
"seq": 192,
|
||||
"t": 106129.000728766,
|
||||
"age_ms": 254.81375599338207
|
||||
},
|
||||
{
|
||||
"seq": 197,
|
||||
"t": 106129.046423399,
|
||||
"age_ms": 216.86658200633246
|
||||
},
|
||||
{
|
||||
"seq": 201,
|
||||
"t": 106129.163282474,
|
||||
"age_ms": 267.04729099583346
|
||||
},
|
||||
{
|
||||
"seq": 207,
|
||||
"t": 106129.245888292,
|
||||
"age_ms": 249.72814400098287
|
||||
},
|
||||
{
|
||||
"seq": 210,
|
||||
"t": 106129.277642284,
|
||||
"age_ms": 230.3109369968297
|
||||
},
|
||||
{
|
||||
"seq": 213,
|
||||
"t": 106129.322393093,
|
||||
"age_ms": 226.60680899571162
|
||||
},
|
||||
{
|
||||
"seq": 218,
|
||||
"t": 106129.408518708,
|
||||
"age_ms": 229.4254459993681
|
||||
},
|
||||
{
|
||||
"seq": 224,
|
||||
"t": 106129.495256232,
|
||||
"age_ms": 216.1567969887983
|
||||
},
|
||||
{
|
||||
"seq": 228,
|
||||
"t": 106129.536706286,
|
||||
"age_ms": 190.93461100419518
|
||||
},
|
||||
{
|
||||
"seq": 230,
|
||||
"t": 106129.586514541,
|
||||
"age_ms": 207.26135199947748
|
||||
},
|
||||
{
|
||||
"seq": 235,
|
||||
"t": 106129.648752037,
|
||||
"age_ms": 186.0731630004011
|
||||
},
|
||||
{
|
||||
"seq": 238,
|
||||
"t": 106129.708485019,
|
||||
"age_ms": 195.9757230069954
|
||||
},
|
||||
{
|
||||
"seq": 243,
|
||||
"t": 106129.772917867,
|
||||
"age_ms": 177.09225999715272
|
||||
},
|
||||
{
|
||||
"seq": 246,
|
||||
"t": 106129.827104283,
|
||||
"age_ms": 181.23534000187647
|
||||
},
|
||||
{
|
||||
"seq": 250,
|
||||
"t": 106129.91438226,
|
||||
"age_ms": 201.94811699911952
|
||||
},
|
||||
{
|
||||
"seq": 256,
|
||||
"t": 106129.970676528,
|
||||
"age_ms": 158.1014629919082
|
||||
},
|
||||
{
|
||||
"seq": 258,
|
||||
"t": 106130.02146594,
|
||||
"age_ms": 175.6849829980638
|
||||
},
|
||||
{
|
||||
"seq": 262,
|
||||
"t": 106130.103489306,
|
||||
"age_ms": 190.86286099627614
|
||||
},
|
||||
{
|
||||
"seq": 263,
|
||||
"t": 106130.151932284,
|
||||
"age_ms": 222.61918500589672
|
||||
},
|
||||
{
|
||||
"seq": 270,
|
||||
"t": 106130.214829523,
|
||||
"age_ms": 169.0382619999582
|
||||
},
|
||||
{
|
||||
"seq": 273,
|
||||
"t": 106130.266302302,
|
||||
"age_ms": 162.1599609934492
|
||||
},
|
||||
{
|
||||
"seq": 276,
|
||||
"t": 106130.326758901,
|
||||
"age_ms": 180.80601100518834
|
||||
},
|
||||
{
|
||||
"seq": 281,
|
||||
"t": 106130.390516547,
|
||||
"age_ms": 161.41096901264973
|
||||
},
|
||||
{
|
||||
"seq": 284,
|
||||
"t": 106130.443561976,
|
||||
"age_ms": 164.49706100684125
|
||||
},
|
||||
{
|
||||
"seq": 289,
|
||||
"t": 106130.503064543,
|
||||
"age_ms": 140.13586498913355
|
||||
},
|
||||
{
|
||||
"seq": 292,
|
||||
"t": 106130.579826008,
|
||||
"age_ms": 167.37519700836856
|
||||
},
|
||||
{
|
||||
"seq": 295,
|
||||
"t": 106130.61713619,
|
||||
"age_ms": 154.48571099841502
|
||||
},
|
||||
{
|
||||
"seq": 300,
|
||||
"t": 106130.723035424,
|
||||
"age_ms": 177.01467699953355
|
||||
}
|
||||
],
|
||||
"fresh_video_updates_per_second": 15.4,
|
||||
"motion_to_decoded_marker_ms": {
|
||||
"p50": 181.23534000187647,
|
||||
"p95": 249.72814400098287,
|
||||
"maximum": 267.04729099583346
|
||||
},
|
||||
"frame_gap_ms": {
|
||||
"p50": 61.72096099180635,
|
||||
"p95": 106.61839399836026,
|
||||
"maximum": 151.05837601004168
|
||||
},
|
||||
"last_motion_seen": 300,
|
||||
"release_visible": true,
|
||||
"method": "60Hz XTest held drag to first observed unique decoded marker; no USB/scanout"
|
||||
}
|
||||
@ -0,0 +1,391 @@
|
||||
{
|
||||
"pid": 34534,
|
||||
"sent": 300,
|
||||
"elapsed": 6.0406107769999835,
|
||||
"frames": [
|
||||
{
|
||||
"seq": 0,
|
||||
"t": 3431.244445763,
|
||||
"age_ms": null
|
||||
},
|
||||
{
|
||||
"seq": 4,
|
||||
"t": 3431.461263847,
|
||||
"age_ms": 172.3552179996659
|
||||
},
|
||||
{
|
||||
"seq": 6,
|
||||
"t": 3431.493808798,
|
||||
"age_ms": 172.23155600004247
|
||||
},
|
||||
{
|
||||
"seq": 9,
|
||||
"t": 3431.577781054,
|
||||
"age_ms": 206.21495099976528
|
||||
},
|
||||
{
|
||||
"seq": 14,
|
||||
"t": 3431.602662177,
|
||||
"age_ms": 140.2410420000706
|
||||
},
|
||||
{
|
||||
"seq": 18,
|
||||
"t": 3431.710441389,
|
||||
"age_ms": 188.83929000003263
|
||||
},
|
||||
{
|
||||
"seq": 23,
|
||||
"t": 3431.793798835,
|
||||
"age_ms": 182.29074999999284
|
||||
},
|
||||
{
|
||||
"seq": 27,
|
||||
"t": 3431.860748916,
|
||||
"age_ms": 189.01282399974662
|
||||
},
|
||||
{
|
||||
"seq": 31,
|
||||
"t": 3431.943923787,
|
||||
"age_ms": 205.59285100034685
|
||||
},
|
||||
{
|
||||
"seq": 36,
|
||||
"t": 3431.990334328,
|
||||
"age_ms": 168.25775099960083
|
||||
},
|
||||
{
|
||||
"seq": 39,
|
||||
"t": 3432.077464922,
|
||||
"age_ms": 205.77047000006132
|
||||
},
|
||||
{
|
||||
"seq": 45,
|
||||
"t": 3432.143944271,
|
||||
"age_ms": 171.88419499962038
|
||||
},
|
||||
{
|
||||
"seq": 46,
|
||||
"t": 3432.193929341,
|
||||
"age_ms": 201.2387290001243
|
||||
},
|
||||
{
|
||||
"seq": 51,
|
||||
"t": 3432.277223499,
|
||||
"age_ms": 198.89731899957042
|
||||
},
|
||||
{
|
||||
"seq": 56,
|
||||
"t": 3432.326931788,
|
||||
"age_ms": 171.98773299969616
|
||||
},
|
||||
{
|
||||
"seq": 60,
|
||||
"t": 3432.443708278,
|
||||
"age_ms": 222.12767100018027
|
||||
},
|
||||
{
|
||||
"seq": 61,
|
||||
"t": 3432.493954963,
|
||||
"age_ms": 255.37493000001632
|
||||
},
|
||||
{
|
||||
"seq": 67,
|
||||
"t": 3432.523106796,
|
||||
"age_ms": 184.65374399966095
|
||||
},
|
||||
{
|
||||
"seq": 71,
|
||||
"t": 3432.593761192,
|
||||
"age_ms": 188.33385199968689
|
||||
},
|
||||
{
|
||||
"seq": 73,
|
||||
"t": 3432.644055417,
|
||||
"age_ms": 199.60400099989783
|
||||
},
|
||||
{
|
||||
"seq": 76,
|
||||
"t": 3432.710660178,
|
||||
"age_ms": 215.88566300033563
|
||||
},
|
||||
{
|
||||
"seq": 80,
|
||||
"t": 3432.777038614,
|
||||
"age_ms": 222.14312899996003
|
||||
},
|
||||
{
|
||||
"seq": 83,
|
||||
"t": 3432.843847534,
|
||||
"age_ms": 238.76107099977162
|
||||
},
|
||||
{
|
||||
"seq": 87,
|
||||
"t": 3432.894341543,
|
||||
"age_ms": 222.06788299990876
|
||||
},
|
||||
{
|
||||
"seq": 91,
|
||||
"t": 3432.944063248,
|
||||
"age_ms": 205.58497799993347
|
||||
},
|
||||
{
|
||||
"seq": 95,
|
||||
"t": 3432.976939229,
|
||||
"age_ms": 171.92502799980502
|
||||
},
|
||||
{
|
||||
"seq": 98,
|
||||
"t": 3433.060685162,
|
||||
"age_ms": 205.7812630000626
|
||||
},
|
||||
{
|
||||
"seq": 101,
|
||||
"t": 3433.144084025,
|
||||
"age_ms": 239.19068100030927
|
||||
},
|
||||
{
|
||||
"seq": 107,
|
||||
"t": 3433.194192174,
|
||||
"age_ms": 189.06940799979566
|
||||
},
|
||||
{
|
||||
"seq": 112,
|
||||
"t": 3433.277305798,
|
||||
"age_ms": 189.0250759997798
|
||||
},
|
||||
{
|
||||
"seq": 116,
|
||||
"t": 3433.343900936,
|
||||
"age_ms": 188.48463999984233
|
||||
},
|
||||
{
|
||||
"seq": 120,
|
||||
"t": 3433.394165412,
|
||||
"age_ms": 172.6255849998779
|
||||
},
|
||||
{
|
||||
"seq": 125,
|
||||
"t": 3433.493910977,
|
||||
"age_ms": 188.51992999998402
|
||||
},
|
||||
{
|
||||
"seq": 130,
|
||||
"t": 3433.577120848,
|
||||
"age_ms": 181.59982199995284
|
||||
},
|
||||
{
|
||||
"seq": 131,
|
||||
"t": 3433.610360523,
|
||||
"age_ms": 183.59445299984145
|
||||
},
|
||||
{
|
||||
"seq": 138,
|
||||
"t": 3433.693979586,
|
||||
"age_ms": 172.39284399965982
|
||||
},
|
||||
{
|
||||
"seq": 142,
|
||||
"t": 3433.794087387,
|
||||
"age_ms": 205.4382760002227
|
||||
},
|
||||
{
|
||||
"seq": 146,
|
||||
"t": 3433.860823978,
|
||||
"age_ms": 205.23615999991307
|
||||
},
|
||||
{
|
||||
"seq": 152,
|
||||
"t": 3433.944030349,
|
||||
"age_ms": 189.14144800010035
|
||||
},
|
||||
{
|
||||
"seq": 156,
|
||||
"t": 3433.993801053,
|
||||
"age_ms": 172.22631000004185
|
||||
},
|
||||
{
|
||||
"seq": 161,
|
||||
"t": 3434.060665388,
|
||||
"age_ms": 155.32808699981615
|
||||
},
|
||||
{
|
||||
"seq": 164,
|
||||
"t": 3434.160480952,
|
||||
"age_ms": 204.94625599985739
|
||||
},
|
||||
{
|
||||
"seq": 168,
|
||||
"t": 3434.227263041,
|
||||
"age_ms": 205.68851899997753
|
||||
},
|
||||
{
|
||||
"seq": 172,
|
||||
"t": 3434.310492745,
|
||||
"age_ms": 222.25396299973
|
||||
},
|
||||
{
|
||||
"seq": 175,
|
||||
"t": 3434.377123464,
|
||||
"age_ms": 215.89412399998764
|
||||
},
|
||||
{
|
||||
"seq": 182,
|
||||
"t": 3434.477372428,
|
||||
"age_ms": 222.4764959996719
|
||||
},
|
||||
{
|
||||
"seq": 187,
|
||||
"t": 3434.560593674,
|
||||
"age_ms": 222.19475699967006
|
||||
},
|
||||
{
|
||||
"seq": 192,
|
||||
"t": 3434.6106537,
|
||||
"age_ms": 189.07553500002905
|
||||
},
|
||||
{
|
||||
"seq": 197,
|
||||
"t": 3434.710504554,
|
||||
"age_ms": 205.62785500032987
|
||||
},
|
||||
{
|
||||
"seq": 198,
|
||||
"t": 3434.760702824,
|
||||
"age_ms": 238.46066999976756
|
||||
},
|
||||
{
|
||||
"seq": 202,
|
||||
"t": 3434.827379917,
|
||||
"age_ms": 217.65514000026087
|
||||
},
|
||||
{
|
||||
"seq": 209,
|
||||
"t": 3434.933724479,
|
||||
"age_ms": 222.29071099991415
|
||||
},
|
||||
{
|
||||
"seq": 213,
|
||||
"t": 3435.027398947,
|
||||
"age_ms": 255.79841900025713
|
||||
},
|
||||
{
|
||||
"seq": 217,
|
||||
"t": 3435.077319854,
|
||||
"age_ms": 239.01306700008718
|
||||
},
|
||||
{
|
||||
"seq": 223,
|
||||
"t": 3435.144122359,
|
||||
"age_ms": 199.344432000089
|
||||
},
|
||||
{
|
||||
"seq": 229,
|
||||
"t": 3435.260626155,
|
||||
"age_ms": 222.42049999977098
|
||||
},
|
||||
{
|
||||
"seq": 232,
|
||||
"t": 3435.294209983,
|
||||
"age_ms": 205.85418000018763
|
||||
},
|
||||
{
|
||||
"seq": 237,
|
||||
"t": 3435.394271997,
|
||||
"age_ms": 222.29362999996738
|
||||
},
|
||||
{
|
||||
"seq": 241,
|
||||
"t": 3435.443899206,
|
||||
"age_ms": 184.16872499983583
|
||||
},
|
||||
{
|
||||
"seq": 246,
|
||||
"t": 3435.527625017,
|
||||
"age_ms": 205.94575999984954
|
||||
},
|
||||
{
|
||||
"seq": 247,
|
||||
"t": 3435.547092141,
|
||||
"age_ms": 208.79844199998843
|
||||
},
|
||||
{
|
||||
"seq": 253,
|
||||
"t": 3435.660602676,
|
||||
"age_ms": 215.84337800004505
|
||||
},
|
||||
{
|
||||
"seq": 256,
|
||||
"t": 3435.727331976,
|
||||
"age_ms": 238.4364640001877
|
||||
},
|
||||
{
|
||||
"seq": 258,
|
||||
"t": 3435.777296048,
|
||||
"age_ms": 248.30200099995636
|
||||
},
|
||||
{
|
||||
"seq": 264,
|
||||
"t": 3435.827309993,
|
||||
"age_ms": 205.18891500023528
|
||||
},
|
||||
{
|
||||
"seq": 266,
|
||||
"t": 3435.927812406,
|
||||
"age_ms": 266.4240100002644
|
||||
},
|
||||
{
|
||||
"seq": 268,
|
||||
"t": 3435.977364952,
|
||||
"age_ms": 288.6516519997713
|
||||
},
|
||||
{
|
||||
"seq": 277,
|
||||
"t": 3436.027469019,
|
||||
"age_ms": 188.94575100011934
|
||||
},
|
||||
{
|
||||
"seq": 280,
|
||||
"t": 3436.110579437,
|
||||
"age_ms": 221.74765199997637
|
||||
},
|
||||
{
|
||||
"seq": 286,
|
||||
"t": 3436.177311071,
|
||||
"age_ms": 188.751800999853
|
||||
},
|
||||
{
|
||||
"seq": 290,
|
||||
"t": 3436.244002164,
|
||||
"age_ms": 188.9267930000642
|
||||
},
|
||||
{
|
||||
"seq": 295,
|
||||
"t": 3436.287856347,
|
||||
"age_ms": 149.54923000004783
|
||||
},
|
||||
{
|
||||
"seq": 297,
|
||||
"t": 3436.367445318,
|
||||
"age_ms": 189.14145200005805
|
||||
},
|
||||
{
|
||||
"seq": 300,
|
||||
"t": 3436.473359398,
|
||||
"age_ms": 230.2628239999649
|
||||
}
|
||||
],
|
||||
"fresh_video_updates_per_second": 14.0,
|
||||
"motion_to_decoded_marker_ms": {
|
||||
"p50": 205.23615999991307,
|
||||
"p95": 255.37493000001632,
|
||||
"maximum": 288.6516519997713
|
||||
},
|
||||
"frame_gap_ms": {
|
||||
"p50": 66.78208899984384,
|
||||
"p95": 113.51053499993213,
|
||||
"maximum": 216.81808399989677
|
||||
},
|
||||
"last_motion_seen": 300,
|
||||
"release_visible": true,
|
||||
"method": "60Hz XTest held drag to first observed unique decoded marker; no USB/scanout"
|
||||
}
|
||||
@ -0,0 +1,391 @@
|
||||
{
|
||||
"pid": 36868,
|
||||
"sent": 300,
|
||||
"elapsed": 5.9589984410004035,
|
||||
"frames": [
|
||||
{
|
||||
"seq": 0,
|
||||
"t": 3640.386110834,
|
||||
"age_ms": null
|
||||
},
|
||||
{
|
||||
"seq": 1,
|
||||
"t": 3640.519373332,
|
||||
"age_ms": 134.4022890002634
|
||||
},
|
||||
{
|
||||
"seq": 3,
|
||||
"t": 3640.602775811,
|
||||
"age_ms": 180.1231290000942
|
||||
},
|
||||
{
|
||||
"seq": 7,
|
||||
"t": 3640.686827223,
|
||||
"age_ms": 202.1667660001185
|
||||
},
|
||||
{
|
||||
"seq": 12,
|
||||
"t": 3640.719559755,
|
||||
"age_ms": 151.21741299981295
|
||||
},
|
||||
{
|
||||
"seq": 16,
|
||||
"t": 3640.886160553,
|
||||
"age_ms": 251.06752900001084
|
||||
},
|
||||
{
|
||||
"seq": 21,
|
||||
"t": 3640.952684036,
|
||||
"age_ms": 232.05332099996667
|
||||
},
|
||||
{
|
||||
"seq": 28,
|
||||
"t": 3641.019270224,
|
||||
"age_ms": 184.72633300007146
|
||||
},
|
||||
{
|
||||
"seq": 31,
|
||||
"t": 3641.08601974,
|
||||
"age_ms": 197.41423599998598
|
||||
},
|
||||
{
|
||||
"seq": 33,
|
||||
"t": 3641.136477653,
|
||||
"age_ms": 218.50386699998126
|
||||
},
|
||||
{
|
||||
"seq": 39,
|
||||
"t": 3641.253744581,
|
||||
"age_ms": 233.55622400003995
|
||||
},
|
||||
{
|
||||
"seq": 44,
|
||||
"t": 3641.302773964,
|
||||
"age_ms": 201.0841410001376
|
||||
},
|
||||
{
|
||||
"seq": 48,
|
||||
"t": 3641.352620567,
|
||||
"age_ms": 184.09052300012263
|
||||
},
|
||||
{
|
||||
"seq": 54,
|
||||
"t": 3641.419806983,
|
||||
"age_ms": 151.48398700011967
|
||||
},
|
||||
{
|
||||
"seq": 58,
|
||||
"t": 3641.469275309,
|
||||
"age_ms": 134.2054219999227
|
||||
},
|
||||
{
|
||||
"seq": 61,
|
||||
"t": 3641.550360582,
|
||||
"age_ms": 165.7757049997599
|
||||
},
|
||||
{
|
||||
"seq": 66,
|
||||
"t": 3641.602734675,
|
||||
"age_ms": 132.61152300037793
|
||||
},
|
||||
{
|
||||
"seq": 68,
|
||||
"t": 3641.669524731,
|
||||
"age_ms": 168.2404889997997
|
||||
},
|
||||
{
|
||||
"seq": 72,
|
||||
"t": 3641.735955758,
|
||||
"age_ms": 168.02757899995413
|
||||
},
|
||||
{
|
||||
"seq": 76,
|
||||
"t": 3641.825930701,
|
||||
"age_ms": 191.08063799967567
|
||||
},
|
||||
{
|
||||
"seq": 80,
|
||||
"t": 3641.886014715,
|
||||
"age_ms": 184.69220999986646
|
||||
},
|
||||
{
|
||||
"seq": 84,
|
||||
"t": 3641.942853183,
|
||||
"age_ms": 174.62308499989376
|
||||
},
|
||||
{
|
||||
"seq": 88,
|
||||
"t": 3642.01955662,
|
||||
"age_ms": 180.3497470000366
|
||||
},
|
||||
{
|
||||
"seq": 92,
|
||||
"t": 3642.069425098,
|
||||
"age_ms": 168.1019530001322
|
||||
},
|
||||
{
|
||||
"seq": 97,
|
||||
"t": 3642.151479252,
|
||||
"age_ms": 166.5138860003026
|
||||
},
|
||||
{
|
||||
"seq": 102,
|
||||
"t": 3642.236618834,
|
||||
"age_ms": 166.25868800019816
|
||||
},
|
||||
{
|
||||
"seq": 104,
|
||||
"t": 3642.303523803,
|
||||
"age_ms": 202.06527200025448
|
||||
},
|
||||
{
|
||||
"seq": 110,
|
||||
"t": 3642.383756275,
|
||||
"age_ms": 181.81065099997795
|
||||
},
|
||||
{
|
||||
"seq": 114,
|
||||
"t": 3642.452824163,
|
||||
"age_ms": 184.7937060001641
|
||||
},
|
||||
{
|
||||
"seq": 115,
|
||||
"t": 3642.502808136,
|
||||
"age_ms": 200.88727400025164
|
||||
},
|
||||
{
|
||||
"seq": 122,
|
||||
"t": 3642.56962765,
|
||||
"age_ms": 168.23873899966202
|
||||
},
|
||||
{
|
||||
"seq": 126,
|
||||
"t": 3642.636211214,
|
||||
"age_ms": 168.06987100017068
|
||||
},
|
||||
{
|
||||
"seq": 130,
|
||||
"t": 3642.736057248,
|
||||
"age_ms": 201.29267600032108
|
||||
},
|
||||
{
|
||||
"seq": 133,
|
||||
"t": 3642.786491538,
|
||||
"age_ms": 201.8608220000715
|
||||
},
|
||||
{
|
||||
"seq": 138,
|
||||
"t": 3642.869465575,
|
||||
"age_ms": 201.49245999982668
|
||||
},
|
||||
{
|
||||
"seq": 142,
|
||||
"t": 3642.936706531,
|
||||
"age_ms": 199.6734029999061
|
||||
},
|
||||
{
|
||||
"seq": 147,
|
||||
"t": 3642.970636602,
|
||||
"age_ms": 152.74627400003737
|
||||
},
|
||||
{
|
||||
"seq": 151,
|
||||
"t": 3643.103158296,
|
||||
"age_ms": 218.58144999987417
|
||||
},
|
||||
{
|
||||
"seq": 155,
|
||||
"t": 3643.186588192,
|
||||
"age_ms": 217.62627699990844
|
||||
},
|
||||
{
|
||||
"seq": 161,
|
||||
"t": 3643.219949826,
|
||||
"age_ms": 168.2127830003992
|
||||
},
|
||||
{
|
||||
"seq": 166,
|
||||
"t": 3643.386168849,
|
||||
"age_ms": 248.8666980002563
|
||||
},
|
||||
{
|
||||
"seq": 167,
|
||||
"t": 3643.419431903,
|
||||
"age_ms": 267.89432299983673
|
||||
},
|
||||
{
|
||||
"seq": 172,
|
||||
"t": 3643.469876985,
|
||||
"age_ms": 235.0979190000544
|
||||
},
|
||||
{
|
||||
"seq": 174,
|
||||
"t": 3643.536069147,
|
||||
"age_ms": 264.59336400012035
|
||||
},
|
||||
{
|
||||
"seq": 181,
|
||||
"t": 3643.586186115,
|
||||
"age_ms": 199.1352990003179
|
||||
},
|
||||
{
|
||||
"seq": 184,
|
||||
"t": 3643.652388194,
|
||||
"age_ms": 217.85114400017846
|
||||
},
|
||||
{
|
||||
"seq": 188,
|
||||
"t": 3643.719702647,
|
||||
"age_ms": 218.2440039996436
|
||||
},
|
||||
{
|
||||
"seq": 191,
|
||||
"t": 3643.769954944,
|
||||
"age_ms": 218.46157999971183
|
||||
},
|
||||
{
|
||||
"seq": 196,
|
||||
"t": 3643.836222937,
|
||||
"age_ms": 201.32009300004938
|
||||
},
|
||||
{
|
||||
"seq": 201,
|
||||
"t": 3643.90293833,
|
||||
"age_ms": 182.37821499997153
|
||||
},
|
||||
{
|
||||
"seq": 206,
|
||||
"t": 3643.969618141,
|
||||
"age_ms": 167.77938299992456
|
||||
},
|
||||
{
|
||||
"seq": 210,
|
||||
"t": 3644.069398845,
|
||||
"age_ms": 201.0048139995888
|
||||
},
|
||||
{
|
||||
"seq": 214,
|
||||
"t": 3644.13643331,
|
||||
"age_ms": 201.597750000019
|
||||
},
|
||||
{
|
||||
"seq": 220,
|
||||
"t": 3644.252838979,
|
||||
"age_ms": 218.2553799998459
|
||||
},
|
||||
{
|
||||
"seq": 227,
|
||||
"t": 3644.319017434,
|
||||
"age_ms": 167.78171700025268
|
||||
},
|
||||
{
|
||||
"seq": 228,
|
||||
"t": 3644.386198309,
|
||||
"age_ms": 217.88031100004446
|
||||
},
|
||||
{
|
||||
"seq": 231,
|
||||
"t": 3644.486060386,
|
||||
"age_ms": 268.07806900023934
|
||||
},
|
||||
{
|
||||
"seq": 234,
|
||||
"t": 3644.536142939,
|
||||
"age_ms": 233.4952709998106
|
||||
},
|
||||
{
|
||||
"seq": 242,
|
||||
"t": 3644.569764438,
|
||||
"age_ms": 168.36531900025875
|
||||
},
|
||||
{
|
||||
"seq": 245,
|
||||
"t": 3644.653021966,
|
||||
"age_ms": 201.83865799981504
|
||||
},
|
||||
{
|
||||
"seq": 247,
|
||||
"t": 3644.703262597,
|
||||
"age_ms": 216.3491179999255
|
||||
},
|
||||
{
|
||||
"seq": 250,
|
||||
"t": 3644.722097729,
|
||||
"age_ms": 185.04074099973877
|
||||
},
|
||||
{
|
||||
"seq": 251,
|
||||
"t": 3644.836617552,
|
||||
"age_ms": 267.9818219999106
|
||||
},
|
||||
{
|
||||
"seq": 258,
|
||||
"t": 3644.953858233,
|
||||
"age_ms": 285.3023870002289
|
||||
},
|
||||
{
|
||||
"seq": 263,
|
||||
"t": 3644.98666922,
|
||||
"age_ms": 235.29682999969737
|
||||
},
|
||||
{
|
||||
"seq": 267,
|
||||
"t": 3645.036247501,
|
||||
"age_ms": 198.78414699996938
|
||||
},
|
||||
{
|
||||
"seq": 270,
|
||||
"t": 3645.069559845,
|
||||
"age_ms": 201.00598099998024
|
||||
},
|
||||
{
|
||||
"seq": 274,
|
||||
"t": 3645.136220116,
|
||||
"age_ms": 184.05027900007553
|
||||
},
|
||||
{
|
||||
"seq": 279,
|
||||
"t": 3645.219745967,
|
||||
"age_ms": 184.3165600002976
|
||||
},
|
||||
{
|
||||
"seq": 283,
|
||||
"t": 3645.26959578,
|
||||
"age_ms": 185.01186799994684
|
||||
},
|
||||
{
|
||||
"seq": 288,
|
||||
"t": 3645.353489409,
|
||||
"age_ms": 185.59401299989986
|
||||
},
|
||||
{
|
||||
"seq": 292,
|
||||
"t": 3645.412158018,
|
||||
"age_ms": 177.5848520001091
|
||||
},
|
||||
{
|
||||
"seq": 296,
|
||||
"t": 3645.48232895,
|
||||
"age_ms": 180.9187710000515
|
||||
},
|
||||
{
|
||||
"seq": 300,
|
||||
"t": 3645.539078755,
|
||||
"age_ms": 171.13896699993347
|
||||
}
|
||||
],
|
||||
"fresh_video_updates_per_second": 14.2,
|
||||
"motion_to_decoded_marker_ms": {
|
||||
"p50": 197.41423599998598,
|
||||
"p95": 267.89432299983673,
|
||||
"maximum": 285.3023870002289
|
||||
},
|
||||
"frame_gap_ms": {
|
||||
"p50": 66.67981100008546,
|
||||
"p95": 132.52169399993363,
|
||||
"maximum": 166.60079800021776
|
||||
},
|
||||
"last_motion_seen": 300,
|
||||
"release_visible": true,
|
||||
"method": "60Hz XTest held drag to first observed unique decoded marker; no USB/scanout"
|
||||
}
|
||||
@ -0,0 +1,441 @@
|
||||
{
|
||||
"pid": 35562,
|
||||
"sent": 300,
|
||||
"elapsed": 6.017804186000376,
|
||||
"frames": [
|
||||
{
|
||||
"seq": 0,
|
||||
"t": 3536.620144655,
|
||||
"age_ms": null
|
||||
},
|
||||
{
|
||||
"seq": 1,
|
||||
"t": 3536.814883409,
|
||||
"age_ms": 196.04478799965364
|
||||
},
|
||||
{
|
||||
"seq": 5,
|
||||
"t": 3536.865073259,
|
||||
"age_ms": 167.73844199997257
|
||||
},
|
||||
{
|
||||
"seq": 10,
|
||||
"t": 3536.948258403,
|
||||
"age_ms": 179.12438700022904
|
||||
},
|
||||
{
|
||||
"seq": 13,
|
||||
"t": 3537.015249368,
|
||||
"age_ms": 196.2264909998339
|
||||
},
|
||||
{
|
||||
"seq": 17,
|
||||
"t": 3537.097523087,
|
||||
"age_ms": 211.9371039998441
|
||||
},
|
||||
{
|
||||
"seq": 21,
|
||||
"t": 3537.164810374,
|
||||
"age_ms": 212.40958599992155
|
||||
},
|
||||
{
|
||||
"seq": 26,
|
||||
"t": 3537.220110615,
|
||||
"age_ms": 184.36631500026124
|
||||
},
|
||||
{
|
||||
"seq": 28,
|
||||
"t": 3537.281839237,
|
||||
"age_ms": 212.57670500017412
|
||||
},
|
||||
{
|
||||
"seq": 31,
|
||||
"t": 3537.365558111,
|
||||
"age_ms": 246.66220700009944
|
||||
},
|
||||
{
|
||||
"seq": 35,
|
||||
"t": 3537.415416932,
|
||||
"age_ms": 229.73451400002887
|
||||
},
|
||||
{
|
||||
"seq": 36,
|
||||
"t": 3537.449159155,
|
||||
"age_ms": 246.3244699997631
|
||||
},
|
||||
{
|
||||
"seq": 42,
|
||||
"t": 3537.481623052,
|
||||
"age_ms": 178.97855999990497
|
||||
},
|
||||
{
|
||||
"seq": 43,
|
||||
"t": 3537.531908274,
|
||||
"age_ms": 212.8173220003191
|
||||
},
|
||||
{
|
||||
"seq": 46,
|
||||
"t": 3537.598891364,
|
||||
"age_ms": 229.01879199980613
|
||||
},
|
||||
{
|
||||
"seq": 48,
|
||||
"t": 3537.631467839,
|
||||
"age_ms": 215.03536199998052
|
||||
},
|
||||
{
|
||||
"seq": 53,
|
||||
"t": 3537.681592942,
|
||||
"age_ms": 195.88962799980436
|
||||
},
|
||||
{
|
||||
"seq": 57,
|
||||
"t": 3537.748287293,
|
||||
"age_ms": 195.9409589999268
|
||||
},
|
||||
{
|
||||
"seq": 62,
|
||||
"t": 3537.798581557,
|
||||
"age_ms": 162.83571299982214
|
||||
},
|
||||
{
|
||||
"seq": 66,
|
||||
"t": 3537.949134193,
|
||||
"age_ms": 246.6181670001788
|
||||
},
|
||||
{
|
||||
"seq": 71,
|
||||
"t": 3537.981714752,
|
||||
"age_ms": 184.30827599968325
|
||||
},
|
||||
{
|
||||
"seq": 72,
|
||||
"t": 3538.031659029,
|
||||
"age_ms": 229.41952700011825
|
||||
},
|
||||
{
|
||||
"seq": 78,
|
||||
"t": 3538.082010749,
|
||||
"age_ms": 178.810859999885
|
||||
},
|
||||
{
|
||||
"seq": 82,
|
||||
"t": 3538.148348114,
|
||||
"age_ms": 167.53107799968348
|
||||
},
|
||||
{
|
||||
"seq": 84,
|
||||
"t": 3538.215343745,
|
||||
"age_ms": 212.66187000037462
|
||||
},
|
||||
{
|
||||
"seq": 85,
|
||||
"t": 3538.298310148,
|
||||
"age_ms": 267.565459999787
|
||||
},
|
||||
{
|
||||
"seq": 90,
|
||||
"t": 3538.331726008,
|
||||
"age_ms": 229.3749039999966
|
||||
},
|
||||
{
|
||||
"seq": 93,
|
||||
"t": 3538.381578122,
|
||||
"age_ms": 228.9849610001511
|
||||
},
|
||||
{
|
||||
"seq": 94,
|
||||
"t": 3538.431567022,
|
||||
"age_ms": 262.6405619998877
|
||||
},
|
||||
{
|
||||
"seq": 99,
|
||||
"t": 3538.481737916,
|
||||
"age_ms": 228.9499620001152
|
||||
},
|
||||
{
|
||||
"seq": 104,
|
||||
"t": 3538.532109468,
|
||||
"age_ms": 195.71026099993105
|
||||
},
|
||||
{
|
||||
"seq": 107,
|
||||
"t": 3538.598420876,
|
||||
"age_ms": 212.85611300027085
|
||||
},
|
||||
{
|
||||
"seq": 110,
|
||||
"t": 3538.666771831,
|
||||
"age_ms": 231.00555100018028
|
||||
},
|
||||
{
|
||||
"seq": 114,
|
||||
"t": 3538.698401884,
|
||||
"age_ms": 195.13919899964094
|
||||
},
|
||||
{
|
||||
"seq": 120,
|
||||
"t": 3538.764949533,
|
||||
"age_ms": 162.70388500015542
|
||||
},
|
||||
{
|
||||
"seq": 121,
|
||||
"t": 3538.815146675,
|
||||
"age_ms": 196.05733100024736
|
||||
},
|
||||
{
|
||||
"seq": 125,
|
||||
"t": 3538.848538912,
|
||||
"age_ms": 151.06507600012264
|
||||
},
|
||||
{
|
||||
"seq": 127,
|
||||
"t": 3538.898356027,
|
||||
"age_ms": 179.4002950000504
|
||||
},
|
||||
{
|
||||
"seq": 129,
|
||||
"t": 3538.948557836,
|
||||
"age_ms": 184.40189800003282
|
||||
},
|
||||
{
|
||||
"seq": 134,
|
||||
"t": 3539.015454889,
|
||||
"age_ms": 168.0350599999656
|
||||
},
|
||||
{
|
||||
"seq": 137,
|
||||
"t": 3539.081556305,
|
||||
"age_ms": 184.1154930002631
|
||||
},
|
||||
{
|
||||
"seq": 142,
|
||||
"t": 3539.131946232,
|
||||
"age_ms": 162.97366799972224
|
||||
},
|
||||
{
|
||||
"seq": 143,
|
||||
"t": 3539.164969233,
|
||||
"age_ms": 178.9348140000584
|
||||
},
|
||||
{
|
||||
"seq": 146,
|
||||
"t": 3539.231701208,
|
||||
"age_ms": 196.0328339996522
|
||||
},
|
||||
{
|
||||
"seq": 151,
|
||||
"t": 3539.28183652,
|
||||
"age_ms": 150.95570599987695
|
||||
},
|
||||
{
|
||||
"seq": 152,
|
||||
"t": 3539.36490821,
|
||||
"age_ms": 228.91642300010062
|
||||
},
|
||||
{
|
||||
"seq": 156,
|
||||
"t": 3539.403856195,
|
||||
"age_ms": 201.30859200025952
|
||||
},
|
||||
{
|
||||
"seq": 159,
|
||||
"t": 3539.465066838,
|
||||
"age_ms": 212.45683799998005
|
||||
},
|
||||
{
|
||||
"seq": 163,
|
||||
"t": 3539.521298919,
|
||||
"age_ms": 202.32530400016913
|
||||
},
|
||||
{
|
||||
"seq": 167,
|
||||
"t": 3539.564986016,
|
||||
"age_ms": 178.99314500027685
|
||||
},
|
||||
{
|
||||
"seq": 174,
|
||||
"t": 3539.631711867,
|
||||
"age_ms": 129.02699400001438
|
||||
},
|
||||
{
|
||||
"seq": 177,
|
||||
"t": 3539.715022132,
|
||||
"age_ms": 150.9297479997258
|
||||
},
|
||||
{
|
||||
"seq": 180,
|
||||
"t": 3539.78181623,
|
||||
"age_ms": 178.8400260002163
|
||||
},
|
||||
{
|
||||
"seq": 184,
|
||||
"t": 3539.837261716,
|
||||
"age_ms": 156.23292299960667
|
||||
},
|
||||
{
|
||||
"seq": 188,
|
||||
"t": 3539.915345804,
|
||||
"age_ms": 179.68466100001024
|
||||
},
|
||||
{
|
||||
"seq": 193,
|
||||
"t": 3540.065381629,
|
||||
"age_ms": 245.27509700010341
|
||||
},
|
||||
{
|
||||
"seq": 196,
|
||||
"t": 3540.164939738,
|
||||
"age_ms": 296.0185110000566
|
||||
},
|
||||
{
|
||||
"seq": 204,
|
||||
"t": 3540.198514843,
|
||||
"age_ms": 196.2652839997645
|
||||
},
|
||||
{
|
||||
"seq": 209,
|
||||
"t": 3540.299446067,
|
||||
"age_ms": 212.7537440001106
|
||||
},
|
||||
{
|
||||
"seq": 214,
|
||||
"t": 3540.331958088,
|
||||
"age_ms": 161.82571300032578
|
||||
},
|
||||
{
|
||||
"seq": 216,
|
||||
"t": 3540.398769686,
|
||||
"age_ms": 196.42248799982553
|
||||
},
|
||||
{
|
||||
"seq": 220,
|
||||
"t": 3540.448549469,
|
||||
"age_ms": 178.3809610001299
|
||||
},
|
||||
{
|
||||
"seq": 221,
|
||||
"t": 3540.482114366,
|
||||
"age_ms": 184.0417050002543
|
||||
},
|
||||
{
|
||||
"seq": 225,
|
||||
"t": 3540.548644517,
|
||||
"age_ms": 196.15066400001524
|
||||
},
|
||||
{
|
||||
"seq": 231,
|
||||
"t": 3540.629612204,
|
||||
"age_ms": 175.98646799979178
|
||||
},
|
||||
{
|
||||
"seq": 234,
|
||||
"t": 3540.698265899,
|
||||
"age_ms": 195.91996400004064
|
||||
},
|
||||
{
|
||||
"seq": 238,
|
||||
"t": 3540.764972501,
|
||||
"age_ms": 195.91938100029438
|
||||
},
|
||||
{
|
||||
"seq": 240,
|
||||
"t": 3540.799238538,
|
||||
"age_ms": 196.48665099975915
|
||||
},
|
||||
{
|
||||
"seq": 243,
|
||||
"t": 3540.831778557,
|
||||
"age_ms": 179.49158499959594
|
||||
},
|
||||
{
|
||||
"seq": 247,
|
||||
"t": 3540.915131988,
|
||||
"age_ms": 196.2151200000335
|
||||
},
|
||||
{
|
||||
"seq": 252,
|
||||
"t": 3540.94839823,
|
||||
"age_ms": 146.04568499999004
|
||||
},
|
||||
{
|
||||
"seq": 256,
|
||||
"t": 3541.031627416,
|
||||
"age_ms": 162.32473599984587
|
||||
},
|
||||
{
|
||||
"seq": 258,
|
||||
"t": 3541.109307562,
|
||||
"age_ms": 193.32685600011246
|
||||
},
|
||||
{
|
||||
"seq": 263,
|
||||
"t": 3541.165125784,
|
||||
"age_ms": 179.53125199983333
|
||||
},
|
||||
{
|
||||
"seq": 267,
|
||||
"t": 3541.231790388,
|
||||
"age_ms": 179.26876199999242
|
||||
},
|
||||
{
|
||||
"seq": 270,
|
||||
"t": 3541.298284373,
|
||||
"age_ms": 182.62805099993784
|
||||
},
|
||||
{
|
||||
"seq": 275,
|
||||
"t": 3541.348325189,
|
||||
"age_ms": 162.70272200017644
|
||||
},
|
||||
{
|
||||
"seq": 279,
|
||||
"t": 3541.415016334,
|
||||
"age_ms": 162.76163700013058
|
||||
},
|
||||
{
|
||||
"seq": 282,
|
||||
"t": 3541.480711474,
|
||||
"age_ms": 178.45212600013838
|
||||
},
|
||||
{
|
||||
"seq": 287,
|
||||
"t": 3541.564962622,
|
||||
"age_ms": 178.97010700016835
|
||||
},
|
||||
{
|
||||
"seq": 290,
|
||||
"t": 3541.63167564,
|
||||
"age_ms": 195.87796700034232
|
||||
},
|
||||
{
|
||||
"seq": 294,
|
||||
"t": 3541.707457108,
|
||||
"age_ms": 204.93854200003625
|
||||
},
|
||||
{
|
||||
"seq": 299,
|
||||
"t": 3541.778955904,
|
||||
"age_ms": 193.3583540003383
|
||||
},
|
||||
{
|
||||
"seq": 300,
|
||||
"t": 3541.832077187,
|
||||
"age_ms": 201.21118299994123
|
||||
}
|
||||
],
|
||||
"fresh_video_updates_per_second": 16.0,
|
||||
"motion_to_decoded_marker_ms": {
|
||||
"p50": 195.87796700034232,
|
||||
"p95": 246.6181670001788,
|
||||
"maximum": 296.0185110000566
|
||||
},
|
||||
"frame_gap_ms": {
|
||||
"p50": 65.69514000011623,
|
||||
"p95": 99.55810900009965,
|
||||
"maximum": 194.73875399989993
|
||||
},
|
||||
"last_motion_seen": 300,
|
||||
"release_visible": true,
|
||||
"method": "60Hz XTest held drag to first observed unique decoded marker; no USB/scanout"
|
||||
}
|
||||
426
docs/evidence/ubuntu-deep-latency-20261105/drag-kms-thread1.json
Normal file
@ -0,0 +1,426 @@
|
||||
{
|
||||
"pid": 352658,
|
||||
"sent": 300,
|
||||
"elapsed": 5.995556267997017,
|
||||
"frames": [
|
||||
{
|
||||
"seq": 0,
|
||||
"t": 105822.364914285,
|
||||
"age_ms": null
|
||||
},
|
||||
{
|
||||
"seq": 1,
|
||||
"t": 105822.585777361,
|
||||
"age_ms": 222.01077300996985
|
||||
},
|
||||
{
|
||||
"seq": 2,
|
||||
"t": 105822.633395286,
|
||||
"age_ms": 252.87143999594264
|
||||
},
|
||||
{
|
||||
"seq": 7,
|
||||
"t": 105822.689622253,
|
||||
"age_ms": 226.022027010913
|
||||
},
|
||||
{
|
||||
"seq": 10,
|
||||
"t": 105822.742185339,
|
||||
"age_ms": 228.2570469978964
|
||||
},
|
||||
{
|
||||
"seq": 16,
|
||||
"t": 105822.79771698,
|
||||
"age_ms": 183.7351360009052
|
||||
},
|
||||
{
|
||||
"seq": 21,
|
||||
"t": 105822.861982205,
|
||||
"age_ms": 164.93943899695296
|
||||
},
|
||||
{
|
||||
"seq": 23,
|
||||
"t": 105822.950869113,
|
||||
"age_ms": 220.40866300812922
|
||||
},
|
||||
{
|
||||
"seq": 28,
|
||||
"t": 105823.019618087,
|
||||
"age_ms": 205.75517599354498
|
||||
},
|
||||
{
|
||||
"seq": 33,
|
||||
"t": 105823.121072793,
|
||||
"age_ms": 224.04250300314743
|
||||
},
|
||||
{
|
||||
"seq": 37,
|
||||
"t": 105823.175335695,
|
||||
"age_ms": 211.7217440099921
|
||||
},
|
||||
{
|
||||
"seq": 40,
|
||||
"t": 105823.237644438,
|
||||
"age_ms": 223.70738101017196
|
||||
},
|
||||
{
|
||||
"seq": 42,
|
||||
"t": 105823.324132994,
|
||||
"age_ms": 277.0209180016536
|
||||
},
|
||||
{
|
||||
"seq": 45,
|
||||
"t": 105823.382827147,
|
||||
"age_ms": 285.76791899104137
|
||||
},
|
||||
{
|
||||
"seq": 51,
|
||||
"t": 105823.455156878,
|
||||
"age_ms": 258.1867209955817
|
||||
},
|
||||
{
|
||||
"seq": 57,
|
||||
"t": 105823.514103903,
|
||||
"age_ms": 216.88186199753545
|
||||
},
|
||||
{
|
||||
"seq": 60,
|
||||
"t": 105823.561138791,
|
||||
"age_ms": 214.07255600206554
|
||||
},
|
||||
{
|
||||
"seq": 63,
|
||||
"t": 105823.605551037,
|
||||
"age_ms": 208.5913160117343
|
||||
},
|
||||
{
|
||||
"seq": 67,
|
||||
"t": 105823.659636816,
|
||||
"age_ms": 196.04647599044256
|
||||
},
|
||||
{
|
||||
"seq": 73,
|
||||
"t": 105823.753416386,
|
||||
"age_ms": 189.77045199426357
|
||||
},
|
||||
{
|
||||
"seq": 76,
|
||||
"t": 105823.803806576,
|
||||
"age_ms": 190.11899099859875
|
||||
},
|
||||
{
|
||||
"seq": 79,
|
||||
"t": 105823.869725451,
|
||||
"age_ms": 205.90471600007731
|
||||
},
|
||||
{
|
||||
"seq": 83,
|
||||
"t": 105823.95639163,
|
||||
"age_ms": 225.8787350001512
|
||||
},
|
||||
{
|
||||
"seq": 87,
|
||||
"t": 105824.013852919,
|
||||
"age_ms": 216.4352410036372
|
||||
},
|
||||
{
|
||||
"seq": 92,
|
||||
"t": 105824.094019076,
|
||||
"age_ms": 213.65897500072606
|
||||
},
|
||||
{
|
||||
"seq": 97,
|
||||
"t": 105824.13580518,
|
||||
"age_ms": 172.12632700102404
|
||||
},
|
||||
{
|
||||
"seq": 98,
|
||||
"t": 105824.193087387,
|
||||
"age_ms": 212.82773300481495
|
||||
},
|
||||
{
|
||||
"seq": 101,
|
||||
"t": 105824.254351098,
|
||||
"age_ms": 224.0923759964062
|
||||
},
|
||||
{
|
||||
"seq": 104,
|
||||
"t": 105824.286978663,
|
||||
"age_ms": 206.35425200453028
|
||||
},
|
||||
{
|
||||
"seq": 110,
|
||||
"t": 105824.342255098,
|
||||
"age_ms": 161.75242500321474
|
||||
},
|
||||
{
|
||||
"seq": 114,
|
||||
"t": 105824.421301557,
|
||||
"age_ms": 174.21901499619707
|
||||
},
|
||||
{
|
||||
"seq": 117,
|
||||
"t": 105824.498500034,
|
||||
"age_ms": 201.53275699703954
|
||||
},
|
||||
{
|
||||
"seq": 121,
|
||||
"t": 105824.540304513,
|
||||
"age_ms": 176.58061899419408
|
||||
},
|
||||
{
|
||||
"seq": 125,
|
||||
"t": 105824.61779757,
|
||||
"age_ms": 187.53464000474196
|
||||
},
|
||||
{
|
||||
"seq": 130,
|
||||
"t": 105824.683076618,
|
||||
"age_ms": 169.4389360054629
|
||||
},
|
||||
{
|
||||
"seq": 131,
|
||||
"t": 105824.726741037,
|
||||
"age_ms": 196.3230559922522
|
||||
},
|
||||
{
|
||||
"seq": 134,
|
||||
"t": 105824.773524511,
|
||||
"age_ms": 193.21187799505424
|
||||
},
|
||||
{
|
||||
"seq": 136,
|
||||
"t": 105824.822325131,
|
||||
"age_ms": 208.38627500052098
|
||||
},
|
||||
{
|
||||
"seq": 139,
|
||||
"t": 105824.870169386,
|
||||
"age_ms": 206.38254401274025
|
||||
},
|
||||
{
|
||||
"seq": 142,
|
||||
"t": 105824.917264065,
|
||||
"age_ms": 203.22382400627248
|
||||
},
|
||||
{
|
||||
"seq": 145,
|
||||
"t": 105824.98236753,
|
||||
"age_ms": 218.49155299423728
|
||||
},
|
||||
{
|
||||
"seq": 148,
|
||||
"t": 105825.0198443,
|
||||
"age_ms": 205.89196399669163
|
||||
},
|
||||
{
|
||||
"seq": 151,
|
||||
"t": 105825.071297604,
|
||||
"age_ms": 207.4841579888016
|
||||
},
|
||||
{
|
||||
"seq": 155,
|
||||
"t": 105825.137494809,
|
||||
"age_ms": 207.23215899488423
|
||||
},
|
||||
{
|
||||
"seq": 159,
|
||||
"t": 105825.178862375,
|
||||
"age_ms": 181.62698599917348
|
||||
},
|
||||
{
|
||||
"seq": 160,
|
||||
"t": 105825.244621502,
|
||||
"age_ms": 230.6874790083384
|
||||
},
|
||||
{
|
||||
"seq": 163,
|
||||
"t": 105825.306028419,
|
||||
"age_ms": 242.21345300611574
|
||||
},
|
||||
{
|
||||
"seq": 169,
|
||||
"t": 105825.375719467,
|
||||
"age_ms": 211.78678300930187
|
||||
},
|
||||
{
|
||||
"seq": 175,
|
||||
"t": 105825.477803874,
|
||||
"age_ms": 214.2023440101184
|
||||
},
|
||||
{
|
||||
"seq": 179,
|
||||
"t": 105825.526652619,
|
||||
"age_ms": 196.3563049939694
|
||||
},
|
||||
{
|
||||
"seq": 181,
|
||||
"t": 105825.608244429,
|
||||
"age_ms": 244.46072398859542
|
||||
},
|
||||
{
|
||||
"seq": 186,
|
||||
"t": 105825.680501243,
|
||||
"age_ms": 233.48074399109464
|
||||
},
|
||||
{
|
||||
"seq": 189,
|
||||
"t": 105825.728851535,
|
||||
"age_ms": 231.71705300046597
|
||||
},
|
||||
{
|
||||
"seq": 192,
|
||||
"t": 105825.786867276,
|
||||
"age_ms": 239.71972599974833
|
||||
},
|
||||
{
|
||||
"seq": 195,
|
||||
"t": 105825.858277224,
|
||||
"age_ms": 261.23618900601286
|
||||
},
|
||||
{
|
||||
"seq": 200,
|
||||
"t": 105825.918178281,
|
||||
"age_ms": 236.96246100007556
|
||||
},
|
||||
{
|
||||
"seq": 202,
|
||||
"t": 105825.991665917,
|
||||
"age_ms": 277.66999100276735
|
||||
},
|
||||
{
|
||||
"seq": 206,
|
||||
"t": 105826.046724269,
|
||||
"age_ms": 266.1855160113191
|
||||
},
|
||||
{
|
||||
"seq": 211,
|
||||
"t": 105826.100238761,
|
||||
"age_ms": 236.50946401176043
|
||||
},
|
||||
{
|
||||
"seq": 215,
|
||||
"t": 105826.147476938,
|
||||
"age_ms": 217.01610699528828
|
||||
},
|
||||
{
|
||||
"seq": 217,
|
||||
"t": 105826.203798987,
|
||||
"age_ms": 239.63930900208652
|
||||
},
|
||||
{
|
||||
"seq": 220,
|
||||
"t": 105826.257033774,
|
||||
"age_ms": 243.18652600049973
|
||||
},
|
||||
{
|
||||
"seq": 226,
|
||||
"t": 105826.303624165,
|
||||
"age_ms": 190.02428000385407
|
||||
},
|
||||
{
|
||||
"seq": 231,
|
||||
"t": 105826.405311617,
|
||||
"age_ms": 208.14740000059828
|
||||
},
|
||||
{
|
||||
"seq": 235,
|
||||
"t": 105826.485612813,
|
||||
"age_ms": 222.0297260064399
|
||||
},
|
||||
{
|
||||
"seq": 240,
|
||||
"t": 105826.542371191,
|
||||
"age_ms": 195.36727099330164
|
||||
},
|
||||
{
|
||||
"seq": 244,
|
||||
"t": 105826.595525478,
|
||||
"age_ms": 181.71944200003054
|
||||
},
|
||||
{
|
||||
"seq": 248,
|
||||
"t": 105826.685236336,
|
||||
"age_ms": 198.72986499103718
|
||||
},
|
||||
{
|
||||
"seq": 253,
|
||||
"t": 105826.741214221,
|
||||
"age_ms": 177.6253559946781
|
||||
},
|
||||
{
|
||||
"seq": 256,
|
||||
"t": 105826.804943658,
|
||||
"age_ms": 191.22826900274958
|
||||
},
|
||||
{
|
||||
"seq": 260,
|
||||
"t": 105826.869890208,
|
||||
"age_ms": 183.9346290071262
|
||||
},
|
||||
{
|
||||
"seq": 264,
|
||||
"t": 105826.929818681,
|
||||
"age_ms": 182.7495990000898
|
||||
},
|
||||
{
|
||||
"seq": 268,
|
||||
"t": 105827.003753437,
|
||||
"age_ms": 190.08757000847254
|
||||
},
|
||||
{
|
||||
"seq": 271,
|
||||
"t": 105827.057522552,
|
||||
"age_ms": 193.68845300050452
|
||||
},
|
||||
{
|
||||
"seq": 275,
|
||||
"t": 105827.141712794,
|
||||
"age_ms": 211.24341098766308
|
||||
},
|
||||
{
|
||||
"seq": 280,
|
||||
"t": 105827.180840381,
|
||||
"age_ms": 167.17212100047618
|
||||
},
|
||||
{
|
||||
"seq": 284,
|
||||
"t": 105827.248257616,
|
||||
"age_ms": 167.93278099794406
|
||||
},
|
||||
{
|
||||
"seq": 287,
|
||||
"t": 105827.309382202,
|
||||
"age_ms": 178.86346799787134
|
||||
},
|
||||
{
|
||||
"seq": 291,
|
||||
"t": 105827.381741682,
|
||||
"age_ms": 184.77957899449393
|
||||
},
|
||||
{
|
||||
"seq": 296,
|
||||
"t": 105827.456995634,
|
||||
"age_ms": 176.64273899572436
|
||||
},
|
||||
{
|
||||
"seq": 300,
|
||||
"t": 105827.554913621,
|
||||
"age_ms": 207.49961299588904
|
||||
}
|
||||
],
|
||||
"fresh_video_updates_per_second": 15.6,
|
||||
"motion_to_decoded_marker_ms": {
|
||||
"p50": 207.82350649824366,
|
||||
"p95": 266.1855160113191,
|
||||
"maximum": 285.76791899104137
|
||||
},
|
||||
"frame_gap_ms": {
|
||||
"p50": 59.91476499912096,
|
||||
"p95": 101.45470600400586,
|
||||
"maximum": 220.8630759996595
|
||||
},
|
||||
"last_motion_seen": 300,
|
||||
"release_visible": true,
|
||||
"method": "60Hz XTest held drag to first observed unique decoded marker; no USB/scanout"
|
||||
}
|
||||