SlideShare una empresa de Scribd logo
1 de 15
SurfaceFlingerService
(서피스 플링거 연결)




                            박철희

                        1
화면 출력 요청 전 과정




                2
1.서피스 플링거 연결 요청

 1.Surfaceflinger 검색 및 proxy 획득




                  ISurfaceComposer

  Android_view_Surface.cpp
  static void SurfaceSession_init(JNIEnv* env, jobject clazz)
  {
     sp<SurfaceComposerClient> client = new SurfaceComposerClient;
  }


 SurfaceComposerClient.cpp
 SurfaceComposerClient::SurfaceComposerClient(): mStatus(NO_INIT), mComposer(Composer::getInstance())
 {
 }
 SurfaceComposerClient는 Refbase를 상속받았기 때문에, onFirstRef 가 불린다.



  void SurfaceComposerClient::onFirstRef()
  {
    sp<ISurfaceComposer> sm(getComposerService());
     ..
                                                                                                  3
static inline sp<ISurfaceComposer> getComposerService() {
    return ComposerService::getComposerService();
 }


 sp<ISurfaceComposer> ComposerService::getComposerService() {
   return ComposerService::getInstance().mComposerService;
 }
                             ComposerService 는 singleton class를 상속받았음으로,
                             이미 ComposerService 객체가 있으면 그 객체를 return하고,
                             없으면, ComposerService 의 생성자를 호출해서 객체를 생성한다.

  ComposerService::ComposerService()
  : Singleton<ComposerService>() {
     const String16 name("SurfaceFlinger");
     while (getService(name, &mComposerService) != NO_ERROR) {
       usleep(250000);
     }
      SurfaceFlinger service의 proxy(ISurfaceCompser)를 mComposerService 에 저장한다.

  }

2.디스플레이 공유 메모리 서비스의 프록시 획득




                                                                                  4
1.서피스 플링거 연결 요청


  SurfaceComposerClient.cpp
  ComposerService::ComposerService(): Singleton<ComposerService>() {
    const String16 name("SurfaceFlinger");
    while (getService(name, &mComposerService) != NO_ERROR) {
       usleep(250000);
    }
     SurfaceFlinger service의 proxy(ISurfaceCompser)를 mComposerService 에 저장한다.
    mServerCblkMemory = mComposerService->getCblk();
    Surface flinger의 getCblk를 이용하여 디스플레이 공유 메모리의 서비스 프락시(IMemoryHep)을 획득한다.
    mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(mServerCblkMemory->getBase());
    획득한 proxy로 공유메모리의 surface_flinger_cblk_t 구조체의 주소를 획득한다.
  }




                                        surface_flinger_cblk_t                  surfaceflinger
    SurfaceComposerClient

                                              connected                         mServerCblk
       ComposerService
                                     Dislay_cblk_t dcblk

          mServerCblk                  w,h:프레임 버퍼 너비,높이
                                              Density,fps
                                           Format,orientation
                                              Xdpi,ydpi




                                                                                                 5
1.서피스 플링거 연결 요청

3.서피스 플링거 연결 요청 및 서비스 클라이언트 프락시 획득




                 ISurfaceComposerClient

  void SurfaceComposerClient::onFirstRef()
  {
      sp<ISurfaceComposer> sm(getComposerService());
   if (sm != 0) {                                                   ISurfaceComposerClient
        sp<ISurfaceComposerClient> conn = sm->createConnection();
        Surfaceflinger에 있는 createConnection 가 호출 됨.
  }                                                                 BnSurfaceComposerClient
  SurfaceFlinger.cpp
  sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
  {                                                                             Client
    sp<ISurfaceComposerClient> bclient;
    sp<Client> client(new Client(this));                            ~Client();
    status_t err = client->initCheck();                             createSurface;
    if (err == NO_ERROR) {                                          destroySurface
        bclient = client;                                           DefaultKeyedVector< size_t,
    }                                                               wp<LayerBaseClient> >
    return bclient;Client class의 proxy인 ISurfaceComposerClient가    mLayers;
                     return됨.
  }                                                                                  6
1.서피스 플링거 연결 요청

-서피스 클라이언트 리모트 서비스의 역할

1.서피스 플링거 서비스의 래퍼:
 서피스 플링거 서비스 기능 중 일부를 사용할 수 있도록 제공함
 (서피스 생성,삭제,서피스 상태 변경)

2.애플리케이션별 레이어 관리:
 서피스 클라이언트 별로 서피스에 대한 지역 식별자를 할당하고, DefaultKeyedVector에
 지역식별자와 layer를 함께 추가함.

3. 레이어 상태 변경:애플리케이션이 서피스의 상태 변경(가로,세로 전환)을 서피스 클라이언트 리모트
           서비스에게 요청한다.

4.애플리케이션 레이어의 생명 주기 관리:
 서피스 생성을 요청한 애플리케이션이 비정상적으로 동작을 종료하더라도 관리하고 있는 서피스와
 관련 자원을 서피스 클라이언트의 소멸자에서 자동으로 해제해 준다.
 (why? Client class는 Refbase class를 상속 받는데 이 Refbase class는 참조하는 곳이 없어질때
      자동으로 소멸자를 불러주게 된다.)




                                                                    7
2.푸시 버퍼 서피스 생성 요청(서비스 클라이언트)
                                                                           WidowManagerService.java
Camera.java                                                                public int relayout(…)
public void onCreate(Bundle icicle)                                        {
{                                                                            int res = relayoutWindow(…);
  SurfaceHolder holder = mSurfaceView.getHolder();                         }
  holder.addCallback(this);                                                public int relayoutWindow(…)
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);                 {
}
                                                                               Surface surface = win.createSurfaceLocked();
                                                                           }
Surfaceview.java
 public void setType(int type) {                                            Surface createSurfaceLocked()
case SURFACE_TYPE_NORMAL:                                                  {
case SURFACE_TYPE_PUSH_BUFFERS:                                              mSurface = new Surface
           mRequestedType = type;                                                     ( mSession.mSurfaceSession,
           if (mWindow != null) {                                                       mSession.mPid,
               updateWindow(false, false);                                              mAttrs.getTitle().toString(),
           }                                                                            0, w, h, mAttrs.format, flags);
           break;                                                          }
        }
}                                                                          Surface.java
                                                                           public Surface()
private void updateWindow(boolean force, boolean redrawNeeded)             {
{                                                                            init(s,pid,name,display,w,h,format,flags);
  …                                                                        }
  final int relayoutResult = mSession.relayout(
                 mWindow, mLayout, mWidth, mHeight,                        Android_view_surface.cpp
             visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets,   static void Surface_init
             mVisibleInsets, mConfiguration, mSurface);                    {
                                                                             surface = client->createSurface
                                                                                   (pid, name, dpy, w, h, format, flags);
                                                                           }
                                                                                                             8
2.푸시 버퍼 서피스 생성 요청 (서비스 클라이언트)
Android_view_surface.cpp
static void Surface_init
{                                                                               token          서피스 지역 식별자
  surface = client->createSurface(pid, name, dpy, w, h, format, flags);
}                                                                               identity       서피스 전역 식별자
                                                                                Width,height   서피스 넓이,높이
sp<SurfaceControl> SurfaceComposerClient::createSurface(…)                     format          포맷
{
  ISurfaceComposerClient::surface_data_t data;
  p<ISurface> surface = mClient->createSurface(&data, pid, name,display, w, h, format, flags);
  서피스 클라이언트의 createSurface를 호출하여 푸시 버퍼 서피스,푸시 버퍼 서피스 핸들을 생성한다.
    이때 data 구조체에 생성된 푸시 버퍼 서피스에 대한 정보를 채워준다.
    푸시 버퍼 서피스 핸들의 proxy가 surface 변수에 저장된다.
    if (surface != 0) {
        result = new SurfaceControl(this, surface, data, w, h, format, flags);
        return된 Isurface proxy를 이용해서 SurfaceControl class를 생성한다.
          이 class는 푸시 버퍼 서피스의 proxy를 획득하거나, 서피스의 상태 변경을 할 수 있게 해 준다.
    }


   SurfaceFlinger.cpp
   sp<ISurface> Client::createSurface(…)
   {
     return mFlinger->createSurface(this, pid, name, params, display, w, h, format, flags);
     SurfaceFlinger의 createSurface를 호출한다.
   }




                                                                                                      9
3.푸시 버퍼 서피스 생성 요청 (서비스 서버)
sp<ISurface> SurfaceFlinger::createSurface(…)
{
  sp<Layer> normalLayer;
  switch (flags & eFXSurfaceMask) {
     case eFXSurfaceNormal:
       if (UNLIKELY(flags & ePushBuffers)) {
           layer = createPushBuffersSurface(client, d, w, h, flags);
           1.푸시 버퍼 서피스 생성,푸시 버퍼 서피스 핸들 생성
       } else {
           normalLayer = createNormalSurface(client, d, w, h, flags, format);
           노말 서피스 생성
           layer = normalLayer;
       }
       break;
   }

    if (layer != 0) {
       layer->initStates(w, h, flags); 2.생성된 layer 상태 초기화
       ssize_t token = addClientLayer(client, layer);  3.전역 레이어 목록과 지역 레이어 목록에 추가
       surfaceHandle = layer->getSurface();  4.푸시버퍼 서비스 핸들을 가져옴.
       if (surfaceHandle != 0) {  mClient->createSurface 호출시 넘겨준 surface_data_t 구조체에 값을 채움.
           params->token = token;  서피스 지역 식별자
           params->identity = surfaceHandle->getIdentity();  서피스 전역 식별자
           params->width = w; params->height = h; 서피스 넓이, 높이
           params->format = format; 서피스 높이
}
     setTransactionFlags(eTransactionNeeded); 서피스 플링거가 합성 시 참조하는 상태 플래그에 설정.

    return surfaceHandle;  생성된 푸시버퍼 핸들을 return함.



                                                                                               10
3.푸시 버퍼 서피스 생성 요청 (서비스 서버)

  1. 푸시 버퍼 레이어 생성,푸시 버퍼 서피스 핸들 리모트 서비스 생성
  layer = createPushBuffersSurface(client, d, w, h, flags);


sp<LayerBuffer> SurfaceFlinger::createPushBuffersSurface(..)                                      LayerBase
{
  sp<LayerBuffer> layer = new LayerBuffer(this, display, client);
  LayerBuffer생성 자 호출시 LayerBase의 생성자 부터 호출된다.                                                LayerBaseClient
  layer->initStates(w, h, flags);
  return layer;
}
                                                                               Layer                          Layer       Layer
                                                                                               Layer
                                                                               Buffer                          Blur        Dim
Layerbase.cpp
LayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display)
  : dpy(display), contentDirty(false),
    sequence(uint32_t(android_atomic_inc(&sSequence))),                                        SurfaceFlinger
     sSequence 값을 sequence에 저장하고 sSequence를 1증가 시킨다.                                                     지역 레이어 목록
     sequence 변수는 동일 Z-order 값을 가지는 레이어를 정렬할때 사용 함.
                                                                                전역 레이어 목록                     Client 1
{
  …                                                                              zorder                        Token=1
                                                                                          mIdentity
}                                                                                                              Token=2
                                                                                   4          4
LayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,       3          1
                                                                                                          지역 레이어 목록
     const sp<Client>& client)                                                     2          2
  : LayerBase(flinger, display), mClientRef(client),                               1          3               Client 2
    mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
    서피스 전역 식별자인 mIdentity의 값을 설정한다.                                                                            Token=1
{                                                                                                               Token=2
}



                                                                                                              11
3.푸시 버퍼 서피스 생성 요청 (서비스 서버)
LayerBuffer::LayerBuffer(SurfaceFlinger* flinger, DisplayID display,
     const sp<Client>& client)
  : LayerBaseClient(flinger, display, client),
    mNeedsBlending(false), mInvalidate(false), mIsReconfiguring(false),
    mBlitEngine(0)
{
  …
}
LayBuffer생성자에서는 특별한 동작을 수행하지 않음. RefBase class를 상속했음으로, onFirstRef()가 불림.


 void LayerBuffer::onFirstRef()
 {
  mSurface = new SurfaceLayerBuffer(mFlinger, this); 푸시 버퍼 서피스 핸들 생성
 }


               ISurface

                                       Isurface 서비스 프록시의 기능 중 푸시 버퍼 레이어와 관련 된
                                       registerBuffers(),
               Surface                 postBuffer(),
                                       createOverlay()등의 함수 호출을 LayerBuffer 클래스에
                                       전달하는 래퍼 클래스 이다.


             SurfaceLayerBuffer


              LayerBuffer



                                                                                   12
3.푸시 버퍼 서피스 생성 요청 (서비스 서버)

2.생성된 layer 상태 초기화
layer->initStates(w, h, flags);
Layerbase class의 initStates 가 호출됨.


void LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
{

     mCurrentState.z       = 0; mCurrentState.w      = w; mCurrentState.h = h;
     mCurrentState.requested_w = w; mCurrentState.requested_h = h;
     mCurrentState.sequence    = 0;
     sequence 값은 드로잉 프레임에서의 레이어와 현재 프레임의 레이어 상태가 변경될 때 1씩 증가
     mDrawingState = mCurrentState;
      mDrawingState (화면에 출력중인 레이어의 상태 저장)과
       mCurrentState(화면 출력을 위해 합성중인 레이어의 상태 저장)를 동일하게 설정
}
    3.전역 레이어 목록과 지역 레이어 목록에 추가
    ssize_t token = addClientLayer(client, layer);


                               SurfaceFlinger                        1.전역 레이어 목록
                                                                     -서피스 플링거 서비스에서 생성된 전체 레이어 목록
                                                지역 레이어 목록            -정렬 순서:zorder 순서
         전역 레이어 목록                                                   - mCurrentState.layersSortedByZ 변수로 관리
                                                Client 1
          layersSortedByZ                                            2.지역 레이어 목록
                                                 mLayers
          zorder   mIdentity                                         -특정 Client에서 생성된 레이어 목록
                                                 Token=1
            4          4                                             -지역 레이어 목록의 레이어는 전역 레이어 목록에
            3          1
                                                 Token=2              추가됨.
                                                                     -Client class의 mLayers 변수로 관리

                                                                                                13
3.푸시 버퍼 서피스 생성 요청 (서비스 서버)

ssize_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
     const sp<LayerBaseClient>& lbc)
{
  // 지역 레이어 목록에 추가
  size_t name = client->attachLayer(lbc);

    // 전역 레이어 목록에 추가
    addLayer_l(lbc);

    return ssize_t(name);
}


size_t Client::attachLayer(const sp<LayerBaseClient>& layer)
{
   size_t name = mNameGenerator++;
   mLayers.add(name, layer);
   return name;
}


status_t SurfaceFlinger::addLayer_l(const sp<LayerBase>& layer)
{
   ssize_t i = mCurrentState.layersSortedByZ.add(layer);
   return (i < 0) ? status_t(i) : status_t(NO_ERROR);
}




                                                                   14
3.푸시 버퍼 서피스 생성 요청 (서비스 서버)

 4. 푸시버퍼 서비스 핸들을 가져옴
 surfaceHandle = layer->getSurface();


Layerbase.cpp의 getSurface가 호출 됨.
sp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
{
  sp<Surface> s;
  Mutex::Autolock _l(mLock);
  s = mClientSurface.promote();
  if (s == 0) {
      s = createSurface();
      mClientSurface = s;
  }
  return s;
}                    LayerBuffer.cpp의 오버라이딩 된 createSurface를 부른다.


LayerBuffer.cpp
sp<LayerBaseClient::Surface> LayerBuffer::createSurface() const
{
  LOGE("LayerBuffer::createSurface()");
  return mSurface;
}

Más contenido relacionado

La actualidad más candente

Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로Jaeseung Ha
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회beom kyun choi
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance상현 조
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programmingihpark92
 
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)상현 조
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crowJaeseung Ha
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발Jay JH Park
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System상현 조
 
Blockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingBlockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingihpark92
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스noerror
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화AnselmKim
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화Jay JH Park
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception상현 조
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 Younghoon Moon
 
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍Jay JH Park
 

La actualidad más candente (20)

Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programming
 
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
 
Blockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingBlockchain 3rd smart contract programming
Blockchain 3rd smart contract programming
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력
 
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
 

Destacado

Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)fefe7270
 
Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)fefe7270
 
안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoView안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoViewEunjoo Im
 
Stagefright recorder part1
Stagefright recorder part1Stagefright recorder part1
Stagefright recorder part1fefe7270
 
Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)fefe7270
 
Android audio system(audioflinger)
Android audio system(audioflinger)Android audio system(audioflinger)
Android audio system(audioflinger)fefe7270
 

Destacado (6)

Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)
 
Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)
 
안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoView안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoView
 
Stagefright recorder part1
Stagefright recorder part1Stagefright recorder part1
Stagefright recorder part1
 
Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)
 
Android audio system(audioflinger)
Android audio system(audioflinger)Android audio system(audioflinger)
Android audio system(audioflinger)
 

Similar a Surface flingerservice(서피스 플링거 연결)

[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라
[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라
[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라NAVER Engineering
 
2019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera22019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera2SooHwan Ok
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
[Swift] Command
[Swift] Command[Swift] Command
[Swift] CommandBill Kim
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.Hojin Jun
 
MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 JaehoChoe3
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)LanarkSeung
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나병걸 윤
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1YoungSu Son
 
React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기NAVER SHOPPING
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴  안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴 YoungSu Son
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발영욱 김
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 

Similar a Surface flingerservice(서피스 플링거 연결) (20)

[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라
[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라
[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라
 
2019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera22019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera2
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
[Swift] Command
[Swift] Command[Swift] Command
[Swift] Command
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 
MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 MVI on android Droid Knights 2020
MVI on android Droid Knights 2020
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1
 
React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴  안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 

Más de fefe7270

Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)fefe7270
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터fefe7270
 
Android audio system(audioplicy_service)
Android audio system(audioplicy_service)Android audio system(audioplicy_service)
Android audio system(audioplicy_service)fefe7270
 
Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)fefe7270
 
Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)fefe7270
 
Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)fefe7270
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)fefe7270
 
Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)fefe7270
 

Más de fefe7270 (8)

Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
 
Android audio system(audioplicy_service)
Android audio system(audioplicy_service)Android audio system(audioplicy_service)
Android audio system(audioplicy_service)
 
Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)
 
Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)
 
Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)
 
Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)
 

Surface flingerservice(서피스 플링거 연결)

  • 2. 화면 출력 요청 전 과정 2
  • 3. 1.서피스 플링거 연결 요청 1.Surfaceflinger 검색 및 proxy 획득 ISurfaceComposer Android_view_Surface.cpp static void SurfaceSession_init(JNIEnv* env, jobject clazz) { sp<SurfaceComposerClient> client = new SurfaceComposerClient; } SurfaceComposerClient.cpp SurfaceComposerClient::SurfaceComposerClient(): mStatus(NO_INIT), mComposer(Composer::getInstance()) { } SurfaceComposerClient는 Refbase를 상속받았기 때문에, onFirstRef 가 불린다. void SurfaceComposerClient::onFirstRef() { sp<ISurfaceComposer> sm(getComposerService()); .. 3
  • 4. static inline sp<ISurfaceComposer> getComposerService() { return ComposerService::getComposerService(); } sp<ISurfaceComposer> ComposerService::getComposerService() { return ComposerService::getInstance().mComposerService; } ComposerService 는 singleton class를 상속받았음으로, 이미 ComposerService 객체가 있으면 그 객체를 return하고, 없으면, ComposerService 의 생성자를 호출해서 객체를 생성한다. ComposerService::ComposerService() : Singleton<ComposerService>() { const String16 name("SurfaceFlinger"); while (getService(name, &mComposerService) != NO_ERROR) { usleep(250000); }  SurfaceFlinger service의 proxy(ISurfaceCompser)를 mComposerService 에 저장한다. } 2.디스플레이 공유 메모리 서비스의 프록시 획득 4
  • 5. 1.서피스 플링거 연결 요청 SurfaceComposerClient.cpp ComposerService::ComposerService(): Singleton<ComposerService>() { const String16 name("SurfaceFlinger"); while (getService(name, &mComposerService) != NO_ERROR) { usleep(250000); }  SurfaceFlinger service의 proxy(ISurfaceCompser)를 mComposerService 에 저장한다. mServerCblkMemory = mComposerService->getCblk(); Surface flinger의 getCblk를 이용하여 디스플레이 공유 메모리의 서비스 프락시(IMemoryHep)을 획득한다. mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(mServerCblkMemory->getBase()); 획득한 proxy로 공유메모리의 surface_flinger_cblk_t 구조체의 주소를 획득한다. } surface_flinger_cblk_t surfaceflinger SurfaceComposerClient connected mServerCblk ComposerService Dislay_cblk_t dcblk mServerCblk w,h:프레임 버퍼 너비,높이 Density,fps Format,orientation Xdpi,ydpi 5
  • 6. 1.서피스 플링거 연결 요청 3.서피스 플링거 연결 요청 및 서비스 클라이언트 프락시 획득 ISurfaceComposerClient void SurfaceComposerClient::onFirstRef() { sp<ISurfaceComposer> sm(getComposerService()); if (sm != 0) { ISurfaceComposerClient sp<ISurfaceComposerClient> conn = sm->createConnection(); Surfaceflinger에 있는 createConnection 가 호출 됨. } BnSurfaceComposerClient SurfaceFlinger.cpp sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() { Client sp<ISurfaceComposerClient> bclient; sp<Client> client(new Client(this)); ~Client(); status_t err = client->initCheck(); createSurface; if (err == NO_ERROR) { destroySurface bclient = client; DefaultKeyedVector< size_t, } wp<LayerBaseClient> > return bclient;Client class의 proxy인 ISurfaceComposerClient가 mLayers; return됨. } 6
  • 7. 1.서피스 플링거 연결 요청 -서피스 클라이언트 리모트 서비스의 역할 1.서피스 플링거 서비스의 래퍼: 서피스 플링거 서비스 기능 중 일부를 사용할 수 있도록 제공함 (서피스 생성,삭제,서피스 상태 변경) 2.애플리케이션별 레이어 관리: 서피스 클라이언트 별로 서피스에 대한 지역 식별자를 할당하고, DefaultKeyedVector에 지역식별자와 layer를 함께 추가함. 3. 레이어 상태 변경:애플리케이션이 서피스의 상태 변경(가로,세로 전환)을 서피스 클라이언트 리모트 서비스에게 요청한다. 4.애플리케이션 레이어의 생명 주기 관리: 서피스 생성을 요청한 애플리케이션이 비정상적으로 동작을 종료하더라도 관리하고 있는 서피스와 관련 자원을 서피스 클라이언트의 소멸자에서 자동으로 해제해 준다. (why? Client class는 Refbase class를 상속 받는데 이 Refbase class는 참조하는 곳이 없어질때 자동으로 소멸자를 불러주게 된다.) 7
  • 8. 2.푸시 버퍼 서피스 생성 요청(서비스 클라이언트) WidowManagerService.java Camera.java public int relayout(…) public void onCreate(Bundle icicle) { { int res = relayoutWindow(…); SurfaceHolder holder = mSurfaceView.getHolder(); } holder.addCallback(this); public int relayoutWindow(…) holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); { } Surface surface = win.createSurfaceLocked(); } Surfaceview.java public void setType(int type) { Surface createSurfaceLocked() case SURFACE_TYPE_NORMAL: { case SURFACE_TYPE_PUSH_BUFFERS: mSurface = new Surface mRequestedType = type; ( mSession.mSurfaceSession, if (mWindow != null) { mSession.mPid, updateWindow(false, false); mAttrs.getTitle().toString(), } 0, w, h, mAttrs.format, flags); break; } } } Surface.java public Surface() private void updateWindow(boolean force, boolean redrawNeeded) { { init(s,pid,name,display,w,h,format,flags); … } final int relayoutResult = mSession.relayout( mWindow, mLayout, mWidth, mHeight, Android_view_surface.cpp visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets, static void Surface_init mVisibleInsets, mConfiguration, mSurface); { surface = client->createSurface (pid, name, dpy, w, h, format, flags); } 8
  • 9. 2.푸시 버퍼 서피스 생성 요청 (서비스 클라이언트) Android_view_surface.cpp static void Surface_init { token 서피스 지역 식별자 surface = client->createSurface(pid, name, dpy, w, h, format, flags); } identity 서피스 전역 식별자 Width,height 서피스 넓이,높이 sp<SurfaceControl> SurfaceComposerClient::createSurface(…) format 포맷 { ISurfaceComposerClient::surface_data_t data; p<ISurface> surface = mClient->createSurface(&data, pid, name,display, w, h, format, flags); 서피스 클라이언트의 createSurface를 호출하여 푸시 버퍼 서피스,푸시 버퍼 서피스 핸들을 생성한다. 이때 data 구조체에 생성된 푸시 버퍼 서피스에 대한 정보를 채워준다. 푸시 버퍼 서피스 핸들의 proxy가 surface 변수에 저장된다. if (surface != 0) { result = new SurfaceControl(this, surface, data, w, h, format, flags); return된 Isurface proxy를 이용해서 SurfaceControl class를 생성한다. 이 class는 푸시 버퍼 서피스의 proxy를 획득하거나, 서피스의 상태 변경을 할 수 있게 해 준다. } SurfaceFlinger.cpp sp<ISurface> Client::createSurface(…) { return mFlinger->createSurface(this, pid, name, params, display, w, h, format, flags); SurfaceFlinger의 createSurface를 호출한다. } 9
  • 10. 3.푸시 버퍼 서피스 생성 요청 (서비스 서버) sp<ISurface> SurfaceFlinger::createSurface(…) { sp<Layer> normalLayer; switch (flags & eFXSurfaceMask) { case eFXSurfaceNormal: if (UNLIKELY(flags & ePushBuffers)) { layer = createPushBuffersSurface(client, d, w, h, flags); 1.푸시 버퍼 서피스 생성,푸시 버퍼 서피스 핸들 생성 } else { normalLayer = createNormalSurface(client, d, w, h, flags, format); 노말 서피스 생성 layer = normalLayer; } break; } if (layer != 0) { layer->initStates(w, h, flags); 2.생성된 layer 상태 초기화 ssize_t token = addClientLayer(client, layer);  3.전역 레이어 목록과 지역 레이어 목록에 추가 surfaceHandle = layer->getSurface();  4.푸시버퍼 서비스 핸들을 가져옴. if (surfaceHandle != 0) {  mClient->createSurface 호출시 넘겨준 surface_data_t 구조체에 값을 채움. params->token = token;  서피스 지역 식별자 params->identity = surfaceHandle->getIdentity();  서피스 전역 식별자 params->width = w; params->height = h; 서피스 넓이, 높이 params->format = format; 서피스 높이 } setTransactionFlags(eTransactionNeeded); 서피스 플링거가 합성 시 참조하는 상태 플래그에 설정. return surfaceHandle;  생성된 푸시버퍼 핸들을 return함. 10
  • 11. 3.푸시 버퍼 서피스 생성 요청 (서비스 서버) 1. 푸시 버퍼 레이어 생성,푸시 버퍼 서피스 핸들 리모트 서비스 생성 layer = createPushBuffersSurface(client, d, w, h, flags); sp<LayerBuffer> SurfaceFlinger::createPushBuffersSurface(..) LayerBase { sp<LayerBuffer> layer = new LayerBuffer(this, display, client); LayerBuffer생성 자 호출시 LayerBase의 생성자 부터 호출된다. LayerBaseClient layer->initStates(w, h, flags); return layer; } Layer Layer Layer Layer Buffer Blur Dim Layerbase.cpp LayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) : dpy(display), contentDirty(false), sequence(uint32_t(android_atomic_inc(&sSequence))), SurfaceFlinger  sSequence 값을 sequence에 저장하고 sSequence를 1증가 시킨다. 지역 레이어 목록  sequence 변수는 동일 Z-order 값을 가지는 레이어를 정렬할때 사용 함. 전역 레이어 목록 Client 1 { … zorder Token=1 mIdentity } Token=2 4 4 LayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 3 1 지역 레이어 목록 const sp<Client>& client) 2 2 : LayerBase(flinger, display), mClientRef(client), 1 3 Client 2 mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 서피스 전역 식별자인 mIdentity의 값을 설정한다. Token=1 { Token=2 } 11
  • 12. 3.푸시 버퍼 서피스 생성 요청 (서비스 서버) LayerBuffer::LayerBuffer(SurfaceFlinger* flinger, DisplayID display, const sp<Client>& client) : LayerBaseClient(flinger, display, client), mNeedsBlending(false), mInvalidate(false), mIsReconfiguring(false), mBlitEngine(0) { … } LayBuffer생성자에서는 특별한 동작을 수행하지 않음. RefBase class를 상속했음으로, onFirstRef()가 불림. void LayerBuffer::onFirstRef() { mSurface = new SurfaceLayerBuffer(mFlinger, this); 푸시 버퍼 서피스 핸들 생성 } ISurface Isurface 서비스 프록시의 기능 중 푸시 버퍼 레이어와 관련 된 registerBuffers(), Surface postBuffer(), createOverlay()등의 함수 호출을 LayerBuffer 클래스에 전달하는 래퍼 클래스 이다. SurfaceLayerBuffer LayerBuffer 12
  • 13. 3.푸시 버퍼 서피스 생성 요청 (서비스 서버) 2.생성된 layer 상태 초기화 layer->initStates(w, h, flags); Layerbase class의 initStates 가 호출됨. void LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) { mCurrentState.z = 0; mCurrentState.w = w; mCurrentState.h = h; mCurrentState.requested_w = w; mCurrentState.requested_h = h; mCurrentState.sequence = 0; sequence 값은 드로잉 프레임에서의 레이어와 현재 프레임의 레이어 상태가 변경될 때 1씩 증가 mDrawingState = mCurrentState;  mDrawingState (화면에 출력중인 레이어의 상태 저장)과 mCurrentState(화면 출력을 위해 합성중인 레이어의 상태 저장)를 동일하게 설정 } 3.전역 레이어 목록과 지역 레이어 목록에 추가 ssize_t token = addClientLayer(client, layer); SurfaceFlinger 1.전역 레이어 목록 -서피스 플링거 서비스에서 생성된 전체 레이어 목록 지역 레이어 목록 -정렬 순서:zorder 순서 전역 레이어 목록 - mCurrentState.layersSortedByZ 변수로 관리 Client 1 layersSortedByZ 2.지역 레이어 목록 mLayers zorder mIdentity -특정 Client에서 생성된 레이어 목록 Token=1 4 4 -지역 레이어 목록의 레이어는 전역 레이어 목록에 3 1 Token=2 추가됨. -Client class의 mLayers 변수로 관리 13
  • 14. 3.푸시 버퍼 서피스 생성 요청 (서비스 서버) ssize_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<LayerBaseClient>& lbc) { // 지역 레이어 목록에 추가 size_t name = client->attachLayer(lbc); // 전역 레이어 목록에 추가 addLayer_l(lbc); return ssize_t(name); } size_t Client::attachLayer(const sp<LayerBaseClient>& layer) { size_t name = mNameGenerator++; mLayers.add(name, layer); return name; } status_t SurfaceFlinger::addLayer_l(const sp<LayerBase>& layer) { ssize_t i = mCurrentState.layersSortedByZ.add(layer); return (i < 0) ? status_t(i) : status_t(NO_ERROR); } 14
  • 15. 3.푸시 버퍼 서피스 생성 요청 (서비스 서버) 4. 푸시버퍼 서비스 핸들을 가져옴 surfaceHandle = layer->getSurface(); Layerbase.cpp의 getSurface가 호출 됨. sp<LayerBaseClient::Surface> LayerBaseClient::getSurface() { sp<Surface> s; Mutex::Autolock _l(mLock); s = mClientSurface.promote(); if (s == 0) { s = createSurface(); mClientSurface = s; } return s; } LayerBuffer.cpp의 오버라이딩 된 createSurface를 부른다. LayerBuffer.cpp sp<LayerBaseClient::Surface> LayerBuffer::createSurface() const { LOGE("LayerBuffer::createSurface()"); return mSurface; }