Having known that BufferQueue exposes the APIs for consuming surface frame while implementing BnGraphicBufferProducer, we
continue our attempt to demystify surface compositions and rendering with an examination of a few more classes with respect to surface composing.
SurfaceFlingerConsumer and GLConsumer class
Defined in framework/native/services/surfaceflinger/SurfaceFlingerConsumer.h, and framework/native/include/gui/GLConsumer.h,SurfaceFlingerConsumer and GLConsumer are
the core classes to fetch the current buffer from BufferQueue to bind to a surface layer specific GL texture. GLConsumer uses
GLES functions to conduct the operation while SurfaceFlingerConsumer is a wrapper around it to safeguard the operation.
The main APIs in SurfaceFlingerConsumerare updateTexImage()
Note that a surface frame will be drawn to the display frame buffer as a GL texture and GLConsumer inherits from ConsumerBase.
It has been known that when a SurfaceComposerClient::createSurface is invoked, Client in
SurfaceFlinger posts a MessageCreateLayer toSurfaceFlinger which
in turn calls SurfaceFlinger::createLayer() create aLayer instance
to service the remote Surface instance.
Applying a lazy initialization, Layer delays until first reference to instantiate a BufferQueue object
and SurfaceFlingerConsumercorresponding to the remote Surface object;
meanwhile Layer links the BufferQueue object
to SurfaceFlingerConsumer object and register itself as SurfaceFlingerConsumer::FrameAvailableListener listener
among other procedures.
When Surface::queueBuffer() is invoked, BufferQueue::queueBuffer()
and Layer::onFrameAvailable() call ensue ,as we elaborated in post SurfaceFlinger(III).
Subsequently , the Layer::draw() and Layer::onDraw() will be called to run SurfaceFlingerConsumer::bindTextureImage()
andLayer::drawWithOpenGL()to FramebufferSurface current