“LayerBuffer”模式的Layer主要应用于多媒体应用,如照相机预览和视频回放的渲染中,根据渲染方式的不同,“LayerBuffer”模式的Layer分为普通缓冲和OverLay两种模式。“LayerBuffer”模式的Layer的渲染过程如下:
        代码:“LayerBuffer”模式的Layer的渲染过程
        void LayerBuffer::BufferSource::onDraw(const Region& clip) const 
    {
        sp ourBuffer(getBuffer());
        if (UNLIKELY(ourBuffer==0))  {
                mLayer.clearWithOpenGL(clip);	    //清空渲染区域
                return;
            }
        status_t err=NO_ERROR;
        NativeBuffer src(ourBuffer->getBuffer());
        const Rect transformedBounds(mLayer.getTransformedBounds());
        if (UNLIKELY(mTexture.name==-1LU)) {
                mTexture.name=mLayer.createTexture();
            }
    #if defined(EGL_ANDROID_image_native_buffer)
        if (mLayer.mFlags & DisplayHardware::DIRECT_TEXTURE) {
            copybit_device_t* copybit=mLayer.mBlitEngine;
            if (copybit) {
                    err=initTempBuffer();
                    if (err==NO_ERROR) {
                            const NativeBuffer& dst(mTempBuffer);
                            region_iterator clip(Region(Rect(dst.crop.r, dst.crop.b)));
                          copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
                          copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF);
                          copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE);
                          err=copybit->stretch(copybit,&dst.img, &src.img,&dst.crop, &src.crop, &clip);
                      }
                } else {
                      err=INVALID_OPERATION;
                }
        }
    #endif
        else {
                err=INVALID_OPERATION;
             }
        if (err !=NO_ERROR){
            GGLSurface t;
            t.version=sizeof(GGLSurface);
            t.width=src.crop.r;
            t.height=src.crop.b;
            t.stride=src.img.w;
            t.vstride=src.img.h;
            t.format=src.img.format;
            t.data=(GGLubyte*)src.img.base;
            const Region dirty(Rect(t.width, t.height));
            mLayer.loadTexture(&mTexture, dirty, t);    //加载纹理
            }
        mTexture.transform=mBufferHeap.transform;
        mLayer.drawWithOpenGL(clip, mTexture);	//OpenGL渲染
    } 
        “LayerBlur”和“LayerDim”模式的Layer均为利用OpenGL进行渲染的特殊Layer,“LayerBlur”模式的Layer呈现一种模糊的特效;“LayerDim”模式的Layer呈现一种暗淡的特效,这里就不再多做介绍了。
        在默认情况下,系统多可以创建31个Layer,4个缓冲。