參考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。
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à)很高逢唤。
同步操作