SlideShare uma empresa Scribd logo
1 de 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

Mais conteúdo relacionado

Mais procurados

[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로Jaeseung Ha
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
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)Circulus
 
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
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회beom kyun choi
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스noerror
 
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)상현 조
 
Blockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingBlockchain 3rd smart contract programming
Blockchain 3rd smart contract programmingihpark92
 
[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 실행하기_20160706Yong Joon Moon
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화AnselmKim
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
 

Mais procurados (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#을 사용한 빠른 툴 개발
 

Destaque

Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)fefe7270
 
Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)fefe7270
 
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
 
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
 
Stagefright recorder part1
Stagefright recorder part1Stagefright recorder part1
Stagefright recorder part1fefe7270
 
Android Audio & OpenSL
Android Audio & OpenSLAndroid Audio & OpenSL
Android Audio & OpenSLYoss Cohen
 
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
 

Destaque (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)
 

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

윈도우 매니저 스터디: 1. 윈도우 매니저 출력
윈도우 매니저 스터디: 1. 윈도우 매니저 출력윈도우 매니저 스터디: 1. 윈도우 매니저 출력
윈도우 매니저 스터디: 1. 윈도우 매니저 출력nemoux
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blogozlael ozlael
 
Bs webgl소모임001 uniform버전
Bs webgl소모임001 uniform버전Bs webgl소모임001 uniform버전
Bs webgl소모임001 uniform버전Seonki Paik
 
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 ChoMario Cho
 

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

D2 Havok
D2 HavokD2 Havok
D2 Havok
 
윈도우 매니저 스터디: 1. 윈도우 매니저 출력
윈도우 매니저 스터디: 1. 윈도우 매니저 출력윈도우 매니저 스터디: 1. 윈도우 매니저 출력
윈도우 매니저 스터디: 1. 윈도우 매니저 출력
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
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
 

Último

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 

Último (6)

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 

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