EGL介紹

參考kronone官網(wǎng)和https://blog.csdn.net/ieearth/article/details/71180457

介紹:

EGL是Khronos指定的一種接口丧叽,做渲染API的種窗口系統(tǒng)包裝的層澡屡,一般提供給OpenGL ES和OpenVG使用炫惩。主要包括:圖形上下文管理、surface/buffer綁定阐肤、渲染同步和高性能加速及2/3D混合渲染使能。同時(shí)也提供不同API之間的數(shù)據(jù)傳輸。比如跑在視頻子系統(tǒng)上的OpenMAX AL和跑在GPU上的OpenGL ES之間的數(shù)據(jù)傳輸。
可以支持Linux和Windows操作系統(tǒng)儡嘶,支持底層渲染API的選擇Xlib或GDI。
EGL支持三種類型的surface渲染恍风,分別是window、pixmap和pixel buffer誓篱。其中朋贬,window和pixmap類型的surface與本地窗口系統(tǒng)對(duì)應(yīng)的資源息息相關(guān);而pixel buffer則是EGL資源獨(dú)享的窜骄,不可通過本地窗口系統(tǒng)進(jìn)行渲染锦募。

Advanced API Interop

EGLStreams擴(kuò)展提供一個(gè)功能強(qiáng)大,且方面編程的API邻遏,用來控制一組Kronos API的圖像流開啟全硬件加速實(shí)現(xiàn)高級(jí)應(yīng)用糠亩,如 增強(qiáng)現(xiàn)實(shí)Augmented Reality。

image.png

Khronos維護(hù)的egl倉庫和bug更新在:
https://github.com/KhronosGroup/?

包含的API:

一共包含45條API:

Image相關(guān)

eglCreateImage創(chuàng)建一個(gè)EGLImage對(duì)象
eglBindTexImage定義一個(gè)二維紋理圖像准验,紋理圖像數(shù)據(jù)用buffer指定赎线,不需要數(shù)據(jù)拷貝。紋理的格式和surface保持一致糊饱,surface必須是支持EGL_BIND_TO_TEXTURE_RGB或EGL_BIND_TO_TEXTURE_RGBA屬性的pbuffer垂寥。如果surface和display是線程當(dāng)前的上下文狀態(tài),這個(gè)命令相當(dāng)于glFlush另锋,如果不是要等其他GL draw命令執(zhí)行完滞项。執(zhí)行過這個(gè)命令之后,指定的surface就不能在讀寫了夭坪。這個(gè)函數(shù)調(diào)用之后eglSwapBuffers會(huì)失效文判。
eglDestroyImage

Context相關(guān)

eglCreateContext:創(chuàng)建一個(gè)EGL rendering context
eglDestroyContext
eglQueryContext
返回EG渲染上下文信息
eglBindAPI:設(shè)置當(dāng)前要綁定的API,可取參數(shù)為EGL_OPENGL_API, EGL_OPENGL_ES_API和EGL_OPENVG_API室梅。1.2及以上的版本支持O噴VG和OpenGLES戏仓,1.4及以上版本才支持OpenGL疚宇。默認(rèn)值是ES,可以通過eglQueryAPI來查詢柜去。
eglQueryAPI:查詢當(dāng)前的渲染API灰嫉,返回調(diào)用線程中EGL使用的當(dāng)前渲染API的值. 這個(gè)值通過eglBindAPI設(shè)置.
eglMakeCurrent將上下文綁定到當(dāng)前渲染線程上,同時(shí)綁定到讀寫surface上.

配置相關(guān)

eglChooseConfig
返回符合指定屬性的EGL幀緩沖的配置list嗓奢,可設(shè)置的參數(shù)很多讼撒。

Buffer相關(guān)

eglCopyBuffers將surface的color buffer拷貝到native_pixmap. 相當(dāng)以一個(gè)glFlush。
eglCreatePbufferFromClientBuffer創(chuàng)建一個(gè)EGL pixel buffer surface并綁定到一個(gè)OpenVG image

Surface相關(guān)

eglCreatePbufferSurface
創(chuàng)建一個(gè)離屏pixel buffer surface返回它的句柄
eglCreatePixmapSurface
創(chuàng)建一個(gè)離屏EGL pixmap surface返回它的句柄. 比eglCreatePixmapSurface多一個(gè)平臺(tái)參數(shù)股耽,用來指定屬于的平臺(tái)根盒。
eglCreatePlatformPixmapSurface
創(chuàng)建一個(gè)離屏EGL pixmap surface并返回其句柄。
eglCreatePlatformWindowSurface
創(chuàng)建一個(gè)離屏EGL窗口surface并返回其句柄物蝙。
eglCreateWindowSurface
創(chuàng)建一個(gè)離屏EGL window surface并返回其句柄炎滞。比eglCreateWindowSurface多個(gè)platforms,用來指定屬于的平臺(tái)诬乞。
eglQuerySurface查詢surface相關(guān)信息
eglDestroySurface
eglGetConfigAttrib
返回EGL frame buffer的配置信息册赛。
eglGetConfigs
返回一個(gè)list,包含指定display可用的所有EGL frame buffer配置震嫉。
eglGetCurrentContext
返回當(dāng)前EGL渲染上下文森瘪,當(dāng)前EGL渲染上下文通過eglMakeCurrent指定.
eglGetCurrentDisplay
返回當(dāng)前EGL渲染上下文的display connection。
eglGetCurrentSurface
返回當(dāng)前EGL渲染上下文的read或draw surface
eglGetDisplay
返回一個(gè)EGL display connection
eglGetError
eglGetPlatformDisplay
返回一個(gè)EGL display connection
eglGetProcAddress
返回一個(gè)GL或EGL擴(kuò)展函數(shù)
eglInitialize
初始化一個(gè)EGL display connection
eglIntro
introduction to通過EGL API管理client API渲染票堵。
eglQueryString
返回一個(gè)字符串扼睬,描述了EGL client或EGL display connection相關(guān)的屬性,可以查詢的參數(shù)包括:EGL_EXTENSIONS悴势、EGL_VERSION窗宇、EGL_VENDOR和EGL_CLIENT_APIS
eglReleaseTexImage
釋放作一個(gè)color buffer,這個(gè)buffer是用來做一幅紋理的, 指定的color buffer釋放給了surface特纤。
eglReleaseThread
釋放EGL per-thread state. 將EGL的狀態(tài)復(fù)位到初始化的情況军俊,釋放的值包括error status, currently bound rendering API以及每一個(gè)client API支持的當(dāng)前上下文。The overhead of maintaining this state may be objectionable in applications which create and destroy many threads, but only call EGL or client APIs in a few of those threads at any given time.
eglSurfaceAttrib
設(shè)置EGL surface的屬性
eglTerminate
中止一個(gè)EGL display連接叫潦,釋放相關(guān)資源蝇完。如果當(dāng)前的線程中display關(guān)聯(lián)的contexts或surfaces, 得不關(guān)聯(lián)或切換之后才能釋放。中止之后可以通過eglInitialize再次激活矗蕊。

同步相關(guān):

在native rendering調(diào)用之前完成GL的執(zhí)行短蜕,
eglWaitClient對(duì)應(yīng)calls for the currently bound context, for the current rendering API.
eglWaitGL對(duì)應(yīng)OpenGL ES rendering calls for the currently bound OpenGL ES context,同glFinish.
eglWaitNative對(duì)應(yīng)Native rendering calls made prior to eglWaitNative are guaranteed to be executed before GL rendering calls made after eglWaitNative.保證原生窗口系統(tǒng)的渲染完成傻咖,參數(shù)engine指定需要等待的渲染引擎
eglClientWaitSyncblock調(diào)用的線程知道指定的sync信號(hào)收到朋魔,或者timeout設(shè)置的時(shí)間到了。
eglWaitSync在server等一個(gè)同步對(duì)象的觸發(fā)信號(hào)卿操,和eglClientWaitSync不同的地方是不會(huì)進(jìn)行block和等待警检,會(huì)直接返回孙援。
eglCreateSync創(chuàng)建一個(gè)EGL sync對(duì)象,sync對(duì)象使能線程間和API上下文之間的client API同步. 可以用來測(cè)試或稱才應(yīng)用程序線程扇雕。
eglGetSyncAttrib返回一個(gè)sync對(duì)象的屬性拓售。
eglDestroySync

Swap相關(guān)

eglSwapBuffers把EGL surface color buffer推送至native window,如果surface是back-buffered window surface, eglSwapBuffers then the color buffer is copied (posted) native window associated with that surface. 單buffer窗口或pixmap或buffer沒有效果镶奉。
eglSwapInterval指定當(dāng)前上下文關(guān)聯(lián)的窗口中础淤,每buffer swap的視頻幀數(shù)的最小值。The interval takes effect when eglSwapBuffers is first called subsequent to the eglSwapInterval call.

分類

屬性配置類的API哨苛、surface創(chuàng)建類API鸽凶、Context生成綁定類API、Display連接和中止類建峭、錯(cuò)誤檢查類玻侥、同步類

使用

初始化display:EGL提供了圖形API如OpenGL ES和原生窗口系統(tǒng)如Linux的X Window之間的一個(gè)結(jié)合層次,在EGL能夠確定可用的Surface類型之前亿蒸,它必須打開和窗口系統(tǒng)的通信渠道凑兰,因?yàn)槭强缙脚_(tái)的,每個(gè)窗口系統(tǒng)都有不同的語義边锁,所以EGL提供基本的不透明類型EGLDisplay(類型為void*)票摇,該類型封裝了所有系統(tǒng)相關(guān)屬性,用于原生窗口系統(tǒng)接口砚蓬,不同的窗口系統(tǒng)定義了不同的Display屬性,最終都會(huì)Native化盆色,定義為EGLNativeDisplayType灰蛙。任何使用EGL的應(yīng)用程序必須執(zhí)行的第一個(gè)操作是創(chuàng)建和初始化與本地EGL Display的連接,eglGetDisplay隔躲、eglInitialize摩梧。

配置surface:

EGL初始化Display完成后,就可以對(duì)Surface進(jìn)行配置了宣旱,有兩種方法仅父,一種是查詢每個(gè)Surface配置,找出最好的選擇浑吟,另一種是指定一組需求笙纤,讓EGL推薦最佳匹配,兩者都返回一個(gè)EGLConfig组力,包括Surface相關(guān)的所有屬性省容。在許多情況下,使用第二種方法更簡(jiǎn)單燎字,而且很有可能得到用第一種方法找到的匹配, eglGetConfigs, eglGetConfigAttrib, eglChooseConfig
創(chuàng)建surface:
有了EGLConfig之后腥椒,就可以創(chuàng)建EGLSurface了阿宅,Surface不只一種類型,下面先介紹Window Surface笼蛛,可以理解為EGL窗口洒放,是屏幕上的渲染區(qū)域,由eglCreateWindowSurface創(chuàng)建滨砍。eglQuerySurface用于獲取Surface信息往湿,eglSurfaceAttrib用于設(shè)置Surface屬性
PBuffer Surface與Window Surface——
除了可以用OpenGL ES 3.0在屏幕上的窗口渲染之外,還可以渲染稱作PBuffer(像素緩沖區(qū)Pixel Buffer的縮寫)的不可見屏幕外表面惨好,和窗口一樣煌茴,PBuffer可以利用OpenGL ES 3.0中的任何硬件加速,PBuffer最常用于生成紋理貼圖日川,如果想要做的是渲染到一個(gè)紋理蔓腐,那么建議使用幀緩沖區(qū)對(duì)象(FBO)代替PBuffer,因?yàn)閹彌_區(qū)更高效龄句,不過在某些FBO無法使用的情況下回论,PBuffer仍然有用,例如用OpenGL ES在屏幕外表面上渲染分歇,然后將其作為其它API(如OpenVG)中的紋理傀蓉。另外,EGLSurface還有個(gè)Pixmap Surface职抡,簡(jiǎn)單總結(jié)一下三者的特點(diǎn)葬燎。window是on-screen的,pbuffer和pixmap是off-screen的缚甩,window綁定到了NativeWindow谱净,pixmap綁定到了NativePixmap,pbuffer沒有任何本地綁定擅威,window是雙緩沖區(qū)的壕探,pbuffer和pixmap是單緩沖區(qū)的,window默認(rèn)在back buffer渲染郊丛,通過eglSwapBuffers交換到屏幕上顯示李请,pbuffer在顯存中分配,由EGL_HEIGHT和EGL_WIDTH指定大小厉熟,常用作紋理數(shù)據(jù)导盅,pixmap綁定到本地的像素緩沖區(qū),這個(gè)緩沖區(qū)可以被其它API使用庆猫。創(chuàng)建不同的EGLSurface時(shí)认轨,需要在EGLConfig中配置EGL_SURFACE_TYPE,window月培、pbuffer嘁字、pixmap分別對(duì)應(yīng)于EGL_WINDOW_BIT恩急、EGL_PBUFFER_BIT、EGL_PIXMAP_BUFFER纪蜒。
創(chuàng)建context:
eglCreateContext衷恭、eglCreateContext
關(guān)聯(lián)context:
創(chuàng)建了Surface和Context之后,因?yàn)榭赡苡卸鄠€(gè)Surface和Context纯续,所以需要通過eglMakeCurrent綁定Context到Surface随珠,dpy為對(duì)應(yīng)的Display,draw用于繪制猬错,read用于讀窗看,ctx為要綁定的Context,成功是返回EGL_TRUE倦炒,失敗時(shí)返回EGL_FALSE显沈。因?yàn)镋GL規(guī)范要求eglMakeCurrent實(shí)現(xiàn)進(jìn)行一次刷新,所以這一調(diào)用對(duì)于基于圖塊的架構(gòu)代價(jià)很高逢唤。
同步操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拉讯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鳖藕,更是在濱河造成了極大的恐慌魔慷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡说榆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門召边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裹驰,你說我怎么就攤上這事∑遥” “怎么了幻林?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)音念。 經(jīng)常有香客問我沪饺,道長(zhǎng),這世上最難降的妖魔是什么闷愤? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任整葡,我火速辦了婚禮,結(jié)果婚禮上讥脐,老公的妹妹穿的比我還像新娘遭居。我一直安慰自己啼器,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布俱萍。 她就那樣靜靜地躺著端壳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枪蘑。 梳的紋絲不亂的頭發(fā)上损谦,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音岳颇,去河邊找鬼照捡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛话侧,可吹牛的內(nèi)容都是我干的栗精。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼掂摔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼术羔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乙漓,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤级历,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叭披,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寥殖,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年涩蜘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚼贡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡同诫,死狀恐怖粤策,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情误窖,我是刑警寧澤叮盘,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站霹俺,受9級(jí)特大地震影響柔吼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丙唧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一愈魏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦培漏、人聲如沸溪厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桩匪。三九已至,卻和暖如春友鼻,著一層夾襖步出監(jiān)牢的瞬間傻昙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工彩扔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妆档,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓虫碉,卻偏偏與公主長(zhǎng)得像贾惦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敦捧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本篇文章是基于谷歌有關(guān)Graphic的一篇概覽文章的翻譯:http://source.android.com/de...
    lee_3do閱讀 7,097評(píng)論 2 21
  • 上下文環(huán)境搭建就像前面提到的须板,OpenGL不負(fù)責(zé)窗口管理及上下文環(huán)境管理,該職責(zé)將由各個(gè)平臺(tái)或者設(shè)備自行完成兢卵。為了...
    凌煙醉臥閱讀 1,322評(píng)論 0 3
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,689評(píng)論 0 3
  • 屏幕上可見的幀緩沖區(qū)由一個(gè)像素?cái)?shù)據(jù)的二維數(shù)組表示习瑰。直接在可顯示緩沖區(qū)上更新像素由一個(gè)嚴(yán)重的問題——用戶在部分更新幀...
    cain_huang閱讀 7,552評(píng)論 0 4
  • 一、英語選修課總結(jié) 美好的時(shí)光總是短暫的秽荤,雖然上課對(duì)很多人來說是一件累活甜奄,但我這次參加文魁大腦記憶培訓(xùn)課卻一點(diǎn)...
    賢子幸福視野閱讀 353評(píng)論 2 0