반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

Android Graphics 번역 3편 - BufferQueue and Gralloc 본문

Android

Android Graphics 번역 3편 - BufferQueue and Gralloc

huiung 2022. 7. 5. 00:10
반응형

BufferQueue클래스는 그래픽 데이터의 buffer를 생성하는 생산자(producer)를 표시 또는 추가처리 하기 위해 데이터를 받는 소비자(consumer)에 연결한다. 시스템을 통해 그래픽 데이터의 버퍼를 이동하는 거의 모든 것이 BufferQueue에 의존한다.

Gralloc memory allocator는 buffer할당을 수행하고 2가지 공급업체별 HIDL interface(IPC에 사용하기 위한 언어)를 구현한다. allocate()함수는 width, height, pxiel format을 인자로 취하고 일련의 flag를 사용한다.

BufferQueue producers and consumers

소비자는 BufferQueue 데이터 구조를 만들고 소유하며 그들의 생산자와 다른 프로세스에 존재할 수 있다. 생산자가 buffer가 필요할 때, 그것은 dequeueBuffer()를 호출함으로써 BufferQueue로부터 free buffer를 요청한다. 생산자는 buffer를 채우고 queueBuffer()를 호출하여 buffer를 queue에 반환한다. 다음으로 소비자는 acquireBuffer()를 통해서 buffer를 얻고 사용한다. 소비자가 사용을 끝내면 releaseBuffer()를 호출하여 buffer를 반환한다.

buffer의 maximum number와 같은 BufferQueue의 몇몇 특성은 생산자와 소비자가 함께 결정한다. 그러나 BufferQueue는 필요할때만 buffer를 할당한다. Buffer는 특성이 변경되지 않는 한 유지된다. 예를 들어, 만약 한 생산자가 다른 크기의 buffer를 요청한다면 이전의 buffer는 해제되고 요구에 따라 새로운 buffer가 할당된다.

많은 data를 이동하는 것은 비효율적이므로 buffer 내용물은 BufferQueue에 의해 복사되지 않는다. buffer는 항상 handle에 의해 전달된다.

Tracking BufferQueue with Systrace

그래픽 buffer가 어떻게 움직이는지 이해하려면 Systrace를 사용해라. Systrace를 사용하려면 gfx, view, sched 태그를 활성화 해야한다. BufferQueue 객체는 trace에 표시된다. Grafika’s playVideo(SurfaceView)가 실행되는 동안 trace를 수행하면 SurfaceView라는 레이블이 지정된 행이 주어진 시간에 대기 중인 buffer 수를 알려준다.

앱이 활성화되어 있는 동안 값이 증가하여 MediaCodec 디코더에서 프레임 렌더링을 트리거한다. SurfaceFlinger가 동작하며 buffer를 소비하면 값은 감소한다. SurfaceFlinger는 초당 60번(60fps)이 아니라 해야할 일이 있을때만 깨어난다. 시스템은 아무것도 업데이트 된 것이 없다면 일하는 걸 피하고 VSYNC를 비활성화 한다.

Gralloc

Gralloc allocator HAL은 flag들을 사용하여 buffer 할당을 수행한다. 사용되는 flag는 다음의 속성을 포함한다.

  • 얼마나 자주 software에 의해 memory가 접근되는지(CPU)
  • 얼마나 자주 hardware에 의해 memory가 접근되는지(GPU)
  • memory가 OpenGL ES(GLES) texture에 의해 사용되는지
  • memory가 video encoder에 의해 사용되는지

예를들어, 만약 한 생산자의 buffer foramt이 RGBA_8888pixel이고 생산자가 해당 buffer가 software에 의해 접근된다고(앱이 CPU의 pixel을 터치한다는 의미)나타낸다면 Gralloc은 R-G-B-A 순서로 pxiel당 4byte의 buffer를 만든다. 만약 대신에, 생산자가 Hardware에 의해서만 접근되고 GLES texture에 의해 사용된다고 설정하면 Gralloc은 BGRA ordering, 비선형 혼합 레이아웃 및 대체 색상 형식과 같이 GLES 드라이버가 원하는 모든 작업을 수행할 수 있다. hardware가 선호하는 형식을 사용하도록 허용하면 성능이 향상될 수 있다.

몇몇값들은 특정 플랫폼과는 결합되지 않을 수 있다. 예를들어 video encoder flag는 YUV pixel이 요구되는데 software 접근을 추가하고 RGBA_8888을 지정하면 실패할 것이다.

Protected buffers

Gralloc flag중 GRALLOC_USAGE_PROTECTED는 그래픽 buffer가 hardware-protected path를 통해서만 표시되도록 허용한다. 따라서 이러한 overlay plane은 DRM 컨텐츠를 표시하는 유일한 방법이다. (DRM 보호 buffer는 SurfaceFlinger또는 GLES drive에서 액세스 할 수 없다)

DRM 보호 비디오는 오직 overlay plane에서만 나타난다. 따라서 보호되는 컨텐츠를 지원하는 Video 플레이어는 SurfaceView로 구현되어야 한다. 즉 HWC(hardware composer)가 GLES 합성으로 전환되면 비디오는 디스플레이에서 사라질 것이다.

반응형