DRM KMS 子系统(2)Framebuffer

文章目录

  • [1. Framebuffer](#1. Framebuffer)
  • [2. drm_framebuffer数据结构](#2. drm_framebuffer数据结构)
  • [3. pixel_format](#3. pixel_format)

1. Framebuffer

  • 这是一个标准目标存储了需要显示的内容的信息,信息包括:
    • 内存(显存)用于存储显示内容存区域的引用
    • 内存(显存)中存储的帧的格式
    • 内存(显存)区域中活跃区域(被显示部分的内容)
  • Framebuffer实现依赖于:
    • 当前在是使用的内存(显存)管理如GEM或TTM
    • 显示控制器的能力:
      • 支持DMA传输类型(Contiguous Memory or Scatter Gather)
      • 支持IOMMU
  • GEM实体的默认实现为使用CMA(Contiguous Memory Allocator),代码在drivers/gpu/drm/drm_fb_cma_helper.c
  • 其他实现通常依赖于显示控制器:
    • 散聚(Scatter Gather)示例 :drivers/gpu/drm/tegra/
    • IOMMU示例:drivers/gpu/drm/exynos/

2. drm_framebuffer数据结构

c 复制代码
#define DRM_FORMAT_MAX_PLANES	4u

pitches/offsets数组大小的4为最大的plane的个数,这里涉及图像格式的知识,如YUV格式的图像,存在多平面如3个平面(Y平面/U平面/V平面)。

  • pitches:代表显示控制器中的一行的长度(字节数),通常4字节对齐
  • offsets:以字节为单位,从buffer开始到实际像素数据的偏移

3. pixel_format

c 复制代码
struct drm_framebuffer {
[...]
uint32_t pixel_format; /* fourcc format */
[...]
};

pixel_format描述了内存(显存)buffer的组织方式,使用FOURCC编码格式,支持的格式定义在:include/drm/drm_fourcc.h或<uapi/drm/drm_fourcc.h>中

这些FOURCC编码格式并非一种标准化,因此只在DRM KMS子系统里是有效。

  • DRM KMS子系统使用三种图像编码格式:

    • RGB:每个像素都使用一个RGB元组
    • YUV:类似的元组,维度上为Y,U和V组件
    • C8:使用一个转换表来映射一个值到一个RGB元组
  • 视频影像中格式多为YUV,它又可细分为多种格式:

    • Packed(紧凑类型):一块内存(显存)区域存储所有组件(Y,U和V)

      紧凑型格式,只使用offsets[0]和pitches[0]

    • Semiplanar(半平面型):一块内存(显存)区域存储Y组件和另一块存储UV组件

      半平面型格式,offsets和pitches均使用前两个数组

    • Planar(多平面型):每个组件都需要一块内存(显存)区域存储

      多平面型格式,offsets和pitches均使用前三个数组

每个内存(显存)区域存储一个帧的组件(Y, U or V)被称作一个plane

相关推荐
凡人叶枫4 分钟前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
yuanmenghao26 分钟前
Linux 性能实战 | 第 7 篇 CPU 核心负载与调度器概念
linux·网络·性能优化·unix
qq_2975746739 分钟前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器
70asunflower1 小时前
Emulation,Simulation,Virtualization,Imitation 的区别?
linux·docker
神梦流2 小时前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器
凡人叶枫2 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习
xuhe22 小时前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
Lsir10110_2 小时前
【Linux】进程信号(下半)
linux·运维·服务器
傻乐u兔3 小时前
C语言进阶————指针3
c语言·开发语言