创建Surface (二)

  • 前言
  • SurfaceFlinger createLayer

前言

我们接着androidP Surface到SurfaceFlinger -->创建Surface (一)来看,当new SurfaceControl之后在其构造函数内都做了什么?这一步跟下去就到了SurfaceFlinger了。

SurfaceFlinger createLayer

对于上层应用所建立的Surface对应到SurfaceFlinger 就是 createLayer
我们来跟代码吧,还是从 SurfaceControl的构造函数开始

  private SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags,SurfaceControl parent, int windowType, int ownerUid)throws OutOfResourcesException, IllegalArgumentException {if (session == null) {throw new IllegalArgumentException("session must not be null");}if (name == null) {throw new IllegalArgumentException("name must not be null");}if ((flags & SurfaceControl.HIDDEN) == 0) {Log.w(TAG, "Surfaces should always be created with the HIDDEN flag set "+ "to ensure that they are not made visible prematurely before "+ "all of the surface's properties have been configured.  "+ "Set the other properties and make the surface visible within "+ "a transaction.  New surface name: " + name,new Throwable());}mName = name;mWidth = w;mHeight = h;// 这里传进去的参数有,session这个是session就是持有该SurfaceControl的SurfaceSession对象,// name 就是window的名字// w,h window的宽和高// format 设置的view的格式// windowType window的类型,就是层级吧// ownerUid 创建的app的uidmNativeObject = nativeCreate(session, name, w, h, format, flags,parent != null ? parent.mNativeObject : 0, windowType, ownerUid);... ...}

frameworks/base/core/jni/android_view_SurfaceControl.cpp

static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject,jint windowType, jint ownerUid) {ScopedUtfChars name(env, nameStr);// 前面我们知道已经创建过连接了,在new SurfaceSession的就持有了SurfaceComposerClient的对象这个直接用就可以了sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj));SurfaceControl *parent = reinterpret_cast<SurfaceControl*>(parentObject);sp<SurfaceControl> surface;// 调用 SurfaceComposerClient的createSurfaceChecked方法status_t err = client->createSurfaceChecked(String8(name.c_str()), w, h, format, &surface, flags, parent, windowType, ownerUid);if (err == NAME_NOT_FOUND) {jniThrowException(env, "java/lang/IllegalArgumentException", NULL);return 0;} else if (err != NO_ERROR) {jniThrowException(env, OutOfResourcesException, NULL);return 0;}surface->incStrong((void *)nativeCreate);return reinterpret_cast<jlong>(surface.get());
}

status_t SurfaceComposerClient::createSurfaceChecked(const String8& name,uint32_t w,uint32_t h,PixelFormat format,sp<SurfaceControl>* outSurface,uint32_t flags,SurfaceControl* parent,int32_t windowType,int32_t ownerUid)
{sp<SurfaceControl> sur;status_t err = mStatus;if (mStatus == NO_ERROR) {sp<IBinder> handle;sp<IBinder> parentHandle;// 注意哈,这里出现了IGraphicBufferProducer,生产者BufferQueueProducer的父类sp<IGraphicBufferProducer> gbp;if (parent != nullptr) {parentHandle = parent->getHandle();}// gbp取地址给了createSurface,那一般就是要给gbp分配地址了,这个client就是ISurfaceComposerClient的本地实现类。err = mClient->createSurface(name, w, h, format, flags, parentHandle,windowType, ownerUid, &handle, &gbp);ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));if (err == NO_ERROR) {*outSurface = new SurfaceControl(this, handle, gbp, true /* owned */);}}return err;
}

frameworks/native/services/surfaceflinger/Client.cpp


status_t Client::createSurface(const String8& name,uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,const sp<IBinder>& parentHandle, int32_t windowType, int32_t ownerUid,sp<IBinder>* handle,sp<IGraphicBufferProducer>* gbp)
{sp<Layer> parent = nullptr;if (parentHandle != nullptr) {auto layerHandle = reinterpret_cast<Layer::Handle*>(parentHandle.get());parent = layerHandle->owner.promote();if (parent == nullptr) {return NAME_NOT_FOUND;}}if (parent == nullptr) {bool parentDied;parent = getParentLayer(&parentDied);// If we had a parent, but it died, we've lost all// our capabilities.if (parentDied) {return NAME_NOT_FOUND;}}// 继续跟到SurfaceFlinger里面return mFlinger->createLayer(name, this, w, h, format, flags, windowType,ownerUid, handle, gbp, &parent);
}

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

//从createSurface到了createLayer
status_t SurfaceFlinger::createLayer(const String8& name,const sp<Client>& client,uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,int32_t windowType, int32_t ownerUid, sp<IBinder>* handle,sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
{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;}ALOGE("createLayer() -> name = %s, windowType = %d",name.c_str(), windowType);status_t result = NO_ERROR;sp<Layer> layer;String8 uniqueName = getUniqueLayerName(name);// 该函数中根据flag创建不同的Layer,Layer前面说过了就是一个图层switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {case ISurfaceComposerClient::eFXSurfaceNormal:// 创建了BufferLayerresult = createBufferLayer(client,uniqueName, w, h, flags, format,handle, gbp, &layer);break;case ISurfaceComposerClient::eFXSurfaceColor:result = createColorLayer(client,uniqueName, w, h, flags,handle, &layer);break;default:result = BAD_VALUE;break;}if (result != NO_ERROR) {return result;}// window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java// TODO b/64227542if (windowType == 441731) {windowType = 2024; // TYPE_NAVIGATION_BAR_PANELlayer->setPrimaryDisplayOnly();}layer->setInfo(windowType, ownerUid);result = addClientLayer(client, *handle, *gbp, layer, *parent);if (result != NO_ERROR) {return result;}mInterceptor->saveSurfaceCreation(layer);setTransactionFlags(eTransactionNeeded);return result;
}
status_t SurfaceFlinger::createBufferLayer(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;}// 创建出了一个BufferLayer,这个BufferLayer里面回去创建BufferCoresp<BufferLayer> layer = new BufferLayer(this, client, name, w, h, flags);status_t err = layer->setBuffers(w, h, format, flags);if (err == NO_ERROR) {*handle = layer->getHandle();*gbp = layer->getProducer();*outLayer = layer;}ALOGE_IF(err, "createBufferLayer() failed (%s)", strerror(-err));return err;
}

BufferLayer被new出来的时候会走进它的onFirstRef()方法里面

void BufferLayer::onFirstRef() {Layer::onFirstRef();// Creates a custom BufferQueue for SurfaceFlingerConsumer to usesp<IGraphicBufferProducer> producer;sp<IGraphicBufferConsumer> consumer;// 在这里面会给producer 和 consumer进行赋值BufferQueue::createBufferQueue(&producer, &consumer, true);mProducer = new MonitoredProducer(producer, mFlinger, this);{// Grab the SF state lock during this since it's the only safe way to access RenderEngineMutex::Autolock lock(mFlinger->mStateLock);mConsumer = new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName,this);}mConsumer->setConsumerUsageBits(getEffectiveUsage(0));mConsumer->setContentsChangedListener(this);mConsumer->setName(mName);if (mFlinger->isLayerTripleBufferingDisabled()) {mProducer->setMaxDequeuedBufferCount(2);}const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());updateTransformHint(hw);
}
void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,sp<IGraphicBufferConsumer>* outConsumer,bool consumerIsSurfaceFlinger) {LOG_ALWAYS_FATAL_IF(outProducer == NULL,"BufferQueue: outProducer must not be NULL");LOG_ALWAYS_FATAL_IF(outConsumer == NULL,"BufferQueue: outConsumer must not be NULL");sp<BufferQueueCore> core(new BufferQueueCore());LOG_ALWAYS_FATAL_IF(core == NULL,"BufferQueue: failed to create BufferQueueCore");// 给producer进行了赋值sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core, consumerIsSurfaceFlinger));LOG_ALWAYS_FATAL_IF(producer == NULL,"BufferQueue: failed to create BufferQueueProducer");// 给consumer进行了赋值sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));LOG_ALWAYS_FATAL_IF(consumer == NULL,"BufferQueue: failed to create BufferQueueConsumer");// 其实我们交接buffer的操作流程都知道,这里producer是应用用来承载数据的,consumer是surfaceFlinger用来消费数据的*outProducer = producer;*outConsumer = consumer;
}

后续会接上BufferQueue的交互流程。

androidP Surface到SurfaceFlinger -->创建Surface (二)相关推荐

  1. androidP Surface到SurfaceFlinger -->surface -> BufferQueue(一)

    BufferQueue 前言 介绍 BufferQueue::createBufferQueue 前言 结合前面的一篇文章创建Surface, 我们知道最后会调用到SurfaceFlinger的Cre ...

  2. androidP Surface到SurfaceFlinger -->创建Surface (一)

    创建Surface 前言 ViewRootImpl创建Surface 前言 我们前面已经分析过Activity启动如何去连接到SurfaceFlinger了,接下来就看Activity的Surface ...

  3. Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7884628 前面我们已经学习过Android应 ...

  4. 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系

    Android - SurfaceFlinger 图形系统 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文 ...

  5. Surface 与 SurfaceFlinger 之间的关系

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.SurfaceFlinger 启动过程 二.Surface 创建过程 三.Surface 显示过程 ...

  6. Android之Surface 与 SurfaceFlinger关系

    通过前面的知识我们知道了,Android 系统从按下开机键到桌面,从桌面点击 App 图标到 Activity 显示的过程.但是 Activity 是怎么显示在屏幕上的呢?下面我们就来讨论下这一过程. ...

  7. Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析

    ndroid应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析 在WindowManagerService服务这一侧,每一个应用程序窗口,即每一个Activity组件,都有一个 ...

  8. Android中创建Surface和TYPE_WALLPAPER类型的window

    文章目录 创建surface 创建Wallpaper类型的window 如何编译代码 上面这两个技术的出发点:因为Android中同一时刻只能运行单个WallpaperService,一个Wallpa ...

  9. SurfaceFlinger与Surface概述

    基本原理: SF一个Client对应一个app中的SurfaceComposerClient, 分别是Binder的n端和b端,主要用来CreateSurface 一个app中有多个Activity, ...

最新文章

  1. Object-c实现各种排序算法 (汇总)
  2. 五、【SAP-PM模块】服务采购业务流程
  3. 【转】C++读写.mat文件的方法
  4. Python:Selenium 1:浏览器驱动
  5. mybatis多个foreach_使用 Mybatis 的 foreach 批量模糊 like 查询及批量插入
  6. 接口测试(apipost、jmeter和python脚本)
  7. 动态执行sql语句用法
  8. Spark SQL 用户自定义函数UDF、用户自定义聚合函数UDAF 教程(Java踩坑教学版)
  9. 别人的Python爬虫代码能读懂,自己却还是不能自由去爬?社群日报
  10. OpenCV使能CUDA加速
  11. dqkg的命令用法_CADk中常用命令使用方法及说明
  12. 计算机学术论文写作与发表
  13. 纯国产环境JAVA程序(Springboot + Mybatis + 达梦数据库)搭建
  14. 问题记录之——windows10系统蓝牙失灵
  15. conductor介绍
  16. 无法访问此网站 - DNS_PROBE_FINISHED_NXDOMAIN
  17. 1. 计算机网络概述
  18. 犹太人传承了三千多年的10大赚钱定律
  19. STM32关于PVD低电压能检测的知识
  20. Chrome浏览器已开启自动保存密码,但仍无法自动保存密码的解决办法

热门文章

  1. Python Flask Web教程002:Flask 快速上手
  2. Bugku web(1—35)
  3. 抵制基因编辑技术,人类到底在恐惧什么?
  4. 2017年清华大学计算机科学与技术系考研小结
  5. 随机点名册的简单程序
  6. 年度目标进度和完成进度对比
  7. mysql中如何创建数据和表
  8. 基于JSP的网上订餐管理系统的设计与实现
  9. 3-OpenCL快速入门教程
  10. 【显著性检测】基于HC算法实现图像显著性检测附MATLAB代码