Android GPU合成

1 FramebufferSurface 概述

   FramebufferSurface 根据名字解析:

  1: Surface 说明它是一个Surface, 那么它就会拥有一个 BufferQuere, 用于显示。

  2: FrameBuffer 这和 Linux 的 framebuffer 是完全不同的。 但是作用有些类似, SurfaceFlinger 在上面作画, 并把它交给HWC, 最终由HWC负责真正的显示。

1.1 FrameBufferSurface创建

SurfaceFlinger启动时会在SurfaceFlinger::init()中通过processDisplayHotplugEventsLocked()->processDisplayChangesLocked()->processDisplayAdded(displayToken, curr[i])中:

 
900  void SurfaceFlinger::init() {
.....
924      mCompositionEngine->setHwComposer(getFactory().createHWComposer(getBE().mHwcServiceName));
925      mCompositionEngine->getHwComposer().setConfiguration(this, getBE().mComposerSequenceId);
926      // Process any initial hotplug and resulting display changes.
927      processDisplayHotplugEventsLocked();
928      const auto display = getDefaultDisplayDeviceLocked();

        processDisplayAdded()方法如下,其创建了BufferQueue和FrameBufferSurface,简单理解为连接上了显示屏幕(Display),那就要给准备一个BufferQueue,以便GPU合成图层时,可以向这个BufferQueue索要GraphicBuffer来存储合成后的数据,再呈现到屏幕上去。

3209  void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
3210                                           const DisplayDeviceState& state) {
        .....
3265      sp<compositionengine::DisplaySurface> displaySurface;
3266      sp<IGraphicBufferProducer> producer;
       //创建BufferQueue,获取到生产者和消费者,而且消费者不是SurfaceFlinger。
3267      sp<IGraphicBufferProducer> bqProducer;
3268      sp<IGraphicBufferConsumer> bqConsumer;
3269      getFactory().createBufferQueue(&bqProducer, &bqConsumer, /*consumerIsSurfaceFlinger =*/false);
3270  
3271      std::optional<DisplayId> displayId = compositionDisplay->getId();
3272  
3273      if (state.isVirtual()) {//虚拟屏幕
3274          sp<VirtualDisplaySurface> vds =
3275                  new VirtualDisplaySurface(getHwComposer(), displayId, state.surface,
3276                                            bqProducer, bqConsumer, state.displayName,
3277                                            state.isSecure);
3278  
3279          displaySurface = vds;
3280          producer = vds;
3281      } else {
3282          ALOGE_IF(state.surface != nullptr,
3283                   "adding a supported display, but rendering "
3284                   "surface is provided (%p), ignoring it",
3285                   state.surface.get());
3286  
3287          LOG_ALWAYS_FATAL_IF(!displayId);
        //创建了FrameBufferSurface对象,及继承自compositionengine::DisplaySurface
        //FrameBufferSurface作为消费者的角色工作,消费SF GPU合成后的数据
3288          displaySurface = new FramebufferSurface(getHwComposer(), *displayId, bqConsumer,
3289                                                  maxGraphicsWidth, maxGraphicsHeight);
3290          producer = bqProducer;
3291      }
3292  
3293      LOG_FATAL_IF(!displaySurface);
//创建DisplayDevice,其又去创建RenderSurface,作为生产者角色工作,displaySurface就是FramebufferSurface对象
3294      const auto display = setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state,
3295                                                         displaySurface, producer);
3296      mDisplays.emplace(displayToken, display);
        .....

然后FrameBufferSurface的构造函数,只是一些设置,初始化一些成员:

 
59  FramebufferSurface::FramebufferSurface(HWComposer& hwc, DisplayId displayId,
60                                         const sp<IGraphicBufferConsumer>& consumer,
61                                         uint32_t maxWidth, uint32_t maxHeight)
62        : ConsumerBase(consumer),
63          mDisplayId(displayId),
64          mMaxWidth(maxWidth),
65          mMaxHeight(maxHeight),
66          mCurrentBufferSlot(-1),
67          mCurrentBuffer(),
68          mCurrentFence(Fence::NO_FENCE),
69          mHwc(hwc),
70          mHasPendingRelease(false),
71          mPreviousBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
72          mPreviousBuffer() {
73      ALOGV("Creating for display %s", to_string(displayId).c_str());
74  
75      mName = "FramebufferSurface";
76      mConsumer->setConsumerName(mName);
77      mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB |
78                                         GRALLOC_USAGE_HW_RENDER |
79                                         GRALLOC_USAGE_HW_COMPOSER);
80      const auto& activeConfig = mHwc.getActiveConfig(displayId);
81      ui::Size limitedSize =
82              limitFramebufferSize(activeConfig->getWidth(), activeConfig->getHeight());
83      mConsumer->setDefaultBufferSize(limitedSize.width, limitedSize.height);
84      mConsumer->setMaxAcquiredBufferCount(
85              SurfaceFlinger::maxFrameBufferAcquiredBuffers - 1);
86  }

再进到surfaceflinger::setupNewDisplayDeviceInternal()中:

 
3123  sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
3124          const wp<IBinder>& displayToken,
3125          std::shared_ptr<compositionengine::Display> compositionDisplay,
3126          const DisplayDeviceState& state,
3127          const sp<compositionengine::DisplaySurface>& displaySurface,
3128          const sp<IGraphicBufferProducer>& producer) {
    .....
3133      creationArgs.displaySurface = displaySurface;
    .....
     //创建对应的surface
31
Android中的SurfaceView合成**主要涉及到SurfaceFlinger和硬件合成(HWC)等组件的配合工作**。 在Android系统中,SurfaceView是一种特殊的视图,它使用一个独立的绘图Surface来渲染内容。这个Surface由SurfaceFlinger服务直接管理,而不是通过常规的视图层次结构。以下是一些关键点: 1. **SurfaceFlinger的角色**:SurfaceFlinger是一个系统服务,负责接受来自多个源的数据缓冲区,对它们进行合成,然后发送到显示设备。它处理屏幕上的各种层,包括状态栏、导航栏以及应用界面等。 2. **合成方式**:合成可以在Client端(使用GPU)或Device端(使用HWC硬件)完成。SurfaceFlinger主要负责Client端的合成工作,通过RenderEngine利用GPU来进行合成。 3. **SurfaceView的优势**:使用SurfaceView进行渲染时,可以直接将缓冲区合成到屏幕上,这样可以避免额外的合成步骤,提高效率。 4. **HWC的作用**:Hardware Composer HAL(HWC)是与SurfaceFlinger配合使用的硬件抽象层,它负责确定合成缓冲区的最有效方法,并实际执行合成过程。 5. **合成流程**:当Buffer放入BufferQueue队列后,Consumer端的FrameListener会通过frameAvailableListener通知Consumer,然后进行相应的处理。 综上所述,Android SurfaceView的合成是一个复杂的过程,涉及多个系统组件和服务的协同工作。了解这些机制有助于更好地理解Android图形系统的工作原理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值