基于Linux嵌入式系统的多窗口实现方法、装置及介质与流程

文档序号:29403340发布日期:2022-03-26 10:01阅读:418来源:国知局
基于Linux嵌入式系统的多窗口实现方法、装置及介质与流程
基于linux嵌入式系统的多窗口实现方法、装置及介质
技术领域
1.本发明涉及计算机领域,具体涉及了一种基于linux嵌入式系统的多窗口实现方法、装置及介质。


背景技术:

2.在实际的gpu窗口系统中,fbdev是基本的linux窗口系统,但其单窗口的弊端导致操作系统只能操作一个可视窗口,这意味着不能向android、wayland那样可以多个应用同时操作屏幕上的渲染,fbdev下并没有一套多窗口系统的实现,通常情况下实现需要fbo再复制到fbdev的缓存上显示出来,在多进程的系统中的同步非常繁琐。
3.现有的技术是在fbdev下向帧缓存的缓存渲染,如果想多个进程使用gpu渲染或者其它图像产生者(如ve)需要显示,存在同帧缓存的竞争问题。
4.linux帧缓存设备下opengles的实现,只能支持单窗口输出渲染输出到帧缓存设备的帧缓存中,不能像android和wayland一样是多窗口渲染,不能很好的支持多进程/线程、存在窗口管理或屏幕的合成进程的操作系统设计。


技术实现要素:

5.本发明的目的在于至少解决现有技术中存在的技术问题之一,提供了一种基于linux嵌入式系统的多窗口实现方法、装置及介质,本发明技术方案在不改变原有gpu厂商的代码下,通过封装库结合ic显示驱动的特点,实现了opengles fbdev下的多线程、多进程的多窗口系统方案。
6.本发明的技术方案包括一种基于linux嵌入式系统的多窗口实现方法,其特征在于,该方法包括:重构,对linux嵌入式系统的显示标准结构体进行重构,经过重构的标准结构体用于对egl接口变量、线程变量及gpu线程管理变量进行描述;初始化,加载重构的opengl程序函数库和对外api函数库,并执行初始化;多窗口实现,通过所述重构的opengl程序函数库中的多个函数,执行多窗口的窗口创建、帧缓存对象的创建、帧缓存对象的交换、窗口显示及窗口显示位置调整;同步线程处理,通过vsync处理线程执行送显线程同步处理,以及,通过送显线程执行渲染线程的同步信号管理及帧缓存对象的管理。
7.根据所述的基于linux嵌入式系统的多窗口实现方法,其中重构包括:对opengles/egl的api函数进行重构,其中所述egl接口变量包括离屏缓冲区变量及显示资源变量,离屏缓冲区变量及显示资源变量分别用于表示外部eglsurface及egldisplay的数据类型,所述线程变量用于表示每个线程拥有的变量,所述gpu线程管理变量用于表示原生gpu厂商的opengles/egl原生变量。
8.根据所述的基于linux嵌入式系统的多窗口实现方法,其中初始化包括:启动渲染程序执行数据加载,包括对原生opengles/egl的库装载,并通过所述重构对标准opengles/egl api函数进行函数重构;启动vsync处理线程,对窗口的生产者与消费者进行同步。
9.根据所述的基于linux嵌入式系统的多窗口实现方法,其中多窗口实现包括:所述
窗口创建通过eglcreatewindowsurface函数创建离屏渲染对象,初始化所述离屏缓冲区变量及初始化消费者硬件层,以及,在同一进程或多个进程创建至少一个窗口,且多个窗口之间不互相影响;所述帧缓存对象的创建通过eglmakecurrent函数申请与帧缓存对象数量的缓存,并创建对应数量的帧缓存对象,对对应的所述离屏缓冲区变量进行初始化,并创建线程变量用于保存必要的线程变量数据;所述帧缓存对象的交换通过eglswapbuffers交换所述离屏缓冲区变量中的帧缓存对象,将渲染操作绘制到帧缓存对象中,并创建sync信号,提交到送显线程,获取并绑定新的帧缓存对象;所述窗口显示通过glbindframebuffer函数对应用程序绑定帧缓存对象依次执行获取线程前后文变量、获取离屏缓冲窗口、获取写入函数的帧缓存对象、执行绑定;所述窗口显示位置调整通过eglsetsurfaceext函数将不同的窗口放置到消费者的不同通道和层中。
10.根据所述的基于linux嵌入式系统的多窗口实现方法,其中多窗口实现还包括:通过eglgetdisplay指定窗口显示于对应的消费者,若消费者为第一次获取,将会创建对应消费者的送显线程。
11.根据所述的基于linux嵌入式系统的多窗口实现方法,其中vsync处理线程包括:控制送显线程执行平滑送帧;对用于同步窗口的循环使用的缓存进行归还处理;以及对需要vsync信号的应用发出渲染节拍。
12.根据所述的基于linux嵌入式系统的多窗口实现方法,其中送显线程包括:同一个vsync周期限制送显一帧画面;同步渲染线程的sync信号管理;基于消费者角度对帧缓存对象的多缓存消费进行协调。
13.根据所述的基于linux嵌入式系统的多窗口实现方法,其中该方法还包括对受影响的api函数进行消除副作用处理。
14.本发明的技术方案还包括一种基于linux嵌入式系统的多窗口实现装置,该装置包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现上述任一项的方法步骤。
15.本发明的技术方案还包括一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现任一所述的方法步骤。
16.本发明的有益效果为:在不改变gpu厂商提供的opengles库和opengles应用的基础上,设计一套实现多窗口/多进程/多线程渲染的方法,提升了fbdev下的opengles的渲染体验和灵活性。
附图说明
17.下面结合附图和实施例对本发明进一步地说明;
18.图1所示为根据本发明实施方式的总体流程图。
19.图2所示为根据本发明实施方式的库初始流程图。
20.图3所示为根据本发明实施方式的交换缓冲流程图。
21.图4所示为根据本发明实施方式的帧缓存对象绑定流程图。
22.图5所示为根据本发明实施方式的vsync处理线程工作流程图。
23.图6所示为根据本发明实施方式的送显线程工作流程图。
24.图7所示为根据本发明实施方式的装置图。
具体实施方式
25.本部分将详细描述本发明的具体实施例,本发明之较佳实施例在附图中示出,附图的作用在于用图形补充说明书文字部分的描述,使人能够直观地、形象地理解本发明的每个技术特征和整体技术方案,但其不能理解为对本发明保护范围的限制。
26.在本发明的描述中,若干的含义是一个或者多个,多个的含义是两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。
27.在本发明的描述中,对方法步骤的连续标号是为了方便审查和理解,结合本发明的整体技术方案以及各个步骤之间的逻辑关系,调整步骤之间的实施顺序并不会影响本发明技术方案所达到的技术效果。
28.本发明的描述中,除非另有明确的限定,设置等词语应做广义理解,所属技术领域技术人员可以结合技术方案的具体内容合理确定上述词语在本发明中的具体含义。
29.图1所示为根据本发明实施方式的总体流程图。该实施例的流程如下:重构,对linux嵌入式系统的显示标准结构体进行重构,经过重构的标准结构体用于对egl接口变量、线程变量及gpu线程管理变量进行描述;初始化,加载重构的opengl程序函数库,并执行初始化;多窗口实现,通过重构的opengl程序函数库中的多个函数,执行多窗口的窗口创建、帧缓存对象的创建、帧缓存对象的交换、窗口显示及窗口显示位置调整;同步线程处理,通过vsync处理线程执行送显线程同步处理,以及,通过送显线程执行渲染线程的同步信号管理及帧缓存对象的管理。
30.本发明的实施方式对部分kronos标准结构体进行了从新定义,用于记录本发明的实施方式需要使用的一些信息,主要的结构体定义如下:
31.a)aw_surface_t:对该库的外部为eglsurface(egl分配的离屏缓冲区)类型
[0032][0033]
表1 aw_surface_t的成员变量
[0034]
表1中n=fbo_num
[0035]
b)aw_display_resoure:对应于外部为egldisplay类型
[0036]
变量类型作用s_list双向链表用于保存该display下的surface变量idegldisplay原生kronos的display结构体r_mcond条件等待用于通知显示线程新的渲染buffer生成v_mcond条件等待用于vsync线程通知vsync事件
[0037]
表2 aw_display_resoure的变量构成
[0038]
c)线程变量结构体thread_context,该变量为每个线程拥的线程变量,用于实现多线程、多context的渲染,其中重要的数据如下表;
[0039]
变量类型作用r_surfaceaw_surface_t用于记录该线程下设置的读surface;w_surfaceaw_surface_t用于记录该线程下设置的写surfacectxeglcontext用于记录kronos标准的eglcontext变量
[0040]
表3线程变量结构体thread_context变量
[0041]
d)gpu_context_t
[0042]
变量类型作用eglegl api函数指针数组用于保存原生具体gpu厂商的api实现函数glgl api函数指针数组用于保存原生具体gpu厂商的api实现函数
[0043]
表4 gpu_context_t函数变量
[0044]
图2所示为根据本发明实施方式的库初始流程图。结合图2,其概括为:
[0045]
当正常的渲染程序加载aw_opengl.so后,需要处理一些特殊的事件,包括对原生opengles/egl的库装载,并且重构其中的标准opengles/egl api函数;启动vsync处理线程,对产生副作用的opengles/egl的api重点重构。
[0046]
基于本发明技术方案的部分重构的函数如下:
[0047]
(1)eglcreatewindowsurface,该函数中主要是创建pbuffersurface,初始化部分aw_surface_t变量和对display硬件layer的部分初始化,并利用这种pbuffersurface机制实现多个surface的效果。
[0048]
(2)eglmakecurrent,该函数中的处理主要是申请fbo_num个buffer和创建fbo,并对aw_surface_t变量进行部分初始化,并创建线程变量用于保存必要的线程变量数据。
[0049]
(3)eglswapbuffers,用于交换aw_surface_t中的fbo,将此前的drawcall绘制到fbo中,并创建sync信号,提交到送显线程,获取并绑定新的fbo,过程中进行必要的等待,主要的流程参考图3:
[0050]
(4)glbindframebuffer,由于利用了fbo方式实现surface,由于kronos规定名字为0的fbo为当前绑定的surface,surface实际上是基于创建的fbo(名字为write_fbo所指定的那个fbo),故而需要对该函数做一些处理,其处理流程参考图4的流程。
[0051]
(5)eglsetsurfaceext,该拓展函数为了支持一个display下的多个surface的显示问题,该函数将不同的surface放置到display的不同channel和layer中,因此实现
window manager的效果。
[0052]
(6)eglgetdisplay,重构该函数,作用用于指定surface显示在哪个display的屏幕上,并且如果是第一次获取该display,将会创建该display的送显线程。
[0053]
图5所示为根据本发明实施方式的vsync处理线程工作流程图。其流程如下:
[0054]
检测vsync线程是否存在事件,若存在则遍历display的配置,使得临时链表的c_read_fbo线程更新为所读取的read_fbo,唤醒对应的渲染线程(eglswapbuffers)执行缓存交换和渲染,完成后通知送显线程一个vsync事件。
[0055]
vsync处理线程的作用包括:对送显线程起到平滑送帧作用,并保障同一个vsync周期只能送显一帧画面;内部起到同步surface的循环使用的buffer作用,避免渲染线程拿到正在显示的buffer,导致屏幕花屏;对关心vsync信号的应用发出渲染节拍,使得应用平滑渲染。
[0056]
图6所示为根据本发明实施方式的送显线程工作流程图。其流程包括:
[0057]
检测到显示链表中出现新的显示surface,将待显示的surface更新至临时链表,取临时链表中的surface,等待sync的信号signal,得到sync信号后提交到display,若read_fbo++后判断显示列表中是否还有数据,若有,则循环此流程直至所有数据送显完成。
[0058]
送显线程主要用于送显,主要作用如下:平滑送显,保障每一帧能够平滑的显示在屏幕上;用于同步渲染线程的sync信号管理;从消费者角度管理fbo的多buffer的消费。
[0059]
图7所示为根据本发明实施方式的装置图。装置包括存储器100及处理器200,其中处理器200存储有计算机程序,计算机程序用于执行:重构,对linux嵌入式系统的显示标准结构体进行重构,经过重构的标准结构体用于对egl接口变量、线程变量及gpu线程管理变量进行描述;初始化,加载重构的opengl程序函数库,并执行初始化;多窗口实现,通过所述重构的opengl程序函数库中的多个函数,执行多窗口的窗口创建、帧缓存对象的创建、帧缓存对象的交换、窗口显示及窗口显示位置调整;同步线程处理,通过vsync处理线程执行送显线程同步处理,以及,通过送显线程执行渲染线程的同步信号管理及帧缓存对象的管理。其中,存储器100用于存储数据。
[0060]
应当认识到,本发明实施例中的方法步骤可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
[0061]
此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
[0062]
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算
平台,如硬盘、光学读取和/或写入存储介质、ram、rom等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。
[0063]
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如消费者。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括消费者上产生的物理和有形对象的特定视觉描绘。
[0064]
上面结合附图对本发明实施例作了详细说明,但是本发明不限于上述实施例,在技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1