




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。Android圖形顯示-Android圖形顯示在使用MarvellPXA310平臺開發(fā)android過程中,一直碰到圖形顯示相關(guān)問題。一直也沒下定決心理一理圖形顯示相關(guān)流程,一方面是因為這塊技術(shù)涉及到一些圖形算法,看起來比較費勁,另一方面原因可以歸結(jié)為自己的浮躁。直到如今,仍然碰到圖形顯示相關(guān)的問題,而仍是跟幾個月前一樣束手無策,才決定寫下這篇文檔。不求完全厘清圖形顯示相關(guān)代碼,只要能夠由此而引入門即功德圓滿。OverviewAndroid中的圖形系統(tǒng)采用Client/Server架構(gòu)。Server(即
2、SurfaceFlinger)主要由c+代碼編寫而成。Client端代碼分為兩部分,一部分是由Java提供的供應(yīng)用使用的api,另一部分則是由c+寫成的底層實現(xiàn)。下圖概要介紹了android圖形系統(tǒng)的架構(gòu)以及使用到的主要組件。Surface概念A(yù)ndroid圖形系統(tǒng)中一個重要的概念和線索是surface。View及其子類(如TextView,Button)要畫在surface上。每個surface創(chuàng)建一個Canvas對象(但屬性時常改變),用來管理view在surface上的繪圖操作,如畫點畫線。每個canvas對象對應(yīng)一個bitmap,存儲畫在surface上的內(nèi)容。每個surface有一個
3、frontbuffer和一個backbuffer。每個window有一個對應(yīng)的surface.window內(nèi)容繪制在view的bitmap后傳給surface。surface作為一個service提供給系統(tǒng)使用,由servicemanager(frameworks/base/services/java/com/android/server/SystemSever.java,frameworks/base/cmds/system_server/library/system_init.cpp)初始化。surfaceserver的代碼位于frameworks/base/libs/surfacefli
4、nger下。有幾個對象與Surface概念緊密相關(guān)1.JavaSurface(frameworks/base/core/java/android/view/Surface.java)。該對象被應(yīng)用間接調(diào)用(通過SurfaceView,ViewRoot等),應(yīng)用需要創(chuàng)建surface,(并同時創(chuàng)建canvas),將圖形繪制到這個對象上并最終投遞到屏幕上。2.C+Surface(frameworks/base/libs/ui/Surface.cpp。這個對象被JavaSurface通過Jni調(diào)用,實現(xiàn)JavaSurface的功能3.ISurface(以及其派生類BnSurface)。這個對象是應(yīng)用
5、和server之間的接口。C+Surface創(chuàng)建這個ISurface(BnSurface)并發(fā)送命令,如更新surface內(nèi)容到屏幕上。Server端接受這個命令并執(zhí)行相應(yīng)操作。研究一個surface如何創(chuàng)建的關(guān)鍵路徑如下1.frameworks/base/core/java/android/view/Surface.java-Surface:Surface()2.frameworks/base/core/jni/android_view_Surface.cpp-Surface_init()。在這個函數(shù)中SurfaceComposerClient對象被創(chuàng)建。3.frameworks/base/
6、libs/ui/SurfaceComposerClient.cppSurfaceComposerClient:SurfaceComposerClient().這個函數(shù)非常重要,在這里建立了client和server之間的橋梁。通過函數(shù)_get_surface_manager()獲得了一個指向server的IBinder對象(具有ISurfaceComposer接口),之后通過這個IBinder就可以跨進(jìn)程訪問Server的功能。接著調(diào)用ISurfaceComposer:createConnection()創(chuàng)建并返回了一個ISurfaceFlingerClient的IBinder。4.frame
7、works/base/libs/ui/SurfaceComposerClient.cpp-SurfaceComposerClient:createSurface().這個函數(shù)中,利用前面獲得的ISurfaceFlingerClient的IBinder,調(diào)用其createSurface接口。5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp-BClient:createSurface()。BClient由ISurfaceFlingerClient派生而來。6.frameworks/base/libs/surfaceflinger/Su
8、rfaceFlinger.cpp-SurfaceFlinger:createSurface()。這個函數(shù)為Surface創(chuàng)建一個對應(yīng)的Layer。上述關(guān)鍵路徑中,1,2,3,4運行于client進(jìn)程中,而5,6運行與server進(jìn)程中。server作為一個service提供給client訪問。與圖形相關(guān)的代碼主要位于下列目錄:1、frameworks/base/graphics/java/android/graphics2、frameworks/base/core/java/android/view3、frameworks/base/core/java/android/widget4、fram
9、eworks/base/opengl/5、frameworks/base/libs/ui6、frameworks/base/libs/surfaceflinger7、frameworks/base/core/jni/android/graphics8、frameworks/base/core/jni/android/opengl9、frameworks/base/core/jni/android/android_view_*.cpp10、external/skiaOverLay2Marvell顯示驅(qū)動除了baseframebuffer設(shè)備fb0外,加入了fb1(overlay1)、fb2(ov
10、erlay2)、fb3(cursorfb)。在此僅討論fb2,主要有2個應(yīng)用:1、camerarecord時候,負(fù)責(zé)把數(shù)據(jù)刷新到LCD上;2、Opencore中output2overlay/*這里display_config主要完成pDisplayCfg-overlay映射到fb2設(shè)備驅(qū)動文件*/問題:Fb2驅(qū)動文件收到數(shù)據(jù)后,如何與fb0合并,刷新到LCD?M2D最下層是GraphicsController,這就是CPU提供的硬件加速單元,提供畫直線,填充和各種blit功能。這個在Monahans_L_LV_Processor_Dev_Man_Vol_III.pdf里有詳細(xì)描述。再上層是驅(qū)動
11、程序,它對GraphicsController的寄存器進(jìn)行包裝,為應(yīng)用程序提供設(shè)備文件/dev/m2d。m2d_append函數(shù)負(fù)責(zé)向命令隊列中寫入要執(zhí)行的命令:staticintm2d_append(structm2d_device*dev,void*usrbuf,size_tlen)volatilegcu_regs_t*gr=dev-gcu_regs;unsignedinttail_room,head_room;unsignedlongexhead=gr-gcrbexhr;unsignedlongtail=dev-ring_tail_dma;unsignedlongbase=dev-rin
12、g_addr_dma;unsignedlongsize=dev-ring_size;unsignedchar*ring_addr=(unsignedchar*)dev-ring_addr;if(tail=exhead)tail_room=size-(tail-base);head_room=exhead-base;elsetail_room=exhead-tail;head_room=0;if(tail_room=len)if(copy_from_user(ring_addr+(tail-base),usrbuf,len)return-EFAULT;tail+=len;#ifdefFILL_N
13、OPelseif(head_room=len)m2d_fill_nop(ring_addr+(tail-base),tail_room);#elseelseif(head_room+tail_room=len)if(copy_from_user(ring_addr+(tail-base),usrbuf,tail_room)return-EFAULT;usrbuf+=tail_room;len-=tail_room;#endifif(copy_from_user(ring_addr,usrbuf,len)return-EFAULT;tail=dev-ring_addr_dma+len;elser
14、eturn-ENOSPC;if(tail-base=size)tail=base;switch_m2d_clk(1);dev-ring_tail_dma=tail;gr-gcrbtr=tail;return0;執(zhí)行完成后,GCU會通過中斷通知CPU:staticintm2d_gcu_irq(intirq,void*dev_id)structm2d_device*dev=(structm2d_device*)dev_id;volatilegcu_regs_t*gr=dev-gcu_regs;unsignedlongstatus=gr-gciscr&gr-gciecr;if(irq!=IRQ_GR
15、PHICS)returnIRQ_NONE;/*FIXME:whatifthisinterruptoccurswithnocurrentcontext*inexecution*/if(status&(GCISCR_PF_INTST|GCISCR_IIN_INTST|GCISCR_IOP_INTST)m2d_interrupt_err(dev,gr);if(status&GCISCR_EEOB_INTST)m2d_interrupt_eeob(dev,gr);returnIRQ_HANDLED;再上層是函數(shù)庫,它對GraphicsController提供的基本功能進(jìn)行包裝,然后通過/dev/m2d
16、的ioctrl把命令發(fā)給GraphicsController。這里的大部分函數(shù)的功能只是將數(shù)據(jù)打包,然后通過ioctrl把命令傳遞給驅(qū)動程序,如:intm2d_color_fill(structm2d_context*ctx,structm2d_op_region*opr)intlen=0;fprintf(stdout,%s:%dn,_func_,_LINE_);if(ctx=NULL)return-1;CHECK_BOUNDARY(opr-dx0,opr-dy0,opr-width,opr-height,ctx-dstbuf);SETUP_CFILL_IMM(ctx-cmdbuf.cb_pt
17、r,len,opr-dx0,opr-dy0,opr-width,opr-height,ctx-fill_color_format,ctx-fill_color_value);UPDATE_CMDBUF(ctx,len);fprintf(stdout,%s:%dn,_func_,_LINE_);returnlen;打包數(shù)據(jù):#defineSETUP_CFILL_IMM(buf,len,x,y,w,h,pf,c)dofprintf(stdout,SETUP_CFILL_IMM:x=%dy=%dw=%dh=%dn,x,y,w,h);uint32_tf=GCU_PXLFMT_FORMAT(pf);if(f)0 x0a)buf0=GC_CFILL_IMM|(f)8)|0 x04;len=5;buf4=(uint32_t)(c);elseif(f)=0 x0B)buf0=GC_CFILL_IMM|(f)32);buf5=(uint32_t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軍訓(xùn)心得體會4作文(27篇)
- 幼兒園教師師德師風(fēng)學(xué)習(xí)總結(jié)(17篇)
- 司機合同協(xié)議書怎么寫6
- 網(wǎng)絡(luò)和信息安全政策的制定當(dāng)前研究試題及答案
- 租賃合同風(fēng)險防控協(xié)議書
- 2025年金融租賃行業(yè)創(chuàng)新業(yè)務(wù)模式與監(jiān)管政策解讀報告
- 產(chǎn)品拍攝合同協(xié)議書范本
- 搬家合同協(xié)議書范本簡單
- 2025企業(yè)員工勞動合同書模板參考
- 2025房產(chǎn)交易中介服務(wù)合同(現(xiàn)金交易) 購房合同
- Q GDW 10115-2022 110kV~1000kV架空輸電線路施工及驗收規(guī)范
- 化工和危險化學(xué)品生產(chǎn)經(jīng)營單位二十條重大隱患判定標(biāo)準(zhǔn)釋義(中化協(xié))
- 2024年湖南移動客戶經(jīng)理(初級)資格認(rèn)證備考試題庫(含答案)
- 低血糖的應(yīng)急處理流程
- 2021年4月自考00322中國行政史試題及答案含解析
- 除草劑的類群及作用機理
- 暴雨天氣注意安全課件
- 自駕車出差報銷單模板
- 供電公司隱患排查總結(jié)報告
- 巡察組信訪方案
- 感染性角膜病臨床診療專家共識課件
評論
0/150
提交評論