Professional Documents
Culture Documents
Surfaceflinger Overlay
Surfaceflinger Overlay
net/yili_xie/article/details/4803527
Android Display System --- Surface Flinger
SurfaceFlinger Android multimedia Android
service surface composer
2D 3D surface SurfaceFlinger
1
a surface surface
b surface
home
Z
surface Z surface
Z
Z-order
buffer
surface SurfaceFlinger
surface (compose/merge) main Surface Main
Surface FB/V4l2 Output
Surface merge
merge
SurfaceFlinger Overlay
2 OverLay
merge overlay Overlay
IMX51 IPU FB
3 FB Overlay
Overlay
Overlay FrameBuffer merge Overlay buffer buffer
Overlay camera
preview Merge Merge
Overlay Overlay
Overlay hal,
Overlay Buffer AndroidFsl
Camera preview r3
opencore Overlay
3SurfaceFlinger
SurfaceFlinger SurfaceFlinger
merge Surface Surface Surface
skiaopengl pixflinger
SurfaceFlinger merge
2D 3D
3.1 Surface
Surface
buffer
SurfaceFlinger
Surface
IBinder
Surface Flinger service surface
SurfaceFlinger (Client)
buffer buffer
SurfaceFlinger
Client Client
surface SurfaceFlinger
surface SurfaceFlinger Client per_client_cblk_t
BClient SurfaceComposerClient
surface
SurfaceComposerClient
SurfaceComposerClient
getComposerService() ISurfaceComposer
ISurfaceComposer:createConnection() binder SurfaceFlinger
SurfaceFlinger ISurfaceFlingerClient
Client Client
Surface Flinger Client 8M
buffer surface layer
z layer layer
( opengl skia) SurfaceFlinger
ISurface
Surface
layer ISurface
// Surfaceflinger client
SurfaceFlinger Thread
SurfaceFlinger SurfaceFlinger
sruface flip
SurfaceComposerClient IBinder
SurfaceFlinger
Surface Surface layer Layer_cblk_t
swapstate SurfaceComposerClient swapsate
buffer swapstate Client copy
Android hal
memcpy HAL
/hardware/libhardware/hardware/include/copybit.h
SurfaceFlinger
Windows manager Windows manager
layer SurfaceFlinger
PS Windows Manager java
z-order
SurfaceComposerClient SurfaceFlinger
SurfaceFlinger SurfaceFlinger
Android
Transaction (layer_state_t)
Transaction
4 SurfaceFlinger
Flinger SurfaceFlinger
SurfaceFlinger
Android Android
( Android
visibleRegionScreen ) layer
layer FB
layer
Opengl alpha copybit hal
alhpa
Android layer FB
4.1 handleConsoleEvent
4.2 handleTransaction
Transaction
Android layer
Z layer layer
layer layer
layer layer
layer layer
skia
4.4 handleRepaint
layer layer
surface buffer layer
buffer alpha
opengl
PixFlinger
4.5 postFrameBuffer
layer buffer FB
http://www.meegozu.com/thread-428-1-1.html
Android libui
1 libui
libui Android Surfacelibui
Overlay GUI
/frameworks/base/include/ui
/frameworks/base/libs/ui
libui.so
2 libui
1Camera
2Event / Key event
3Overlay
4RectRegion PixelFormat
5Framebuffer
6Surface
3 Framebuffer
3.1
libui FramebufferNativeWindow Gralloc
Linux Framebuffer Gralloc
FramebufferNativeWindow 2 NativeBuffer
Gralloc alloc
1.
if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
2.
3.
4.
5.
mNumBuffers = 2;
6.
mNumFreeBuffers = 2;
7.
mBufferHead = mNumBuffers-1;
8.
9.
10.
11.
12.
13.
14.
15.
16.
3.2
Gralloc libui ashmem
GRALLOC_USAGE_HW_MASK
sw_gralloc_handle_t
sw_gralloc_handle_t::alloc
size = bpp * w * h size PAGE_SIZE ashmem_create_region
ashmem_set_prot_region mmap
1.
2.
3.
4.
prot |= PROT_WRITE;
5.
ashmem_set_prot_region(fd, prot) ;
6.
sw_gralloc_handle_t::registerBuffer sw_gralloc_handle_t
mmap
1.
if (hnd->pid != getpid()) {
2.
3.
hnd->base = intptr_t(base);
4.
4 libui Surface
libui Surface SurfaceFlinger
SurfaceFlinger Android
SurfaceComposerClientSurfaceControl Surface
4.1 SurfaceComposerClient
SurfaceComposerClient
SurfaceComposerClient getComposerService() ISurfaceComposer
ISurfaceComposer:createConnection() binder SurfaceFlinger
SurfaceFlinger ISurfaceFlingerClient
//D:\repos\pydtd\pydtd_device\frameworks\base\libs\surfaceflinger_client\SurfaceComposerClient.cpp
4.2 Surface
SurfaceComposerClient createSurface() Surface
ISurfaceFlingerClient createSurface() binder SurfaceFlinger Layer
SurfaceControl
//D:\repos\pydtd\pydtd_device\frameworks\base\libs\surfaceflinger_client\SurfaceComposerClient.cpp
Surface
4.4
Server SurfaceFlinger
SurfaceComposerClientSurfaceControl Surface Surface
Surface ISurfaceXXX Binder
libui Surface libsurfaceflinger SurfaceFlinger
Surface
http://hi.baidu.com/aokikyon
http://meegozu.com/thread-431-1-1.html
http://blog.csdn.net/yili_xie/archive/2009/11/12/4803527.aspx
http://blog.csdn.net/DroidPhone/article/details/5972568
Surface
Android Surface
Surface
Surface
1. SurfaceSession
2. SurfaceSession Surface
1.
void SurfaceComposerClient::_init(
2.
3.
4.
......
5.
mClient = conn;
6.
if (mClient == 0) {
7.
mStatus = NO_INIT;
8.
return;
9.
10.
11.
mControlMemory = mClient->getControlBlock();
12.
mSignalServer = sm;
13.
14. }
Surface
SurfaceFlinger Layer Layer JAVA
JAVA Surface Canvas
Canvas
Surface lock()
dequeueBuffer(&backBuffer) backBuffer
SharedBufferClient->dequeue()
GraphicBuffer:backBuffer
frontBuffer
info vaddr
D:\repos\pydtd\pydtd_device\frameworks\base\libs\surfaceflinger_client\ Surface.cpp
Surface
Surface Canvas
buffer frontBufferSurfaceFlinger
frontBuffer OpenGL
JAVA unlockCanvasAndPost
Surface_unlockCanvasAndPost
bitmap Canvas
Surface unlockAndPost
GraphicBuffer unlock()
SharedClient SharedBufferStack
Canvas SharedBufferClient dequeue
SharedBufferClient queue
SurfaceFlinger SurfaceFlinger Layer SharedBufferServer
SurfaceFlinger SharedBufferServer Layer SurfaceComposerClient
SurfaceFlinger SharedClient SharedClient
SharedBufferStack 31 Surface
SharedBufferStack SurfaceComposerClient Surface SharedBufferClient
SharedBufferStack SurfaceFlinger Layer SharedBufferServer SharedBufferStack
SharedBufferClient/SharedBufferServer SharedBufferStack
SharedBufferStack Surface
SurfaceFlinger/
SharedClient SharedBufferStack
/frameworks/base/libs/surfaceflinger_client/SharedBufferStack.cpp
/frameworks/base/include/private/surfaceflinger/SharedBufferStack.h
Chrome 30
2011
2011
IT
SurfaceFlinger
Surface Surface SurfaceFlinger LayerSurfaceFlinger Layer
Layer SurfaceFlinger
Layer Surface
Surface SurfaceFlinger SurfaceFlinger
SurfaceSurfaceFlinger - Layer
Surface
Android Surface
Surface
Surface
1. SurfaceSession
2. SurfaceSession Surface
1.
void SurfaceComposerClient::_init(
2.
3.
4.
......
5.
mClient = conn;
6.
if (mClient == 0) {
7.
mStatus = NO_INIT;
8.
return;
9.
10.
11.
mControlMemory = mClient->getControlBlock();
12.
mSignalServer = sm;
13.
14. }
void SurfaceComposerClient::_init(
const sp<ISurfaceComposer>& sm, const sp<ISurfaceFlingerClient>& conn)
{
......
mClient = conn;
if (mClient == 0) {
mStatus = NO_INIT;
return;
}
mControlMemory = mClient->getControlBlock();
mSignalServer = sm;
mControl = static_cast<SharedClient *>(mControlMemory->getBase());
}
Surface
SurfaceFlinger Layer Layer JAVA
JAVA Surface Canvas
Canvas
Surface lock()
dequeueBuffer(&backBuffer) backBuffer
SharedBufferClient->dequeue()
GraphicBuffer:backBuffer
frontBuffer
info vaddr
Surface
Surface Canvas
buffer frontBufferSurfaceFlinger
frontBuffer OpenGL
JAVA unlockCanvasAndPost
Surface_unlockCanvasAndPost
bitmap Canvas
Surface unlockAndPost
GraphicBuffer unlock()
SharedClient SharedBufferStack
Canvas SharedBufferClient dequeue
SharedBufferClient queue
SurfaceFlinger SurfaceFlinger Layer SharedBufferServer
SurfaceFlinger SharedBufferServer Layer SurfaceComposerClient
SurfaceFlinger SharedClient SharedClient
SharedBufferStack 31 Surface
SharedBufferStack SurfaceComposerClient Surface SharedBufferClient
SharedBufferStack SurfaceFlinger Layer SharedBufferServer SharedBufferStack
SharedBufferClient/SharedBufferServer SharedBufferStack
SharedBufferStack Surface
SurfaceFlinger/
SharedClient SharedBufferStack
/frameworks/base/libs/surfaceflinger_client/SharedBufferStack.cpp
/frameworks/base/include/private/surfaceflinger/SharedBufferStack.h
Chrome 30
2011
2011
IT
SurfaceFlinger
Surface Surface SurfaceFlinger LayerSurfaceFlinger Layer
Layer SurfaceFlinger
Layer Surface
Surface SurfaceFlinger SurfaceFlinger
SurfaceSurfaceFlinger - Layer
Surface
Android Surface
Surface
Surface
1. SurfaceSession
2. SurfaceSession Surface
1.
void SurfaceComposerClient::_init(
2.
3.
4.
......
5.
mClient = conn;
6.
if (mClient == 0) {
7.
mStatus = NO_INIT;
8.
return;
9.
10.
11.
mControlMemory = mClient->getControlBlock();
12.
mSignalServer = sm;
13.
14. }
void SurfaceComposerClient::_init(
const sp<ISurfaceComposer>& sm, const sp<ISurfaceFlingerClient>& conn)
{
......
mClient = conn;
if (mClient == 0) {
mStatus = NO_INIT;
return;
}
mControlMemory = mClient->getControlBlock();
mSignalServer = sm;
mControl = static_cast<SharedClient *>(mControlMemory->getBase());
}
Surface
SurfaceFlinger Layer Layer JAVA
JAVA Surface Canvas
Canvas
Surface lock()
dequeueBuffer(&backBuffer) backBuffer
SharedBufferClient->dequeue()
GraphicBuffer:backBuffer
frontBuffer
info vaddr
Surface
Surface Canvas
buffer frontBufferSurfaceFlinger
frontBuffer OpenGL
JAVA unlockCanvasAndPost
Surface_unlockCanvasAndPost
bitmap Canvas
Surface unlockAndPost
GraphicBuffer unlock()
SharedClient SharedBufferStack
Canvas SharedBufferClient dequeue
SharedBufferClient queue
SurfaceFlinger SurfaceFlinger Layer SharedBufferServer
SurfaceFlinger SharedBufferServer Layer SurfaceComposerClient
SurfaceFlinger SharedClient SharedClient
SharedBufferStack 31 Surface
SharedBufferStack SurfaceComposerClient Surface SharedBufferClient
SharedBufferStack SurfaceFlinger Layer SharedBufferServer SharedBufferStack
SharedBufferClient/SharedBufferServer SharedBufferStack
SharedBufferStack Surface
SurfaceFlinger/
SharedClient SharedBufferStack
/frameworks/base/libs/surfaceflinger_client/SharedBufferStack.cpp
/frameworks/base/include/private/surfaceflinger/SharedBufferStack.h
SharedClientSharedBufferStackSharedBufferClientSharedBufferServer
1. SharedClient
1.
sp<ISurfaceFlingerClient> SurfaceFlinger::createConnection()
2.
3.
Mutex::Autolock _l(mStateLock);
4.
5.
6.
7.
if (client->ctrlblk == 0) {
8.
mTokens.release(token);
9.
return 0;
10.
11.
12.
if (err < 0) {
13.
mTokens.release(token);
14.
return 0;
15.
16.
sp<BClient> bclient =
17.
18.
return bclient;
19. }
sp<ISurfaceFlingerClient> SurfaceFlinger::createConnection()
{
Mutex::Autolock _l(mStateLock);
uint32_t token = mTokens.acquire();
sp<Client> client = new Client(token, this);
if (client->ctrlblk == 0) {
mTokens.release(token);
return 0;
}
status_t err = mClientsMap.add(token, client);
if (err < 0) {
mTokens.release(token);
return 0;
}
sp<BClient> bclient =
new BClient(this, token, client->getControlBlockMemory());
return bclient;
Client 4K
SharedClient
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
new(ctrlblk) SharedClient;
}
14. }
2. SharedBufferStackSharedBufferServer
SharedBufferClient
SharedClient SharedBufferStack
1.
int32_t id = client->generateId(pid);
int32_t id = client->generateId(pid);
1.
2.
w, h, flags, format);
createNormalSurfaceLocked Layer
1.
1.
2.
3.
4.
5.
mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
{
6.
7.
client->ctrlblk, i, NUM_BUFFERS,
8.
mIdentity);
9.
1.
2.
: mClient(surface->mClient), mSurface(surface->mSurface),
3.
mToken(surface->mToken), mIdentity(surface->mIdentity),
4.
mFormat(surface->mFormat), mFlags(surface->mFlags),
5.
mBufferMapper(GraphicBufferMapper::get()), mSharedBufferClient(NULL),
6.
mWidth(surface->mWidth), mHeight(surface->mHeight)
7.
8.
9.
10.
11.
init();
12. }
http://blog.csdn.net/droidphone/article/details/5982893