3 Android显示系统之Surface

围巾🧣 2023年10月14日 379次浏览

内容

image-20231013140724474

Surface 是什么

Surface是Android图形系统的核⼼部分, 图形界⾯上的⼀个窗⼝或对话框等都对应着⼀个 Surface。

而这个Surface是⼀块绘制区域的抽象,它对应着Server服务端Surfacelinger中的⼀个图 层Layer,这个图层的背后是⼀块图形缓冲区GraphicBuffer,Client客⼾端的应⽤程序的UI使⽤软件 绘制、硬件绘制在Surface上各种渲染操作时,绘制操作的结果其实也就是在该图形缓冲区中。

image-20231013140826053

Surface 是⼀个接口,供⽣产⽅与消耗方交换缓冲区。Surface 对象使应用能够渲染要在屏幕上显示的图像。⼤多数客户端使用 OpenGL ESVulkan 渲染到 Surface 上。

Surface 创建

先来看⼀张Surface创建的流程图

surface-create

  1. Surface的创建与Window息息相关, 因此Surface的创建需要从Window的添加开始。 我们知 道, Window的添加是从ActivityThread.handleResumeActivity开始的, 此时会做⼀系列的动 作如: Session的创建(openSession), ViewRoot的创建(Global.addView), Surface的创建 (ViewRoot中的Surface, 此时是⼀个空的), addWindow等。
  2. addWindow会创建⼀个WindowState; WindowState表⽰⼀个窗⼝的所有属性,它是WMS中 事实上的窗⼝。 之后会调⽤attach()创建SurfaceSession, ,SurfaceSession 表⽰⼀个跟 SurfaceFlinger 的连接。
  3. ViewRoot.performTravels开始, 在relayoutWindow中会先创建⼀个SurfaceControl
# base/core/java/android/view/SurfaceControl.java
private SurfaceControl(SurfaceSession session……) {
        ……
            // note jin:返回 native SurfaceControl 指针
            mNativeObject = nativeCreate(session, name, w, h, format, flags,
                    parent != null ? parent.mNativeObject : 0, metaParcel);
        } finally {
            metaParcel.recycle();
        }
        ……
    }


# base/core/jni/android_view_SurfaceControl.cpp
// note jin: native 创建 Surface
static jlong nativeCreate(JNIEnv* env,……) {
    ……
    // note jin: client 即上创建的 SurfaceComposerClient 对象
    sp<SurfaceComposerClient> client;
    ……

    // note jin:
    status_t err = client->createSurfaceChecked(
            String8(name.c_str()), w, h, format, &surface, flags, parent, std::move(metadata));
    ……
    return reinterpret_cast<jlong>(surface.get());
}


# native/libs/gui/SurfaceComposerClient.cpp
// note jin:
status_t SurfaceComposerClient::createSurfaceChecked(const String8& name,……) {
    ……
        // note jin: 真正创建
        err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),&handle, &gbp);
        ……
}


# native/services/surfaceflinger/Client.cpp
// note jin: 真正创建 Surface
status_t Client::createSurface(const String8& name,……) {
    // We rely on createLayer to check permissions.
    return mFlinger->createLayer(name, this, w, h, format, flags, std::move(metadata), handle, gbp,parentHandle);
}

SurfaceControl创建在构造中伴随着Surface的创建, ⽽createSurface的最终结果即是 SurfaceFlinger::createLayer

Surface 在 SurfaceFlinger 中对应的实体是 Layer 对象。 Surface创建完成后, 在WMS中调⽤getSurfaceControl:

# base/core/java/android/view/Surface.java
public void copyFrom(SurfaceControl other) {
        ……

        long surfaceControlPtr = other.mNativeObject;
        ……
            setNativeObjectLocked(newNativeObject);
        }
    }

    private void setNativeObjectLocked(long ptr) {
        if (mNativeObject != ptr) {
            ……
            mNativeObject = ptr;
            mGenerationId += 1;
            if (mHwuiContext != null) {
                mHwuiContext.updateSurface();
            }
        }
    }

nativeGetFromSurfaceControl ⽅法返回了⼀个 native 层创建的 Surface 指针,并赋值给了 Java 层 Surface 对象的 mNativeObject 属性。

Surface中的BufferQueue

在上述流程中, 我们发现createSurface最终变成了createLayer。 ⽽在createLayer时, ⼀套 BufferQueue的体系就建⽴起来了。

# native/services/surfaceflinger/SurfaceFlinger.cpp
// note jin:
status_t SurfaceFlinger::createLayer(const String8& name, ^) {
    ^

    switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
        case ISurfaceComposerClient::eFXSurfaceBufferQueue:
            // note jin:
            result = createBufferQueueLayer(client, uniqueName, w, h, flags, std::move(metadata),format, handle, gbp, &layer);

            break;
        case ISurfaceComposerClient::eFXSurfaceBufferState:
            ……
    }

   ……
}

// note jin: surface
status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client,……) {
    ……

    sp<BufferQueueLayer> layer = getFactory().createBufferQueueLayer(
            LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
    ……
    if (err == NO_ERROR) {
        *handle = layer->getHandle();
        // note jin: 可以获取到生产者,通常为 app
        *gbp = layer->getProducer();
        *outLayer = layer;
    }

    ALOGE_IF(err, "createBufferQueueLayer() failed (%s)", strerror(-err));
    return err;
}

# native/services/surfaceflinger/BufferQueueLayer.cpp
// note jin:
sp<IGraphicBufferProducer> BufferQueueLayer::getProducer() const {
    return mProducer;
}

// note jin:
void BufferQueueLayer::onFirstRef() {
    BufferLayer::onFirstRef();

    // 创建自定义BufferQueue以供SurfaceFlingerConsumer使用
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferConsumer> consumer;
    // note jin: BufferQueue 在此创建
    BufferQueue::createBufferQueue(&producer, &consumer, true);
    mProducer = new MonitoredProducer(producer, mFlinger, this);
    ……
}

我们可以看到, 在createBufferLayer时, 通过BufferQueue::createBufferQueue创建了 BufferQueue实例, 然后创建并指定了其⽣产者与消费者。 我们可以想象⼀下, ⽣产者便是App, ⽽ 消费者便是SurfaceFlinger了。

总结

在 Java 层中 ViewRootImpl 实例中持有⼀个 Surface 对象,该 Surface 对象中的mNativeObject 属性指向 native 层中创建的 Surface 对象,native 层的 Surface 对应 SurfaceFlinger 中的 Layer 对象,它持有 Layer 中的 BufferQueueProducer ⽣产者指针, 在 Surface 上绘制的内容最终会交由 SurfaceFlinger 来合成渲染送到显⽰器显⽰