android studio 显示图形_显示服务器实现(一)

在一个多窗口的图形化操作系统中,显示服务器的任务就是组织这些窗口展现给用户。实际的显示服务器有Linux世界基于X11协议的XServer或者Wayland协议的Weston,还有Android里的SurfaceFlinger。但是除了显示,他们同时包含了输入管理(鼠标、键盘等)的功能,本文主要还是讨论图形显示部分,通过将显示服务器用到的技术分解,实际来看看如何实现一个显示服务器。

需求分析

在命令行Linux操作系统中实现一个支持GPU图形应用的显示服务器:

  1. 每个图形应用绘制到一个缓冲(Buffer)
  2. 图形应用将这个缓冲交给显示服务器组装成帧缓冲(Framebuffer)
  3. 显示服务器将帧缓冲显示到显示器上

图一:显示服务器需求

一个简单的OpenGL应用

这是一个在Linux X11系统下简单的OpenGL应用【1】,效果是在一个X11窗口中绘制一个红色三角形。我们看看OpenGL应用是如何跟显示服务器(XServer)交互的。注意这里忽略了无关参数和代码,下同。

Display

首先用EGL从X11的Display和Window创建Context,然后用OpenGL进行实际绘制,最后用EGL的eglSwapBuffers将绘制好的缓冲交给XServer去显示。

这个例子的目的,一是看看OpenGL应用和显示服务器的接口,二是看看在显示服务器那边,我们也想用OpenGL做窗口组装的话还需要什么。

以下三个例子会展示如何解决:

  1. 在没有显示服务器(自己就是显示服务器)的情况下创建Context进行OpenGL绘制
  2. 将绘制好的帧缓冲给显示器显示
  3. 应用将缓冲交给显示服务器去组装

无显示服务器的OpenGL绘制

例二【2】是在没有显示服务器的情况下,用EGL+GBM做OpenGL绘制的例子:

int

GBM是一个GPU缓冲管理的API,可以直接从GPU的设备文件(/dev/dri/renderD128)创建一个gbm_device,然后再创建一个代表GPU缓冲的gbm_surface。支持EGL_MESA_platform_gbm扩展【5】的EGL接口可以利用gbm_device和gbm_surface来创建EGLDisplay和EGLSurface。接下来就和EGL+X11那个例子一样了。

显示器显示帧缓冲

显示帧缓冲可以参考例三【3】,首先打开GPU设备文件/dev/dri/card0(这个文件同时支持绘图和显示,而/dev/dri/renderD128只有绘图功能)。然后就能调用KMS接口获取当前连着显示器的Connector/Encoder/Crtc,这三个模块的功能:Crtc从帧缓冲读取数据给Encoder,Encoder编码数据给Connector,Connector输出HDMI/DP/VGA接口的信号。最后drmModeFBPtr代表Crtc要读取的帧缓冲。当前drmModeFBPtr所指向的帧缓冲里面应该是命令行界面,我们需要为自己的绘图缓冲创建一个新的drmModeFBPtr。

int

在上一个例子中我们将图形绘制在了gbm_surface上,这里就从gbm_surface创建一个新的drmModeFBPtr然后取代原来的命令行drmModeFBPtr给drmModeCrtcPtr显示:

struct

应用和显示服务器间传递缓冲

现在我们知道自己实现的应用和显示服务器端如何用OpenGL进行绘制,而且显示服务器如何将绘制好的帧缓冲拿去显示。最后的一个问题就是应用如何将缓冲传递给显示服务器用于组装。应用和显示服务器是两个独立进程,这个需求只能用进程间通信来解决,但是图形系统所需传递的数据量巨大(一帧往往需要几MB,每秒60帧,就是上百MB/s,这还只是一个应用), 如果用传统的进程间通信方法比如Socket和System V IPC,性能会很差。所以我们需要一种零拷贝的进程间共享缓冲的方式。

例四【4】展示了使用dma-buf+unix local socket达到应用和显示服务器间零拷贝传递缓冲的实现。里面是应用部分的代码,是显示服务器部分的代码。首先我们创建两个进程分别代表应用和显示服务器,用socketpair建立unix local socket连接(出于演示方便,真实的显示服务器会用完整的socket listen/bind/connect/accept流程):

int

然后是应用端,我们用GBM接口获得缓冲的文件描述(File Descriptor),这个文件描述只是一个句柄,在Linux内核里代表了一个关联缓冲的dma-buf结构体。我们只需要在进程间传递这个文件描述就可以共享他所代表的缓冲而不用拷贝。传递文件描述的方法就是这个Unix Local Socket的sendmsg函数。

// 获得缓冲

最后是显示服务器端,用recvmsg接收应用传送来的文件描述,然后还原为gbm_bo。支持EGL_KHR_image_pixmap扩展【6】的EGL可以将gbm_bo转换为EGLImageKHR(对于支持EGL_EXT_image_dma_buf_import扩展【7】的EGL可以直接将文件描述转换为EGLImageKHR)。支持GL_OES_EGL_image扩展【8】的OpenGL可以将EGLImageKHR转换为贴图,这样就能将应用的缓冲作为一个OpengGL的贴图进行组装成帧缓冲的绘图操作了。

// 接收dma-buf

结语

本文介绍的这些技术是显示服务器实现的基础,下一篇文章我们会讨论更深入的应用和显示服务器间的同步问题。

引用

  1. 例一:OpenGL应用
  2. 例二:无显示服务器OpenGL
  3. 例三:显示帧缓冲
  4. 例四:缓冲传递
  5. EGL_MESA_platform_gbm扩展
  6. EGL_KHR_image_pixmap扩展
  7. EGL_EXT_image_dma_buf_import扩展
  8. GL_OES_EGL_image扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

discuzX 帖子 有的图片没输出 [attach]12323[/attach]的解决办法

在pre_forum_post (as p )中,每个帖子都有一个p.attachment字段,这个字段记录了,帖子中有多少张图片,如果为0,则程序不会替换帖子内容(p.message)中的[attach]标签, 在pre_forum_attachment (as a)中&#…

win32 API函数大全

1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束…

如何识别C++编译以后的函数名

C/C语言在编译以后,函数的名字会被编译器修改,改成编译器内部的名字,这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时,显示的就是被编译器修改过的名字,比如说_Z3foov 。 那么这个函数真实的名字是什…

聊聊临时表

什么是临时表临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以 及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是…

电脑不能开机维修_MacBook维修 苹果笔记本电脑进水不开机

最近有很多小伙伴来店里,是进水的Macbook苹果笔记本电脑开不开机、黑屏,有很多朋友认为Macbook进水后擦干,只要能开机就没事,实在不开机晾几天就会好了。其实不然。Macbook进水后晾干虽然能开机但有很多后遗症——比如忽然黑屏、反…

Linux Arch目录下处理器体系架构介绍

alpha 处理器 Alpha 处理器最早由美国DEC 公司设计制造,在Compaq (康柏)公司收购DEC 之后,Alpha 处理器继续得到发展,并且应用于许多高档的Compaq 服务器上,HP (惠普)收购的Compaq &…

前端和后端的英文_计算机专业的本科生在前端、后端、测试和运维之间该如何选择...

首先,对于计算机专业的同学来说,在选择发展方向的时候往往会遇到一些困惑,当前随着计算机技术体系的不断壮大,计算机领域的岗位分类也越来越细化,而且在新技术的推动下,还在不断出现新的岗位,比…

医学影像后处理技术超详细收藏版(上)

转自:医学影像后处理技术超详细收藏版(上) 导语: 医学图像后处理是通过综合运用计算机图像处理技术,医学知识,将由各种数字化成像技术所获得的人体信息按照一定的需要在计算机上表现出来,使之…

BulkLoader类使用

BulkLoader提供简单的载入函数,不管要载入的是xml、swf还是声音文件,都只使用同一接口。功能强大,十分推荐。 用法,载入xml文件: var bulkLoader:BulkLoader new BulkLoader(main loading);bulkLoader.add(my_xml_fil…

uboot 详细注释讲解

大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能&#xff0…

【转】VTK和ITK中的坐标系统

当我们在处理医学图像和应用时,一个问题就是坐标系统之间的不同。在图像应用中通常有三个坐标系,分别是世界坐标系,解剖坐标系和图像坐标系。 每种坐标系目的不同,呈现数据的方式也不一样。 解剖坐标系由三个平面组成,…

(ZT)在日本市场推广 iPhone 应用的经验

原贴:http://www.cocoachina.com/appstore/market/2010/0728/1942.html 本文作者为 CocoaChina 会员 “lawrencewu”,是一位专攻日本市场的 iPhone 开发者。他的10款 App (9个收费,一个免费)在9个月的时间里已经取得了…

嵌入式系统 Boot Loader 技术内幕

1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入…

互联网医院 2020年突出成就_【关注】中国社科院发布2020中国医院互联网影响力排行榜...

导 读:11月4日,中国社科院健康业发展研究中心联合好大夫在线,发布2020中国医院互联网影响力排行榜,这是该榜单连续第5年发布。中国社科院健康业发展研究中心以好大夫在线平台611.6亿次的患者浏览轨迹、6648万患者的在线问诊记录、4.7亿次医…

集合附加属性(HACK)

传说中的HACK… 靠看文档是不知道的 http://wekempf.spaces.live.com/blog/cns!d18c3ec06ea971cf!468.entry?wawsignin1.0&sa837408022 http://blogs.msdn.com/b/johngossman/archive/2008/07/28/how-to-initialize-an-attached-dependencyproperty-of-type-collection.as…

h5链接加上 vconsole_又出爆款!凯美瑞和红旗H5没法比!

论舒适性而言,三厢版车型的优势还是十分明显的。基本可以满足日常商务用途和家用等多种用车环境。今天带来的两款车都是三厢车,分别是红旗H5和宝马1系。那这两款车究竟是骡子是马,还是让大家一起来看看它们的实际表现吧。车型:红旗…

程序员:如何写出杀手级简历

1. 简历里要有你工作的技术细节: 编程语言,你的个人成就和水平。 我有时会看到一些简历,里面的工作描述就只有一行话,像这样: * 在一个3人组成的团队里开发一个 e-mail 插件。筛选者在阅读你的简历时心里都有选择标准&…

HDOJ 1010 HDU 1010 Tempter of the Bone ACM 1010 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋题目地址:http://acm.hdu.edu.cn/showproblem.php?pid1010 题目描述:代码Tempter of the BoneTime Limit: 2000/1000MS (Java/Others) Memory Limit: 65536/32768K (Java/Others)Total Submission(s): 16817Accepted …

console application_灵活使用 console 让 js 调试更简单

摘要: 玩转console。原文:灵活使用 console 让 js 调试更简单作者:前端小智Fundebug经授权转载,版权归原作者所有。Web 开发最常用的高度就是 console.log ,虽然 console.log 占有一席之地,但很多人并没有意…