日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

android surfaceflinger研究----显示系统

發布時間:2025/3/15 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android surfaceflinger研究----显示系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 這周抽空研究了一下SurfaceFlinger,發現真正復雜的并不是SurfaceFlinger本身,而是Android的display顯示系統,網上關于這部分的介紹有不少,本不打算寫的,但是發現還是記錄一下研究代碼的過程比較好,一是能夠幫助自己理清思路,另一個原因就是以后當這塊內容忘記的時候,能快速的通過這個記錄撿起來。

? ? 一. ?android顯示系統的建立

我們看SurfaceFlinger的定義就知道,它其實是一個Thread, 因此SurfaceFlinger的初始化工作就理所當然的放在了SurfaceFlinger線程中,詳見readyToRun()@SurfaceFlinger.cpp

? ??SurfaceFlinger對于顯示的管理是通過一個或多個GraphicPlane對象(目前android只實現了一個)來管理的,

@SurfaceFlinger.h

[cpp]?view plaincopy
  • GraphicPlane????????????????mGraphicPlanes[1];??
  • ? ? 其實,GraphicPlane類只是一個wrapper層,目的是當android支持多個顯示系統時,通過該類來管里各自的圖形系統,顯示系統真正的初始化工作是通過DisplayHardware類來初始化底層圖形系統的管理與顯示的。真正的圖形顯示系統的初始化在init()@DisplayHardware.cpp 目前,android支持一個圖形系統,這個圖形系統是全局的,surfaceflinger可以訪問,其他不通過surfaceflinger進行圖形處理的application也可以對其進行操作。


    ? ? 1. FrameBuffer的建立

    ? ??framebuffer,確切的是說是linux下的framebuffer,,它是linux圖形顯示系統中一個與圖形硬件無關的抽象層,user完全不用考慮我們的硬件設備,而僅僅使用framebuffer就可以實現對屏幕的操作。

    ? ? android的framebuffer并沒有被SurfaceFlinger直接使用,而是在framebuffer外做了一層包裝,這個包裝就是FramebufferNativeWindow,我們來看一下FramebufferNativeWindow的創建過程。

    ? ?我們的framebuffer是由一個設備符fbDev來表示的,它是FramebufferNativeWindow的一個成員,我們來分析一下對fbDev的處理過程。

    ? ? 1.1. fbDev設備符

    ? ? 1.1.1?gralloc library

    ? ? 在這之前,先介紹一下gralloc library,它的形態如grallocBOARDPLATFORM.so,?BOARDPLATFORM可以從屬性ro.board.platform中獲得,這篇文章中我們以Qualcomm?msmx7x30為例,也就是gralloc.msm7x30.so中,它的源路徑在hardware/msm7k/libgralloc-qsd8k。

    ? ? framebuffer的初始化需要通過HAL?gralloc.msm7x30.so 來完成與底層硬件驅動的適配,但是gralloc library并不是平臺無關的,不同的vendor可能會實現自己的gralloc library,因此為了保證在創建framebuffer時能夠平臺無關,android只能是動態的判斷并使用當前的gralloc library,android通過從gralloc library中再抽象出一個hw_module_t結構來供使用,它為framebuffer的初始化提供了需要的gralloc.msm7x30.so業務。因此通過這個hw_module_t結構我們就不需要知道當前系統使用的到底是哪個gralloc library。按規定,所有gralloc library中的這個結構體被命名為HAL_MODULE_INFO_SYM(HMI)。當前分析的系統中,HAL_MODULE_INFO_SYM在hardware/msm7k/libgralloc-qsd8k/galloc.cpp。

    ? ? 1.1.2?打開fbDev設備符? ??

    ? ? 下面看如何打開?打開fbDev設備符。通過HAL_MODULE_INFO_SYM提供的gralloc.msm7x30.so的接口我們調用到了fb_device_open()@hardware/msm7k/libgralloc-qsd8kframebuffer.cpp。


    [cpp]?view plaincopy
  • int?fb_device_open(hw_module_t?const*?module,?const?char*?name,??
  • ????????hw_device_t**?device)??
  • {??
  • ????int?status?=?-EINVAL;??
  • ????if?(!strcmp(name,?GRALLOC_HARDWARE_FB0))?{??
  • ????????alloc_device_t*?gralloc_device;??
  • ????????status?=?gralloc_open(module,?&gralloc_device);??
  • ??
  • ????????/*?initialize?our?state?here?*/??
  • ????????fb_context_t?*dev?=?(fb_context_t*)malloc(sizeof(*dev));??
  • ????????memset(dev,?0,?sizeof(*dev));??
  • ??
  • ????????/*?initialize?the?procs?*/??
  • ????????dev->device.common.tag?=?HARDWARE_DEVICE_TAG;??
  • ??
  • ????????private_module_t*?m?=?(private_module_t*)module;??
  • ????????status?=?mapFrameBuffer(m);??
  • ??
  • }??

  • 在這個函數中,主要為fbDev設備符指定一個fb_context_t實例,并通過函數mapFrameBuffer()對設備節點/dev/graphics/fb0進行操作,操作的目的有:

    1.獲得屏幕設備的信息,并將屏幕信息保存在HAL_MODULE_INFO_SYM(上面代碼中的module)中。

    ?2. 向/dev/graphics/fb0請求page flip模式,page flip模式需要至少2個屏幕大小的buffer,page flip模式在后面介紹。目前android系統中設置為2個屏幕大小的buffer。當然屏幕設備可能不支持page flip模式。

    mapFrameBufferLocked()@hardware/msm7k/libgralloc-qsd8k/framebuffer.cpp

    [cpp]?view plaincopy
  • /*?
  • ?*?Request?NUM_BUFFERS?screens?(at?lest?2?for?page?flipping)?
  • ?*/??
  • info.yres_virtual?=?info.yres?*?NUM_BUFFERS;??
  • ??
  • ??
  • uint32_t?flags?=?PAGE_FLIP;??
  • if?(ioctl(fd,?FBIOPUT_VSCREENINFO,?&info)?==?-1)?{??
  • ????info.yres_virtual?=?info.yres;??
  • ????flags?&=?~PAGE_FLIP;??
  • ????LOGW("FBIOPUT_VSCREENINFO?failed,?page?flipping?not?supported");??
  • }??


  • 3. 映射屏幕設備緩存區給fbDev設備符。

    mapFrameBufferLocked()@hardware/msm7k/libgralloc-qsd8k/framebuffer.cpp

    [cpp]?view plaincopy
  • /*?
  • ?*?map?the?framebuffer?
  • ?*/??
  • ??
  • int?err;??
  • size_t?fbSize?=?roundUpToPageSize(finfo.line_length?*?info.yres_virtual);??
  • module->framebuffer?=?new?private_handle_t(dup(fd),?fbSize,??
  • ????????private_handle_t::PRIV_FLAGS_USES_PMEM);??
  • ??
  • module->numBuffers?=?info.yres_virtual?/?info.yres;??
  • module->bufferMask?=?0;??
  • ??
  • void*?vaddr?=?mmap(0,?fbSize,?PROT_READ|PROT_WRITE,?MAP_SHARED,?fd,?0);??
  • if?(vaddr?==?MAP_FAILED)?{??
  • ????LOGE("Error?mapping?the?framebuffer?(%s)",?strerror(errno));??
  • ????return?-errno;??
  • }??
  • module->framebuffer->base?=?intptr_t(vaddr);??
  • memset(vaddr,?0,?fbSize);??


  • 1.2 grDev設備符

    在為framebuffer,也就是FramebufferNativeWindow申請內存之前,我們還要介紹一個概念,就是grDev設備符。它雖然也叫設備符,但是它和具體的設備沒有直接關系,我們看它的類型就是知道了alloc_device_t,沒錯,grDev設備符就是為了FramebufferNativeWindow管理內存使用的。為FramebufferNativeWindow提供了申請/釋放內存的接口。


    ? ? 1.3 FramebufferNativeWindow內存管理

    FramebufferNativeWindow維護了2個buffer,? [cpp]?view plaincopy
  • sp<NativeBuffer>?buffers[2];??

  • ? ? 1.3.1 屏幕設備支持page filp模式

    目前的android系統默認要求屏幕設備給系統映射2個屏幕大小的緩存區,以便支持page flip模式,如果屏幕設備支持page flip模式,那么FramebufferNativeWindow中buffers將分別指向一個屏幕大小的屏幕設備緩存區。 [cpp]?view plaincopy
  • //?create?a?"fake"?handles?for?it??
  • intptr_t?vaddr?=?intptr_t(m->framebuffer->base);??
  • private_handle_t*?hnd?=?new?private_handle_t(dup(m->framebuffer->fd),?size,??
  • ?????????????????????????????????????????????private_handle_t::PRIV_FLAGS_USES_PMEM?|??
  • ?????????????????????????????????????????????private_handle_t::PRIV_FLAGS_FRAMEBUFFER);??
  • ??
  • //?find?a?free?slot??
  • for?(uint32_t?i=0?;?i<numBuffers?;?i++)?{??
  • ????if?((bufferMask?&?(1LU<<i))?==?0)?{??
  • ????????m->bufferMask?|=?(1LU<<i);??
  • ????????break;??
  • ????}??
  • ????vaddr?+=?bufferSize;??
  • }??
  • ??
  • hnd->base?=?vaddr;??
  • hnd->offset?=?vaddr?-?intptr_t(m->framebuffer->base);??
  • *pHandle?=?hnd;??

  • ? ? 1.3.2 屏幕設備不支持page flip模式

    mapFrameBufferLocked()@hardware/msm7k/libgralloc-qsd8k/framebuffer.cpp中可以得知,如果屏幕設備不支持page flip模式,那么numBuffer值將為1而不是2,那么映射過來的屏幕緩存區將只有一個屏幕大小,不夠支持page flip模式,那么此時將不使用這一個屏幕大小的屏幕緩存區,而改為去dev/pmem設備去申請。

    gralloc_alloc_framebuffer_locked()@hardware/msm7k/libgralloc-qsd8k/gpu.cpp

    [cpp]?view plaincopy
  • ????const?uint32_t?bufferMask?=?m->bufferMask;??
  • ????const?uint32_t?numBuffers?=?m->numBuffers;??
  • ????const?size_t?bufferSize?=?m->finfo.line_length?*?m->info.yres;??
  • ????if?(numBuffers?==?1)?{??
  • ????????//?If?we?have?only?one?buffer,?we?never?use?page-flipping.?Instead,??
  • ????????//?we?return?a?regular?buffer?which?will?be?memcpy'ed?to?the?main??
  • ????????//?screen?when?post?is?called.??
  • ????????int?newUsage?=?(usage?&?~GRALLOC_USAGE_HW_FB)?|?GRALLOC_USAGE_HW_2D;??
  • ????????return?gralloc_alloc_buffer(bufferSize,?newUsage,?pHandle);??
  • ????}??

  • ? ? 2. 打開Overlay

    同選擇gralloc library相似,根據屬性值來選擇何時的overlay庫,如果vendor廠商沒有提供overlay庫的話,那么系統將使用默認的overlay庫overlay.default.so。同樣的我們獲得overlay庫的HAL_MODULE_INFO_SYM結構體,作為系統調用overlay的接口。
    [cpp]?view plaincopy
  • if?(hw_get_module(OVERLAY_HARDWARE_MODULE_ID,?&module)?==?0)?{??
  • ????overlay_control_open(module,?&mOverlayEngine);??
  • }??


  • ? ? 3. 選擇OpenGL ES library(也即軟/硬件加速)

    OpenGL (Open Graphics Library)[3] is a standard specification defining a cross-language, cross-platform API for writing applications that produce 2D and 3D computer graphics. The interface consists of over 250 different function calls which can be used to draw complex three-dimensional scenes from simple primitives. OpenGL was developed by Silicon Graphics Inc. (SGI) in 1992[4] and is widely used in CAD, virtual reality, scientific visualization, information visualization, flight simulation, and video games. OpenGL is managed by the non-profit technology consortium Khronos Group.。 android是默認支持OpenGL ES軟件加速的,library為libGLES_android,源碼路徑為frameworks\base\opengl\libagl;如果手機設備支持硬件加速的話,那么復雜的圖像處理工作將交由GPU去處理,那么效率將大大提高。但是如果系統真的存在硬件加速,它是如何選擇何時用軟件加速?何時用硬件加速的呢? 如何查看是否有GPU來實現硬件加速,很容易查看/system/lib/egl/egl.cfg文件內容 [java]?view plaincopy
  • 0?0?android??
  • 0?1?adreno200??
  • ? ? 因此只要我們的移動設備芯片集成了GPU,并提供了對應的GL圖形庫,那么我們就可以在我們的工程中device目錄下的egl.cfg文件中加入類似上面的配置,那么我們的系統就會支持硬件加速。 如adreno200 GPU提供的GL圖形庫:
    [cpp]?view plaincopy
  • libGLESv1_CM_adreno200.so??
  • libGLESv2_adreno200.so??
  • libEGL_adreno200.so??
  • ? ? 那么假如我們的系統中軟硬件加速都支持了,那么我們從代碼來看能不能讓用戶自由的選擇加速類型,我們帶著問題來研究一下代碼。

    ? ?3.1?OpenGL初始化

    在調用不管是軟件加速的還是硬件加速的OpenGL api之前,我們都需要把軟硬兩種模式的各自的OpenGL api提取出來,抽象出一個interface來供系統使用,這個過程我稱之為OpenGL初始化過程。 軟硬兩種模式的OpenGL api被分別指定到了一個全局數組的對應位置。
    frameworks/base/opengl/libs/EGL/egl.cpp
    [cpp]?view plaincopy
  • static?egl_connection_t?gEGLImpl[IMPL_NUM_IMPLEMENTATIONS];??
  • [cpp]?view plaincopy
  • enum?{??
  • ????IMPL_HARDWARE?=?0,??
  • ????IMPL_SOFTWARE,??
  • ????IMPL_NUM_IMPLEMENTATIONS??
  • };??

  • gEGLImpl[IMPL_HARDWARE]中保存著硬件圖形設備的OpenGL api地址,從 [cpp]?view plaincopy
  • libGLESv1_CM_adreno200.so??
  • libGLESv2_adreno200.so??
  • libEGL_adreno200.so??
  • 這3個庫中獲得;gEGLImpl[IMPL_SOFTWARE]中保存著軟件的OpenGL api地址,從libGLES_android.so中獲取。
    這部分代碼在egl_init_drivers_locked()@frameworks/base/opengl/libs/EGL/egl.cpp

    3.2 EGL和GLES api

    在OpenGL的初始化過程中,OpenGL提供了兩套api,分別稱為EGL和GLES。android在OPENGL初始化過程中,會將兩種不同的接口分開管理,從下面代碼中我們可以看到EGL和GLES api地址被存儲到了不同的位置。 @frameworks\base\opengl\libs\EGL\Loader.h
    [cpp]?view plaincopy
  • enum?{??
  • ????EGL?????????=?0x01,??
  • ????GLESv1_CM???=?0x02,??
  • ????GLESv2??????=?0x04??
  • };??
  • load_driver()@frameworks\base\opengl\libs\EGL\Loader.cpp
    上面枚舉的EGL表示ELG api;GLESvq1_CM表示OpenGL ES 1.0的api;GLESv2表示OpenGL ES 2.0的api。 EGL api地址最終被存儲在gEGLImpl[].egl中; GLESvq1_CM api地址最終被存儲在gEGLImpl[].hooks[GLESv1_INDEX]->gl中; GLESv2 api地址最終被存儲在gEGLImpl[].hooks[GLESv2_INDEX]->gl中;

    3.2.1 EGL api EGL is an interface between Khronos rendering APIs such as OpenGL ES or OpenVG and the underlying native platform window system. It handles graphics context management, surface/buffer binding, and rendering synchronization and enables high-performance, accelerated, mixed-mode 2D and 3D rendering using other Khronos APIs. 上面引用了官方的定義,可以看出,EGL是系統和OPENGL ES之間的接口,它的聲明在文件frameworks\base\opengl\libs\EGL\egl_entries.in。

    3.2.2 GLES GLES才是真正的OpenGL ES的api,它的聲明我們可以在frameworks\base\opengl\libs\entries.in找到。目前的android系統不但將EGL提供給系統使用,同時將GLES也提供給了系統使用,這個我們可以在最開始的顯示系統的結構圖中可以看到,surfacefliger和framework的opengl模塊均可以訪問EGL和GLES接口。

    3.3 OpenGL config

    每個OpenGL庫都根據不同的像素格式(pixel format)提供了一系統的config,android根據framebuffer中設置的像素格式來選擇合適的config,android根據中各config中的屬性信息來創建main surface和openGL上下文。

    3.3.1 系統默認pixel format

    當前的代碼分析是基于gingerbread的,在mapFrameBufferLocked()@hardware/msm7k/libgralloc-qsd8k/framebuffer.cpp中我們可以找到framebuffer的pixel format的類型 [cpp]?view plaincopy
  • ???if(info.bits_per_pixel?==?32)?{??
  • /*?
  • *?Explicitly?request?RGBA_8888?
  • */??
  • ??
  • /*?Note:?the?GL?driver?does?not?have?a?r=8?g=8?b=8?a=0?config,?so?if?we?do?
  • *?not?use?the?MDP?for?composition?(i.e.?hw?composition?==?0),?ask?for?
  • *?RGBA?instead?of?RGBX.?*/??
  • if?(property_get("debug.sf.hw",?property,?NULL)?>?0?&&?atoi(property)?==?0)??
  • ????module->fbFormat?=?HAL_PIXEL_FORMAT_RGBX_8888;??
  • else?if(property_get("debug.composition.type",?property,?NULL)?>?0?&&?(strncmp(property,?"mdp",?3)?==?0))??
  • ????module->fbFormat?=?HAL_PIXEL_FORMAT_RGBX_8888;??
  • else??
  • ????module->fbFormat?=?HAL_PIXEL_FORMAT_RGBA_8888;??
  • ???}?else?{??
  • /*?
  • *?Explicitly?request?5/6/5?
  • */??
  • module->fbFormat?=?HAL_PIXEL_FORMAT_RGB_565;??
  • ???}??

  • 目前的移動設備都是真彩色,所以這里我們認為我們的屏幕設備支持的是HAL_PIXEL_FORMAT_RGBA_8888。

    ? ??

    3.3.2 config初始化

    所有的OpenGL庫提供的config,同樣需要將軟硬兩種模式的各自的OpenGL config提取出來供系統使用,如同OpenGL api地址一樣。OpenGL config提取出來后保存在另外一個全局變量 [cpp]?view plaincopy
  • static?egl_display_t?gDisplay[NUM_DISPLAYS];??
  • [cpp]?view plaincopy
  • //??EGLDisplay?are?global,?not?attached?to?a?given?thread??
  • const?unsigned?int?NUM_DISPLAYS?=?1;??
  • 中,不同于gEGLImpl分開保存軟硬件api,所有的config,不論軟硬件的,均保存在gDisplay[0],因為所有的config是以屏幕區分的,同一塊屏幕應該保存同一份config信息。
    在提取出的openGL的config時,會保存到gDisplay[0].config中,在這兒有一個很tricky的實現,它保證了硬件加速器的優先使用!
    [cpp]?view plaincopy
  • <strong>??</strong>??????//?sort?our?configurations?so?we?can?do?binary-searches??
  • ????????qsort(??dp->configs,??
  • ????????????????dp->numTotalConfigs,??
  • ????????????????sizeof(egl_config_t),?cmp_configs);<strong>??
  • </strong>??
  • 最終,上述代碼會將gDisplay[0].config中的配置按照先硬件的,后軟件的規則做一個總體的排序。

    代碼在eglInitialize()@frameworks/base/opengl/libs/EGL/egl.cpp

    3.3.3 config選擇

    上文說到,android會根據framebuffer的pixel format信息來獲取對應的config,這個過程只選擇一個合適的config,選到為止。

    3.3.3.1 滿足屬性要求

    并不是所有的config都可以被選擇,首先這個config的屬性需要滿足 init()@DisplayHardware.cpp
    [cpp]?view plaincopy
  • //?initialize?EGL??
  • EGLint?attribs[]?=?{??
  • ????????EGL_SURFACE_TYPE,???EGL_WINDOW_BIT,??
  • ????????EGL_NONE,???????????0,??
  • ????????EGL_NONE??
  • };??
  • 3.3.3.2 滿足RGBA要求

    在pixelflinger中,為系統提供了各個pixel format的基本信息,RGBA值,字節數/pixel,位數/pixel。 system/core/libpixelflinger/format.cpp
    [cpp]?view plaincopy
  • static?GGLFormat?const?gPixelFormatInfos[]?=??
  • {???//??????????Alpha????Red?????Green???Blue??
  • ????{??0,??0,?{{?0,?0,???0,?0,???0,?0,???0,?0?}},????????0?},???//?PIXEL_FORMAT_NONE??
  • ????{??4,?32,?{{32,24,???8,?0,??16,?8,??24,16?}},?GGL_RGBA?},???//?PIXEL_FORMAT_RGBA_8888??
  • android會根據pixelflinger的pixel format信息,去和openGL的config比較,得到想要的config。
    selectConfigForPixelFormat()@frameworks/base/libs/ui/EGLUtils.cpp
    [cpp]?view plaincopy
  • EGLConfig*?const?configs?=?(EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs);??
  • if?(eglChooseConfig(dpy,?attrs,?configs,?numConfigs,?&n)?==?EGL_FALSE)?{??
  • ????free(configs);??
  • ????return?BAD_VALUE;??
  • }??
  • ??
  • const?int?fbSzA?=?fbFormatInfo.getSize(PixelFormatInfo::INDEX_ALPHA);??
  • const?int?fbSzR?=?fbFormatInfo.getSize(PixelFormatInfo::INDEX_RED);??
  • const?int?fbSzG?=?fbFormatInfo.getSize(PixelFormatInfo::INDEX_GREEN);??
  • const?int?fbSzB?=?fbFormatInfo.getSize(PixelFormatInfo::INDEX_BLUE);???
  • ??
  • int?i;??
  • EGLConfig?config?=?NULL;??
  • for?(i=0?;?i<n?;?i++)?{??
  • ????EGLint?r,g,b,a;??
  • ????EGLConfig?curr?=?configs[i];??
  • ????eglGetConfigAttrib(dpy,?curr,?EGL_RED_SIZE,???&r);??
  • ????eglGetConfigAttrib(dpy,?curr,?EGL_GREEN_SIZE,?&g);??
  • ????eglGetConfigAttrib(dpy,?curr,?EGL_BLUE_SIZE,??&b);??
  • ????eglGetConfigAttrib(dpy,?curr,?EGL_ALPHA_SIZE,?&a);??
  • ????if?(fbSzA?<=?a?&&?fbSzR?<=?r?&&?fbSzG?<=?g?&&?fbSzB??<=?b)?{??
  • ????????config?=?curr;??
  • ????????break;??
  • ????}??
  • }??

  • ? ? 4. 創建main surface

    要讓OpenGL進行圖形處理,那么需要在OpenGL中創建一個openGL surface。代碼在eglCreateWindowSurface()@frameworks/base/opengl/libs/EGL/egl.cpp 調用當前的config所處的openGL庫的api來創建surface。通過validate_display_config()方法來獲取當前config的openGL api。 創建的surface會和FramebufferNativeWindow關聯到一起。

    ? ? 5. 創建?OpenGL ES 上下文

    ? ??An?OpenGL context?represents many things. A context stores all of the state associated with this instance of OpenGL. It represents the (potentially visible)?default framebufferthat rendering commands will draw to when not drawing to a?framebuffer object. Think of a context as an object that holds all of OpenGL; when a context is destroyed, OpenGL is destroyed.

    ? ?http://www.opengl.org/wiki/OpenGL_context

    ?具體的創建過程專業術語太多,也沒有仔細研究不再介紹。

    ? ? 6. 綁定context和surface

    有了surface,有了FramebufferNativeWindow,有了context,基本上與圖形系統相關的概念都有了,下一步就是把這幾個概念關聯起來,在創建surface時已經將surface和FramebufferNativeWindow關聯了起來。 eglMakeCurrent()@frameworks/base/opengl/libs/EGL/egl.cpp

    6.1 多線程支持

    OpenGL 提供了多線程的支持,有以下2點的支持: 1. 一個Context只能被一個線程使用,不能存在多個線程使用同一個context。因此在多線層操作中使用到了TLS技術,即Thread-local storage,來保證context被唯一使用。 makeCurrent()@frameworks/base/opengl/libs/libagl/egl.cpp
    [cpp]?view plaincopy
  • ????ogles_context_t*?current?=?(ogles_context_t*)getGlThreadSpecific();??
  • ????if?(gl)?{??
  • ????????egl_context_t*?c?=?egl_context_t::context(gl);??
  • ????????if?(c->flags?&?egl_context_t::IS_CURRENT)?{??
  • ????????????if?(current?!=?gl)?{??
  • ????????????????//?it?is?an?error?to?set?a?context?current,?if?it's?already??
  • ????????????????//?current?to?another?thread??
  • ????????????????return?-1;??
  • ????????????}??
  • ????????}?else?{??
  • ????????????if?(current)?{??
  • ????????????????//?mark?the?current?context?as?not?current,?and?flush??
  • ????????????????glFlush();??
  • ????????????????egl_context_t::context(current)->flags?&=?~egl_context_t::IS_CURRENT;??
  • ????????????}??
  • ????????}??
  • ????????if?(!(c->flags?&?egl_context_t::IS_CURRENT))?{??
  • ????????????//?The?context?is?not?current,?make?it?current!??
  • ????????????setGlThreadSpecific(gl);??
  • ????????????c->flags?|=?egl_context_t::IS_CURRENT;??
  • ????????}??
  • 2. 在同一進程中,對于不同的線程對OpenGL庫的訪問,可能使用的GLES api version不同,同樣可以使用TLS技術來保證多線程過程中,不同線程調用各自的GLES api。 前面我們介紹過GLES api地址被存放在gEGLImpl[].hooks[VERSION]->gl中,因此為保證多線程支持,android將gEGLImpl[].hooks[VERSION]保存到了TLS中,這樣就實現了不同線程各自調用各自版本的GLES api。 eglMakeCurrent()@frameworks/base/opengl/libs/EGL/egl.cpp
    [cpp]?view plaincopy
  • //?cur_c?has?to?be?valid?here?(but?could?be?terminated)??
  • if?(ctx?!=?EGL_NO_CONTEXT)?{??
  • ????setGlThreadSpecific(c->cnx->hooks[c->version]);??
  • ????setContext(ctx);??
  • ????_c.acquire();??
  • }?else?{??
  • ????setGlThreadSpecific(&gHooksNoContext);??
  • ????setContext(EGL_NO_CONTEXT);??
  • }??

  • 盡管openGL 實現了多線程的支持,目前我從代碼中別沒有找到多線程的使用。

    6.2 設置surface和context之間的關系

    由于vendor廠商提供的GPU的GLES庫是不可見的,因此以libGLES_android.so軟件加速為例來說明這個過程。 contex中保存著兩個surface,read和draw,多少情況下這兩個surface為同一個surface。 設置FramebufferNativeWindow中Buffers[2]之一為surface的數據區, 通過connect()和bindDrawSurface()。最終的形態如下圖所示:


    在init()@DisplayHardware.cpp中,在綁定surface和context之后,馬上在當前線程中unbind了context,通過 [cpp]?view plaincopy
  • //?Unbind?the?context?from?this?thread??
  • eglMakeCurrent(display,?EGL_NO_SURFACE,?EGL_NO_SURFACE,?EGL_NO_CONTEXT);??
  • 這么做的目的應該是支持多display系統中的特殊處理,目的是當系統有多個display系統的話,那么surfaceflinger就會去定義多個DisplayHardware對象,那么為了保證下一個DisplayHardware對象的創建不受影響,在當前的DisplayHardware創建完成后,將context從當前的進程中unbind掉。 不過沒關系,在所有的DisplayHardware創建完成之后,surfaceflinger會重新bind 主Display系統的context和surface。 readyToRun()@SurfaceFlinger.cpp
    [cpp]?view plaincopy
  • //?initialize?primary?screen??
  • //?(other?display?should?be?initialized?in?the?same?manner,?but??
  • //?asynchronously,?as?they?could?come?and?go.?None?of?this?is?supported??
  • //?yet).??
  • const?GraphicPlane&?plane(graphicPlane(dpy));??
  • const?DisplayHardware&?hw?=?plane.displayHardware();??
  • const?uint32_t?w?=?hw.getWidth();??
  • const?uint32_t?h?=?hw.getHeight();??
  • const?uint32_t?f?=?hw.getFormat();??
  • hw.makeCurrent();??



  • 下圖為這個圖形系統的類圖結構。



    原文地址:?http://blog.csdn.net/windskier/article/details/7030732

    總結

    以上是生活随笔為你收集整理的android surfaceflinger研究----显示系统的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    午夜婷婷网 | 日本亚洲国产 | 日韩久久精品一区二区三区下载 | 国产精品美女免费看 | 久久免费视屏 | 在线一二区 | 中文字幕精品久久 | 亚洲最大成人免费网站 | 毛片网在线 | 天天干夜夜擦 | 亚洲作爱 | 婷婷亚洲综合五月天小说 | 中文不卡视频 | 国产99黄| 欧美极度另类 | 精品国产成人 | 久久综合色综合88 | 亚洲精品视频在线观看网站 | 国产精品久久一区二区三区不卡 | 亚洲黄色影院 | 天天色天天射综合网 | 一区二区三区影院 | 九九视频网站 | 亚洲天天做 | 日韩三级久久 | 2022国产精品视频 | 午夜视频99 | 97在线观看视频 | 久久精品精品电影网 | 狠狠色丁香婷婷综合欧美 | 丁香激情五月婷婷 | 国产亚洲精品久久19p | 91精品视频免费在线观看 | 人人射人人澡 | 美女免费视频网站 | 伊人亚洲综合网 | 蜜臀av性久久久久蜜臀av | 人人插人人爱 | 色综合天天综合网国产成人网 | 国产精品国产三级国产 | 日批视频国产 | 亚洲最大成人免费网站 | 亚洲丝袜一区二区 | 国产亚洲婷婷免费 | 日韩,中文字幕 | 亚洲无人区小视频 | 有码中文字幕 | 日韩免费在线视频观看 | 日韩二区在线观看 | 青青河边草观看完整版高清 | 亚洲理论在线观看电影 | 午夜精品导航 | 亚洲精品黄色 | 国产香蕉在线 | 国产精品影音先锋 | 日韩欧美视频二区 | 人人要人人澡人人爽人人dvd | 中文字幕日韩在线播放 | 久草精品视频 | 免费成视频 | 99re国产| 韩国一区二区av | 一区二区三区日韩在线 | se视频网址| 五月婷婷综合在线视频 | 国色天香在线观看 | 亚洲三区在线 | 91成人网在线观看 | 97av在线视频免费播放 | 婷婷夜夜| 麻豆精品视频在线 | 亚洲va在线va天堂 | 亚洲黄色软件 | 伊人影院99| 91精品国产乱码 | 中文字幕乱码在线播放 | 精品久久久久久亚洲综合网站 | 伊人首页| 99热官网| 日日夜夜免费精品视频 | 中文亚洲欧美日韩 | 韩国精品福利一区二区三区 | 久草在在线视频 | 欧美精品久久人人躁人人爽 | 六月丁香在线观看 | 亚洲v欧美v国产v在线观看 | 最近更新中文字幕 | 综合激情网 | 久草在线最新免费 | 人人干狠狠操 | 天天色天天操天天爽 | 亚洲综合视频网 | 国内精品久久久久影院日本资源 | 麻豆传媒视频在线 | 高清日韩一区二区 | 成人av资源站 | 热re99久久精品国产99热 | 国产亚洲一区二区三区 | 久久久久久毛片精品免费不卡 | 久久激情视频 | 亚洲在线成人精品 | 亚洲国产中文字幕 | 日韩视频免费观看高清 | 这里有精品在线视频 | 久久久国产一区二区 | 黄色的片子 | 日韩性久久 | 91精品国自产在线观看欧美 | 国产婷婷 | 中文字幕免费高清在线 | 九九久久久久久久久激情 | 91成年人网站 | 久久久影院一区二区三区 | 天天操天天操天天操天天 | 免费三级骚 | 国产呻吟在线 | 天天爱天天操天天干 | 国内免费久久久久久久久久久 | 97视频精品| 黄色精品网站 | 日韩免费一级a毛片在线播放一级 | 国产中文字幕在线播放 | 日韩高清免费在线观看 | 美女国内精品自产拍在线播放 | 国产传媒中文字幕 | 久久久综合香蕉尹人综合网 | 一级一片免费观看 | 天天干com | 麻豆久久久久 | 麻豆91网站 | 亚洲精品美女久久 | 国产拍在线 | 欧美在线1| 看av在线 | 婷婷在线网站 | 美女福利视频在线 | 又黄又爽又无遮挡的视频 | 黄色片软件网站 | 亚洲精品综合一二三区在线观看 | 久草在线视频网站 | 久久96 | 精品国产91亚洲一区二区三区www | 日本成人中文字幕在线观看 | 婷婷视频 | 欧美国产高清 | 国产人成一区二区三区影院 | av不卡免费看 | 91爱看片 | 亚洲成人av一区二区 | 黄色影院在线观看 | 日本精品一区二区在线观看 | 伊人影院得得 | 精品国产美女 | 国产一级三级 | 在线观看色网 | 免费视频一二三区 | 国产成人亚洲在线电影 | 一区二区三区日韩视频在线观看 | 日韩网站在线 | 国产亚洲综合在线 | 狠狠色噜噜狠狠狠狠2022 | 国产91国语对白在线 | 久久综合免费视频影院 | 91成人观看 | 免费看久久久 | 国产伦理一区二区三区 | 精品在线观看免费 | 麻豆一区在线观看 | 久久人人添人人爽添人人88v | av中文字幕在线看 | 久久视频在线 | 久久久综合色 | 中文在线 | 亚洲精品国产综合久久 | 黄色大片日本免费大片 | 91香蕉视频污在线 | av在线免费观看不卡 | 日日骑 | 九九九在线观看视频 | 蜜臀久久99精品久久久无需会员 | 国产一区二区久久久久 | 麻豆精品视频在线 | 中文字幕av电影下载 | 久久久久久久久久久久久久电影 | 久久9视频 | 91黄色在线视频 | 探花视频在线版播放免费观看 | 久操97 | 国产免费一区二区三区网站免费 | 成人a毛片 | 国产精品久久久久久久久软件 | 国产极品尤物在线 | 伊人亚洲综合网 | 国产高清视频免费观看 | 成人欧美在线 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产精品视频永久免费播放 | 91在线www| 天天射天 | 91久久国产露脸精品国产闺蜜 | 免费日韩一级片 | 2019中文字幕第一页 | 狠狠操狠狠干2017 | 久久国产精品一区二区三区四区 | 激情网婷婷 | 国产另类xxxxhd高清 | 激情影院在线观看 | 91传媒在线播放 | 久久久免费精品国产一区二区 | 正在播放国产一区二区 | 久久99久久99精品免观看粉嫩 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 国产三级国产精品国产专区50 | 蜜臀av性久久久久av蜜臀妖精 | 美女黄频免费 | 一本—道久久a久久精品蜜桃 | 韩国一区二区三区在线观看 | 国产精品18久久久久vr手机版特色 | 国产成人精品999在线观看 | 成人影音av | 黄a网站 | 九热精品 | 黄色a一级片 | 综合国产在线 | 黄色国产大片 | 国产91丝袜在线播放动漫 | 欧美一区二区在线免费观看 | 国产精品1区| av福利电影| 日本中文字幕视频 | 国产成人三级在线 | 欧美 日韩 久久 | 免费视频99| 免费av免费观看 | 丁香 久久 综合 | 国产在线色站 | 日韩一二三在线 | 2019中文 | 日韩精品亚洲专区在线观看 | 在线观看中文字幕2021 | 久久综合网色—综合色88 | www日韩精品 | 精品 激情| 色综合久久综合网 | 国产一级高清 | 爱爱av网站| 国产亚洲视频在线免费观看 | 日韩毛片在线一区二区毛片 | 欧美三人交| 96国产精品视频 | 丁香婷婷电影 | 国产精品都在这里 | 成人国产精品久久久久久亚洲 | 九月婷婷综合网 | 精品免费久久 | 99精品免费在线观看 | 国产精久久久久久妇女av | 欧美久久成人 | av在线电影免费观看 | 日韩成人一级大片 | 精品一区二区av | 婷婷色在线 | 97免费视频在线播放 | 一区二区三区精品在线 | 久久精品视频4 | 欧美一区免费在线观看 | 91麻豆看国产在线紧急地址 | 亚洲成av人片 | 高清精品久久 | 香蕉久草在线 | 黄网站www| 9ⅰ精品久久久久久久久中文字幕 | 午夜在线免费观看 | 娇妻呻吟一区二区三区 | 欧美久久久一区二区三区 | 97国产大学生情侣白嫩酒店 | 爱爱av在线| 国产在线高清视频 | 国产在线观看黄 | 国产伦理精品一区二区 | 97超碰超碰久久福利超碰 | 亚洲天堂网在线视频观看 | 99久久精品免费看国产麻豆 | 亚州欧美视频 | www.少妇| 97成人精品区在线播放 | 国产黄色片在线免费观看 | 精品毛片久久久久久 | 日本中文字幕高清 | 黄色免费观看视频 | 日韩专区 在线 | 91免费黄视频 | 九色最新网址 | 国产玖玖视频 | 激情狠狠干 | 免费日韩一区二区三区 | 97视频在线免费 | 99c视频在线 | 黄色小说18 | 韩国av一区二区三区在线观看 | 国产a精品 | 98精品国产自产在线观看 | 玖玖玖在线观看 | 国产专区免费 | 国产剧情一区二区在线观看 | 色爱区综合激月婷婷 | 国产传媒中文字幕 | 久久成电影 | 日日夜夜添| 国产二区免费视频 | 91男人影院 | 中文字幕av在线不卡 | 在线观看中文字幕dvd播放 | 手机色站| 色中射| 久久免费毛片 | 午夜色性片 | 欧美在线一 | 91色一区二区三区 | 国产成人免费av电影 | 久久乐九色婷婷综合色狠狠182 | 久久精品高清视频 | 国产视频高清 | 亚洲天堂免费视频 | 夜夜夜草 | 在线免费观看欧美日韩 | 国产成人91 | 日韩免费在线观看视频 | 国产精品中文字幕av | av日韩在线网站 | 国产精品18久久久久久vr | 国产精品久久久久久久婷婷 | 91大神视频网站 | 午夜的福利 | 在线看国产视频 | 一区二区 不卡 | 午夜久久久久久久久久影院 | 国产免费高清视频 | 人人爽久久涩噜噜噜网站 | 午夜三级大片 | 玖玖在线播放 | 国产高清亚洲 | 99久久99久久精品免费 | 91你懂的 | 97视频免费观看2区 亚洲视屏 | 黄色一级大片在线观看 | av在线播放免费 | 久草精品视频 | 久色小说 | 91高清免费在线观看 | 亚洲精品小视频在线观看 | 少妇精69xxtheporn| 中文字幕国内精品 | av在线激情| 国产中文在线字幕 | 一区二区三区精品在线视频 | 激情在线网站 | 中文字幕第 | 97人人精品 | 永久免费精品视频网站 | 亚洲一区免费在线 | 在线看一区 | 五月精品| 精品国产一二三 | 欧美久草网 | 97视频人人免费看 | 人人插人人做 | 国内精品久久久久久久久久清纯 | 91av视频| 国产精品久久久久永久免费观看 | 亚洲成人av片在线观看 | 亚洲开心色 | 国产精品综合久久久久久 | 久久字幕网 | 国产精品密入口果冻 | 91av短视频| 九九综合久久 | 国产 字幕 制服 中文 在线 | 日韩专区一区二区 | 久久精品欧美一区二区三区麻豆 | 91精品久久久久久久99蜜桃 | 国产看片网站 | 免费在线观看不卡av | 亚洲精品高清一区二区三区四区 | 免费成人av在线看 | 成人a级大片 | 精品一区二区三区在线播放 | 日本爱爱免费视频 | 欧美一二区在线 | 日韩av视屏在线观看 | 不卡的av电影 | 国产精品久久久久永久免费 | 香蕉网在线播放 | 亚洲国产经典视频 | 欧美日韩精品区 | 国产成人精品av | 日本久久久久久久久久 | 欧美极品在线播放 | 欧美日韩精品免费观看视频 | 在线观看激情av | 中文字幕欧美日韩va免费视频 | 久久国产精品色婷婷 | 国产在线欧美 | 中文字幕在线网址 | 成年人网站免费观看 | 毛片黄色一级 | 成年人免费在线观看网站 | 91网在线观看 | 91香蕉视频好色先生 | 久久兔费看a级 | 中文字幕久久精品亚洲乱码 | 国产拍揄自揄精品视频麻豆 | 在线黄频 | 成人久久久久久久久 | 久草视频手机在线 | 国产午夜精品一区二区三区欧美 | 日韩久久久久 | 综合网天天色 | 国产午夜精品一区二区三区 | 欧美成人h版在线观看 | 国产黄色大片 | 欧美性脚交 | 免费观看www视频 | 911久久香蕉国产线看观看 | 白丝av免费观看 | 国产精品久久久久影院 | av片中文字幕| 久久99精品国产麻豆婷婷 | 午夜视频在线观看一区二区 | 欧美精品在线一区二区 | 亚洲国产三级在线观看 | 精品在线观看一区二区 | 亚洲高清免费在线 | 激情校园亚洲 | 日本黄色免费网站 | 在线免费国产视频 | 成人亚洲网 | av福利网址导航大全 | 精品国产一区二区三区日日嗨 | 国产麻豆视频网站 | 久久人人97超碰精品888 | 成人av亚洲 | 国产午夜精品久久久久久久久久 | 精品久久久久久久久久久久久久久久久久 | 在线观看小视频 | 亚洲激情网站免费观看 | 久久免费视频在线观看 | 日本精品久久久久中文字幕5 | 国产区精品区 | av福利在线播放 | 中文字幕在线观看第二页 | 亚洲国产成人在线播放 | wwwwwww色| 国产精品一区二区在线免费观看 | 五月婷婷综合在线视频 | 色综合久久综合中文综合网 | 色婷婷激情四射 | 国产精品原创av片国产免费 | 美女视频黄的免费的 | 久久艹人人 | 91成人在线视频 | 天堂av色婷婷一区二区三区 | 精品国产一区二区在线 | 激情综合久久 | 五月天久久综合网 | 深爱激情五月网 | 香蕉国产91 | 免费日韩视 | 久久综合精品国产一区二区三区 | 免费看黄在线观看 | 国产免费一区二区三区最新6 | 欧美日韩成人 | 日韩乱理 | 日韩黄色免费在线观看 | 日女人免费视频 | 99久久精品网 | 天天干天天射天天操 | 午夜影视剧场 | 91久久国产自产拍夜夜嗨 | 欧美日韩精品在线一区二区 | 日本久久久久久久久 | 亚洲人成综合 | 正在播放日韩 | 国产福利在线免费观看 | av中文字幕av | 久草在在线视频 | 日韩伦理一区二区三区av在线 | 国产精品免费不卡 | 国产精品久久片 | 91av在线播放视频 | 激情视频91 | 精品亚洲欧美无人区乱码 | 伊人在线视频 | 经典三级一区 | 九色在线视频 | av免费网站在线观看 | 99国产一区| 成年人视频在线观看免费 | 日韩xxxxxxxxx| 日本久久久精品视频 | 国产精品18久久久久久久 | 人人干干人人 | 999久久久久久久久 69av视频在线观看 | 欧美国产日韩一区二区 | 国产经典 欧美精品 | 婷婷激情5月天 | 特片网久久 | 亚洲撸撸 | 国产精品国产三级国产不产一地 | 精品久久久久一区二区国产 | 久久亚洲成人网 | 中文字幕在线高清 | 国产传媒中文字幕 | 99久久99热这里只有精品 | 免费看一级片 | 波多野结衣视频一区 | 精品国产乱码久久久久久久 | 久久五月网 | 久久免费黄色大片 | 十八岁以下禁止观看的1000个网站 | 久久久久亚洲国产精品 | 人人澡视频 | 久久免费久久 | 日韩av一区二区三区在线观看 | 狂野欧美激情性xxxx | 国内精品久久久久久中文字幕 | 午夜视频导航 | 免费在线观看黄 | 一区二区三区免费网站 | 日本视频久久久 | 日韩一级片网址 | 激情综合网天天干 | 欧美日韩视频观看 | 国产精品99久久久久久有的能看 | 欧美91精品久久久久国产性生爱 | 黄色片免费电影 | 人人爽人人澡人人添人人人人 | 91av综合 | 久久小视频 | 天天操天天弄 | 国产高清在线不卡 | 又黄又爽的免费高潮视频 | 福利网在线 | 日韩专区一区二区 | 五月婷婷丁香激情 | 国产男女无遮挡猛进猛出在线观看 | 最新av观看 | 国产一区二区影院 | 超碰夜夜 | 欧美日韩中文字幕视频 | 91中文字幕在线观看 | 亚洲资源 | 天天天天爽| 日韩精品一卡 | 精品人人人人 | 免费在线观看黄色网 | 人人精久 | 日日干av | 天天摸天天干天天操天天射 | 999视频在线观看 | 亚洲撸撸| 欧美性大战久久久久 | 亚洲天天摸日日摸天天欢 | 国产在线色站 | 麻豆视频免费网站 | 国产在线观看 | 西西大胆啪啪 | 欧美成人高清 | 国产精品精品国产色婷婷 | 欧美有色 | 最近高清中文字幕在线国语5 | 国产无套视频 | 国产超碰97 | 国产黄色一级片在线 | av一二三区 | av 一区 二区 久久 | 国产一区欧美在线 | 亚州精品在线视频 | 狠狠色丁香婷婷综合久久片 | 亚洲无吗视频在线 | 日韩三级免费观看 | 伊人国产在线观看 | 三级黄色大片在线观看 | 欧美激情视频一区二区三区免费 | 亚州国产精品久久久 | 日韩r级在线 | 久久精品视频日本 | 精品国内| 成人资源在线 | 一区二区三区四区久久 | 久久国产热 | 91亚洲在线观看 | av免费试看| 97福利视频 | 久久99视频免费 | 亚洲精品视频久久 | 91视频麻豆视频 | 亚洲精品美女久久久久 | 天天操·夜夜操 | 亚洲天天 | 国产一二三精品 | 99999精品 | 麻豆视频国产在线观看 | 久草在线综合 | 午夜国产一区二区三区四区 | 国产在线国偷精品产拍 | 波多野结衣视频一区二区三区 | 国产高清福利在线 | 久久看免费视频 | 久久国语露脸国产精品电影 | 精品一区二区三区久久久 | 四虎成人在线 | 久久久久久久综合色一本 | 久久久受www免费人成 | 国产一区二区影院 | 91在线色 | 狠狠色丁香婷婷综合欧美 | 欧美日韩视频精品 | 欧美一级片在线播放 | 国产一二区视频 | 亚州av一区 | 成人av片在线观看 | 香蕉在线观看视频 | 综合av在线 | 成人黄色电影免费观看 | 97超碰人人澡人人爱 | 中文成人字幕 | 99精品久久久久久久 | 黄色资源网站 | 亚洲欧美国产日韩在线观看 | 亚洲综合视频在线 | 麻豆精品在线视频 | adn—256中文在线观看 | 精品视频免费在线 | 日p在线观看 | 天天干天天天 | 成人午夜在线观看 | av电影av在线 | 在线观看视频三级 | 超碰人人乐| 丁香综合激情 | 久草视频99| 亚洲精品乱码久久久久久9色 | 狠狠色狠狠色终合网 | 91av看片| 国产成人精品午夜在线播放 | 久久久久久久影院 | 国产又黄又爽又猛视频日本 | 99re久久精品国产 | 欧美极品一区二区三区 | 丁香六月婷婷开心婷婷网 | 国产黑丝一区二区三区 | 婷婷色av| 久久精品视频日本 | av解说在线 | 国产精品观看在线亚洲人成网 | 毛片基地黄久久久久久天堂 | 亚洲午夜久久久影院 | 综合网伊人| 国产裸体视频网站 | 人人爱人人添 | 99re8这里有精品热视频免费 | 播五月综合 | 91免费在线播放 | 日韩一区二区在线免费观看 | 久久久久免费观看 | 中文字幕乱码一区二区 | 成人中心免费视频 | 蜜臀av一区二区 | 色视频网页 | 欧美 激情 国产 91 在线 | 天天激情综合网 | 精品一二三四五区 | 成人啪啪18免费游戏链接 | 中文字幕精品一区久久久久 | 99精品在线观看视频 | 久久久久日本精品一区二区三区 | 国产98色在线 | 日韩 | 亚洲年轻女教师毛茸茸 | 国产小视频在线观看 | 日本午夜在线观看 | 天天干,夜夜爽 | 久久亚洲欧美 | 视频一区二区免费 | 在线观看中文字幕2021 | 国产一区在线视频观看 | 国产精品理论片在线播放 | av在线亚洲天堂 | 午夜视频免费播放 | 91在线影院 | 欧美一区二区免费在线观看 | 亚洲精品毛片一级91精品 | 欧美男男激情videos | 日韩精品久久久久久久电影竹菊 | 欧美精品在线视频 | 99精品欧美一区二区蜜桃免费 | 日本久久久久久久久久久 | 久久麻豆精品 | 在线黄网站 | 黄免费在线观看 | 天天操狠狠操网站 | 五月婷婷操| 毛片网在线观看 | 99riav1国产精品视频 | 亚洲成人黄色网址 | 99久在线精品99re8热视频 | 国产一区网址 | 人人爱爱 | 成人在线免费观看网站 | 久久国产精品久久久久 | 国产精品久久久久久久久久不蜜月 | www.91国产 | 91av在线免费视频 | 国产精品免费一区二区三区在线观看 | 婷婷深爱 | 日韩av中文在线 | 91在线www| 天天综合成人 | 黄色成人在线观看 | www.一区二区三区 | 国产精品精品久久久久久 | 国产精品无av码在线观看 | 日韩在线视频观看免费 | 久久中国精品 | 国产精品久久久久久久久久新婚 | 黄色大片国产 | 久久久久亚洲精品 | 黄色大全免费网站 | 亚洲成a人片在线www | 欧美视频日韩 | av最新资源 | 国产成人精品免费在线观看 | 久久久久久久久久久久99 | 欧美大香线蕉线伊人久久 | 久久夜夜爽 | 亚洲人成精品久久久久 | 亚洲精品国产欧美在线观看 | 国产精品99久久久久久有的能看 | 亚洲精品一区二区三区高潮 | 国产免费美女 | 久久涩涩网站 | 国产精品成人免费精品自在线观看 | 免费久久片 | 视频二区在线视频 | 成人av在线观 | 91最新网址在线观看 | 国产专区第一页 | 日韩在线观看免费 | 国产乱码精品一区二区蜜臀 | 成人免费在线视频观看 | 五月天网站在线 | 欧美一区二区三区在线视频观看 | 精品欧美一区二区三区久久久 | 国产精品美女久久久久久免费 | 成人在线播放网站 | 日狠狠 | 日本夜夜草视频网站 | 国产高清一区二区 | 黄色在线看网站 | 最新国产精品视频 | 日韩最新在线 | 少妇高潮流白浆在线观看 | 亚洲无在线 | 国产精品毛片完整版 | 国产精品国内免费一区二区三区 | 日本福利视频在线 | 亚洲高清国产视频 | 国产精品美女久久久久久2018 | 日韩精品久久中文字幕 | 久久精品国产免费观看 | 国产在线观看午夜 | 91av99 | 麻豆成人在线观看 | 天天看天天干 | 国产精品免费大片视频 | 亚洲一区二区精品在线 | 夜夜看av | 午夜国产在线观看 | 99精品国产免费久久久久久下载 | 色综合久久88色综合天天6 | 亚洲激情视频在线 | 国产在线观看你懂得 | 青春草视频在线播放 | 爱射综合 | 婷婷色在线播放 | 91九色在线| 国产二区免费视频 | 91成人精品一区在线播放69 | 婷婷激情影院 | 国产粉嫩在线 | 四虎欧美| 日韩av视屏在线观看 | 96av在线视频 | 久久影院中文字幕 | 精品国产99国产精品 | 国产看片网站 | 在线中文字幕一区二区 | 国产亚洲小视频 | 狠狠色丁香婷婷综合视频 | 天堂av在线网 | 一级黄色在线视频 | 久久激情视频 久久 | 狠狠天天 | 日韩天堂网 | 久操视频在线免费看 | 成人在线电影观看 | 免费观看福利视频 | 99久久婷婷国产一区二区三区 | 97在线看片 | 久久精品网站免费观看 | 超碰在线97观看 | 三上悠亚一区二区在线观看 | 啪啪资源| 国产日韩欧美视频 | 国产日韩欧美在线观看 | bayu135国产精品视频 | 精品在线观 | 在线观看视频日韩 | 中文免费在线观看 | 亚洲波多野结衣 | 99精品视频在线观看免费 | 激情欧美丁香 | 久久亚洲免费视频 | 免费情缘 | 国产丝袜在线 | 日韩二三区 | 免费精品视频在线 | 欧美激精品 | 国产手机视频 | 黄色av电影网| 婷婷五月情 | 美腿丝袜一区二区三区 | av一本久道久久波多野结衣 | 日韩欧美在线视频一区二区三区 | 国产精品免费观看久久 | 亚洲不卡123 | 亚洲精品九九 | 菠萝菠萝蜜在线播放 | 色五丁香 | 区一区二区三在线观看 | 国色天香第二季 | 色黄www小说| 黄在线免费看 | 国产精品九九九九九九 | 亚洲精品美女久久17c | 久久香蕉电影 | 久操中文字幕在线观看 | 国产一区二区影院 | 91成品视频 | 免费午夜av | 在线av资源 | 亚洲精品美女久久久 | 国产精品精品久久久久久 | 最新日韩在线观看视频 | 午夜久久成人 | 久久毛片网站 | 91在线视频精品 | 中文字幕在线电影 | 中日韩在线 | av成人亚洲 | 亚洲电影图片小说 | 久久国产亚洲精品 | 欧美综合色在线图区 | 国产精品理论在线观看 | 黄色av电影一级片 | 在线日本看片免费人成视久网 | 日本女人在线观看 | 免费高清在线一区 | 亚洲免费成人av电影 | 亚洲一区免费在线 | 欧美性生活大片 | 成年人看片网站 | 成人精品99 | 精品一区二区三区久久久 | 国产丝袜制服在线 | 麻豆传媒电影在线观看 | 欧美精品做受xxx性少妇 | 91视频啪| 国产亚洲精品久久久网站好莱 | 日本精品二区 | 午夜视频在线瓜伦 | 人人爽人人爽人人爽人人爽 | 一区二区三区精品在线视频 | 伊人久久国产精品 | 成人中文字幕+乱码+中文字幕 | 1024手机基地在线观看 | 在线小视频你懂的 | 日韩欧美高清不卡 | 视频福利在线观看 | 国产免费不卡 | 国产精品av免费 | 在线观看不卡视频 | 免费日韩在线 | 国产精品12345 | 97超碰国产精品女人人人爽 | 欧美久草视频 | 91久久久久久久一区二区 | 久草在线高清视频 | 美女福利视频网 | 一区二区三区日韩视频在线观看 | 夜夜骑日日操 | 成人黄色毛片 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 久久免费在线观看 | 99视频+国产日韩欧美 | 麻豆91精品视频 | 黄色网www | 91九色蝌蚪国产 | 日韩中文字幕免费 | 欧美黑人xxxx猛性大交 | 亚洲视频精品 | 国产精品毛片一区视频播不卡 | 日韩网 | 日韩高清在线看 | 欧美影院久久 | 91综合久久一区二区 | 国产高清专区 | 国产精品嫩草69影院 | 成人在线免费观看网站 | 日韩91av | 国产视频资源 | 国产福利一区二区在线 | 成人一级片在线观看 | 国产高清av免费在线观看 | 成年人免费在线观看网站 | 成人网在线免费视频 | 精品9999| 亚洲精品美女视频 | 久久综合射| 综合亚洲视频 | 欧美色图亚洲图片 | 欧美久久久久久久 | 最新国产精品视频 | 欧美色图一区 | 99视频国产精品免费观看 | 国内小视频在线观看 | 国模一区二区三区四区 | 在线观看黄色小视频 | 成年人免费观看国产 | 91麻豆免费版| 久久黄色免费视频 | 国产精品久久久久久一区二区 | 欧美日韩在线免费观看视频 | 深夜免费小视频 | 中文字幕丝袜美腿 | www.香蕉 | 日韩精品一区二区不卡 | 在线天堂视频 | 色七七亚洲影院 | 欧美乱码精品一区二区 | 国产一区黄色 | 国产视频一区二区在线 | 国产精品久久久久久久免费大片 | 99婷婷| 亚洲欧美日韩中文在线 | 色婷婷成人 | 久久久国产精华液 | 99久久精品国 | 免费三级在线 | 五月婷婷综合在线 | 国产高清在线观看 | 在线之家免费在线观看电影 | 曰本免费av| 美女网站在线观看 | 免费能看的av | 美女久久久久久 | 中文字幕中文字幕中文字幕 | 日韩精选在线 | 国产精品久久久久av免费 | 中文字幕av专区 | 欧美视频99 | 麻花豆传媒mv在线观看网站 | 91免费视频黄 | 亚洲五月 | 国产精品自拍在线 | 亚洲激色 | 精品国产乱码久久久久久天美 | 西西www4444大胆视频 | 久久精品视频网 | 奇米777777 | 日韩成人精品 | 伊人久久在线观看 | 手机av在线网站 | 激情五月婷婷激情 | 久久久久久久久久国产精品 | 亚洲综合视频在线 | av天天澡天天爽天天av | 成人久久久久久久久久 | 久草久草视频 | 欧美日韩国产一区二 | 婷婷久草 | 中文字幕免费在线 | 成年人视频在线免费观看 | 欧美日韩免费视频 | 欧美韩国日本在线观看 | 久久久久久久久影院 | 日日日视频 | 久操中文字幕在线观看 |