版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。Android圖形顯示-Android圖形顯示在使用MarvellPXA310平臺開發(fā)android過程中,一直碰到圖形顯示相關(guān)問題。一直也沒下定決心理一理圖形顯示相關(guān)流程,一方面是因?yàn)檫@塊技術(shù)涉及到一些圖形算法,看起來比較費(fèi)勁,另一方面原因可以歸結(jié)為自己的浮躁。直到如今,仍然碰到圖形顯示相關(guān)的問題,而仍是跟幾個(gè)月前一樣束手無策,才決定寫下這篇文檔。不求完全厘清圖形顯示相關(guān)代碼,只要能夠由此而引入門即功德圓滿。OverviewAndroid中的圖形系統(tǒng)采用Client/Server架構(gòu)。Server(即
2、SurfaceFlinger)主要由c+代碼編寫而成。Client端代碼分為兩部分,一部分是由Java提供的供應(yīng)用使用的api,另一部分則是由c+寫成的底層實(shí)現(xiàn)。下圖概要介紹了android圖形系統(tǒng)的架構(gòu)以及使用到的主要組件。Surface概念A(yù)ndroid圖形系統(tǒng)中一個(gè)重要的概念和線索是surface。View及其子類(如TextView,Button)要畫在surface上。每個(gè)surface創(chuàng)建一個(gè)Canvas對象(但屬性時(shí)常改變),用來管理view在surface上的繪圖操作,如畫點(diǎn)畫線。每個(gè)canvas對象對應(yīng)一個(gè)bitmap,存儲畫在surface上的內(nèi)容。每個(gè)surface有一個(gè)
3、frontbuffer和一個(gè)backbuffer。每個(gè)window有一個(gè)對應(yīng)的surface.window內(nèi)容繪制在view的bitmap后傳給surface。surface作為一個(gè)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下。有幾個(gè)對象與Surface概念緊密相關(guān)1.JavaSurface(frameworks/base/core/java/android/view/Surface.java)。該對象被應(yīng)用間接調(diào)用(通過SurfaceView,ViewRoot等),應(yīng)用需要?jiǎng)?chuàng)建surface,(并同時(shí)創(chuàng)建canvas),將圖形繪制到這個(gè)對象上并最終投遞到屏幕上。2.C+Surface(frameworks/base/libs/ui/Surface.cpp。這個(gè)對象被JavaSurface通過Jni調(diào)用,實(shí)現(xiàn)JavaSurface的功能3.ISurface(以及其派生類BnSurface)。這個(gè)對象是應(yīng)用
5、和server之間的接口。C+Surface創(chuàng)建這個(gè)ISurface(BnSurface)并發(fā)送命令,如更新surface內(nèi)容到屏幕上。Server端接受這個(gè)命令并執(zhí)行相應(yīng)操作。研究一個(gè)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()。在這個(gè)函數(shù)中SurfaceComposerClient對象被創(chuàng)建。3.frameworks/base/
6、libs/ui/SurfaceComposerClient.cppSurfaceComposerClient:SurfaceComposerClient().這個(gè)函數(shù)非常重要,在這里建立了client和server之間的橋梁。通過函數(shù)_get_surface_manager()獲得了一個(gè)指向server的IBinder對象(具有ISurfaceComposer接口),之后通過這個(gè)IBinder就可以跨進(jìn)程訪問Server的功能。接著調(diào)用ISurfaceComposer:createConnection()創(chuàng)建并返回了一個(gè)ISurfaceFlingerClient的IBinder。4.frame
7、works/base/libs/ui/SurfaceComposerClient.cpp-SurfaceComposerClient:createSurface().這個(gè)函數(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()。這個(gè)函數(shù)為Surface創(chuàng)建一個(gè)對應(yīng)的Layer。上述關(guān)鍵路徑中,1,2,3,4運(yùn)行于client進(jìn)程中,而5,6運(yùn)行與server進(jìn)程中。server作為一個(gè)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ū)動(dòng)除了baseframebuffer設(shè)備fb0外,加入了fb1(overlay1)、fb2(ov
10、erlay2)、fb3(cursorfb)。在此僅討論fb2,主要有2個(gè)應(yīng)用:1、camerarecord時(shí)候,負(fù)責(zé)把數(shù)據(jù)刷新到LCD上;2、Opencore中output2overlay/*這里display_config主要完成pDisplayCfg-overlay映射到fb2設(shè)備驅(qū)動(dòng)文件*/問題:Fb2驅(qū)動(dòng)文件收到數(shù)據(jù)后,如何與fb0合并,刷新到LCD?M2D最下層是GraphicsController,這就是CPU提供的硬件加速單元,提供畫直線,填充和各種blit功能。這個(gè)在Monahans_L_LV_Processor_Dev_Man_Vol_III.pdf里有詳細(xì)描述。再上層是驅(qū)動(dòng)
11、程序,它對GraphicsController的寄存器進(jìn)行包裝,為應(yīng)用程序提供設(shè)備文件/dev/m2d。m2d_append函數(shù)負(fù)責(zé)向命令隊(duì)列中寫入要執(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會(huì)通過中斷通知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ū)動(dòng)程序,如: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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度城市基礎(chǔ)設(shè)施建設(shè)流動(dòng)資金借款合同模板4篇
- 二零二五版辦公用品租賃與銷售一體化合同3篇
- 2025版煤炭國際貿(mào)易居間服務(wù)不可撤銷合同4篇
- 2025年消防排煙系統(tǒng)設(shè)備租賃與現(xiàn)場管理合同3篇
- 二零二四全新公積金貸款賣房合同附房產(chǎn)交易風(fēng)險(xiǎn)評估及貸款額度調(diào)整3篇
- 2025年循環(huán)貸款擔(dān)保抵押合同(文化產(chǎn)業(yè))2篇
- 2025版快遞行業(yè)專用快遞發(fā)件合同范本2篇
- 二零二五年度裝修工人健康檢查與職業(yè)病防治合同3篇
- 二零二五年度戶外運(yùn)動(dòng)場地租賃合同安全設(shè)施完善與活動(dòng)組織管理合同3篇
- 標(biāo)示牌施工噪音控制與環(huán)保合同(二零二五年度)3篇
- 物業(yè)民法典知識培訓(xùn)課件
- 2023年初中畢業(yè)生信息技術(shù)中考知識點(diǎn)詳解
- 2024-2025學(xué)年山東省德州市高中五校高二上學(xué)期期中考試地理試題(解析版)
- TSGD7002-2023-壓力管道元件型式試驗(yàn)規(guī)則
- 2024年度家庭醫(yī)生簽約服務(wù)培訓(xùn)課件
- 建筑工地節(jié)前停工安全檢查表
- 了不起的狐貍爸爸-全文打印
- 第二章流體靜力學(xué)基礎(chǔ)
- 小學(xué)高年級語文作文情景互動(dòng)教學(xué)策略探究教研課題論文開題中期結(jié)題報(bào)告教學(xué)反思經(jīng)驗(yàn)交流
- 春節(jié)新年紅燈籠中國風(fēng)信紙
- 注塑件生產(chǎn)通用標(biāo)準(zhǔn)
評論
0/150
提交評論