• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    SurfaceFlinger在X Window系統(tǒng)環(huán)境下的運行方案①

    2017-10-20 03:08:24賀也平周啟明
    關(guān)鍵詞:內(nèi)核調(diào)用桌面

    江 帆,賀也平,周啟明

    (中國科學(xué)院 軟件研究所 基礎(chǔ)軟件國家工程研究中心,北京 100190)

    SurfaceFlinger在X Window系統(tǒng)環(huán)境下的運行方案①

    江 帆,賀也平,周啟明

    (中國科學(xué)院 軟件研究所 基礎(chǔ)軟件國家工程研究中心,北京 100190)

    本文給出一種將Android圖形系統(tǒng)SurfaceFlinger移植到桌面Linux發(fā)行版的X Window系統(tǒng)環(huán)境下運行的方案.在X Window系統(tǒng)環(huán)境下運行的SurfaceFlinger可使Android運行環(huán)境中以本地進(jìn)程形式的Android應(yīng)用進(jìn)程的UI界面顯示到X Window的窗口中.使用Mesa作為OpenGL ES實現(xiàn)并使Mesa EGL兼容Android的本地窗口ANativeWindow,同時借助Androidx86的gralloc.drm.so模塊,實現(xiàn)了Android應(yīng)用程序的UI渲染過程SurfaceFlinger的圖像合成過程能夠使用GPU進(jìn)行硬件加速.另外,用X11的DRI2擴(kuò)展協(xié)調(diào) SurfaceFlinger的窗口和X Server的DDX驅(qū)動,使合成后的圖像能高效地更新到窗口中,避免了SurfaceFlinger的圖像緩存由獨立顯存到系統(tǒng)內(nèi)存的拷貝過程.經(jīng)實驗,在本移植方案下,第三方3D基準(zhǔn)測試軟件San-Angeles能達(dá)到60FPS的幀率.相比于已有方案,本方案的架構(gòu)更加簡潔高效,且支持硬件加速.

    Android圖形系統(tǒng); SurfaceFlinger; X Window系統(tǒng); 移植; 兼容環(huán)境

    Android運行環(huán)境可以使數(shù)量眾多的Android應(yīng)用程序不經(jīng)修改即可在桌面Linux系統(tǒng)上以本地進(jìn)程的形式運行,這對于原本應(yīng)用資源匱乏的桌面Linux系統(tǒng)來說是一個很好的補(bǔ)充[1].而使Android的圖形系統(tǒng)SurfaceFlinger在桌面Linux系統(tǒng)上運行是構(gòu)建Android運行環(huán)境的重要環(huán)節(jié).SurfaceFlinger的主要功能是將應(yīng)用窗口和系統(tǒng)窗口合成一幀完整畫面并提交到屏幕顯示.張超等[2]成功地實現(xiàn)SurfaceFlinger在桌面Linux的X Window環(huán)境下運行.其主要方法是利用軟件渲染的方法方式將SurfaceFlinger合成的圖像寫入共享內(nèi)存,再由一個桌面圖形程序輸出畫面.該方法的不足是使用軟件渲染而沒有調(diào)用GPU實現(xiàn)硬件加速,造成占用大CPU時間,并且畫面輸出過程需要不斷調(diào)用IPC,在處理3D圖形時只有個位數(shù)的幀數(shù),性能十分低下.

    提高圖形系統(tǒng)性能的思路是使用GPU進(jìn)行硬件渲染而非使用CPU進(jìn)行軟件渲染.arm架構(gòu)和x86架構(gòu)在圖形系統(tǒng)方面存在較大差異.具體表現(xiàn)為arm架構(gòu)下的GPU沒有獨立顯存,所有程序的圖像緩存都位于系統(tǒng)內(nèi)存,而在x86的Linux內(nèi)核之上,需要使用DRI框架來調(diào)用GPU,并且GPU有自己的獨立顯存[3].而面向arm架構(gòu)設(shè)計的SurfaceFlinger的源碼即使能面向x86架構(gòu)編譯,也不能直接在x86架構(gòu)的Linux內(nèi)核之上運行.另一方面,SurfaceFlinger在自己的圖像緩存上合成好的畫面幀需要提交到X Window的窗口中顯示.因此,要實現(xiàn)SurfaceFlinger在X Window系統(tǒng)環(huán)境下運行,需要解決的問題主要有兩個:1)使Android應(yīng)用程序的UI渲染過程和SurfaceFlinger的圖像合成過程能夠在x86架構(gòu)的Linux內(nèi)核之上進(jìn)行硬件加速;2)使SurfaceFlinger的圖像緩存能夠顯示在X Window的窗口中.

    從OpenGL ES的角度來看Android應(yīng)用程序的UI渲染過程和SurfaceFlinger的圖像合成過程,Android應(yīng)用程序和SurfaceFlinger都可以看作是OpenGL ES的應(yīng)用程序.因此首先需要一種能在x86 架構(gòu)下使用的OpenGL ES的實現(xiàn)作為GPU驅(qū)動.Androidx86項目在讓Android系統(tǒng)在x86架構(gòu)的PC上運行做出了重要貢獻(xiàn)[4].該項目使用Mesa[5]作為OpenGL ES實現(xiàn),并基DRM[6]和GEM[7]實現(xiàn)了gralloc.drm.so模塊,成功地使SurfaceFlinger在x86架構(gòu)下運行并實現(xiàn)硬件加速.但是該項目的目標(biāo)是在x86架構(gòu)下運行完整的Android系統(tǒng),因此其運行時會占用整個顯示屏,并不能實現(xiàn)在桌面Linux的圖形系統(tǒng)X Window的環(huán)境下獨立運行SurfaceFlinger程序.本文以Mesa作為OpenGL ES實現(xiàn),借用Androidx86的擴(kuò)展的Mesa EGL的DRI驅(qū)動實現(xiàn)對Android本地窗口ANativeWindow的支持,并使用gralloc.drm.so進(jìn)行圖像緩存的申請,成功實現(xiàn)了基于硬件加速的Android應(yīng)用程序UI渲染.對于SurfaceFlinger將畫面提交到窗口顯示的過程,首先SuracefFlinger需要有自己的窗口.其次使用gralloc.drm.so直接通過內(nèi)核DRM模塊申請的顯存無法和Surface-Flinger的窗口進(jìn)行內(nèi)在綁定.本文使用X11的DRI2擴(kuò)展協(xié)調(diào)SurfaceFlinger的圖像緩存和窗口,有效避免了SurfaceFlinger圖像緩存由GPU獨立顯存到系統(tǒng)內(nèi)存的拷貝,使得SurfaceFlinger的窗口畫面更新過程更加流暢.

    本文余下章節(jié)的結(jié)構(gòu)如下.第1節(jié),以Android應(yīng)用程序UI渲染到SurfaceFlinger合成的畫面在窗口中顯示的過程為線索,分析整體架構(gòu)的運作流程.第2節(jié),為更好地理解系統(tǒng)架構(gòu)的原理,分析Android應(yīng)用程序UI渲染過程中涉及到的關(guān)鍵組件.第3節(jié),在不考慮X Window系統(tǒng)的情況下,討論Android應(yīng)用程序和SurfaceFlinger如何在x86的架構(gòu)下運行并支持硬件加速.第4節(jié),給出SurfaceFlinger和X Window系統(tǒng)兼容的關(guān)鍵技術(shù)和進(jìn)一步的優(yōu)化方案.第5節(jié),給出并分析移植方案在各型GPU上運行的實驗結(jié)果.第6節(jié),結(jié)語.

    1 總體架構(gòu)

    圖1描述了SurfaceFlinger移植到X Window環(huán)境下的架構(gòu).序號1至19描述了從Actitity的UI渲染到畫面最終提交到窗口的完整過程.整個系統(tǒng)運行于開啟了Binder驅(qū)動的x86架構(gòu)的Linux內(nèi)核之上./dev/binder和/dev/dri/card0分別為Binder IPC和DRM內(nèi)核子系統(tǒng)的設(shè)備文件.

    App的UI使用硬件渲染路徑(1~6).軟件渲染調(diào)用CPU在系統(tǒng)內(nèi)存上進(jìn)行計算,這樣會占用大量CPU時間,性能低下.因此從OpenGL ES的角度來看,所有App都是OpenGL ES的應(yīng)用程序.App的圖像緩存通過EGL向Surface申請.Android的本地窗口是BufferQueue(由 producer和 consumer組成)的 wrapper,因此Surface拿到的圖像緩存是從BufferQueue申請的GraphicBuffer.GraphicBuffer包含的圖像緩存的實際句柄則是通過gralloc.drm.so調(diào)用libdrm向內(nèi)核的GEM模塊申請的.

    SurfaceFlinger同樣擁有自己的Surface,但是它的圖像緩存則是通過xwindow.default.so調(diào)用X11的DRI2擴(kuò)展向X Server的DDX驅(qū)動申請的,而非直接調(diào)用libdrm向內(nèi)核申請.這樣可使SurfaceFlinger圖像緩存的GEM句柄和SurfaceFlinger自己的窗口在X Server端產(chǎn)生內(nèi)在綁定.

    圖1 系統(tǒng)架構(gòu)

    當(dāng)一個Activity的一幀畫面渲染好以后,就通過BufferQueue經(jīng)Binder IPC機(jī)制將GraphicBuffer提交到SurfaceFlinger中(7~8).GraphicBuffer支持序列化,因此可以通過Binder傳遞.每個Surface對應(yīng)Surface-Flinger中的一個Layer.當(dāng)一個由EventThread發(fā)處的VSync同步信號到來時,SurfaceFlinger就會調(diào)用OpenGL ES將這些Layer合成為一幀畫面(9~10).SurfaceFlinger同樣需要有自己的本地窗口Surface來承載這一幀合成好的圖像.在INVALIDATE_ON_VSYNC宏置為1時,在Surface緩存更新的同時發(fā)起一個畫面更新.

    因為桌面上沒有硬件HWComposer,因此Surface-Flinger的畫面合成過程是基于OpenGL ES完成的,而hwcomposer.x86.so只是一個符合HWComposer 1.0 接口標(biāo)準(zhǔn)的軟件實現(xiàn),并不是硬件HWComposer的驅(qū)動程序.它的set()接口僅調(diào)用了EGL層的eglSwapBuffers()函數(shù)進(jìn)行前后臺圖像緩存更新,eglSwapBuffers()再調(diào)用Surface的queueBuffer()將一個GraphicBuffer通過BufferQueuer傳給了同位于SurfaceFlinger進(jìn)程中的作為consumer的 FrameBufferSurface對象(11~14).FrameBufferSurface接下來通過gralloc.drm.so將這個渲染好的GraphicBuffer提交到窗口.

    在HAL層中基于Xlib和X11的DRI2擴(kuò)展實現(xiàn)了xwindow.default.so模塊.SurfaceFlinger通過該模塊和X Server通信,并創(chuàng)建屬于SurfaceFlinger自己的窗口.gralloc.drm.so將這個渲染好的GraphicBuffer提交到窗口的過程由xwindow.default.so調(diào)用X11的DRI2擴(kuò)展的pageflip功能完成(15~19).

    本項目基于源碼分支android-5.1.1_r9開發(fā).后續(xù)章節(jié)中關(guān)于Android圖形系統(tǒng)的分析以該版本為基準(zhǔn).

    2 Android應(yīng)用程序的UI渲染路徑

    為理解移植后的系統(tǒng)架構(gòu)如何運作,我們以Android應(yīng)用程序UI渲染到圖像呈現(xiàn)在屏幕的過程為線索,分析該過程中涉及的一些Android圖形系統(tǒng)的關(guān)鍵組件.

    要讓SurfaceFlinger在X Window環(huán)境下運行,我們首先需要了解在arm架構(gòu)下Android系統(tǒng)中App的UI是如何渲染和顯示到屏幕的以及SurfaceFlinger在這個過程起到的作用.App的UI界面的渲染方式分為2D和3D兩種.進(jìn)行2D渲染的方式包括:1)調(diào)用Canvas的drawRect(),drawText()等方法將像素點繪制到一個Bitmap; 2)View的子類繪制Button、List等空間; 3)或一個定制的View類實現(xiàn)開發(fā)者自己定義的行為等.2D渲染有兩條路徑,一是使用hwui的基于OpenGL ES2.0的硬件渲染,一種是使用Skia軟件渲染引擎的軟件渲染.Android的UI繪制也支持硬件加速,這時Activity會創(chuàng)建一個GLSurfaceView并且使用OpenGL ES的Java綁定接口(android.opengl.*)進(jìn)行畫面渲染.AOSP中提供的libEGL.so、libGLESv1_CM.so、libGLESv2.so、libGLESv3.so只是EGL和OpenGL ES實現(xiàn)的wrapper,底下真正調(diào)用的是由供應(yīng)商提供的閉源專屬GPU驅(qū)動或Android自己實現(xiàn)的軟件GPU模擬PixelFlinger.但是不論是2D渲染還是3D渲染,最終的渲染結(jié)果的所有像素點都位于該Activity的Surface之上.

    2.1 SurfaceFlinger

    SurfaceFlinger是Android的窗口合成器.它和App的Surface構(gòu)成了C/S架構(gòu).一個完整的屏幕界面實際上是由多個窗口(包括導(dǎo)航條、狀態(tài)條和應(yīng)用UI)合成后的結(jié)果.每個窗口分別屬于不同的進(jìn)程,由這些進(jìn)程獨立渲染在自己的Surface之上.每個Surface對應(yīng)SurfaceFlinger中的一個Layer,這些Layer通過z軸順序排列起來.SurfaceFlinger基于OpenGL ES的API將這些Layer合成一幀完整的畫面.

    2.2 BufferQueue和gralloc

    Surface和SurfaceFlinger構(gòu)成C/S架構(gòu).Buffer-Queue是Surface和SurfaceFlinger之間進(jìn)行Graphic-Buffer交換的通道.App從Surface獲取新的Graphic-Buffer并將繪制好的GraphicBuffer通過Buffer-Queue傳遞給 SurfaceFlinger,而 SurfaceFlinger從BufferQueue接收渲染好的GraphicBuffer用于下一幀的畫面合成,同時將新的GraphicBuffer放入BufferQueue傳遞給App的Surface.

    gralloc是Android HAL層定義的圖形緩存分配器.在BufferQueue中傳遞的GraphicBuffer對象通過gralloc獲取實際的圖像緩存描述句柄.gralloc的圖形緩存申請接口alloc()接收width,height,pixel format以及usage flags等參數(shù).App和SurfaceFlinger使用圖像緩存的目的不同,App是為了渲染UI畫面并傳遞給SurfaceFlinger進(jìn)行圖形合成,而SurfaceFlinger要在自己的圖像緩存上合成最終畫面并提交到屏幕顯示.因此它們申請圖像緩存的類型也不一樣,具體表現(xiàn)為usage flags參數(shù)的區(qū)別.SurfaceFlinger是GRALLOC_-USAGE_HW_FB,而App的則是其他類型.因此,需要在App和SurfaceFlinger之間傳遞的App的圖像緩存是從Ashmem申請的共享內(nèi)存,而SurfaceFlinger的圖像緩存則是Framebuffer.但在arm架構(gòu)下,兩者實際上都位于系統(tǒng)內(nèi)存之上.App的畫面渲染完成時會通過Ashmem共享內(nèi)存換地給SurfaceFlinger,而Surface-Flinger在畫面合成完畢時會調(diào)用Framebuffer的pageflip機(jī)制將新生成的畫面更新到屏幕顯示.

    2.3 Android的本地窗口Surface

    本地窗口是EGL中的概念,EGL為了保證OpenGL ES的平臺獨立性,需要適應(yīng)各種操作系統(tǒng)下的本地窗口.ANativeWindow是Android系統(tǒng)定義的本地窗口,也是EGL的Android平臺適配窗口,其中定義了獲取和釋放圖像緩存的接口.圖像緩存用ANative-WindowBuffer其定義,它描述了窗口的基本信息如寬度、高度、像素格式等基本信息.實際圖像緩存的地址和句柄buffer_handle_t結(jié)構(gòu)體描述.Surface是應(yīng)用層次的本地窗口,不論是App還是SurfaceFlinger,Android上的所有圖形程序都需要有自己的Surface,而Surface的作用就是給EGL層提供ANativeWindow的接口.上層應(yīng)用即可通過這些接口獲取和釋放圖像緩存.

    3 在x86架構(gòu)下運行SurfaceFlinger

    要讓SurfaceFlinger能在X Window的環(huán)境下運行,首先要解決的問題是如何讓SurfaceFlinger在x86架構(gòu)的Linux內(nèi)核之上運行.Androidx86項目很好地解決了SurfaceFlinger在x86架構(gòu)下運行的問題.Android系統(tǒng)主要是為arm架構(gòu)設(shè)計的,arm架構(gòu)下的GPU沒有自己的獨立顯存,SurfaceFlinger通過Surface申請的的Framebuffer硬件緩存仍然是系統(tǒng)內(nèi)存的一部分.而x86架構(gòu)下,GPU有自己的專屬獨立圖顯存.SurfaceFlinger本身基于OpenGL ES實現(xiàn),要使用x86架構(gòu)的GPU進(jìn)行硬件加速,就需要有可以在x86架構(gòu)下運行的OpenGL ES實現(xiàn).因此Androidx86項目在圖形系統(tǒng)方面的主要工作有兩點:1)使用Mesa作為OpenGLES實現(xiàn); 2)實現(xiàn)了gralloc.drm.so.

    3.1 Mesa和EGL

    DRI是一個使應(yīng)用程序在X Window系統(tǒng)的環(huán)境下直接發(fā)訪問圖形硬件的框架.其實現(xiàn)分散在X Server和它的客戶端共享庫Xlib、Mesa以及DRM內(nèi)核子系統(tǒng)中[8].Mesa在DRI框架中扮演了GPU驅(qū)動的角色,因此Androidx86選擇Mesa作為OpenGL ES的實現(xiàn).但是Mesa默認(rèn)只支持X Window系統(tǒng)的本地窗口,而不支持Android的本地窗口ANativeWindow.在Mesa的架構(gòu)中,EGL是OpenGL ES和本地窗口之間的一個中間層,其作用之一是保證OpenGL ES的平臺獨立性.因此Androidx86在Mesa EGL中添加了對ANative-Window的支持(platform_android.c),使得Mesa可以通過Surface獲取ANativeWindow.因此本文中借用Android對Mesa EGL的擴(kuò)展實現(xiàn)對Android本地窗口的支持.

    3.2 gralloc.drm.so

    在X Window環(huán)境下,一個桌面OpenGL ES程序的圖像緩存是由Mesa EGL的DRI驅(qū)動(platform_x11.c)借用X11的DRI2擴(kuò)展通過X Server的DDX驅(qū)動向內(nèi)核申請的.而在Android系統(tǒng)中,實際圖像緩存申請操作是由GraphicBuffer類調(diào)用HAL層的gralloc完成的.在arm架構(gòu)下,gralloc為應(yīng)用申請的圖像緩存來自Ashmem共享內(nèi)存,而為SurfaceFlinger申請的圖像緩存來自Framebuffer,這些圖像緩存本身都位于系統(tǒng)內(nèi)存,而Mesa無法基于系統(tǒng)內(nèi)存調(diào)用GPU進(jìn)行硬件加速.這一點也從側(cè)面說明文獻(xiàn)[2]中的移植方法不支持硬件加速.gralloc.drm.so基于libdrm,實現(xiàn)了從x86架構(gòu)的獨立顯存為應(yīng)用程序和SurfaceFlinger申請圖像緩存.libdrm是內(nèi)核DRM子系統(tǒng)的用戶態(tài)共享庫,應(yīng)用程序可以通過libdrm調(diào)用內(nèi)核的GEM模塊來創(chuàng)建圖像緩存對象,在用戶態(tài)使用一個GEM句柄(本質(zhì)是一個整數(shù))作為圖像緩存的引用.因此在arm架構(gòu)下,buffer_handle_t包含的是圖像緩存的首地址,而在x86架構(gòu)下包含的則是GEM句柄.這時,在Androidx86系統(tǒng)中,不論是App還是SurfaceFlinger,通過graloc.drm.so申請圖像緩存的過程是一樣的,并不會因為alloc()接口的usage flags參數(shù)不同而不同.另一方面,在Androidx86環(huán)境下,SurfaceFlinger會占用整個屏幕作為其畫面輸出的目標(biāo).這樣無法和桌面Linux發(fā)行版的X Window系統(tǒng)兼容.因此,要讓SurfaceFlinger的合成畫面在X Window系統(tǒng)的窗口中顯示,就需要將SurfaceFlinger的角色由Android窗口合成器降級為X Window系統(tǒng)的應(yīng)用程序.

    4 在X Window的環(huán)境下運行SurfaceFlinger

    X Window系統(tǒng)是桌面Linux系統(tǒng)的標(biāo)準(zhǔn)圖形系統(tǒng)[9].它采用C/S架構(gòu),客戶端程序基于Xlib和X Server通過TCP連接通信,如果客戶端程序和X Server位于統(tǒng)一系統(tǒng)上,則使用IPC通信.因為X Window系統(tǒng)為分布式環(huán)境而設(shè)計,客戶端程序通過Xlib向X Server申請的資源(例如一個窗口)位于X Server中,客戶端程序只能拿到該資源的一個整數(shù)ID作為引用.

    在Androidx86中,SurfaceFlinger在初始化時直接作為DRM Master,進(jìn)行KMS設(shè)置,這樣會與X Server發(fā)生沖突.因為在一個桌面Linux系統(tǒng)中只允許有一個DRM Master.在畫面需要更新到屏幕是直接調(diào)用drm的pageflip機(jī)制進(jìn)行屏幕畫面刷新,并且Surface-Flinger合成的畫面會顯示到整個屏幕上.現(xiàn)在我們要讓SurfaceFlinger在X Window系統(tǒng)的環(huán)境下運行,具體而言是讓SurfaceFlinger將更新后的圖像緩存提交到一個窗口中顯示.

    4.1 移植方案

    首先SurfaceFlinger需要有自己的窗口,此時SurfaceFlinger需要調(diào)用X Window的客戶端共享庫,而采用NDK編譯的SurfaceFlinger的ELF文件無法使用桌面Linux的默認(rèn)動態(tài)鏈接器和已安裝的Xlib共享庫[1].因此需要將Xlib的源碼轉(zhuǎn)換為Android項目并使用NDK進(jìn)行編譯,并基于移植的Xlib在HAL實現(xiàn)了xwindow.default.so模塊.SurfaceFlinger即可使用xwindow.default.so模塊創(chuàng)建自己的窗口.

    當(dāng)SurfaceFlinger需要將自己的Surface中的最新的GraphicBuffer提交窗口時,在SurfaceFlinger進(jìn)程中已有兩個資源,一是通過GraphicBuffer的buffer_handle_t中獲取的圖像緩存標(biāo)識GEM句柄,一是標(biāo)識窗口的整數(shù)ID.一個直觀的方法是利用libdrm將GEM句柄描述的圖像緩存映射到系統(tǒng)內(nèi)存空間,將這段空間封裝成XImage最后通過Xlib提交到X Server顯示.

    XImage和Pixmap的區(qū)別是前者位于客戶端進(jìn)程而后者位于X Server進(jìn)程.XImage是一個結(jié)構(gòu)體,包含了位圖的各種格式、大小等信息,同時還有一個指針指向像素數(shù)據(jù)所在的內(nèi)存地址.所以我們可以根據(jù)圖像緩存在系統(tǒng)內(nèi)存空間的映射來構(gòu)造這個XImage,然后讓這個XImage顯示在SurfaceFlinger的窗口中.這個XImage最終要通過Xlib傳給X Server,由X Server顯示出來.但不論是TCP連接還是IPC機(jī)制,傳遞大塊內(nèi)存的效率較低.所以我們使用了X11的共享內(nèi)存擴(kuò)展MIT-SHM[10].這樣,XImage就可以通過共享內(nèi)存?zhèn)鬟f給X Server.相比于文獻(xiàn)[2]的架構(gòu),本架構(gòu)下畫面更新頻率由HWComposer中用于模擬硬件VSync信號的VSyncThread的信號頻率決定(一般為60FPS,和顯示屏刷新率保持一致),而不需要額外的同步信號控制,也不需要額外的圖像顯示進(jìn)程,因此總體架構(gòu)更為簡潔.

    4.2 優(yōu)化方案

    在各種GPU上測試時發(fā)現(xiàn),只有在Intel集成顯卡上畫面刷新頻率能達(dá)到60FPS,而Nvidia和AMD獨立顯卡上畫面十分卡頓.在上述移植方案中,App和SurfaceFlinger從Surface獲取的圖像緩存都是通過libdrm向內(nèi)核的GEM模塊申請的,因此基于Mesa的App的UI渲染過程和SurfaceFlinger的畫面合成過程是使用GPU進(jìn)行硬件加速的.問題在于將GEM句柄標(biāo)識的圖像緩存映射到系統(tǒng)內(nèi)存空間并封裝到XImage的過程需要將圖像緩存從獨立顯存讀取到系統(tǒng)內(nèi)存,這個過程的延遲較大.在該方法下,每次畫面更新都需要拷貝一次,因此拖慢了畫面刷新頻率.

    優(yōu)化的思路來自于對桌面上基于Mesa的圖形程序架構(gòu)的思考.基于X Window系統(tǒng)的圖形程序申請圖像緩存是由X Server端的DDX驅(qū)動完成的,本質(zhì)仍然是通過libdrm調(diào)用GEM內(nèi)核模塊創(chuàng)建顯存對象.而桌面上基于Mesa的圖形程序調(diào)用eglSwapBuffers()進(jìn)行畫面更新時,EGL的DRI驅(qū)動并沒有將圖像緩存拷貝到系統(tǒng)內(nèi)存,但是畫面仍然能在一個由X Window系統(tǒng)創(chuàng)建的窗口中更新.因此桌面Linux上基于Mesa的圖形程序的圖像緩存的申請和更新是由Mesa和X Window協(xié)同完成的.其原理在于,在DRI架構(gòu)中,X Server提供X11協(xié)議的DRI2擴(kuò)展,用于DRI客戶端進(jìn)行窗口系統(tǒng)和DDX驅(qū)動的協(xié)調(diào)[8,11].因此,在上文移植方案的基礎(chǔ)上需要做兩點改進(jìn):1)在gralloc.drm.so中區(qū)分App和SurfaceFlinger圖像緩存申請方式,App直接使用libdrm向內(nèi)核GEM模塊申請,而Surface-Flinger使用DRI2擴(kuò)展接口通過DDX驅(qū)動申請; 2)SurfaceFlinger進(jìn)行畫面更新時不再直接使用DRM的pageflip接口,而使用DRI2擴(kuò)展的緩存交換接口.這樣就不需要將SurfaceFlinger的圖像緩存拷貝到系統(tǒng)內(nèi)存了,因此是一種完全支持硬件加速的架構(gòu).

    5 性能測試

    系統(tǒng)性能測試方法是運行一個以Surface為本地窗口的Android OpenGL ES圖形程序,測量其在一段時間內(nèi)的平均幀率(FPS).同時測量該程序的CPU負(fù)載.采用San Angeles Observation作為基準(zhǔn)測試軟件,后文簡稱Angeles.Angeles基于OpenGL ES1.0實現(xiàn),每次運行約109秒,結(jié)束后會自動給出該時間內(nèi)的總幀數(shù)和幀率.系統(tǒng)部署平臺選取了三臺GPU分別由Intel、Nvidia和AMD制造的PC.三臺PC均運行Linux Mint 17.3操作系統(tǒng),并使用開啟了Binder驅(qū)動的版本號為4.2.6的Linux內(nèi)核.各PC的關(guān)鍵硬件參數(shù)如表1所示.實驗方案是以800*480、1280*720 兩種分辨率大小的窗口,分別在各PC以優(yōu)化前和優(yōu)化兩種架構(gòu)運行Angeles程序,并采集運行期間Surface-Flinger和Angeles的CPU占用情況.

    表1 測試主機(jī)關(guān)鍵參數(shù)

    從表2和表3可以看出,不論是在哪種分辨率下,優(yōu)化前只有PC1的幀率能到達(dá)60FPS的速度,PC2和PC3的幀率均小于30FPS.幀率低于30FPS時人眼便能覺察到畫面的卡頓感.原因在于Intel集顯沒有獨立顯存,而是共享系統(tǒng)內(nèi)存,因此每次將顯存拷貝是由系統(tǒng)內(nèi)存的一個地址拷貝到另一個地址,該過程的速度很快,不會拖慢圖像更新頻率.而在PC2和PC3上,顯存的拷貝需要從GPU獨顯拷貝到系統(tǒng)內(nèi)存,此過程耗時較長,拖慢了SurfaceFlinger的畫面更新速率.另一方面,觀察兩種分辨率下的優(yōu)化前的PC2和PC3的幀率變化,發(fā)現(xiàn)分辨率越大,幀率越小,其原因在于分辨率越大,需要拷貝的顯存越大,拷貝時間越長.

    表2 圖形性能測試結(jié)果(800*480)

    表3 圖形性能測試結(jié)果(1280*720)

    優(yōu)化后,在800*480分辨率時,三臺PC均能達(dá)到60FPS幀率,畫面十分流暢.只有在1280*720時,PC2的幀率低于60FPS,其原因是PC2的GPU性能較弱.優(yōu)化后的運行幀率和CPU負(fù)載均優(yōu)于張超等人[2]的實驗結(jié)果.

    從SurfaceFlinger(S)和Angeles(A)的CPU負(fù)載的變化情況分析,不論在哪種分辨率下,優(yōu)化后相較于優(yōu)化前,SurfaceFlinger的CPU負(fù)載降低且均低于2%,而Angeles的CPU負(fù)載升高.原因在于,優(yōu)化前,Surface-Flinger的顯存拷貝過程需要占用大量CPU時間,拖慢了畫面更新速率.在BufferQueue另一端的Angeles程序需要等待SurfaceFlinger交出空閑的GraphicBuffer才能進(jìn)行下一幀的渲染,CPU負(fù)責(zé)也較低.優(yōu)化后,SurfaceFlinger的畫面更新時沒有了圖像緩存的拷貝過程,SurfaceFlinger本身不再是瓶頸,而Angeles在渲染完一幀畫面后可以立即從BufferQueue獲取一個空閑的GraphicBuffer.因此造成這種變化.

    6 結(jié)語

    使Android的圖形系統(tǒng)SurfaceFlinger能夠在桌面Linux發(fā)行版的X Window系統(tǒng)的環(huán)境下運行,是構(gòu)建Android桌面運行環(huán)境的重要環(huán)節(jié).本文給出了一種簡潔高效的移植方案.使用Mesa作為OpenGL ES實現(xiàn),并借助gralloc.drm.so模塊,實現(xiàn)了Android應(yīng)用程序的UI渲染過程和SurfaceFlinger的圖像合成過程能夠使用GPU進(jìn)行硬件加速.同時,使用X11的DRI2擴(kuò)展協(xié)調(diào)SurfaceFlinger的窗口和X Server的DDX驅(qū)動,實現(xiàn)了窗口畫面的快速更新,且避免了SurfaceFlinger圖像緩存由獨立顯存到系統(tǒng)內(nèi)存的拷貝過程.經(jīng)實驗,本移植方案能基于各型GPU進(jìn)行硬件加速,圖形性能相較于已有方案有顯著提升.

    1張超.面向桌面Linux的Android運行環(huán)境構(gòu)建[碩士學(xué)位論文].長沙:國防科學(xué)技術(shù)大學(xué),2012.

    2張超,易曉東,戴華東.Android圖形系統(tǒng)向桌面Linux的移植.2012全國計算機(jī)體系結(jié)構(gòu)學(xué)術(shù)年會論文集.西安,中國.2012.209–213.

    3Inki Dae Software Platform Lab.DRM driver development for embedded systems.http://elinux.org/images/7/71/Elce11_dae.pdf.[2011].

    4Android-x86-porting android to x86.http://www.androidx86.org/.

    5The mesa 3D graphics library.http://www.mesa3d.org/.

    6Direct rendering manager (DRM).https://dri.freedesktop.org/wiki/DRM.

    7Packard K.Gem-the graphics execution manager.2008.https://lwn.net/Articles/283798/.

    8Direct rendering infrastructure.https://en.wikipedia.org/wiki/Direct_Rendering_Infrastructure.

    9Scheifler RW,Gettys J.The X Window system.ACM Trans.on Graphics,1986,5(2):79–109.

    10Corbet J.MIT-SHM-the MIT shared memory extension.https://www.x.org/Releases/X11R7.7/doc/xextproto/shm.html.[1991].

    11H?gsberg K.The DRI2 extension.https://www.x.org/releases/X11R7.7/doc/dri2proto/dri2proto.txt.[2008].

    Method to Run SurfaceFlinger on X Window System

    JIANG Fan,HE Ye-Ping,ZHOU Qi-Ming
    (National Engineering Research Center of Fundamental Software,Institue of Sofware,Chinese Academy of Sciences,Beijing 100190,China)

    This paper presents a method to transplant Android’s graphic system,SurfaceFlinger,to run on desktop Linux distribution’s X Window System.SurfaceFlinger running on X can make UI of the Android applications,running as native processes in the desktop Android runtime,show in a window of X.Using Mesa as the OpenGL ES implementation and making Mesa EGL compatible with Android’s native window,together with gralloc.drm.so module,the Android UI rendering process and SurfaceFlinger’s graphic compositing process can be implemented by using the GPU for hardware acceleration.In addition,using X11’s DRI2 extension to coordinate window of SurfaceFlinger with X Server’s DDX driver,can avoid graphic buffer coping from GPU’s dedicated memory to the system memory.In our experiment,the third-party 3D benchmark software San-Angeles can achieve 60FPS on variety GPUs.Compared with the existing method,the architecture of our method is more concise,efficient,and supportive of hardware acceleration.

    Android graphic system; SurfaceFlinger; X Window system; transplant; compatibility environment

    江帆,賀也平,周啟明.SurfaceFlinger在X Window系統(tǒng)環(huán)境下的運行方案.計算機(jī)系統(tǒng)應(yīng)用,2017,26(10):95–101.http://www.c-sa.org.cn/1003-3254/6012.html

    國家科技重大專項(2012ZX01039-004)

    2017-01-17; 采用時間:2017-02-23

    猜你喜歡
    內(nèi)核調(diào)用桌面
    桌面舞龍
    萬物皆可IP的時代,我們當(dāng)夯實的IP內(nèi)核是什么?
    強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
    基于APP在線控制雙擠出頭FDM桌面3D打印機(jī)的研制
    核電項目物項調(diào)用管理的應(yīng)用研究
    基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
    Linux內(nèi)核mmap保護(hù)機(jī)制研究
    LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
    基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
    利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
    欧美高清成人免费视频www| 黄片wwwwww| 色吧在线观看| 中国美女看黄片| 中文字幕制服av| 天堂网av新在线| 小说图片视频综合网站| 热99在线观看视频| 日韩av在线大香蕉| 亚洲国产精品久久男人天堂| 国产黄片美女视频| 欧美bdsm另类| 一区二区三区免费毛片| 久久久a久久爽久久v久久| 亚洲经典国产精华液单| 男人舔女人下体高潮全视频| 免费大片18禁| 桃色一区二区三区在线观看| 伊人久久精品亚洲午夜| 亚洲欧美成人综合另类久久久 | 久久精品国产99精品国产亚洲性色| 成人午夜精彩视频在线观看| 身体一侧抽搐| 九色成人免费人妻av| 国产精华一区二区三区| 天堂网av新在线| 天堂中文最新版在线下载 | 极品教师在线视频| 免费无遮挡裸体视频| 久久国产乱子免费精品| 色播亚洲综合网| 嘟嘟电影网在线观看| 免费av观看视频| 91午夜精品亚洲一区二区三区| 久久精品影院6| 午夜精品在线福利| 国产精品野战在线观看| 亚洲激情五月婷婷啪啪| 国产精品精品国产色婷婷| 美女 人体艺术 gogo| 国产欧美日韩精品一区二区| 久久热精品热| 色综合站精品国产| 成年免费大片在线观看| av在线亚洲专区| 国产一级毛片七仙女欲春2| 特大巨黑吊av在线直播| av女优亚洲男人天堂| 丝袜美腿在线中文| 久久6这里有精品| 国产高清有码在线观看视频| av在线观看视频网站免费| 26uuu在线亚洲综合色| av天堂在线播放| .国产精品久久| 天天躁夜夜躁狠狠久久av| 亚洲国产精品久久男人天堂| 乱系列少妇在线播放| 麻豆精品久久久久久蜜桃| 直男gayav资源| 99久久精品一区二区三区| 岛国毛片在线播放| 中文字幕av成人在线电影| 美女大奶头视频| av又黄又爽大尺度在线免费看 | 天天躁夜夜躁狠狠久久av| 最新中文字幕久久久久| 丰满乱子伦码专区| 日韩高清综合在线| 成年免费大片在线观看| 又爽又黄a免费视频| 变态另类成人亚洲欧美熟女| 亚洲自偷自拍三级| 热99re8久久精品国产| 国产午夜精品一二区理论片| av免费观看日本| 一区二区三区四区激情视频 | 日韩三级伦理在线观看| 欧美xxxx性猛交bbbb| 欧美高清成人免费视频www| 久久99精品国语久久久| 免费搜索国产男女视频| 真实男女啪啪啪动态图| 亚洲精品自拍成人| 岛国在线免费视频观看| 国产色爽女视频免费观看| 亚洲中文字幕一区二区三区有码在线看| 亚洲熟妇中文字幕五十中出| 中文字幕精品亚洲无线码一区| 国产av麻豆久久久久久久| 亚洲av中文av极速乱| 欧美性猛交╳xxx乱大交人| 欧美丝袜亚洲另类| 欧美激情国产日韩精品一区| 日韩欧美一区二区三区在线观看| 国产片特级美女逼逼视频| 国产欧美日韩精品一区二区| 婷婷色综合大香蕉| 99久国产av精品国产电影| 99热精品在线国产| 2022亚洲国产成人精品| 天天躁日日操中文字幕| 午夜精品一区二区三区免费看| 1000部很黄的大片| 一夜夜www| 午夜精品国产一区二区电影 | 岛国在线免费视频观看| 国产成人精品一,二区 | 级片在线观看| 悠悠久久av| 久久久久久久午夜电影| 亚洲欧美精品综合久久99| 亚洲av二区三区四区| 亚洲av男天堂| 中文字幕精品亚洲无线码一区| 国产成人一区二区在线| 国内揄拍国产精品人妻在线| 国产片特级美女逼逼视频| 国产精品人妻久久久久久| 亚洲自拍偷在线| 12—13女人毛片做爰片一| 国产亚洲av片在线观看秒播厂 | 女人被狂操c到高潮| 伦理电影大哥的女人| 精华霜和精华液先用哪个| 好男人视频免费观看在线| 国产成人a区在线观看| 一进一出抽搐gif免费好疼| 综合色av麻豆| 三级毛片av免费| 欧美激情国产日韩精品一区| 久久久久久久久大av| 日本欧美国产在线视频| 搞女人的毛片| 亚洲18禁久久av| 99热6这里只有精品| 欧美人与善性xxx| 搡女人真爽免费视频火全软件| 好男人视频免费观看在线| 亚洲在线观看片| 亚洲精品日韩在线中文字幕 | 亚洲国产高清在线一区二区三| 国产成人福利小说| 成人亚洲精品av一区二区| 精品不卡国产一区二区三区| 最近视频中文字幕2019在线8| 男人狂女人下面高潮的视频| 夜夜看夜夜爽夜夜摸| 久久久久久国产a免费观看| 成人鲁丝片一二三区免费| 看十八女毛片水多多多| 欧美一区二区国产精品久久精品| 99热这里只有精品一区| 在线观看av片永久免费下载| 免费搜索国产男女视频| 国产激情偷乱视频一区二区| 久久亚洲精品不卡| 1024手机看黄色片| 国产探花极品一区二区| 亚洲综合色惰| 美女高潮的动态| 三级男女做爰猛烈吃奶摸视频| 天堂√8在线中文| 色视频www国产| 婷婷精品国产亚洲av| 久久人人爽人人爽人人片va| 成年av动漫网址| 亚洲第一区二区三区不卡| 噜噜噜噜噜久久久久久91| 一卡2卡三卡四卡精品乱码亚洲| 国产亚洲精品久久久久久毛片| 精品久久国产蜜桃| 亚洲第一电影网av| 亚洲自拍偷在线| 一本久久精品| 国产亚洲精品av在线| 国产高清激情床上av| 国产精品久久久久久精品电影小说 | 亚洲人成网站在线观看播放| www.色视频.com| 麻豆成人午夜福利视频| 婷婷精品国产亚洲av| 国产一区二区激情短视频| 最近2019中文字幕mv第一页| 中文字幕av在线有码专区| 欧美日韩国产亚洲二区| 国产69精品久久久久777片| 久久精品久久久久久久性| 亚洲三级黄色毛片| 成年版毛片免费区| 91午夜精品亚洲一区二区三区| 亚洲精品色激情综合| 日本免费a在线| 亚洲av男天堂| 欧美日韩乱码在线| 欧美一区二区亚洲| 在线免费观看不下载黄p国产| 国产av麻豆久久久久久久| 成人毛片a级毛片在线播放| 亚洲av免费在线观看| 日本av手机在线免费观看| 久久人人精品亚洲av| 国产男人的电影天堂91| 国模一区二区三区四区视频| 欧美另类亚洲清纯唯美| 亚洲,欧美,日韩| 蜜臀久久99精品久久宅男| 淫秽高清视频在线观看| 国产中年淑女户外野战色| 欧美变态另类bdsm刘玥| 亚洲激情五月婷婷啪啪| 亚洲精品国产成人久久av| 韩国av在线不卡| 国产成人午夜福利电影在线观看| 亚洲激情五月婷婷啪啪| 日韩强制内射视频| 99热这里只有是精品在线观看| av在线亚洲专区| 精品人妻视频免费看| 亚洲av熟女| 国内久久婷婷六月综合欲色啪| .国产精品久久| 我的女老师完整版在线观看| 极品教师在线视频| 悠悠久久av| 丝袜美腿在线中文| 国产伦理片在线播放av一区 | 1024手机看黄色片| 女同久久另类99精品国产91| 偷拍熟女少妇极品色| 亚洲av成人精品一区久久| 91av网一区二区| 国产亚洲精品久久久com| 国产伦一二天堂av在线观看| 国产成人精品婷婷| av黄色大香蕉| 男女下面进入的视频免费午夜| 成人性生交大片免费视频hd| 欧美日韩一区二区视频在线观看视频在线 | 热99re8久久精品国产| 欧美日韩综合久久久久久| 青春草亚洲视频在线观看| 国产综合懂色| 国产伦精品一区二区三区视频9| 人妻系列 视频| 中文亚洲av片在线观看爽| 美女xxoo啪啪120秒动态图| 国产色爽女视频免费观看| 亚洲精品成人久久久久久| 久99久视频精品免费| 免费av不卡在线播放| 偷拍熟女少妇极品色| 啦啦啦观看免费观看视频高清| 秋霞在线观看毛片| 亚洲人成网站在线播放欧美日韩| 亚洲av熟女| 免费av观看视频| 国产一区亚洲一区在线观看| 国产大屁股一区二区在线视频| 日韩欧美精品v在线| 简卡轻食公司| 国产精品.久久久| 亚洲熟妇中文字幕五十中出| 久久久a久久爽久久v久久| 3wmmmm亚洲av在线观看| 又爽又黄无遮挡网站| 一区二区三区高清视频在线| 男人的好看免费观看在线视频| 天天一区二区日本电影三级| 久久久久久国产a免费观看| 亚洲天堂国产精品一区在线| 草草在线视频免费看| 啦啦啦啦在线视频资源| av在线观看视频网站免费| 麻豆国产av国片精品| 看十八女毛片水多多多| av在线播放精品| 天堂av国产一区二区熟女人妻| 丰满的人妻完整版| 国产91av在线免费观看| 少妇丰满av| 麻豆精品久久久久久蜜桃| 成人毛片60女人毛片免费| videossex国产| 免费看光身美女| 日韩强制内射视频| 午夜免费男女啪啪视频观看| 九色成人免费人妻av| 国产亚洲av片在线观看秒播厂 | 国产黄片美女视频| 免费观看人在逋| 天堂av国产一区二区熟女人妻| 99热只有精品国产| 国产色爽女视频免费观看| 久久亚洲精品不卡| 国产精品久久电影中文字幕| 午夜a级毛片| 成年免费大片在线观看| 日韩一本色道免费dvd| 午夜福利视频1000在线观看| 国产亚洲精品久久久久久毛片| 69av精品久久久久久| 伦精品一区二区三区| 91久久精品国产一区二区三区| 亚洲av成人精品一区久久| www.色视频.com| 女的被弄到高潮叫床怎么办| 欧美日本亚洲视频在线播放| 夜夜夜夜夜久久久久| 日本免费一区二区三区高清不卡| 午夜爱爱视频在线播放| 亚洲成人久久性| 亚洲精品国产av成人精品| 国产白丝娇喘喷水9色精品| 综合色丁香网| 欧美日本视频| 听说在线观看完整版免费高清| 亚洲三级黄色毛片| 少妇的逼好多水| 久久久a久久爽久久v久久| 国产蜜桃级精品一区二区三区| 亚洲av不卡在线观看| 亚洲欧美日韩无卡精品| 啦啦啦啦在线视频资源| 成人三级黄色视频| 国产精品伦人一区二区| 深夜a级毛片| 秋霞在线观看毛片| 亚洲真实伦在线观看| 国产美女午夜福利| 国产三级中文精品| 麻豆乱淫一区二区| 亚洲乱码一区二区免费版| 热99re8久久精品国产| 久久久久久九九精品二区国产| 一本一本综合久久| 99久久久亚洲精品蜜臀av| 在现免费观看毛片| av在线蜜桃| 一区二区三区免费毛片| 99久久九九国产精品国产免费| 噜噜噜噜噜久久久久久91| 国内精品久久久久精免费| 国产伦精品一区二区三区视频9| 又爽又黄无遮挡网站| 亚洲激情五月婷婷啪啪| 精品人妻熟女av久视频| 欧美精品一区二区大全| 国产老妇伦熟女老妇高清| 黄色日韩在线| 69av精品久久久久久| 不卡视频在线观看欧美| 午夜亚洲福利在线播放| 亚洲无线观看免费| 欧美性猛交╳xxx乱大交人| 国产欧美日韩精品一区二区| 久久人人爽人人爽人人片va| 国产日韩欧美在线精品| 国产精品,欧美在线| 麻豆乱淫一区二区| 亚洲性久久影院| 午夜福利成人在线免费观看| 国产精品一区二区在线观看99 | 三级经典国产精品| 久久亚洲精品不卡| 成人无遮挡网站| 欧美+日韩+精品| a级毛片免费高清观看在线播放| 国产成人精品一,二区 | 久久这里有精品视频免费| 久久精品国产清高在天天线| av黄色大香蕉| 97超视频在线观看视频| 丝袜喷水一区| 国产精品免费一区二区三区在线| 尤物成人国产欧美一区二区三区| 搡女人真爽免费视频火全软件| 99久国产av精品| 自拍偷自拍亚洲精品老妇| 热99re8久久精品国产| 成人毛片a级毛片在线播放| 国内精品宾馆在线| 永久网站在线| 日韩亚洲欧美综合| 亚洲中文字幕一区二区三区有码在线看| 国模一区二区三区四区视频| 国产老妇女一区| 在线观看午夜福利视频| 成人特级黄色片久久久久久久| 亚洲欧美清纯卡通| 国产精品综合久久久久久久免费| 国产中年淑女户外野战色| 99国产极品粉嫩在线观看| 青春草国产在线视频 | 国产精品一区www在线观看| 一区二区三区高清视频在线| 日韩 亚洲 欧美在线| 欧美又色又爽又黄视频| 如何舔出高潮| 免费av毛片视频| 乱码一卡2卡4卡精品| 久久久久久久久久黄片| a级一级毛片免费在线观看| 狂野欧美激情性xxxx在线观看| 在线播放无遮挡| 少妇裸体淫交视频免费看高清| 天天一区二区日本电影三级| 中国美女看黄片| 久久精品91蜜桃| 成人av在线播放网站| 此物有八面人人有两片| 婷婷色av中文字幕| 久久99热这里只有精品18| 一本精品99久久精品77| АⅤ资源中文在线天堂| 国产亚洲精品av在线| 嫩草影院新地址| 国产精品一区二区三区四区免费观看| 一本久久中文字幕| 久久热精品热| 嘟嘟电影网在线观看| 国产精品av视频在线免费观看| 久久精品国产鲁丝片午夜精品| 99热只有精品国产| 久久热精品热| a级毛色黄片| 婷婷色综合大香蕉| 亚洲天堂国产精品一区在线| 有码 亚洲区| 久久亚洲国产成人精品v| 嫩草影院新地址| 波野结衣二区三区在线| 1024手机看黄色片| 亚洲av中文av极速乱| 一级av片app| 亚洲美女视频黄频| 69av精品久久久久久| 欧美日韩综合久久久久久| 1024手机看黄色片| 久久99蜜桃精品久久| 亚洲av不卡在线观看| 久久精品国产清高在天天线| a级一级毛片免费在线观看| 深爱激情五月婷婷| 伦理电影大哥的女人| 亚洲精品国产av成人精品| 一进一出抽搐gif免费好疼| 国产成人aa在线观看| 国产高潮美女av| 一本一本综合久久| 成人无遮挡网站| 日日摸夜夜添夜夜添av毛片| 搡女人真爽免费视频火全软件| 一进一出抽搐动态| 一个人看视频在线观看www免费| 国产成人精品婷婷| 久久久久久久久久久丰满| 亚洲欧美日韩东京热| 亚洲内射少妇av| 国产综合懂色| 九九久久精品国产亚洲av麻豆| 99久久无色码亚洲精品果冻| 国产伦一二天堂av在线观看| 丰满乱子伦码专区| 免费人成在线观看视频色| 免费不卡的大黄色大毛片视频在线观看 | 亚洲国产精品合色在线| 观看美女的网站| 国产精品不卡视频一区二区| 亚洲精品国产成人久久av| 我要搜黄色片| 亚洲人成网站在线观看播放| 九九热线精品视视频播放| 日韩在线高清观看一区二区三区| 久久精品综合一区二区三区| 一级毛片aaaaaa免费看小| 国产精品三级大全| 免费观看精品视频网站| 中文精品一卡2卡3卡4更新| 天堂影院成人在线观看| 日韩精品有码人妻一区| 国产单亲对白刺激| 亚洲乱码一区二区免费版| 日本撒尿小便嘘嘘汇集6| 日韩人妻高清精品专区| 男人和女人高潮做爰伦理| 小说图片视频综合网站| av卡一久久| 国产精品国产高清国产av| av在线播放精品| 不卡视频在线观看欧美| 国产精品女同一区二区软件| 人人妻人人看人人澡| 一级毛片电影观看 | 亚洲欧美日韩高清专用| 熟女电影av网| 亚洲精品久久国产高清桃花| 亚洲色图av天堂| 免费搜索国产男女视频| 黄色日韩在线| av卡一久久| 天堂中文最新版在线下载 | 能在线免费观看的黄片| 边亲边吃奶的免费视频| 久久九九热精品免费| 国产老妇女一区| 男女视频在线观看网站免费| 九草在线视频观看| 卡戴珊不雅视频在线播放| 国产精品一区二区三区四区免费观看| 精品免费久久久久久久清纯| 麻豆成人av视频| 久久综合国产亚洲精品| 欧美日本视频| 欧美一区二区亚洲| 国产伦在线观看视频一区| 九九热线精品视视频播放| 亚洲成av人片在线播放无| 狂野欧美激情性xxxx在线观看| 国产精品不卡视频一区二区| 欧美一区二区亚洲| 日韩国内少妇激情av| 国产高清有码在线观看视频| 色综合色国产| 国产精品久久视频播放| 在线观看免费视频日本深夜| 一本久久中文字幕| 成人毛片60女人毛片免费| 国产精品久久久久久精品电影小说 | eeuss影院久久| 精品久久久久久久久久免费视频| 18禁在线播放成人免费| 熟女电影av网| 国产单亲对白刺激| 长腿黑丝高跟| 黄色一级大片看看| 久99久视频精品免费| 亚洲欧美成人综合另类久久久 | 亚洲精品久久久久久婷婷小说 | 午夜免费男女啪啪视频观看| 美女内射精品一级片tv| 亚洲精品自拍成人| 久久精品国产鲁丝片午夜精品| 国产精品爽爽va在线观看网站| 国产高清不卡午夜福利| 国产精品一二三区在线看| 一本—道久久a久久精品蜜桃钙片 精品乱码久久久久久99久播 | 免费不卡的大黄色大毛片视频在线观看 | 成人鲁丝片一二三区免费| 久久久久久久久久黄片| 不卡视频在线观看欧美| 国产精品久久久久久精品电影小说 | 波多野结衣高清作品| 成人高潮视频无遮挡免费网站| 国产精品嫩草影院av在线观看| 国产真实伦视频高清在线观看| 成人综合一区亚洲| 欧美激情在线99| 欧美+亚洲+日韩+国产| 亚洲第一电影网av| 国产精品女同一区二区软件| 午夜福利在线观看免费完整高清在 | 国产高潮美女av| 亚洲久久久久久中文字幕| 综合色av麻豆| 你懂的网址亚洲精品在线观看 | 亚洲欧美日韩东京热| 简卡轻食公司| www.色视频.com| 伦精品一区二区三区| 麻豆国产av国片精品| 久久亚洲精品不卡| 欧美日本视频| 精品欧美国产一区二区三| 精品久久久久久久久亚洲| 成人午夜精彩视频在线观看| 国模一区二区三区四区视频| 亚洲自拍偷在线| 免费人成在线观看视频色| 18禁在线无遮挡免费观看视频| 久久99精品国语久久久| 黄色欧美视频在线观看| 卡戴珊不雅视频在线播放| 99国产极品粉嫩在线观看| 亚洲av成人精品一区久久| 亚洲aⅴ乱码一区二区在线播放| 男人舔奶头视频| 观看免费一级毛片| 久久6这里有精品| 久久欧美精品欧美久久欧美| 久久久久久久亚洲中文字幕| 丝袜美腿在线中文| 日日啪夜夜撸| 国产成人精品一,二区 | 成人毛片a级毛片在线播放| 久久久久久久久久久丰满| 我要搜黄色片| 久久热精品热| 久久久a久久爽久久v久久| 久久6这里有精品| 99国产极品粉嫩在线观看| 精品久久久噜噜| 亚洲高清免费不卡视频| 日韩欧美精品v在线| a级一级毛片免费在线观看| 午夜免费激情av| 欧美bdsm另类| 中国美白少妇内射xxxbb| 亚洲国产色片| 美女国产视频在线观看| 天天一区二区日本电影三级| 午夜激情福利司机影院| 亚洲国产欧美在线一区| 亚洲经典国产精华液单| 女人被狂操c到高潮|