Android圖形顯示講課講稿_第1頁
Android圖形顯示講課講稿_第2頁
Android圖形顯示講課講稿_第3頁
Android圖形顯示講課講稿_第4頁
Android圖形顯示講課講稿_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。Android圖形顯示-Android圖形顯示在使用MarvellPXA310平臺開發(fā)android過程中,一直碰到圖形顯示相關問題。一直也沒下定決心理一理圖形顯示相關流程,一方面是因為這塊技術涉及到一些圖形算法,看起來比較費勁,另一方面原因可以歸結為自己的浮躁。直到如今,仍然碰到圖形顯示相關的問題,而仍是跟幾個月前一樣束手無策,才決定寫下這篇文檔。不求完全厘清圖形顯示相關代碼,只要能夠由此而引入門即功德圓滿。OverviewAndroid中的圖形系統采用Client/Server架構。Server(即

2、SurfaceFlinger)主要由c+代碼編寫而成。Client端代碼分為兩部分,一部分是由Java提供的供應用使用的api,另一部分則是由c+寫成的底層實現。下圖概要介紹了android圖形系統的架構以及使用到的主要組件。Surface概念Android圖形系統中一個重要的概念和線索是surface。View及其子類(如TextView,Button)要畫在surface上。每個surface創(chuàng)建一個Canvas對象(但屬性時常改變),用來管理view在surface上的繪圖操作,如畫點畫線。每個canvas對象對應一個bitmap,存儲畫在surface上的內容。每個surface有一個

3、frontbuffer和一個backbuffer。每個window有一個對應的surface.window內容繪制在view的bitmap后傳給surface。surface作為一個service提供給系統使用,由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概念緊密相關1.JavaSurface(frameworks/base/core/java/android/view/Surface.java)。該對象被應用間接調用(通過SurfaceView,ViewRoot等),應用需要創(chuàng)建surface,(并同時創(chuàng)建canvas),將圖形繪制到這個對象上并最終投遞到屏幕上。2.C+Surface(frameworks/base/libs/ui/Surface.cpp。這個對象被JavaSurface通過Jni調用,實現JavaSurface的功能3.ISurface(以及其派生類BnSurface)。這個對象是應用

5、和server之間的接口。C+Surface創(chuàng)建這個ISurface(BnSurface)并發(fā)送命令,如更新surface內容到屏幕上。Server端接受這個命令并執(zhí)行相應操作。研究一個surface如何創(chuàng)建的關鍵路徑如下1.frameworks/base/core/java/android/view/Surface.java-Surface:Surface()2.frameworks/base/core/jni/android_view_Surface.cpp-Surface_init()。在這個函數中SurfaceComposerClient對象被創(chuàng)建。3.frameworks/base/

6、libs/ui/SurfaceComposerClient.cppSurfaceComposerClient:SurfaceComposerClient().這個函數非常重要,在這里建立了client和server之間的橋梁。通過函數_get_surface_manager()獲得了一個指向server的IBinder對象(具有ISurfaceComposer接口),之后通過這個IBinder就可以跨進程訪問Server的功能。接著調用ISurfaceComposer:createConnection()創(chuàng)建并返回了一個ISurfaceFlingerClient的IBinder。4.frame

7、works/base/libs/ui/SurfaceComposerClient.cpp-SurfaceComposerClient:createSurface().這個函數中,利用前面獲得的ISurfaceFlingerClient的IBinder,調用其createSurface接口。5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp-BClient:createSurface()。BClient由ISurfaceFlingerClient派生而來。6.frameworks/base/libs/surfaceflinger/Su

8、rfaceFlinger.cpp-SurfaceFlinger:createSurface()。這個函數為Surface創(chuàng)建一個對應的Layer。上述關鍵路徑中,1,2,3,4運行于client進程中,而5,6運行與server進程中。server作為一個service提供給client訪問。與圖形相關的代碼主要位于下列目錄: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顯示驅動除了baseframebuffer設備fb0外,加入了fb1(overlay1)、fb2(ov

10、erlay2)、fb3(cursorfb)。在此僅討論fb2,主要有2個應用:1、camerarecord時候,負責把數據刷新到LCD上;2、Opencore中output2overlay/*這里display_config主要完成pDisplayCfg-overlay映射到fb2設備驅動文件*/問題:Fb2驅動文件收到數據后,如何與fb0合并,刷新到LCD?M2D最下層是GraphicsController,這就是CPU提供的硬件加速單元,提供畫直線,填充和各種blit功能。這個在Monahans_L_LV_Processor_Dev_Man_Vol_III.pdf里有詳細描述。再上層是驅動

11、程序,它對GraphicsController的寄存器進行包裝,為應用程序提供設備文件/dev/m2d。m2d_append函數負責向命令隊列中寫入要執(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;再上層是函數庫,它對GraphicsController提供的基本功能進行包裝,然后通過/dev/m2d

16、的ioctrl把命令發(fā)給GraphicsController。這里的大部分函數的功能只是將數據打包,然后通過ioctrl把命令傳遞給驅動程序,如: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;打包數據:#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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論