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);}
- Android N Graphics之SF创建layer过程
- Android N Graphics之wms中surface到SurfaceFlinger中的layer联系
- Android N Graphics之应用侧的surface的创建
- Chromium网页Graphics Layer Tree创建过程分析
- Android N Graphics之BitmapFactory
- Android N Graphics之FrameBuffer驱动分析
- android APK签名过程之CERT.SF分析
- android APK签名过程之CERT.SF分析
- Android4.2.2 SurfaceFlinger之Layer和Bufferqueue的创建过程
- ArcGIS Web Mapping for Silverlight之Graphics layer
- AbiWord Graphics Layer
- 绘制Core Graphics Layer
- Chromium网页Layer Tree创建过程分析
- Hello Android 之 Graphics 实例
- Android-Graphics学习之:canvas
- Android样式之layer-list
- Android样式之layer-list
- Android学习之layer-list
- HTTP POST提交数据方式不同引起的躺坑记
- IO流学习-02
- LeetCode
- java 笔记
- Android 使用Zxing实现二维码的生成,扫描
- Android N Graphics之SF创建layer过程
- bzoj 4548: 小奇的糖果 && bzoj 3658: Jabberwocky(双向链表+树状数组)
- python之字符串格式化(format)(转自:benric)
- __HAL_AFIO_REMAP_SWJ_DISABLE
- Spring MVC 学习总结(四)——视图与综合示例
- 表达式得到期望结果的组成种数
- 不要使用equals方法对AtomicXXX进行是否相等的判断
- Mysql内核:INNODB存储引擎--《十一》Insert Buffer
- Eclipse项目迁移AndroidStudio的两种方式