当前位置: 首页 > article >正文

Linux下通过DRM操作屏幕,发生行对齐 (stride)问题

前言

Linux下使用LVGL操作屏幕,屏幕尺寸是[280*1424],不管如何设置LVGL的参数,屏幕的显示均为花屏,能看到有图像显示,但是图像是行错乱的。


ubuntu桌面系统显示正常

打印DRM看输出

drm: 280x1424 (0mm X 0mm) pixel format AR24

可见DRM的没什么问题,确实和屏幕对的上

使用色块填充排查

给屏幕直接填充固定颜色

    // 填充为红色(例如 ARGB8888 格式:0xFFFF0000)
    uint32_t *fb = (uint32_t *)fbuf->map;

    int i;
    for(i = 0; i < 280*2; i++)
    {
        fb[i] = 0xFFFF0000; // 红色像素值
        // for(int j = 0; j < 100; j++)
        // {
        //     fb[i*1424 + j] = 0xFFFF0000; // 红色像素值
        // }
    }
    for(; i < 280*1424; i++)
    {
        fb[i] = 0xFF00FF00; // 绿色像素值
    }

发现问题:一行似乎不是280个像素点。每行的似乎在285~290之间?

分析


出现这种情况的原因可能与 屏幕的行对齐方式(stride)缓冲区分辨率设置 不一致有关。虽然屏幕的逻辑分辨率是 1424x280,但 一行的实际像素数量可能大于 1424,这是由于 行对齐缓冲区分配方式 的限制。

  1. 行对齐 (stride)

    • 大多数 GPU 或显示硬件要求每行的像素数据对齐到特定的字节边界(如 32 字节或 64 字节)。

    • 即使屏幕宽度是 1424 像素,每行数据的实际占用可能大于 1424 * 4 字节。

    • 这个实际的宽度称为 stride(步长),通常可以通过 DRM 查询到。

  2. 缓冲区的 stride 不匹配

    • 如果你直接按分辨率 1424 * 280 计算缓冲区的大小,可能会忽略 stride 的额外字节。

    • 例如,stride 可能是 1440 * 4 字节,即一行的实际长度为 1440 像素(即便只显示 1424 像素)。

  3. 显存分配方式

    • 显存分配时可能会对分辨率进行对齐操作,比如将宽度对齐到 8 或 16 的倍数,导致一行像素的数量超过逻辑宽度。

drm: 280x1424 (0mm X 0mm) pixel format AR24
drm: pitch 1152
drm: size 1640448
drm: pitch 1152
drm: size 1640448
DRM subsystem and buffer mapped successfully

解析打印信息

  1. 分辨率

    • drm: 280x1424 表示屏幕的逻辑分辨率为宽 280 像素,高 1424 像素。
  2. 像素格式

    • pixel format AR24 表示屏幕的像素格式为 XRGB8888,即每像素占用 4 字节(32 位),Alpha 通道未使用。
  3. Pitch (stride)

    • drm: pitch 1152 表示每行像素占用 1152 字节
    • 对于 XRGB8888,每像素占用 4 字节,因此一行实际包含 1152 / 4 = 288 像素。
    • 这是由于硬件对行数据进行了 对齐处理(对齐到 32 字节或 64 字节)。
  4. 缓冲区大小

    • drm: size 1640448 表示缓冲区总大小为 1640448 字节

    • 计算:pitch * height = 1152 * 1424 = 1640448 字节。这与打印的大小一致。


http://www.kler.cn/a/411262.html

相关文章:

  • 一个专为云原生环境设计的高性能分布式文件系统
  • 深度学习基础01_深度学习概述参数初始化激活函数
  • MacOS系统上Jmeter 录制脚本遇到的证书坑位
  • 簡單易懂:如何在Windows系統中修改IP地址?
  • Pytorch微调深度学习模型
  • Large Spatial Model:End-to-end Unposed Images to Semantic 3D 论文解读
  • CSRF--跨站请求伪造
  • 计算机网络八股整理(一)
  • 每日一题 LCR 060. 前 K 个高频元素
  • Spring Boot 3.4.0 发行:革新与突破的里程碑
  • 移动充储机器人“小奥”的多场景应用(下)
  • 103.【C语言】数据结构之TopK问题详细分析
  • Linux:基础开发工具
  • 信息系统项目管理师(第四版)概要
  • pip安装github上的开源软件包
  • 基于Java Springboot高校网上订餐平台
  • 了解 CSS position 属性
  • 嵌入式linux系统中图像处理基本方法
  • STM32C011开发(2)----nBOOT_SEL设置
  • 机器学习知识点
  • 拿下域名vip#bj
  • 软件工程第20、21章小测
  • 用Scala来解决成绩排名的相关问题
  • SQL server数据库
  • ffmpeg.js视频播放(转换)
  • R和Julia免疫细胞映射到组织切片