皮皮网
皮皮网

【钱龙黑马量能指标源码公式】【多线程手写源码】【springbootweb场景源码分析】libdrm源码

时间:2024-11-20 18:25:58 来源:设置源码输出的坏处

1.视频和视频帧:Intel GPU(核显)的源码编解码故事
2.Gentoo linux 配置nvidia显卡,安装timeshift,源码安装steam方法总结
3.RK3399 探索之旅 / Display 子系统 / 基础概念
4.1.Wayland介绍

libdrm源码

视频和视频帧: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芯片中,核显占比不小,算力不容小觑。在没有独立显卡的多线程手写源码笔记本上,可以运行大量大型游戏,虽偶有卡顿、掉帧情况,整体表现已相对不错。

       接下来,看官方给出的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上的springbootweb场景源码分析图。在介绍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数据结构的工具。

更多内容请点击【百科】专栏