首页 > 系统相关 >Linux图形栈概述

Linux图形栈概述

时间:2024-01-26 13:45:15浏览次数:27  
标签:OpenGL 渲染 API 概述 Linux 缓冲区 GPU 图形

Linux图形栈概述

图形渲染相关概念

直接渲染架构DRI

DRI(Direct Rendering Infrastructure):是现代Linux上的图形栈架构,允许用户态程序直接向图形硬件发出命令,主要用途是为OpenGL的Mesa提供硬件加速。

零拷贝

零拷贝(Zero-Copy)是指CPU不需要将文件拷贝多次就能实现文件的转移、发送等。

双缓冲

使用双缓冲技术来解决新旧图像刷新在屏幕导致的卡顿、撕裂问题:

  • 前缓冲区(front buffer):就是显存,就是on-screen buffer
  • 后缓冲区(back buffer):就是内存中的某个地方,就是off-screen buffer

双缓冲就是先将所有绘图操作结果存储在后缓冲区,然后将后缓冲区一次性复制到前缓冲区,图形硬件就显示前缓冲区的内容。这样就能最大限度地减少画面撕裂。

还出现了多重缓冲

翻页(pageflip)

准备两个前缓冲区,并且这两个前缓冲区都能用于显示图形。当其中一个前缓冲区在显示时,另一个就在绘制,等到绘制完成,就交换两个前缓冲区的角色,图形硬件显示另一个前缓冲区的内容。

直接渲染管理器DRM

帧缓冲区fbdev:是Linux内核的一个子系统,可以理解为显存上的一段内存,用于存储显卡处理过或即将处理的渲染数据,然后送至显示器刷新,从而显示图形。现逐渐被DRM子系统取代。

DRM(Direct Rendering Manager):是Linux 内核的一个子系统,提供了比fbdev更高级的功能,是现代显卡的GPU接口。DRM 公开了一个API,libdrm用户空间程序可以使用该 API 将命令和数据发送到 GPU 并执行配置显示器模式设置等操作。

DRM会独占GPU的访问权限,使用GPU的程序都得向DRM发送请求,DRM充当仲裁管理从而避免冲突问题,从而控制多个程序使用显示设备;还会管理进程间共享内存等等。

与 Framebuffer 不同的是,DRM 不直接将像素数据写入帧缓冲,而是将渲染指令发送给图形硬件,由硬件完成像素渲染和输出。

详细参考这篇博客:DRM(Direct Rendering Manager)学习简介-CSDN博客

图形执行管理器GEM

GEM(Graphics Execution Manager)是用于图形内存管理的API,实现用户态程序可以创建、处理、销毁存在与GPU显存中的内存对象(GEM object),或者叫做句柄,以及与CPU中内存内容的同步。这样做的原因是减少在用户态和内核态之间频繁的切换。显然GEM是特定与驱动程序的。

内核模式设置KMS

  • 模式设置:显卡要设置一种模式(分辨率、色深、刷新率等的组合)才能正常工作,这个设置的过程叫模式设置Mode-setting。在开始使用framebuffer之前,以及当应用程序或用户需要更改模式时,都要执行模式设置操作。
    • 用户模式设置vs内核模式设置:传统上模式设置是在用户空间下完成,但KMS允许这一过程在内核空间中完成,提供了更快更稳定的切换。
  • KMS:现在Linux中的模式设置代码在内核中作为一个子系统,向外提供API。

KMS设备模型

KMS 将输出设备作为显示控制器的显示输出管道上常见的一系列硬件进行抽象并管理。

KMS抽象出来的硬件:

  • DRM Framebuffer:帧缓冲区,绘制前需要格式化
  • 阴极射线管控制器(CRTC, Cathode Ray Tube Controller):CRT是阴极射线管,C代表控制器。CRTC会读取帧缓冲区(frame buffer)中的数据然后让阴极射线管显示,叠加planes上的信息,传给编码器。可用的CRTC的数量决定了硬件可以同时处理多少个独立的输出设备。
  • 平面(plane):一个 plane 代表一个图层(image layer),最终合成的 image 由多个 plane 组成。拥有 frame buffer 的 plane 称为主平面(primary plane),每个CRTC必须关联一个 plane,CRTC根据plane来确定视频模式(分辨率、色深、像素格式等)。
  • 编码器(Encoder):编码器将内存中的 pixel 像素编码转换为显示器所需要的信号,以适配不同的协议,比如VGA、Mipi等。Encoder 与 CRTC 之间的交互就是 Mode-setting
  • 连接器(connector):就是显示屏硬件与电脑的连接口,比如VGA口、HDMI口

EGL与OpenGL

两者关系:OpenGL操作GPU,而GPU显然是硬件,因此是平台相关的;但是OpenGL还需要与本地机器上的Window System交互,因此还需要一个中间层EGL来实现跨平台。

OpenGL

一个跨语言跨平台的GPU功能的API规范,规定了绘制2D和3D图形的API。其实现叫做“驱动”,由硬件厂商提供。

OpenGL用于桌面系统,OpenGL ES或GLES用于嵌入式系统,OpenVG用于2D矢量图形渲染器。

EGL

嵌入式系统图形库(Embedded-System Graphics Library),是提供给OpenGL等渲染API与X等底层Window System之间的接口,由操作系统实现。应用程序员并不直接编写 EGL,而是应该使用 API 之一,例如 OpenGL。

OpenGL术语

模型:模型是用数据结构定义的对于三维物体的描述,至于二维物体需要从三维坐标转换为二维坐标。包含几何、视点、纹理以及照明信息。

渲染:计算机程序将2D或3D模型生成图像的过程,即窗口生成图形内容的过程

合成:多个窗口合成为一帧图像的过程(一般是将各个应用的窗口按照z-order排布,然后“压”成一张图片)。因为屏幕只能显示一帧图像

送显:像素数据被送至显卡驱动显示在屏幕上(屏幕显示图片就是按照像素RGB发出对应的光)

image

着色器(Shader):用于在GPU上执行的小程序,使用GLSL语言编写。用于通过着色器来实现可编程流水线,来控制GPU渲染管线。

渲染管线(Render Pipeline)

OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。

渲染管线是将数据从3D场景转换成2D图像,最终在屏幕上显示出来的过程。它分为三个阶段:应用阶段、几何阶段和光栅阶段。

GBM 与 Mesa

GBM

通用缓冲区管理(Generic Buffer Management)与EGL类似,但是强大一些,提供与 Mesa 绑定的一种图形渲染分配缓冲区的机制。

Mesa

Mesa也称为Mesa3DMesa 3D 图形库,是OpenGLVulkan和其他图形API规范的开源实现。Mesa 将这些开源规范转换为特定于供应商的图形硬件驱动程序,因此不同平台要用对应的Mesa。

后端(backend)

在图形系统(如X11和Wayland)中,后端(backend)通常指的是底层系统或硬件层面的实现。这是与应用程序接口(API)和图形库等用户空间概念相对应的概念。

因此,实际上所谓的后端这个概念不仅仅局限于图形渲染的底层系统这种,其他功能和领域中的实现底层系统的结构都可以称之为后端。

桌面系统架构

以deepin生态为例

image

具体每个组件的内容参考:桌面架构.pptx

显示管理器DM

显示管理器(DM, Display Manager):是登录界面输入提示密码的界面。用于管理不同的显示服务器和用户会话。

显示服务器DS

显示服务器(DS, Display Server):提供图形环境的框架,初始化显示资源,并提供绘图的API。这样用户就可以使用输入设备和应用程序进行交互,让应用程序通过窗口协议来和DS通信。

桌面环境DE

桌面环境(DE, Desktop Environment)是结合DM、DS、应用程序结合形成的一套软件。提供通用图形用户界面元素,如图标、工具栏、壁纸,桌面小部件。 大多数桌面环境包括提供一套整合的应用程序和实用工具。 最重要的是,桌面环境提供他们自己的窗口管理器(window manager)

标签:OpenGL,渲染,API,概述,Linux,缓冲区,GPU,图形
From: https://www.cnblogs.com/3to4/p/17989144

相关文章

  • 你不知道的Linux shell操作
    LinuxShell脚本入门教程LinuxShell脚本是一种强大的工具,它允许您自动化日常任务和复杂操作。在本教程中,我们将逐步介绍几个实用的Shell脚本示例。每个示例都将详细说明,以便即使是初学者也能轻松理解和应用。1.基础Shell脚本示例1:"HelloWorld"每个编程学习之旅都......
  • 指纹面容识别登录流程概述
    近来在帮忙处理一个IOS端,指纹/面容登录的需求。独立的原生IOS开发人员,已经被优化掉了,我是革命一块儿砖,哪里需要哪里搬,-_-||。在此,对期间遇到的一些实践问题,做一个梳理备忘,也希望可以给其他产品及码农提供参考。本文主要侧重于,整体的移动端指纹/面容实现用户登录的解......
  • NOI Linux 下 Geany 配置教程
    没有括号补全?现在有自动括号补全了!红色的a.cpp的意思是a.cpp没有保存。现在来设置编译运行的快捷键。不难推测"%e"是可执行文件的意思,"%f"是源文件的意思,即默认命令等价于g++-Wall-oaa.cpp。在后面加上想要的编译参数:其他都不怎么要改,直接确定即可。......
  • Linux 系统安装的基本操作
    Linux基本安装方法 centos6.4 这里为大家介绍Linux的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果自己不想搭建,也可以直接买一台学习用用,参考各大云服务器比较。本次以centos6.4为例。 centos下载地址:可以去官网下载最新版本:https://www.cento......
  • Linux系统目录结构和相对绝对路径
     1.系统的目录结构:在WIN系统中,查看文件先进入相应的磁盘,然后进入文件目录,WIN中,有多个磁盘C:\ D:\ E:\ Linux只有一个根目录 使用tree命令查看Linux目录结构,这个命令默认是没有安装的 根下得目录作用说明:2.绝对路径和相对路径:路径:在我......
  • Arch(Manjaro) Linux Pacman 命令详解
    参考Wiki:https://wiki.archlinuxcn.org/zh-hans/Pacmanyay命令参考:HerePacman是一个软件包管理器,作为ArchLinux发行版的一部分。简单来说,就是和apt-get之于Ubuntu一样,pacman就是Arch的apt-get。要想轻松玩转Arch,学会pacman是必需的。Pacman包管理器是ArchLinux的一大亮点。......
  • Linux30个常用基本命令
    1、cd命令功能说明:切换目录。举例:却换到根目录:cd/2、ls命令功能说明:列出目录内容。举例:列出/var目录的文件和目录的信息:ls–l/var;最常用方式ls–ltr3、cat命令功能说明:查看小文件内容。举例:查看test.txt文件内容:cattest.txt4、chmod命令功能说明:修改文......
  • 其他设备唤醒Linux系统的S3或者S4
    如果你的键盘可以唤醒,但是鼠标去不能cat/proc/acpi/wakeup DeviceS-stateStatusSysfsnodeGP18 S4 *disabledSIO1 S3 *disabledpnp:00:03GPP0 S4 *enabledpci:0000:00:01.1GPP1 S4 *disabledGPP2 S4 *disabledGPP4 S4 *enabledpci:0000:00:02.2GPP5 ......
  • Linux reboot 命令
    ​ Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linuxreboo......
  • Linux-unbuntu 文件操作(基于非缓冲区文件操作)
    常用指令1.打开:open2.关闭:close3.写:write4.读:read5.光标偏移:lseek1.打开文件----open头文件#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);形参:pathname-......