Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 43

http://blog.csdn.

net/yili_xie/article/details/4803527
Android Display System --- Surface Flinger
SurfaceFlinger Android multimedia Android
service surface composer
2D 3D surface SurfaceFlinger

1

surface window 4 surface


home 3 surface button
home surface

a surface surface


b surface
home

Z
surface Z surface
Z
Z-order

buffer surface surface

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

SurfaceFlinger Overlay hal Overlay hal overlay


/hardware/libhardware/include/harware/Overlay.h
FB V4L2 output Overlay hal
, Overlay sequence
/frameworks/base/libs/surfaceflinger/tests/overlays/Overlays.cpp, sequnce

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

layer Surface Layer


Android
Layer Client pid
layer ID Layer
Layer Surface
ISurfaceFlingerClient::Surface_data_t Surace buffer

ISurface
Surface

Android 4 layer layer

Layer LayerBlur LayerBuffer LayerDim


Android LayerBuffer
Layer Buffer Layer Layer
Surface.java /frameworks/base/core/java/android/view/surface.java
Layer Layer (norm layer) LayerBuffer
Norm Layer Android Layer
surface layer Normal Layer
Android display Normal Layer Surface

buffer front buffer back buffer


Flip Front buffer SurfaceFlinger Back buffer
Back buffer (dirty) flip back buffer front
buffer front buffer back buffer buffer
surface
/frameworks/base/lib/surfaceflinger/layer.cpp setbuffers()
buffer flip Android display
Surface FB main surface
LayerBuffer Layer
layer render buffer camera preview / video playback

post buffer overlay


Overlay layer overlay post buffer
layer post buffer
layer merge FB overlay merge

layer ISurface

// Surfaceflinger client

sp<SurfaceComposerClient> client = new SurfaceComposerClient();


// Surfaceflinger Surface surface PushBuffers
sp<Surface> surface = client->createSurface(getpid(), 0, 320, 240,
PIXEL_FORMAT_UNKNOWN, ISurfaceComposer::ePushBuffers);
// ISurface getISurface()
Surface.h /framewoks/base/include/ui/Surface.h
sp<ISurface> isurface = Test::getISurface(surface);
//overlay overlay overlay
sp<OverlayRef> ref = isurface->createOverlay(320, 240,
PIXEL_FORMAT_RGB_565);
sp<Overlay> verlay = new Overlay(ref);
//post buffer buffer buffer
ISurface
ISurface::BufferHeap buffers(w, h, w, h,
PIXEL_FORMAT_YCbCr_420_SP,
transform,
0,
mHardware->getPreviewHeap());
mSurface->registerBuffers(buffers);
3.2
Surface buffer
buffer SurfaceFlinger
flip
SurfaceFlinger SurfaceFlinger

SurfaceFlinger Thread
SurfaceFlinger SurfaceFlinger
sruface flip
SurfaceComposerClient IBinder

SurfaceComposerClient SurfaceFlinger SurfaceFlingerSynchro


OPEN
OPEN CLOSE
OPEN Client Surface IBinder
SurfaceFlinger OPEN

SurfaceFlinger
Surface Surface layer Layer_cblk_t
swapstate SurfaceComposerClient swapsate
buffer swapstate Client copy

// We block the client if:


// eNextFlipPending:
//
// eResizeRequested:
//

we've used both buffers already, so we need to


wait for one to become availlable.
the buffer we're going to acquire is being
resized. Block until it is done.

// eFlipRequested && eBusy: the buffer we're going to acquire is


//
// eInvalidSurface:
//

currently in use by the server.


this is a special case, we don't block in this
case, we just return an error.

lockSurface() layer swapstate


buffer unlockSurfaceAndPost()
SurfaceFlinger Flip unlockSurface()
SurfaceFlinger
Surface

Front buffer Back buffer SurfaceFlinger

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

signal singalEvent Client


handleConsoleEvent /dev/console

4.2 handleTransaction
Transaction

Android layer

layer Android layer


layer
4.3 handlePageFlip
surface buffer layer_state_t
swapsate swapsate eNextFlipPending
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.

err = framebuffer_open(module, &fbDev);

3.

err = gralloc_open(module, &grDev);

4.

// initialize the buffer FIFO

5.

mNumBuffers = 2;

6.

mNumFreeBuffers = 2;

7.

mBufferHead = mNumBuffers-1;

8.

buffers[0] = new NativeBuffer(

9.
10.
11.
12.

fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);


buffers[1] = new NativeBuffer(
fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
err = grDev->alloc(grDev, fbDev->width, fbDev->height, fbDev->format,

13.
14.

GRALLOC_USAGE_HW_FB, &buffers[0]->handle, &buffers[0]->stride);


err = grDev->alloc(grDev, fbDev->width, fbDev->height, fbDev->format,

15.
16.

GRALLOC_USAGE_HW_FB, &buffers[1]->handle, &buffers[1]->stride);


......

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.

int fd = ashmem_create_region("sw-gralloc-buffer", size);

2.

int prot = PROT_READ;

3.

if (usage & GRALLOC_USAGE_SW_WRITE_MASK)

4.

prot |= PROT_WRITE;

5.

ashmem_set_prot_region(fd, prot) ;

6.

void* base = mmap(0, size, prot, MAP_SHARED, fd, 0);

sw_gralloc_handle_t::registerBuffer sw_gralloc_handle_t
mmap
1.

if (hnd->pid != getpid()) {

2.

void* base = mmap(0, hnd->size, hnd->prot, MAP_SHARED, hnd->fd, 0);

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

JAVA Surface SurfaceControl JAVA


SurfaceControl SurfaceControl getSurface Surface

4.3 Surface ISurface


SurfaceControl getSurface() Surface SurfaceControl
Surface Surface
getISurface() ISurface ISurface binder

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

Android SurfaceFlinger SharedClient -- Surface


Layer
SurfaceFlinger Surface
Surface SurfaceFlinger LayerSurfaceFlinger Layer
Layer SurfaceFlinger Layer
Surface
Surface SurfaceFlinger SurfaceFlinger
SurfaceSurfaceFlinger - Layer

Surface
Android Surface

Surface

Surface

1. SurfaceSession

SurfaceComposerClient JAVA JNI


SurfaceComposerClient SurfaceComposerClient ISurfaceComposer
SurfaceFlinger createConnectionSurfaceFlinger ISurfaceFlingerClient
SurfaceComposerClient createConnection SurfaceFlinger
SharedClient SharedClient SurfaceComposerClient
JAVA SurfaceSession

2. SurfaceSession Surface

JAVA JNI Surface_Init() SurfaceComposerClient


SurfaceComposerClient ISurfaceFlingerClient createSurface
SurfaceFlingerSurfaceFlinger Layer Layer setBuffers()

Layer Layer ISurface SurfaceComposerClient


ISurface SurfaceControl SurfaceControl JAVA

JAVA Surface SurfaceControl JAVA


SurfaceControl SurfaceControl getSurface Surface

Android Surface Page-Flip

SurfaceSession SurfaceFlinger SharedClient


SurfaceComposerClient ISurfaceFlingerClient getControlBlock()
SharedClient SurfaceComposerClient _init:

view plaincopy to clipboardprint?

1.

void SurfaceComposerClient::_init(

2.
3.

const sp<ISurfaceComposer>& sm, const sp<ISurfaceFlingerClient>& conn)


{

4.

......

5.

mClient = conn;

6.

if (mClient == 0) {

7.

mStatus = NO_INIT;

8.

return;

9.

10.
11.

mControlMemory = mClient->getControlBlock();

12.

mSignalServer = sm;

13.

mControl = static_cast<SharedClient *>(mControlMemory->getBase());

14. }

Surface
SurfaceFlinger Layer Layer JAVA
JAVA Surface Canvas
Canvas

Surface Surface.java lockCanvas() Canvas


lockCanvas Surface_lockCanvas JAVA SurfaceControl
getSurface() Surface Surface lock()lock()
Surface vaddr vaddr Android 2D Skia
bitmap Skia Canvas APICanvas.setBitmapDevice(bitmap) bitmap
Canvas Canvas JAVA JAVA Canvas
vaddr

Surface lock()

dequeueBuffer(&backBuffer) backBuffer

SharedBufferClient->dequeue()

GraphicBuffer:backBuffer

Layer buffer MappergetBufferLocked ISurface

frontBuffer

Buffer frontBuffer backBuffer Buffer

backBuffer->lock() backBuffer vaddr

info vaddr

Note: Ray, Dirty, frontbuffer Copy backBuffer , backBuffer adder

D:\repos\pydtd\pydtd_device\frameworks\base\libs\surfaceflinger_client\ Surface.cpp

Surface
Surface Canvas
buffer frontBufferSurfaceFlinger
frontBuffer OpenGL

JAVA unlockCanvasAndPost

Surface_unlockCanvasAndPost

JAVA SurfaceControl getSurface() Surface

bitmap Canvas

Surface unlockAndPost

GraphicBuffer unlock()

queueBuffer() SharedBufferClient queue()

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

Android SurfaceFlinger SharedClient -- Surface


Layer
Android 2010-10-28 18:59 8691 (18)

SurfaceFlinger
Surface Surface SurfaceFlinger LayerSurfaceFlinger Layer
Layer SurfaceFlinger
Layer Surface
Surface SurfaceFlinger SurfaceFlinger
SurfaceSurfaceFlinger - Layer

Surface
Android Surface

Surface

Surface

1. SurfaceSession

SurfaceComposerClient JAVA JNI


SurfaceComposerClient SurfaceComposerClient ISurfaceComposer
SurfaceFlinger createConnectionSurfaceFlinger ISurfaceFlingerClient
SurfaceComposerClient createConnection SurfaceFlinger

SharedClient SharedClient SurfaceComposerClient


JAVA SurfaceSession

2. SurfaceSession Surface

JAVA JNI Surface_Init() SurfaceComposerClient


SurfaceComposerClient ISurfaceFlingerClient createSurface
SurfaceFlingerSurfaceFlinger Layer Layer setBuffers()
Layer Layer ISurface SurfaceComposerClient
ISurface SurfaceControl SurfaceControl JAVA

JAVA Surface SurfaceControl JAVA


SurfaceControl SurfaceControl getSurface Surface

Android Surface Page-Flip

SurfaceSession SurfaceFlinger SharedClient


SurfaceComposerClient ISurfaceFlingerClient getControlBlock()
SharedClient SurfaceComposerClient _init:

view plaincopy to clipboardprint?

1.

void SurfaceComposerClient::_init(

2.
3.

const sp<ISurfaceComposer>& sm, const sp<ISurfaceFlingerClient>& conn)


{

4.

......

5.

mClient = conn;

6.

if (mClient == 0) {

7.

mStatus = NO_INIT;

8.

return;

9.

10.
11.

mControlMemory = mClient->getControlBlock();

12.

mSignalServer = sm;

13.

mControl = static_cast<SharedClient *>(mControlMemory->getBase());

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 Surface.java lockCanvas() Canvas


lockCanvas Surface_lockCanvas JAVA SurfaceControl
getSurface() Surface Surface lock()lock()
Surface vaddr vaddr Android 2D Skia
bitmap Skia Canvas APICanvas.setBitmapDevice(bitmap) bitmap
Canvas Canvas JAVA JAVA Canvas
vaddr

Surface lock()

dequeueBuffer(&backBuffer) backBuffer

SharedBufferClient->dequeue()

GraphicBuffer:backBuffer

Layer buffer MappergetBufferLocked ISurface

frontBuffer

Buffer frontBuffer backBuffer Buffer

backBuffer->lock() backBuffer vaddr

info vaddr

Surface
Surface Canvas
buffer frontBufferSurfaceFlinger
frontBuffer OpenGL

JAVA unlockCanvasAndPost

Surface_unlockCanvasAndPost

JAVA SurfaceControl getSurface() Surface

bitmap Canvas

Surface unlockAndPost

GraphicBuffer unlock()

queueBuffer() SharedBufferClient queue()

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

Android SurfaceFlinger SharedClient -- Surface


Layer
Android 2010-10-28 18:59 8691 (18)

SurfaceFlinger
Surface Surface SurfaceFlinger LayerSurfaceFlinger Layer

Layer SurfaceFlinger
Layer Surface
Surface SurfaceFlinger SurfaceFlinger
SurfaceSurfaceFlinger - Layer

Surface
Android Surface

Surface

Surface

1. SurfaceSession

SurfaceComposerClient JAVA JNI


SurfaceComposerClient SurfaceComposerClient ISurfaceComposer
SurfaceFlinger createConnectionSurfaceFlinger ISurfaceFlingerClient
SurfaceComposerClient createConnection SurfaceFlinger
SharedClient SharedClient SurfaceComposerClient
JAVA SurfaceSession

2. SurfaceSession Surface

JAVA JNI Surface_Init() SurfaceComposerClient


SurfaceComposerClient ISurfaceFlingerClient createSurface
SurfaceFlingerSurfaceFlinger Layer Layer setBuffers()
Layer Layer ISurface SurfaceComposerClient
ISurface SurfaceControl SurfaceControl JAVA

JAVA Surface SurfaceControl JAVA


SurfaceControl SurfaceControl getSurface Surface

Android Surface Page-Flip

SurfaceSession SurfaceFlinger SharedClient


SurfaceComposerClient ISurfaceFlingerClient getControlBlock()
SharedClient SurfaceComposerClient _init:

view plaincopy to clipboardprint?

1.

void SurfaceComposerClient::_init(

2.
3.

const sp<ISurfaceComposer>& sm, const sp<ISurfaceFlingerClient>& conn)


{

4.

......

5.

mClient = conn;

6.

if (mClient == 0) {

7.

mStatus = NO_INIT;

8.

return;

9.

10.
11.

mControlMemory = mClient->getControlBlock();

12.

mSignalServer = sm;

13.

mControl = static_cast<SharedClient *>(mControlMemory->getBase());

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 Surface.java lockCanvas() Canvas


lockCanvas Surface_lockCanvas JAVA SurfaceControl
getSurface() Surface Surface lock()lock()
Surface vaddr vaddr Android 2D Skia
bitmap Skia Canvas APICanvas.setBitmapDevice(bitmap) bitmap
Canvas Canvas JAVA JAVA Canvas
vaddr

Surface lock()

dequeueBuffer(&backBuffer) backBuffer

SharedBufferClient->dequeue()

GraphicBuffer:backBuffer

Layer buffer MappergetBufferLocked ISurface

frontBuffer

Buffer frontBuffer backBuffer Buffer

backBuffer->lock() backBuffer vaddr

info vaddr

Surface
Surface Canvas
buffer frontBufferSurfaceFlinger
frontBuffer OpenGL

JAVA unlockCanvasAndPost

Surface_unlockCanvasAndPost

JAVA SurfaceControl getSurface() Surface

bitmap Canvas

Surface unlockAndPost

GraphicBuffer unlock()

queueBuffer() SharedBufferClient queue()

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

createConnection SurfaceFlinger Client

view plaincopy to clipboardprint?

1.

sp<ISurfaceFlingerClient> SurfaceFlinger::createConnection()

2.

3.

Mutex::Autolock _l(mStateLock);

4.

uint32_t token = mTokens.acquire();

5.
6.

sp<Client> client = new Client(token, this);

7.

if (client->ctrlblk == 0) {

8.

mTokens.release(token);

9.

return 0;

10.

11.

status_t err = mClientsMap.add(token, client);

12.

if (err < 0) {

13.

mTokens.release(token);

14.

return 0;

15.

16.

sp<BClient> bclient =

17.

new BClient(this, token, client->getControlBlockMemory());

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

view plaincopy to clipboardprint?

1.

Client::Client(ClientID clientID, const sp<SurfaceFlinger>& flinger)

2.
3.

: ctrlblk(0), cid(clientID), mPid(0), mBitmap(0), mFlinger(flinger)


{

4.

const int pgsize = getpagesize();

5.

const int cblksize = ((sizeof(SharedClient)+(pgsize-1))&~(pgsize-1));

6.
7.

mCblkHeap = new MemoryHeapBase(cblksize, 0,

8.

"SurfaceFlinger Client control-block");

9.
10.

ctrlblk = static_cast<SharedClient *>(mCblkHeap->getBase());

11.

if (ctrlblk) { // construct the shared structure in-place.

12.
13.

new(ctrlblk) SharedClient;
}

14. }

Client::Client(ClientID clientID, const sp<SurfaceFlinger>& flinger)


: ctrlblk(0), cid(clientID), mPid(0), mBitmap(0), mFlinger(flinger)
{
const int pgsize = getpagesize();
const int cblksize = ((sizeof(SharedClient)+(pgsize-1))&~(pgsize-1));
mCblkHeap = new MemoryHeapBase(cblksize, 0,
"SurfaceFlinger Client control-block");
ctrlblk = static_cast<SharedClient *>(mCblkHeap->getBase());
if (ctrlblk) { // construct the shared structure in-place.
new(ctrlblk) SharedClient;
}
}

createConnection Client getControlBlockMemory()


IMemoryHeap ISurfaceFlingerClient BClientBClient mCblk
IMemoryHeap

BClient SurfaceComposerClientSurfaceComposerClient ISurfaceFlingerClient


getControlBlock() IMemoryHeap SurfaceComposerClient
mControlMemory

IMemoryHeap getBase () SharedClient


SurfaceComposerClient mControl

SurfaceComposerClient mControl SurfaceFlinger::Client.ctrlblk


SharedClient

2. SharedBufferStackSharedBufferServer
SharedBufferClient
SharedClient SharedBufferStack

SharedBufferStack surfaces[ NUM_LAYERS_MAX ];

NUM_LAYERS_MAX 31 SharedClient 4KB


Surface SurfaceFlinger createSurface createConnection
Client Client 0--NUM_LAYERS_MAX
SharedBufferStack

view plaincopy to clipboardprint?

1.

int32_t id = client->generateId(pid);

int32_t id = client->generateId(pid);

Client Layer Layer

view plaincopy to clipboardprint?

1.

layer = createNormalSurfaceLocked(client, d, id,

2.

w, h, flags, format);

layer = createNormalSurfaceLocked(client, d, id,


w, h, flags, format);

createNormalSurfaceLocked Layer

view plaincopy to clipboardprint?

1.

sp<Layer> layer = new Layer(this, display, client, id);

sp<Layer> layer = new Layer(this, display, client, id);

Layer LayerBaseClientLayerBaseClient SharedBufferServer


SharedBufferStack SharedClient SharedBufferServer

view plaincopy to clipboardprint?

1.

LayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,

2.

const sp<Client>& client, int32_t i)

3.

: LayerBase(flinger, display), lcblk(NULL), client(client), mIndex(i),

4.
5.

mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
{

6.

lcblk = new SharedBufferServer(

7.

client->ctrlblk, i, NUM_BUFFERS,

8.

mIdentity);

9.

LayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,


const sp<Client>& client, int32_t i)
: LayerBase(flinger, display), lcblk(NULL), client(client), mIndex(i),
mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
{
lcblk = new SharedBufferServer(
client->ctrlblk, i, NUM_BUFFERS,
mIdentity);
}

Layer lcblk (SharedBufferServer) SharedClient


Layer SharedBufferStack

SurfaceFlinger Surface.cpp Surface

view plaincopy to clipboardprint?

1.

Surface::Surface(const sp<SurfaceControl>& surface)

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.

mSharedBufferClient = new SharedBufferClient(

9.

mClient->mControl, mToken, 2, mIdentity);

10.
11.

init();

12. }

Surface::Surface(const sp<SurfaceControl>& surface)


: mClient(surface->mClient), mSurface(surface->mSurface),
mToken(surface->mToken), mIdentity(surface->mIdentity),
mFormat(surface->mFormat), mFlags(surface->mFlags),
mBufferMapper(GraphicBufferMapper::get()), mSharedBufferClient(NULL),
mWidth(surface->mWidth), mHeight(surface->mHeight)
{
mSharedBufferClient = new SharedBufferClient(
mClient->mControl, mToken, 2, mIdentity);
init();
}

SharedBufferClient mClient->mControl SharedClient mToken


SharedBufferStack

Surface mSharedBufferClient Layer lcblk (SharedBufferServer)


SharedClient SharedBufferStack SurfaceLayer

http://blog.csdn.net/droidphone/article/details/5982893

Android SurfaceFlinger threadLoop()

You might also like