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

DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC

drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1);

这两行代码用于启用 Linux DRM(Direct Rendering Manager)客户端的两个关键特性,具体作用如下:


1. drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1)

  • 作用
    启用 通用平面(Universal Planes) 支持。

  • 详细解释

    • 传统 DRM 平面限制
      早期 DRM 接口仅暴露主显示平面(Primary Plane)、光标平面(Cursor Plane)等有限的硬件图层,其他叠加平面(Overlay Planes)可能无法直接管理。

    • 通用平面的意义
      启用 DRM_CLIENT_CAP_UNIVERSAL_PLANES 后,客户端可以通过 drmModeGetPlaneResources 获取所有可用平面(包括主平面、叠加平面、光标平面等),从而全面控制硬件的图层合成能力。

    • 应用场景
      需要精细管理多个图层的场景(如 Wayland Compositor、游戏引擎或视频播放器),以充分利用硬件加速的叠加功能。


2. drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1)

  • 作用
    启用 原子模式设置(Atomic Mode Setting) 支持。

  • 详细解释

    • 传统模式设置的局限性
      传统 DRM 接口(如 drmModeSetCrtc)通过多个独立调用修改显示属性(分辨率、图层位置等),可能导致中间状态闪烁或配置不一致。

    • 原子提交的优势
      原子模式允许将多个显示属性(CRTC、Plane、Connector 的配置)打包成一个原子操作,通过 drmModeAtomicCommit 一次性提交,确保所有修改同时生效,避免中间状态。

    • 关键特性

      • 支持回滚(Test-Only 模式):可预先验证配置是否有效,避免直接应用非法配置导致黑屏。

      • 支持异步提交:非阻塞操作,提升性能。

    • 应用场景
      动态调整显示参数(如分辨率、旋转、HDR)、多显示器协同、减少画面撕裂。


代码意义总结

函数调用功能应用目标
drmSetClientCap(..., DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1)启用所有平面访问权限精细控制硬件图层合成
drmSetClientCap(..., DRM_CLIENT_CAP_ATOMIC, 1)启用原子化显示配置无闪烁、一次提交多属性

验证与错误处理

  • 返回值检查
    这两个函数返回 0 表示成功,负数表示失败(如硬件不支持或内核版本过低)。实际开发中应检查返回值:

    if (drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1) < 0) {perror("Failed to enable universal planes");
    }
    if (drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1) < 0) {perror("Failed to enable atomic modesetting");
    }
     

底层依赖

  • 内核支持

    • 需要 Linux 内核 ≥ 4.2(原子模式设置广泛支持)。

    • 硬件驱动需实现对应功能(如 Intel i915、AMDGPU、Nouveau 等主流驱动均支持)。

  • 典型用例
    Wayland 合成器(如 Weston、KWin)、高级图形应用(如游戏、视频播放器)。


完整工作流程示例

  1. 打开 DRM 设备

    int fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
     
  2. 启用能力

    drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
    drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1);
     
  3. 获取资源

    drmModePlaneRes *planes = drmModeGetPlaneResources(fd);
    drmModeRes *res = drmModeGetResources(fd);
     
  4. 原子提交配置

    drmModeAtomicReq *req = drmModeAtomicAlloc();
    drmModeAtomicAddProperty(req, plane_id, prop_alpha, 0xFFFF);
    drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
     

注意事项

  • 硬件兼容性:部分嵌入式 GPU 可能不支持原子操作或通用平面。

  • 性能影响:原子提交需要驱动支持,不当使用可能导致性能下降。

  • 调试工具:可通过 modetest(来自 libdrm 工具包)验证功能是否启用。

这两行代码是构建现代 Linux 图形栈(如 Wayland)的基础,确保应用程序能够充分利用硬件的显示合成能力。

相关文章:

DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC

drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1); 这两行代码用于启用 Linux DRM&#xff08;Direct Rendering Manager&#xff09;客户端的两个关键特性&#xff0c;具体作用如下&#xff1a; 1. drmSetClientCap…...

anaconda安装 创建虚拟环境+pycharm中conda环境配置

miniconda下载安装参考以下链接&#xff1a; https://blog.csdn.net/2301_76831056/article/details/143165738?fromshareblogdetail&sharetypeblogdetail&sharerId143165738&sharereferPC&sharesourceweixin_63339973&sharefromfrom_link &#xff08;注…...

EasyExcel导出导入excel工具类

接上一篇EasyExcel导出导入excel的文章&#xff0c;附上一份完整的工具类代码。对于字体颜色名称&#xff0c;请参考这篇文章。 POI字体颜色 小技巧 类转换用属性拷贝不同类如果有相同属性&#xff0c;则使用反射验证&#xff0c;减少代码量 private List<Person> vali…...

终端SSH连接工具SecureCRT安装和连接Linux

SecureCRT 9.5是一款集终端仿真与加密功能于一身的专业软件&#xff0c;其坚如磐石的安全性、高效的信息传输能力以及高度可定制的会话管理&#xff0c;使得它成为众多用户的首选。该软件不仅支持SSH2、SSH1、Telnet等多种协议&#xff0c;还提供了Relogin、Serial、TAPI、RAW等…...

赛逸展2025“创新引擎”启动:限量席位,点亮科技绿色新征程

当今时代&#xff0c;科技革新与绿色发展已然成为推动社会进步的双引擎。2025第七届亚洲消费电子技术贸易展&#xff08;赛逸展&#xff09;敏锐捕捉这一趋势&#xff0c;重磅打造“科技创新专区”&#xff0c;并面向科技、绿色企业吹响限量招募号角。 这个独具特色的专区紧扣…...

Spring的 init-method, @PostConstruct, InitializingBean 对比

Spring的 init-method, PostConstruct, InitializingBean 对比 在Spring框架中&#xff0c;init-method、PostConstruct和InitializingBean都是用于定义Bean初始化后执行逻辑的机制&#xff0c;但它们在实现方式、耦合度、执行顺序及适用场景上有所不同。以下是它们的对比总结…...

Gogs 精简备份与恢复方案(仅SQLite数据库和配置)

一、备份方案设计 1. 备份内容 SQLite数据库文件&#xff1a;/home/git/gogs/data/gogs.db 配置和附件&#xff1a;/home/git/gogs/custom 整个目录 2. 备份策略 每周日凌晨2点执行完整备份 保留最近4周的备份文件 备份存储在独立分区 /backup&#xff08;使用永久化挂载…...

FPGA实现数码管显示分秒时间

目录 一. verilog实现 二. 烧录验证 三. 结果验证 使用开发板&#xff1a;DE2-115开发板 一. verilog实现 要实现分和秒&#xff0c;需要知道定时器的频率&#xff0c;通过查手册可知&#xff0c;我使用的开发板时钟为50hz&#xff0c;也就是时钟一个周期是2微秒。 5000000…...

读书记录九之《在峡江的转弯处-陈行甲人生笔记》

距离上本读完的书&#xff0c;写读后感有很长一段时间了&#xff0c;中间读了几本书&#xff0c;但都没写点文字&#xff0c;没错&#xff0c;是懒病又犯了。陈行甲这本书&#xff0c;一开始从网络上推荐看到&#xff0c;看之前介绍是一本人物自传的回忆录。我个人对这类贴近的…...

可视化开发:用Qt实现Excel级动态柱状图

Qt柱状图 QtChart 首先我们介绍一下 图表建立的基础&#xff1a;Qt Charts QtChart 是Qt框架的一个模块&#xff0c;专注与提供交互式数据可视化功能 俗话就是 用于用户轻松创建各种类型的图表和图形界面 它包含的图表类型有很多&#xff1a;折线图&#xff0c;饼图&#x…...

从零实现Json-Rpc框架】- 项目实现 - 基于Dispatcher模块的RPC框架

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

kubekey -实现懒人一键部署K8S集群

kubekey -实现懒人一键部署K8S集群 操作步骤 官网&#xff1a; https://kubesphere.io/zh/ 一、执行以下命令快速创建一个 Kubernetes 集群。 Master节点 如果您访问 GitHub/Googleapis 受限&#xff0c;请登录 Linux 主机&#xff0c;执行以下命令设置下载区域。 [roottest ~]…...

Android设计模式之模板方法模式

一、定义&#xff1a; 定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 二、结构&#xff1a; AbstractClass抽象类&#xff1a;定义算法的骨架&#xff0c;包含模板方法和若干…...

李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念

机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值&#xff1a;label MAE MSE 几率分布&#xff0c;cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小&#xff0c;找导数为零的点 单独考虑w&#xff0c;w…...

数字IC后端项目常见问题之streamOut layermap和innovus drc violation

Q1&#xff1a;我需要将Innovus设计GDS导出到Virtuoso&#xff0c;但发现写出GDS的过程会报如下所示的警告。这里写出GDS使用的是Virtuoso (DFII) streamOut mapping文件&#xff01; Clock Gen模块Routing DRC&#xff0c;Timing分析及解决 streamOut tease.gds2 -mapFile cd…...

短剧系统开发动漫短剧系统源码开发上线小程序app教程

一、市场规模与用户增长&#xff1a;突破677亿&#xff0c;Z世代成主力 整体扩张 2025年短剧市场预计同比增长15%&#xff0c;规模达677.9亿元&#xff0c;用户规模6.62亿&#xff08;占网民59.7%&#xff09;。动漫短剧作为细分领域&#xff0c;增速显著受益于二次元文化渗透&…...

太阳能高杆路灯:照亮未来的新光

在全球能源转型进程加速以及可持续发展理念日益深入人心的背景下&#xff0c;太阳能高杆路灯作为融合新能源技术、智能控制技术与多功能集成特性的创新产品&#xff0c;正逐步革新传统路灯的格局。其不仅有效解决了传统路灯对电网供电的依赖问题&#xff0c;更为城市及乡村的照…...

《C++Linux编程进阶:从0实现muduo 》-第8讲.C++面试如何高效获取线程ID

章节重点 在C面试时&#xff0c;经常被问到如果高效获取线程ID&#xff0c;但不少同学都不知道如何回答。 重点是通过__thread关键字。 重点内容 视频讲解&#xff1a;《CLinux编程进阶&#xff1a;从0实现muduo C网络框架系列》-第8讲. C面试如何高效获取线程ID 测试获取线…...

【Tauri2】011——菜单menu(2)

前言 前面简单地创建了菜单&#xff0c;接下来就来试试菜单中的action Rust中菜单项注册action AppHandle in tauri - Rusthttps://docs.rs/tauri/2.4.0/tauri/struct.AppHandle.html#method.on_menu_event这就需要用到App或者AppHandle中的方法on_menu_event #[must_use] …...

架构设计基础系列:面向对象设计的原则

引言 面向对象设计&#xff08;Object-Oriented Design&#xff0c;OOD&#xff09;是软件开发中的重要概念&#xff0c;其核心在于通过对象、类、继承、封装和多态等机制&#xff0c;实现对现实世界问题的抽象和建模。OOD不仅有助于提高代码的可重用性、可维护性和可扩展性&a…...

UE5学习笔记 FPS游戏制作35 使用.csv配置文件

文章目录 导入.csv要求首先创建一个结构体导入配置文件读取配置 导入 .csv要求 第一行必须包含标题 第一列的内容必须不能重复&#xff0c;因为第一列会被当成行的名字&#xff0c;在数据处理中发挥类似于字典的key的作用 当前的配置文件内容如下 首先创建一个结构体 结构…...

嵌入式单片机ADC数模转换的基本方法

第一:模数转换的概述 1:模数转换的概念 一般在电路中,信号分为两种,一种是模拟信号,一种是数字信号,绝大多数传感器采集的都是模拟信号,如温度、湿度、烟雾浓度、亮度.......,但是对于计算机需要处理的数字信号,那就需要利用电路把模拟信号转换为数字信号,这个转换的…...

Web数据挖掘及其在电子商务中的研究与应用

标题:Web数据挖掘及其在电子商务中的研究与应用 内容:1.摘要 随着互联网的飞速发展&#xff0c;Web数据呈现出爆炸式增长&#xff0c;电子商务领域更是积累了海量数据。在此背景下&#xff0c;对Web数据进行有效挖掘并应用于电子商务具有重要意义。本研究旨在探索Web数据挖掘技…...

01-Docker 安装

1、安装环境介绍 安装环境&#xff1a;Linux CentOS 7 本安装教程参考Docker官方文档&#xff0c;地址如下&#xff1a;https://docs.docker.com/engine/install/centos/ 2、卸载旧版docker 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove do…...

Redis 的缓存雪崩、击穿、穿透及其解决办法

文章目录 Redis 的缓存雪崩、击穿、穿透及其解决办法缓存雪崩解决办法 缓存击穿解决方案 缓存穿透解决方案 Redis 的缓存雪崩、击穿、穿透及其解决办法 本篇文章回顾 Redis 当中缓存崩溃、击穿、穿透现象以及相应的解决办法&#xff0c;主要的参考资料是&#xff1a;https://w…...

使用 Selenium 构建简单高效的网页爬虫

在当今数据驱动的世界中&#xff0c;网络爬虫已成为获取网络信息的重要工具。本文将介绍如何使用 Python 和 Selenium 构建一个简单而高效的网页爬虫&#xff0c;该爬虫能够处理现代网站的动态内容&#xff0c;支持代理设置和用户配置文件。 为什么选择 Selenium&#xff1f; …...

性能比拼: Pingora vs Nginx (My NEW Favorite Proxy)

本内容是对知名性能评测博主 Anton Putra Pingora vs Nginx Performance Benchmark: My NEW Favorite Proxy! 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 介绍 在本视频中&#xff0c;我们将对比 Nginx 和 Pingora&#xff08;一个用于构建网络服务的 Rust 框架…...

Ranger一分钟

简介 Ranger Admin&#xff1a;Web UIPolicy Admin Tool&#xff1a;定义和管理策略的模块Ranger Plugins&#xff1a;HDFS、Hive、HBase、Kafka、Storm、YARNRanger UserSync&#xff1a; LDAP、Active DirectoryRanger KMS&#xff1a;管理和保护数据加密的密钥 加密密钥管理…...

STM32单片机入门学习——第5节: [3-1]GPIO输出

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.01 STM32开发板学习——第5节&#xff1a; [3-1]GPIO输出 前言开发板说明引用解答和…...

Open GL ES ->模型矩阵、视图矩阵、投影矩阵等变换矩阵数学推导以及方法接口说明

Open GL ES 变换矩阵详解 一、坐标空间变换流程 局部空间 ->Model Matrix(模型矩阵)-> 世界空间 世界空间->View Matrix(视图矩阵)->观察空间 观察空间 ->Projection Matrix(投影矩阵)->裁剪空间 裁剪空间 ->ViewPort Transform(视口变换)>屏幕空间 …...