1.视频和视频帧:Intel GPU(核显)的源码编解码故事
2.Gentoo linux 配置nvidia显卡,安装timeshift,源码安装steam方法总结
3.RK3399 探索之旅 / Display 子系统 / 基础概念
4.1.Wayland介绍
视频和视频帧:Intel GPU(核显)的源码编解码故事
一般提及基于“显卡或多媒体处理芯片对视频进行解码”为硬解码,本文将探讨如何利用Intel的源码核显,即集成GPU实现硬解码。源码提及QSV,源码游戏管家源码全称为Quick Sync Video,源码Intel在年发布Sandy Bridge CPU时,源码一同推出了这项基于核显进行多媒体处理,源码包括视频编解码的源码技术。集成核显,源码官方称HD Graphics,源码最早在Sandy Bridge前一代制程已推出,源码但性能提升及充分发挥在Sandy Bridge时期。源码Haswell及后续制程发布更高级的源码Iris架构。最近Intel宣布将开发独立显卡,核显发展具体走向未知。
接手QSV项目时,预期会有很多相关资料,实则相反。因此,将记录自己学习过程。
本文将介绍:
I. Intel的核显(集成GPU):
了解核显很有必要,几个月前,作者对CPU的认识还停留在“南北桥”架构。以下内容若有不准确之处,欢迎指正。
查看Gen CPU结构图,首先看CPU核心部分。在整块CPU芯片中,核显占比不小,算力不容小觑。在没有独立显卡的java源码回收笔记本上,可以运行大量大型游戏,虽偶有卡顿、掉帧情况,整体表现已相对不错。
接下来,看官方给出的GPU内部结构图。GPU内部远比图上所示复杂,图中介绍的仅为部分Subslice芯片结构。GPU分为Slice部分和Un-Slice部分,Slice部分已介绍,接下来介绍Un-Slice部分。
作者找到了一张图,展示了在MFF上进行视频处理的流程:1) 首先在MFX/VDBOX模块上进行编解码;2) 接着送到VQE/VEBOX上做图像增强和矫正处理;3) 然后送到SFC上做scale和transcode;4) 最后送出到显示屏上展示。是否完全正确,作者这里做个记录。
推荐知乎文章《转》Intel Gen8/Gen9核芯显卡微架构详细剖析,深入浅出,关于thread dispatch的说明即出自该文。
最后,总结Intel集成GPU/核显结构图。
注意,这是skylake架构下的GT2/GT3/GT4 GPU结构图,X数字越大,集成的Slice和Unslice芯片更多,能力越强,价格也更高。
II. Quick Sync Video(QSV)技术:
QSV是Intel推出的将视频处理任务直接送到GPU上进行专门负责视频处理的硬件模块处理的软件技术。与CPU或通用GPU上的视频编码不同,QSV是处理器芯片上的专用硬件核心,这使得视频处理更为高效。
要了解QSV如何驱动GPU的MFF,首先看官方Intel® Video and Audio for Linux上的源码生成界面图。在介绍QSV之前,提及Intel在FFmpeg上提供的插件,包括ffmpeg-qsv、ffmpeg-vaapi和ffmpeg-ocl。详细描述如下:
· FFmpeg-vaapi提供基于低级VAAPI接口的硬件加速,在VA API标准下在Intel GPU上执行高性能视频编解码器、视频处理和转码功能。
· FFmpeg-qsv提供基于Intel GPU的硬件加速,基于Intel Media SDK提供高性能视频编解码器、视频处理和转码功能。
· FFmpeg-ocl提供基于工业标准OpenCL在CPU/GPU上的硬件加速,主要用于加速视频处理过滤器。
接下来,介绍QSV在ffmpeg2.8及以上版本的支持,经过MSDK、LibVA、UMD和LibDRM。分层进行分析:
· MSDK:Intel的媒体开发库,支持多种图形平台,实现通用功能,可用于数字视频的预处理、编解码和不同编码格式的转换。源码地址为Intel® Media SDK,在Linux平台上编译使用。
· VA-API:Video Acceleration API,提供类unix平台的视频硬件加速开源库和标准。Intel源码地址在Intel-vaapi-driver Project,在Linux平台上使用。
· UMD:User Mode Driver的缩写,指VA-API Driver。Intel提供了两个工具:intel-vaapi-driver 和 intel-media-driver,推荐使用后者。加盟运营源码
· LibDRM:Direct Rendering Manager,解决多个程序协同使用Video Card资源问题,提供一组API访问GPU。与VA-API,LibDRM是一套通用的Linux/Unix解决方案。
· Linux Kernel:Intel的Kernel是i driver,描述了libDRM和Kernel Driver之间的关系。
至此,整个关系图较为清晰。
III. FFMPEG+QSV解码:
QSV硬解的任务主要包括:
关于3-4步操作的详细实现,底层库会帮助完成。但作为一个优秀的工程师,研究FFMPEG源码依然十分重要。接下来,介绍如何使用FFmpeg API中的h_qsv解码器插件。
提及FFmpeg命令行使用方法,推荐阅读官方资料《QuickSync》或《Intel_FFmpeg_plugins》。
关于示例代码,作者曾遇到许多坑,总结为:多数中文博客不可靠,官方demo最可信。官方代码提供了两份可用:qsvdec.c和hw_decode.c。作者最早使用的是第一段代码,核心部分如下:
然而,这段代码存在问题。测试发现,对于赛扬系列一款CPU,在p视频上MSDK达到fps,理论上h_qsv平台上限也应为fps,但实际测试不到fps。排查后发现是av_hwframe_transfer_data()性能较弱。
最终,广告源码图片与Intel一起解决了性能问题。那么,性能提升方案为何是GPU-COPY技术做Memory-Mapping?
解释GPU和CPU渲染图像的过程,包括坐标系转化、纹理叠加等,仅需了解两点:
后者的数据组织方式能充分利用GPU的并行特性,加速图像处理、渲染。尽管存在一些纹理叠加的技术难题,但性能提升足以补偿。
接下来,解释Memory-Mapping:从Intel CPU架构图中可见,GPU和CPU位于同一芯片上,各自寄存器/缓存区有限,视频数据主要存储在内存上。GPU和CPU的数据组织方式不同,同一帧数据存于内存同一位置,数据格式不同,因此需要做Memory-Mapping。Memory-Mapping相较于Memory-Copy,减少了数据从内存区域A移动到区域B的操作,已经是优化。进一步优化:GPU完成Memory-Mapping以及数据从GPU到内存和CPU的操作。
在av_hwframe_transfer_data()内部,Memory-Mapping由CPU完成,性能受限于CPU,只能并行。修改后,整体性能从不到fps提升至fps,虽然与理想fps仍有差距,但满足性能需求。
据悉,Intel将在FFmpeg 4.3开源出这个解决方案。
写在后面:
了解GPU底层对应用开发人员帮助不大,毕竟了解芯片布线的重新设计、制程工艺提升、GPU-COPY技术的数据I/O提升等,也不能做什么。最终,芯片架构是芯片工程师的事,底层逻辑实现是嵌入式工程师的事。应用开发人员无法做出实质贡献,但作为知识库扩充或休闲阅读,了解也无妨。
希望有机会接触CUDA的编解码,深入学习N卡设计。
感谢因《视频和帧》系列文章结识的朋友,热心指出文章描述不准确的地方。文中如有不严谨之处,欢迎指正。
Gentoo linux 配置nvidia显卡,安装timeshift,安装steam方法总结
在Gentoo Linux中配置Nvidia显卡并安装timeshift和Steam的详细步骤如下:Nvidia显卡配置
以root或sudo权限操作,前提是你已经安装了Gentoo的桌面环境。
首先,从官网获取内核源码并安装:`emerge --ask sys-kernel/gentoo-sources`
选择内核:`eselect kernel list eselect kernel set 1`
可选地,使用genkernel自定义内核配置:`emerge --ask sys-kernel/genkernel`
禁用nouveau显卡:创建配置文件`/etc/modprobe.d/blacklist.conf`并添加相关blacklist语句。
配置显卡驱动:修改`/etc/portage/make.conf`以指定支持的显卡类型(如Intel和Nvidia)。
安装相关驱动:分别执行`emerge`命令安装Nvidia和AMD驱动。
timeshift安装
安装必要的软件包:`emerge app-eselect/eselect-repository dev-vcs/git`
启用timeshift:`eselect repository enable guru`,同步包列表:`emaint sync -r guru` 或 `emerge --sync`
将timeshift添加至keywords:`nano /etc/portage/package.keywords`,然后安装`emerge app-backup/timeshift --autounmask-write`。
Steam安装
为Steam安装做准备:修改`/etc/portage/make.conf`,临时添加`USE=" -gpm "`。
安装必要的依赖,如ncurses:`emerge sys-libs/ncurses`
移除临时的`-gpm`:`use="-gpm"`
添加Steam存储库:`eselect repository enable steam-overlay` 或 `layman -a steam-overlay`,同步存储库:`emaint sync -r steam-overlay` 或 `emerge --sync`
添加Steam相关的use和keywords:`nano /etc/portage/package.accept_keywords/steam` 和 `/etc/portage/package.keywords`。
AMD显卡用户还需额外设置:`echo "x-libs/libdrm video_cards_radeon" >> /etc/portage/package.use/list`
最后,安装Steam相关应用:`emerge games-util/steam-launcher games-util/steam-meta`,重启系统后,Steam即可正常运行。
RK 探索之旅 / Display 子系统 / 基础概念
深入探索RK显示子系统基础概念,了解驱动开发的关键点。
驱动框架构建者们在多年经验中累积的代码,让Linux驱动开发变得复杂而有深度。定位学习驱动开发时,建议先从整体把握,再适当地填充细节。从使用者的角度出发,思考如何更好地应用驱动框架,可能会带来更好的学习效果。
作为一位新手,我记录下自己的一些想法和学习心得,欢迎各位指正。
一、基础概念
1. Linux的两种显示方案
2. DRM/KMS基础概念
DRM subsystem包含DRM driver、KMS等部分,DRM driver负责使能Display engine,类似于FBDEV的加强版。KMS中组件包括GPU、display、display connector等,共同构成显示pipeline。
二、了解硬件信息
查阅芯片手册,如RK,了解其VOP数量及支持的显示接口。确定单板的显示接口,如NanoPC T4,以便驱动工程师根据上层业务需求,使能连接在接口上的Panel。
三、查看单板的设备树
NanoPC-T4设备树显示display相关节点,如vopl、vopb、edp、panel、hdmi、dsi等,每个节点都具备特定功能,如显示、接口等。
四、查看Rockchip的DRM Driver
掌握驱动路径,理解DRM driver的probe流程。通过官方提供的图示,了解DRM框架组件的关联方式,进行更细致的源码分析。
五、辅助调试的工具
利用sysfs查看显示状态,调整DRM log等级以优化调试。libdrm/modetest提供测试程序,用于查询设备支持状况和进行基本显示测试。
六、思考技术与人生
学习技术的同时,思考如何更好地生活,与他人分享想法,共同成长。对嵌入式系统感兴趣,关注公众号:嵌入式Hacker。文章价值所在,不妨点个在看和赞。
1.Wayland介绍
Wayland简介
Wayland是Unix系统中的下一代显示服务器,由Xorg-Server的开发者设计和构建。它提供了一种将应用程序窗口呈现在用户屏幕上的方式,为使用过X的读者带来了惊喜,为新手提供了灵活强大的图形构建系统。本书将帮助读者深入了解Wayland的概念、设计和实现,提供构建Wayland客户端和服务端应用的工具。理解Wayland的直观设计选择将带来许多“啊哈!”的时刻。欢迎加入开源图形的未来!
注意:当前版本包含第1-章的内容,后续部分仍在开发中。
待办事项:
关于本书
本作品采用知识共享署名-相同方式共享4.0国际许可协议。源代码可在此获取。
关于作者
Drew DeVault通过构建sway,成功进入Wayland世界,这是i3窗口管理器的流行克隆。如今,sway是最受欢迎的平铺Wayland合成器,拥有大量用户、提交次数和影响力。Drew通过启动wlroots回报了Wayland社区,这是一个构建Wayland合成器的开放、可组合的模块,成为数十个独立合成器的基础。
1.1 高层设计
计算机由输入设备和输出设备组成,分别用于接收和显示信息。输入设备包括键盘、鼠标等;输出设备通常以显示器的形式呈现,适用于桌面、笔记本或移动设备。Wayland合成器负责将输入事件分派给适当的应用程序窗口,并在输出设备上显示它们。
1.2 目标与目标受众
本书旨在使读者全面了解Wayland协议及高级应用,掌握核心协议和协议扩展知识。本书主要面向客户端开发者,同时也为合成器开发者提供实用性信息。本书聚焦于协议和libwayland,不包含所有Linux桌面组件的详细信息,如libdrm、libinput等。
1.3 Wayland软件包中有什么
安装Linux发行版中的"wayland"时,通常会安装libwayland-client、libwayland-server、wayland-scanner和wayland.xml等组件。这些组件代表了流行的Wayland协议实现,本书适用于任何Wayland实现。
方式协议由XML文件定义,包含了核心Wayland协议的高级规范。wayland-scanner工具用于处理XML文件生成代码,libwayland客户端和服务端库实现了线路协议,提供了处理Wayland数据结构的工具。