Android N Graphics之SF创建layer过程

来源:互联网 发布:中国近代史知乎 编辑:程序博客网 时间:2024/06/16 16:07

继续上一节的Client的createSurface的实现流程:

status_t Client::createSurface(
const String8& name,
uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
sp* handle,
sp* gbp)
{
/*
* createSurface must be called from the GL thread so that it can
* have access to the GL context.
*/

class MessageCreateLayer : public MessageBase {    SurfaceFlinger* flinger;    Client* client;    sp<IBinder>* handle;    sp<IGraphicBufferProducer>* gbp;    status_t result;    const String8& name;    uint32_t w, h;    PixelFormat format;    uint32_t flags;public:    MessageCreateLayer(SurfaceFlinger* flinger,            const String8& name, Client* client,            uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,            sp<IBinder>* handle,            sp<IGraphicBufferProducer>* gbp)        : flinger(flinger), client(client),          handle(handle), gbp(gbp), result(NO_ERROR),          name(name), w(w), h(h), format(format), flags(flags) {    }    status_t getResult() const { return result; }    virtual bool handler() {        result = flinger->createLayer(name, client, w, h, format, flags,                handle, gbp);        return true;    }};sp<MessageBase> msg = new MessageCreateLayer(mFlinger.get(),        name, this, w, h, format, flags, handle, gbp);mFlinger->postMessageSync(msg);return static_cast<MessageCreateLayer*>( msg.get() )->getResult();

}

其实在这个函数中会去填充handle,这个其实是surface的一个唯一标识,同时还会填充一个gbp,这个其实就是一个图像缓冲区。继续来看这个是如何实现的,在这个里面其实会定义一个消息类ssageCreateLayer,然后这里会把它的对象通过postMessageSync方法发送出去,继续回来到handler的接口中,这里会调用到SF的createLayer,继续来看sf的createLayer的实现:

status_t SurfaceFlinger::createLayer(    const String8& name,    const sp<Client>& client,    uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,    sp<IBinder>* handle, sp<IGraphicBufferProducer>*     gbp){//ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());if (int32_t(w|h) < 0) {ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",int(w), int(h));return BAD_VALUE;}status_t result = NO_ERROR;sp<Layer> layer;switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {    case ISurfaceComposerClient::eFXSurfaceNormal:        result = createNormalLayer(client,                name, w, h, flags, format,                handle, gbp, &layer);        break;    case ISurfaceComposerClient::eFXSurfaceDim:        result = createDimLayer(client,                name, w, h, flags,                handle, gbp, &layer);        break;    default:        result = BAD_VALUE;        break;}if (result != NO_ERROR) {    return result;}result = addClientLayer(client, *handle, *gbp, layer);if (result != NO_ERROR) {    return result;}setTransactionFlags(eTransactionNeeded);return result;

}

这里我们可以根据传进来的flags来选择性的创建一个普通的layer还是模糊的layer。下面来分别看一下普通layer和模糊的layer的创建:

status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,    const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer){// initialize the surfacesswitch (format) {case PIXEL_FORMAT_TRANSPARENT:case PIXEL_FORMAT_TRANSLUCENT:    format = PIXEL_FORMAT_RGBA_8888;    break;case PIXEL_FORMAT_OPAQUE:    format = PIXEL_FORMAT_RGBX_8888;    break;}*outLayer = new Layer(this, client, name, w, h, flags);status_t err = (*outLayer)->setBuffers(w, h, format, flags);if (err == NO_ERROR) {    *handle = (*outLayer)->getHandle();    *gbp = (*outLayer)->getProducer();}ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));return err;

}

这里能看到普通的layer创建的过程,首先对format进行了设置,然后创建了一个layer,从layer中填充handle和gbp用来返回给调用者。
继续来看dimLayer的创建的流程:

status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,    const String8& name, uint32_t w, uint32_t h, uint32_t flags,sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer){*outLayer = new LayerDim(this, client, name, w, h, flags);*handle = (*outLayer)->getHandle();*gbp = (*outLayer)->getProducer();return NO_ERROR;

}

dimLyaer的创建的流程是和普通Layer创建的流程都一样的,不过这里new的是一个LayerDim。继续来看一下普通layer和DimLayer的构造函数:

LayerDim::LayerDim(SurfaceFlinger* flinger, const sp<Client>& client,    const String8& name, uint32_t w, uint32_t h, uint32_t flags): Layer(flinger, client, name, w, h, flags) {}Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,const String8& name, uint32_t w, uint32_t h, uint32_t flags):   contentDirty(false),sequence(uint32_t(android_atomic_inc(&sSequence))),mFlinger(flinger),mTextureName(-1U),mPremultipliedAlpha(true),mName("unnamed"),mFormat(PIXEL_FORMAT_NONE),mTransactionFlags(0),mPendingStateMutex(),mPendingStates(),mQueuedFrames(0),mSidebandStreamChanged(false),mCurrentTransform(0),mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),mOverrideScalingMode(-1),mCurrentOpacity(true),mCurrentFrameNumber(0),mRefreshPending(false),mFrameLatencyNeeded(false),mFiltering(false),mNeedsFiltering(false),mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),#ifndef USE_HWC2mIsGlesComposition(false),#endifmProtectedByApp(false),mHasSurface(false),mClientRef(client),mPotentialCursor(false),mQueueItemLock(),mQueueItemCondition(),mQueueItems(),mLastFrameNumberReceived(0),mUpdateTexImageFailed(false),mAutoRefresh(false),mFreezePositionUpdates(false){#ifdef USE_HWC2ALOGV("Creating Layer %s", name.string());#endifmCurrentCrop.makeInvalid();mFlinger->getRenderEngine().genTextures(1, &mTextureName);mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);uint32_t layerFlags = 0;if (flags & ISurfaceComposerClient::eHidden)layerFlags |= layer_state_t::eLayerHidden;if (flags & ISurfaceComposerClient::eOpaque)layerFlags |= layer_state_t::eLayerOpaque;if (flags & ISurfaceComposerClient::eSecure)layerFlags |= layer_state_t::eLayerSecure;if (flags & ISurfaceComposerClient::eNonPremultiplied)mPremultipliedAlpha = false;mName = name;mCurrentState.active.w = w;mCurrentState.active.h = h;mCurrentState.active.transform.set(0, 0);mCurrentState.crop.makeInvalid();mCurrentState.finalCrop.makeInvalid();mCurrentState.z = 0;#ifdef USE_HWC2mCurrentState.alpha = 1.0f;#elsemCurrentState.alpha = 0xFF;#endifmCurrentState.layerStack = 0;mCurrentState.flags = layerFlags;mCurrentState.sequence = 0;mCurrentState.requested = mCurrentState.active;// drawing state & current state are identicalmDrawingState = mCurrentState;#ifdef USE_HWC2const auto& hwc = flinger->getHwComposer();const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);nsecs_t displayPeriod = activeConfig->getVsyncPeriod();#elsensecs_t displayPeriod =flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);#endifmFrameTracker.setDisplayRefreshPeriod(displayPeriod);}void Layer::onFirstRef() {// Creates a custom BufferQueue for SurfaceFlingerConsumer to usesp<IGraphicBufferProducer> producer;sp<IGraphicBufferConsumer> consumer;BufferQueue::createBufferQueue(&producer, &consumer);mProducer = new MonitoredProducer(producer, mFlinger);mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName);mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));mSurfaceFlingerConsumer->setContentsChangedListener(this);mSurfaceFlingerConsumer->setName(mName);#ifdef TARGET_DISABLE_TRIPLE_BUFFERING#warning "disabling triple buffering"#elsemProducer->setMaxDequeuedBufferCount(2);#endifconst sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());updateTransformHint(hw);}
原创粉丝点击