SlideShare ist ein Scribd-Unternehmen logo
1 von 9
SurfaceFlingerService
(그래픽 공유 버퍼 생성 및 등록)




                           박철희

                      1
화면 출력 요청 전 과정




                2
1.그래픽 버퍼 공유 메모리 생성

서피스 플링거 서비스와 서비스 클라이언트간의 data 공유를 위해 그래픽 버퍼 공유 메모리 생성



                     Client                                  SurfaceFlinger




                                  생성                  버퍼등록                    Android

                                                                              kernel
                  그래픽 버퍼 공유
                  메모리




 Ex)CameraService에서 preview data를 surfaceflinger와 공유하기 위한 그래픽 버퍼 공유 메모리 생성


 CameraService.cpp
 status_t CameraService::Client::startPreviewMode()
 {
 result = mHardware->startPreview();
 }

                                                                                        3
1.그래픽 버퍼 공유 메모리 생성

QualcommCameraHardware.cpp
status_t QualcommCameraHardware::startPreview()
{
   return startPreviewInternal();
}

status_t QualcommCameraHardware::startPreviewInternal()
{
   mPreviewInitialized = initPreview();
}



bool QualcommCameraHardware::initPreview()
{
mPreviewHeap = new PmemPool(pmem_region, MemoryHeapBase::READ_ONLY |
                 MemoryHeapBase::NO_CACHING,
                 MSM_PMEM_PREVIEW,
                 mPreviewFrameSize,
                 kPreviewBufferCountActual,
                 mPreviewFrameSize,
                 CbCrOffset, 0, "preview");




QualcommCameraHardware::PmemPool::PmemPool(..)
{
  sp<MemoryHeapBase> masterHeap =new MemoryHeapBase(pmem_pool, mAlignedSize,flags);
   MemoryHeapBase class를 이용하여, "/dev/pmem_adsp“ 영역(pmem_pool)에 mAlignedSize 만큼의 공유 메모리 생성
    (kernel virtual address)


                                                                                  4
1.그래픽 버퍼 공유 메모리 생성

sp<MemoryHeapPmem> pmemHeap = new MemoryHeapPmem(masterHeap, flags);
 생성된 공유 메모리의 영역을 physical 메모리의 연속된 영역으로 잡음
  mHeap = pmemHeap;
 register_buf(mBufferSize,
            mFrameSize, mCbCrOffset, myOffset,
            mHeap->getHeapID(),
            mAlignedBufferSize * cnt,
            (uint8_t *)mHeap->base() + mAlignedBufferSize * cnt,
            pmem_type,
            active);
 생성된 공유 메모리를 camera drive에 등록.

completeInitialization();  생성된 MemoryHeapBase 영역을 4개의 mBuffers로 나눔



          CameraService                                    Android
                                                           Virtual address


                           생성    Mapping된 address return

                                                           Kernel
             mBuffers[0]                                   Virtual address
             mBuffers[3]



Physical memory   0x4000                    write
                                                       Camera driver
                  0x1000


                                                                             5
2. 그래픽 버퍼 공유 메모리 등록 요청

생성된 그래픽 버퍼 공유 메모리를 SurfaceFlinger에게 등록 요청 한다.

status_t CameraService::Client::registerPreviewBuffers() {

ISurface::BufferHeap buffers(w, h, w, h,
                    mPixelFormat,
                    mOrientation,
                    0,
                    mHardware->getPreviewHeap());생성된 그래픽 버퍼 공유 메모리의 프락시

생성된 그래픽 버퍼 공유 메모리의 넓이,높이,format, 서비스 프락시를 가진 buffers class를 생성한다.

status_t result = mSurface->registerBuffers(buffers);
mSurface는 layerbuffer의 서피스 핸들인 SurfaceLayerBuffer를 가리킨다.
}

 Layerbuffer.cpp
 status_t LayerBuffer::SurfaceLayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers)
 {
    sp<LayerBuffer> owner(getOwner());
    if (owner != 0)
        return owner->registerBuffers(buffers);
    return NO_INIT;
 }

 status_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers)
 {
    sp<BufferSource> source = new BufferSource(*this, buffers);
    mSource = source;
 }

                                                                                                  6
2. 그래픽 버퍼 공유 메모리 등록 요청

LayerBuffer::BufferSource::BufferSource(LayerBuffer& layer,const ISurface::BufferHeap& buffers)
{
  mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride;
  mBufferHeap = buffers;
  buffers에는 공유 메모리에 접근할 수 있는 프락시가 저장 되어 있다,
    즉, Buffersource의 mBufferHeap 변수가 공유 메모리를 가리키게 된다.
}
                                                              void LayerBuffer::onDraw(const Region& clip) const
                                                              {
                                                                sp<Source> source(getSource());
                     Layerbuffer                                if (LIKELY(source != 0)) {
                                                                    source->onDraw(clip);
                      onDraw()                                  } else {
                                                                    clearWithOpenGL(clip);
                      Source                                    }
                                                              }
                      onDraw()
                                                             void LayerBuffer::Source::onDraw(const Region& clip) const {
                                                             }

                                                              void LayerBuffer::BufferSource::onDraw(const Region& clip)
                                                              const
                                                              {
      BufferSource                 OverlaySource
                                                                mLayer.drawWithOpenGL(tempClip, mTexture);
      onDraw()                      onDraw()                  }
                                                              void LayerBuffer::OverlaySource::onDraw(const Region& clip)
                                                              const
                                                              {
                                                                 mLayer.clearWithOpenGL(clip, 0, 0, 0, 0);
                                                                 layer를 검은색으로 덮음
                                                              }
                                                                                                            7
2. 그래픽 버퍼 공유 메모리 등록 요청



                                                                  SurfaceFlinger


      CameraService

                                                               Layerbuffer
                                       BufferHeap 등록
                                                               mSource        BufferSource

                                                                              mBufferHeap
       Android
       Virtual address


      Kernel
      Virtual address    mBuffers[0]
                         mBuffers[3]



       Physical memory        0x4000                   write
                                                                  Camera driver
                              0x1000




                                                                                      8
2. 그래픽 버퍼 공유 메모리 등록 요청-Overlay 경우


                   Camera process

                                                                              SurfaceFlinger
                                             mSurface->createOverlay
   1.CameraService 에서 setOverlay()호출                                        Layerbuffer

                                                                            mSource

   3. Overlay 변수 저장
   4. Preview thread에서                                                      OverlaySource
   mOverlay->setFd(mPreviewHeap->mHeap-                                     Overlay
   >getHeapID());
   5. mOverlay->queueBuffer
     ((void *)offset_addr);
                                                                                2.Overlay device open



                                                                                 Overlay device
                                                              queueBuffer
                               mBuffers[0]
                               mBuffers[3]                    4번 이후
                                                              Overlay는
                                                              그래픽 버퍼 공유 메모리를 가리킴




                                                                                                   9

Weitere ähnliche Inhalte

Was ist angesagt?

[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
흥배 최
 

Was ist angesagt? (20)

[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
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
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스
 
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)
 
iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
Blockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingBlockchain 3rd smart contract programming
Blockchain 3rd smart contract programming
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 

Andere mochten auch

Andere mochten auch (10)

Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)
 
Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)
 
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)
 
Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)
 
Stagefright recorder part1
Stagefright recorder part1Stagefright recorder part1
Stagefright recorder part1
 
Android Audio & OpenSL
Android Audio & OpenSLAndroid Audio & OpenSL
Android Audio & OpenSL
 
Android audio system(audioplicy_service)
Android audio system(audioplicy_service)Android audio system(audioplicy_service)
Android audio system(audioplicy_service)
 
Android Audio System
Android Audio SystemAndroid Audio System
Android Audio System
 
Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)
 

Ähnlich wie Surface flingerservice(그래픽 공유 버퍼 생성 및 등록) (7)

D2 Havok
D2 HavokD2 Havok
D2 Havok
 
윈도우 매니저 스터디: 1. 윈도우 매니저 출력
윈도우 매니저 스터디: 1. 윈도우 매니저 출력윈도우 매니저 스터디: 1. 윈도우 매니저 출력
윈도우 매니저 스터디: 1. 윈도우 매니저 출력
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
Bs webgl소모임001 uniform버전
Bs webgl소모임001 uniform버전Bs webgl소모임001 uniform버전
Bs webgl소모임001 uniform버전
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 

Surface flingerservice(그래픽 공유 버퍼 생성 및 등록)

  • 1. SurfaceFlingerService (그래픽 공유 버퍼 생성 및 등록) 박철희 1
  • 2. 화면 출력 요청 전 과정 2
  • 3. 1.그래픽 버퍼 공유 메모리 생성 서피스 플링거 서비스와 서비스 클라이언트간의 data 공유를 위해 그래픽 버퍼 공유 메모리 생성 Client SurfaceFlinger 생성 버퍼등록 Android kernel 그래픽 버퍼 공유 메모리 Ex)CameraService에서 preview data를 surfaceflinger와 공유하기 위한 그래픽 버퍼 공유 메모리 생성 CameraService.cpp status_t CameraService::Client::startPreviewMode() { result = mHardware->startPreview(); } 3
  • 4. 1.그래픽 버퍼 공유 메모리 생성 QualcommCameraHardware.cpp status_t QualcommCameraHardware::startPreview() { return startPreviewInternal(); } status_t QualcommCameraHardware::startPreviewInternal() { mPreviewInitialized = initPreview(); } bool QualcommCameraHardware::initPreview() { mPreviewHeap = new PmemPool(pmem_region, MemoryHeapBase::READ_ONLY | MemoryHeapBase::NO_CACHING, MSM_PMEM_PREVIEW, mPreviewFrameSize, kPreviewBufferCountActual, mPreviewFrameSize, CbCrOffset, 0, "preview"); QualcommCameraHardware::PmemPool::PmemPool(..) { sp<MemoryHeapBase> masterHeap =new MemoryHeapBase(pmem_pool, mAlignedSize,flags); MemoryHeapBase class를 이용하여, "/dev/pmem_adsp“ 영역(pmem_pool)에 mAlignedSize 만큼의 공유 메모리 생성 (kernel virtual address) 4
  • 5. 1.그래픽 버퍼 공유 메모리 생성 sp<MemoryHeapPmem> pmemHeap = new MemoryHeapPmem(masterHeap, flags); 생성된 공유 메모리의 영역을 physical 메모리의 연속된 영역으로 잡음 mHeap = pmemHeap; register_buf(mBufferSize, mFrameSize, mCbCrOffset, myOffset, mHeap->getHeapID(), mAlignedBufferSize * cnt, (uint8_t *)mHeap->base() + mAlignedBufferSize * cnt, pmem_type, active); 생성된 공유 메모리를 camera drive에 등록. completeInitialization();  생성된 MemoryHeapBase 영역을 4개의 mBuffers로 나눔 CameraService Android Virtual address 생성 Mapping된 address return Kernel mBuffers[0] Virtual address mBuffers[3] Physical memory 0x4000 write Camera driver 0x1000 5
  • 6. 2. 그래픽 버퍼 공유 메모리 등록 요청 생성된 그래픽 버퍼 공유 메모리를 SurfaceFlinger에게 등록 요청 한다. status_t CameraService::Client::registerPreviewBuffers() { ISurface::BufferHeap buffers(w, h, w, h, mPixelFormat, mOrientation, 0, mHardware->getPreviewHeap());생성된 그래픽 버퍼 공유 메모리의 프락시 생성된 그래픽 버퍼 공유 메모리의 넓이,높이,format, 서비스 프락시를 가진 buffers class를 생성한다. status_t result = mSurface->registerBuffers(buffers); mSurface는 layerbuffer의 서피스 핸들인 SurfaceLayerBuffer를 가리킨다. } Layerbuffer.cpp status_t LayerBuffer::SurfaceLayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) { sp<LayerBuffer> owner(getOwner()); if (owner != 0) return owner->registerBuffers(buffers); return NO_INIT; } status_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) { sp<BufferSource> source = new BufferSource(*this, buffers); mSource = source; } 6
  • 7. 2. 그래픽 버퍼 공유 메모리 등록 요청 LayerBuffer::BufferSource::BufferSource(LayerBuffer& layer,const ISurface::BufferHeap& buffers) { mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride; mBufferHeap = buffers; buffers에는 공유 메모리에 접근할 수 있는 프락시가 저장 되어 있다, 즉, Buffersource의 mBufferHeap 변수가 공유 메모리를 가리키게 된다. } void LayerBuffer::onDraw(const Region& clip) const { sp<Source> source(getSource()); Layerbuffer if (LIKELY(source != 0)) { source->onDraw(clip); onDraw() } else { clearWithOpenGL(clip); Source } } onDraw() void LayerBuffer::Source::onDraw(const Region& clip) const { } void LayerBuffer::BufferSource::onDraw(const Region& clip) const { BufferSource OverlaySource mLayer.drawWithOpenGL(tempClip, mTexture); onDraw() onDraw() } void LayerBuffer::OverlaySource::onDraw(const Region& clip) const { mLayer.clearWithOpenGL(clip, 0, 0, 0, 0); layer를 검은색으로 덮음 } 7
  • 8. 2. 그래픽 버퍼 공유 메모리 등록 요청 SurfaceFlinger CameraService Layerbuffer BufferHeap 등록 mSource BufferSource mBufferHeap Android Virtual address Kernel Virtual address mBuffers[0] mBuffers[3] Physical memory 0x4000 write Camera driver 0x1000 8
  • 9. 2. 그래픽 버퍼 공유 메모리 등록 요청-Overlay 경우 Camera process SurfaceFlinger mSurface->createOverlay 1.CameraService 에서 setOverlay()호출 Layerbuffer mSource 3. Overlay 변수 저장 4. Preview thread에서 OverlaySource mOverlay->setFd(mPreviewHeap->mHeap- Overlay >getHeapID()); 5. mOverlay->queueBuffer ((void *)offset_addr); 2.Overlay device open Overlay device queueBuffer mBuffers[0] mBuffers[3] 4번 이후 Overlay는 그래픽 버퍼 공유 메모리를 가리킴 9