Layer
class Layer : public virtual RefBase, compositionengine::LayerFE {
mutable bool contentDirty{false};
Region surfaceDamageRegion;
// Layer serial number. This gives layers an explicit ordering, so we
// have a stable sort order when their layer stack and Z-order are
// the same.
int32_t sequence{sSequence++};
// constant
sp<SurfaceFlinger> mFlinger;
protected:
compositionengine::OutputLayer* findOutputLayerForDisplay(const DisplayDevice*) const;//OutputLayer最后合成的layer
// these are protected by an external lock (mStateLock)
State mCurrentState;
// These are only accessed by the main thread or the tracing thread.
State mDrawingState;
const wp<Client> mClientRef;//who? mClientRef(args.client),
/*
// constant
sp<SurfaceFlinger> mFlinger;
// protected by mLock
DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayers;
*/
// Child list about to be committed/used for editing.
LayerVector mCurrentChildren{LayerVector::StateSet::Current};
// Child list used for rendering.
LayerVector mDrawingChildren{LayerVector::StateSet::Drawing};
wp<Layer> mCurrentParent;
wp<Layer> mDrawingParent;
virtual bool isOpaque(const Layer::State&) const { return false; }
bool isSecure() const;
virtual bool isVisible() const = 0;
virtual bool isProtected() const { return false; }
virtual bool canReceiveInput() const;
bool isHiddenByPolicy() const;
/*
* doTransaction - process the transaction. This is a good place to figure
* out which attributes of the surface have changed.
*/
uint32_t doTransaction(uint32_t transactionFlags);
/*
* latchBuffer - called each time the screen is redrawn and returns whether
* the visible regions need to be recomputed (this is a fairly heavy
* operation, so this should be set only if needed). Typically this is used
* to figure out if the content or size of a surface has changed.
*/
virtual bool latchBuffer(bool& /*recomputeVisibleRegions*/, nsecs_t /*latchTime*/,
nsecs_t /*expectedPresentTime*/) {
return false;
}
virtual bool isBufferLatched() const { return false; }
virtual void latchAndReleaseBuffer() {}
bool Layer::attachChildren() {
bool changed = false;
for (const sp<Layer>& child : mCurrentChildren) {
sp<Client> parentClient = mClientRef.promote();
sp<Client> client(child->mClientRef.promote());//class Client : public BnSurfaceComposerClient
if (client != nullptr && parentClient != client) {
if (child->mLayerDetached) {
child->mLayerDetached = false;
changed = true;
}
changed |= child->attachChildren();
}
}
return changed;
}
BufferLayer
class BufferLayer : public Layer {
bool latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime,
nsecs_t expectedPresentTime) override;
bool isBufferLatched() const override { return mRefreshPending; }//override显示指明需要重写的方法
BufferInfo mBufferInfo;
BufferLayerConsumer
BufferLayerConsumer consumes buffers of graphics data from a BufferQueue,
and makes them available to RenderEngine as a texture.
class BufferLayerConsumer : public ConsumerBase {
// mCurrentTextureBuffer is the buffer containing the current texture. It's
// possible that this buffer is not associated with any buffer slot, so we
// must track it separately in order to support the getCurrentBuffer method.
std::shared_ptr<Image> mCurrentTextureBuffer;
// mCurrentCrop is the crop rectangle that applies to the current texture.
// It gets set each time updateTexImage is called.
Rect mCurrentCrop;
// The portion of this surface that has changed since the previous frame
Region mCurrentSurfaceDamage;
// Utility class for managing GraphicBuffer references into renderengine
class Image {
public:
Image(const sp<GraphicBuffer>& graphicBuffer, renderengine::RenderEngine& engine);
virtual ~Image();
const sp<GraphicBuffer>& graphicBuffer() { return mGraphicBuffer; }
private:
// mGraphicBuffer is the buffer that was used to create this image.
sp<GraphicBuffer> mGraphicBuffer;
// Back-reference into renderengine to initiate cleanup.
renderengine::RenderEngine& mRE;
DISALLOW_COPY_AND_ASSIGN(Image);
};
BufferQueueLayer
/*
* A new BufferQueue and a new BufferLayerConsumer are created when the
* BufferLayer is first referenced.
*
* This also implements onFrameAvailable(), which notifies SurfaceFlinger
* that new data has arrived.
*/
class BufferQueueLayer : public BufferLayer {
class BufferStateLayer : public BufferLayer {//Interface implementation for Layer
sp<BufferLayerConsumer> mConsumer;
sp<IGraphicBufferProducer> mProducer;
Vector<BufferItem> mQueueItems;
sp<ContentsChangedListener> mContentsChangedListener;
// -----------------------------------------------------------------------
// Interface implementation for BufferLayerConsumer::ContentsChangedListener
// -----------------------------------------------------------------------
class ContentsChangedListener : public BufferLayerConsumer::ContentsChangedListener {
public:
ContentsChangedListener(BufferQueueLayer* bufferQueueLayer)
: mBufferQueueLayer(bufferQueueLayer) {}
void abandon();
protected:
void onFrameAvailable(const BufferItem& item) override;
void onFrameReplaced(const BufferItem& item) override;
void onSidebandStreamChanged() override;
void onFrameDequeued(const uint64_t bufferId) override;
void onFrameDetached(const uint64_t bufferId) override;
void onFrameCancelled(const uint64_t bufferId) override;
private:
BufferQueueLayer* mBufferQueueLayer = nullptr;
Mutex mMutex;
};
Client
SurfaceComposerClient服务的本地Binder实现
class Client : public BnSurfaceComposerClient
// constant
sp<SurfaceFlinger> mFlinger;
// protected by mLock
DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayers;
从return mFlinger->createLayer可知,Client是暴露给producer的接口,Client又是一个转接类,真正的实现,由mFlinger完成
Client属于匿名binder服务,外界的进程不可能直接获取到,因而首先需要借助SurfaceFlinger这一实名binder Service
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
const sp<Client> client = new Client(this);
return client->initCheck() == NO_ERROR ? client : nullptr;
}
Client::Client(const sp<SurfaceFlinger>& flinger)
: mFlinger(flinger)
{
}
sp<Layer> Client::getLayerUser(const sp<IBinder>& handle) const
{
Mutex::Autolock _l(mLock);
sp<Layer> lbc;
wp<Layer> layer(mLayers.valueFor(handle));
if (layer != 0) {
lbc = layer.promote();
ALOGE_IF(lbc==0, "getLayerUser(name=%p) is dead", handle.get());
}
return lbc;
}
status_t Client::createSurface(const String8& name, uint32_t w, uint32_t h, PixelFormat format,
uint32_t flags, const sp<IBinder>& parentHandle,
LayerMetadata metadata, sp<IBinder>* handle,
sp<IGraphicBufferProducer>* gbp, uint32_t* outTransformHint) {
// We rely on createLayer to check permissions.
return mFlinger->createLayer(name, this, w, h, format, flags, std::move(metadata), handle, gbp,
parentHandle, nullptr, outTransformHint);
}
MonitoredProducer
// MonitoredProducer wraps an IGraphicBufferProducer so that SurfaceFlinger will
// be notified upon its destruction
class MonitoredProducer : public BnGraphicBufferProducer {
public:
MonitoredProducer(const sp<IGraphicBufferProducer>& producer,
const sp<SurfaceFlinger>& flinger,
const wp<Layer>& layer);
// The Layer which created this producer, and on which queued Buffer's will be displayed.
sp<Layer> getLayer() const;
private:
sp<IGraphicBufferProducer> mProducer;
sp<SurfaceFlinger> mFlinger;
// The Layer which created this producer, and on which queued Buffer's will be displayed.
wp<Layer> mLayer;
};
MonitoredProducerde 功能与Client差不多
status_t MonitoredProducer::dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h,
PixelFormat format, uint64_t usage,
uint64_t* outBufferAge,
FrameEventHistoryDelta* outTimestamps) {
return mProducer->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
}
LayerVector
/*
* Used by the top-level SurfaceFlinger state and individual layers
* to track layers they own sorted according to Z-order. Provides traversal
* functions for traversing all owned layers, and their descendents.
*/
class LayerVector : public SortedVector<sp<Layer>> {
public:
enum class StateSet {
Invalid,
Current,
Drawing,
};
private:
const StateSet mStateSet;
ComposerService
class ComposerService : public Singleton<ComposerService>
{
sp<ISurfaceComposer> mComposerService;
sp<IBinder::DeathRecipient> mDeathObserver;
Mutex mLock;
ComposerService();
void connectLocked();
void composerServiceDied();
friend class Singleton<ComposerService>;
public:
// Get a connection to the Composer Service. This will block until
// a connection is established.
static sp<ISurfaceComposer> getComposerService();//得到SurfaceFlinger的Binder代理对象
};
sp<ISurfaceComposer> composer;
composer = ComposerService::getComposerService();
或者 getService("SurfaceFlinger", &composer);
ISurfaceComposerClient,得到SurfaceComposerClient的Binder代理对象,ISurfaceComposerClient is the interface to create Surface。
sp<ISurfaceComposerClient> composerClient = composer->createConnection();
要操作Surface,需要得到SurfaceControl
sp<SurfaceControl> surfaceControl = composerClient->createSurface();
int Surface::lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds);//得到一块surface(Layer)
int Surface::unlockAndPost();
all-kinds-of-buffers.png
SurfaceFlinger
SurfaceFlinger实现了ISurfaceComposer接口,是服务端
参考资料:https://waynewolf.github.io/2014/06/22/surfaceflinger-and-client/
class SurfaceFlinger : public BnSurfaceComposer,
public PriorityDumper,
public ClientCache::ErasedRecipient,
private IBinder::DeathRecipient,
private HWC2::ComposerCallback,
private ISchedulerCallback {
status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) override;
/* ISurfaceComposer interface
*/
sp<ISurfaceComposerClient> createConnection() override;
handleMessageRefresh
|—> preComposition
|—> rebuildLayerStacks
|—> setUpHWComposer
|—> HWComposer::createWorkList <== hwc="" structures="" are="" allocated="" |—=""> Layer::setGeometry()
|— set per frame data
|— HWComposer::prepare
|—> hwc prepare
|—> doComposition
|---- skip composition on external display if condition meets
|—> doDisplayComposition
| |—> doComposeSurfaces
| |—> DisplayDevice::swapBuffers
| |—> eglSwapBuffers
| |—> FramebufferSurface::advanceFrame
|—> DisplayDevice::flip(…) <== just="" update="" statistics="" count="" |--=""> Call DisplayDevice::compositionComplete(), notify each display
|--> DisplaySurface::compositionComplete()
|--> FramebufferSurface::compositionComplete()
|--> HWComposer::fbCompositionComplete()
|--> NoOP if HWC >= 1.1
|--> used only in framebuffer device case.
|—> postFrameBuffer
|—> HWComposer::commit
|—> hwc set
|—> update retireFenceFd of hwc_display_contents_1
|—> DisplayDevice::onSwapBuffersCompleted
|—> FramebufferSurface::onFrameComitted
|—> Layer::onLayerDisplayed
|— update some statistics
|—> postCom
CompositionRefreshArgs
/**
* A parameter object for refreshing a set of outputs
*/
struct CompositionRefreshArgs {
// All the outputs being refreshed
Outputs outputs;
// All the layers that are potentially visible in the outputs. The order of
// the layers is important, and should be in traversal order from back to
// front.
Layers layers;
// All the layers that have queued updates.
Layers layersWithQueuedFrames;
// If true, forces the entire display to be considered dirty and repainted
bool repaintEverything{false};
/**
* An output layer contains the output-dependent composition state for a layer
*/
class OutputLayer {
/**
* Encapsulates all the state involved with composing layers for an output
*/
class Output {