2. 윈도우 매니저 출력 기본 동작 과정 윈도우 버퍼 관리 (메모리 버퍼 vs DRM 버퍼) 컴포지팅/렌더링 방식 (메모리 기반 vs 하드웨어가속 기반) 윈도우 매니저 구조 (출력: 렌더러 + 백엔드) OPENGL OPENGL 동작 과정 및 소프트웨어 스택 구조 DRI & DRM 컴포지팅 디스플레이 동기화
3.
4. 윈도우 매니저 출력 과정 1. 윈도우 버퍼 공유
■메모리 버퍼 기반 vs DRM 버퍼 기반 2. 컴포지팅(렌더링)
■PIXMAN 렌더러 vs OPENGL 렌더러 3. 디스플레이 동기화
■FB 백엔드 vs DRM 백엔드
APPLICATION
APPLICATION
COMPOSITOR
FRAMEBUFFER
CRTC
1
2
3
1
2
5. 렌더링 방식 메모리 기반(PIXMAN) vs 하드웨어가속 기반(OPENGL)
SCREEN
GPU
framebuffer
framebuffer
GUI framework (without opengl)
GUI framework
(with opengl)
WINDOW
WINDOW
CPU
6. APPLICATION
APPLICATION
CPU memory
FRAMEBUFFER
CRTC
copy
copy
APPLICATION
APPLICATION
GPU memory
FRAMEBUFFER
CRTC
rendering
메모리 기반 (without OPENGL, with PIXMAN)
하드웨어가속 기반 (with OPENGL)
sync
7. 공유 메모리 기반 윈도우 버퍼 관리 WAYLAND 는 로컬 기반 프로토콜이므로 레퍼런스 기반 버퍼 관리
■클라이언트는 서버에 버퍼를 복사하지 않고 공유 메모리에 대한 접근 허용 렌더러는 클라이언트와의 공유 메모리에 직접 접근하여 필요한 부분을 프레임버퍼로 복사
application (shm)
buffer
application
(shm)
buffer
compositor (pixman-renderer)
framebuffer
buffer
buffer
copy
copy
8. 공유 메모리 기반 윈도우 버퍼 공유 과정 파일디스크립터 공유 (SCM_RIGHT 소켓 확장 기능 이용) 레퍼런스 기반 버퍼 최소한 더블 버퍼링 필요
CLIENT
wl_surface
wl_shm
wl_shm_pool
WAYLAND/WESTON
wl_shm
wl_shm_pool
tmpfile
create tmpfile
fd
create_pool (fd)
wl_shm_pool
create_buffer (pool)
wl_buffer
wl_surface
attach (buffer)/damage/commit
pixman_surface
pixman_image_t
9. DRM 버퍼 기반 윈도우 버퍼 관리 클라이언트가 하드웨어가속을 지원하는 경우 (drm)
■렌더러는 클라이언트가 생성한 프레임버퍼를 텍스처로 이용하여 렌더링 클라이언트가 공유 메모리를 지원하는 경우 (shm)
■렌더러는 클라이언트의 공유 메모리를 이용하여 텍스처 생성
이로 인해 경우에 따라, PIXMAN 렌더러보다 성능이 떨어질 수도 있다.
application (shm)
buffer
application
(drm)
buffer (framebuffer)
compositor (gl-renderer)
framebuffer
texture
texture
texture
copy
10. 윈도우 버퍼 반환(해제) 시점 메모리 버퍼 + PIXMAN 렌더러 (reference)
■다음 윈도우 버퍼로 교체하기 전까지 유지 DRM 버퍼 + OPENGL 렌더러 (reference)
■다음 윈도우 버퍼로 교체하기 전까지 유지 메모리 버퍼 + OPENGL 렌더러 (copy)
■컴포지터에서 텍스처를 업데이트하기 전까지 유지
application (shm)
buffer
application
(shm)
buffer
compositor (pixman-renderer)
framebuffer
buffer
buffer
application (shm)
buffer
application
(drm)
buffer
(framebuffer)
compositor (gl-renderer)
framebuffer
texture
texture
texture
11. 렌더러 + 백엔드 일반적인 어플리케이션은 메모리 버퍼 사용 (하드웨어가속 x) 렌더러는 PIXMAN, OPENGL 두 가지만 존재 백엔드는 FB, DRM 외에도 X11, WAYLAND 등 여러 가지 존재
■원격 지원을 위한 RDP 백엔드도 존재 (Remote Desktop Protocol)
메모리 버퍼
DRM 버퍼
PIXMAN 렌더러
OPENGL 렌더러
FB 백엔드
DRM 백엔드
WAYLAND 백엔드
12. DRM 백엔드 (≠ OPENGL) KMS (Kernel Mode Setting)
■Framebuffer/CRTC/Encoder/Connector
■장치 검색 및 해상도/재생률 관리 디스플레이 동기화
■PAGE_FLIP 다음 VBLANK 에서 프레임버퍼 교체
■VSYNC 다음 VSYNC 이벤트 전달 하드웨어 플레인 관리
■마우스 커서 플레인, … 자원 관리
■GPU 가 사용하는 시스템 메모리와 그래픽 메모리 관리
■GPU 가 사용하는 가상 주소 공간 관리 (IOMMU)
■GPU 에 명령어 스트림 전달 및 실행 (렌더링, DMA, …)
13.
14. OPENGL 동작 방식 (레스터라이징 방식) 버텍스(vertex) 점 폴리곤(polygon) 면 (삼각형 기반) 텍스쳐(texture) 이미지
3D SPACE
(1, 0, 0)
(-1, 0, 0)
(0, 1, 0)
FRAMEBUFFER
15. 레스터라이징 vs 레이트레이싱
Rasterization
Ray tracing
OpenGL, DirectX
NVidia OptiX, …
기본 동작 저비용, 효과 고비용
기본 동작 고비용, 효과 저비용
실시간 게임, 모델링 등에 활용
영화, 인테리어 CG 제작 등에 활용
Real time ray tracing
그래픽장치 성능 발전
실시간 게임, 모델링 등에 활용
16. 기본 동작 과정 GPU 메모리를 할당받아 필요한 데이터 전달 (텍스쳐, 버텍스, …) 명령어 버퍼에 OPENGL 명령어 순서대로 전달 지정된 명령어 버퍼를 이용하여 렌더링 요청 GPU 가 명령어 버퍼를 이용하여 프레임버퍼에 결과 이미지 렌더링
glVertex()
glTexImage()
GPU
batch buffer
texture buffer
frame buffer
eglSwapBuffers()
CRTC
vertex buffer
glBufferData()
23. 여러 화면을 하나의 화면으로 합쳐주는 것 SCENE GRAPH 각 화면의 위치 정보 관리 다양한 그래픽 관련 분야에서 활용 윈도우 매니저 여러 윈도우를 하나의 프레임버퍼로 합성 위젯 엔진 여러 위젯을 하나의 윈도우 화면으로 합성 …
window
window
framebuffer
widget
widget
widget
widget
window
widget
widget
window
copy
copy
copy
copy
24. 변환(transform) 관리 기본 변환 종류
■위치(position), 회전(rotation), 크기(size/scale) 상속 관계 표현(o), 상하 관계 표현(x) 레이어(layer) 관리 대부분의 윈도우는 동일한 계층 소속 윈도우의 상하 관계를 표현 플레인(plane) 관리 윈도우가 실제로 그려질 영역 관리 소프트웨어 플레인 vs 하드웨어 플레인
node
(transform)
node (transform)
node (transform)
node
(transform)
node
(transform)
25. 현재 WESTON 에서 사용하는 레이어 구조
weston_view (cursor sprite)
fade_layer
cursor_layer
fullscreen_layer
panel_layer
background_layer
workspace_layer
workspace_layer
workspace_layer
weston_view
(application)
input_panel_layer
lock_layer
weston_surface
shell_surface
content
geometry
weston_view (application)
weston_surface
weston_surface
weston_surface
subsurface
26. 하드웨어 플레인 동작 원리 디스플레이에서 처리하는 일종의 컴포지팅 마우스 커서를 위한 독립된 하드웨어 플레인은 필수 사용자 시나리오에 맞는 적절한 하드웨어 플레인 활용 필요
APPLICATION
WINDOW
APPLICATION
WINDOW
APPLICATION
WINDOW
LAYER0
WINDOW
WINDOW
LAYER1
WINDOW
SCREEN
WINDOW
WINDOW
WINDOW
27. 데미지(damage) 관리 목적 PIXMAN 과 GL 렌더러에서 다음 프레임버퍼를 생성하기 위한 메모리 복사 최소화 (이전 프레임버퍼 재활용)
■동영상 압축 기술에서 사용하는 기술과 유사한 목적 (I/P 프레임) 이전 프레임버퍼에서 변경이 필요한 부분만 갱신하여 다음 프레임버퍼로 재활용
■변경이 필요한 영역을 잘 계산하는 것이 핵심!!! 화면 변경이 필요한 경우 클라이언트가 버퍼의 내용을 갱신할 때
■클라이언트는 버퍼의 변경 범위를 서버에 전송 윈도우의 위치/크기/방향이 변경될 때 새로운 윈도우가 나타나거나 기존의 윈도우가 사라질 때 …
28. 클라이언트가 버퍼의 내용을 갱신할 때 이전에 사용했던, 변경 사항이 없는 부분은 그대로 재사용 WAYLAND 의 기본 프로토콜을 이용하여 윈도우 버퍼가 변경된 범위를 전달 (wl_surface.damage)
window (client)
buffer
window
(client)
buffer
compositor
(server)
framebuffer
buffer
buffer
buffer
damage
damage
copy
29. 윈도우의 위치/크기/방향이 변경될 때 윈도우의 위치(크기/방향)가 변경되어 아래 있던 윈도우가 화면에 보여지는 경우 발생
■아래 있던 윈도우에서 새롭게 보여지게 된 영역 변경
■위치가 변경된 윈도우를 새로운 위치에서 다시 그림
※ 이러한 이유로, 레퍼런스 기반 버퍼를 사용할 때는 클라이언트가 마지막 윈도우 버퍼를 항상 유지할 필요가 있다. (마지막 윈도우 버퍼가 프레임버퍼에 한번 반영되었다고 끝이 아니다.)
window (client)
buffer
window
(client)
buffer
compositor
(pixman-renderer)
framebuffer
buffer
buffer
compositor (pixman-renderer)
framebuffer
buffer
buffer
copy
copy
30. 새로운 윈도우가 나타나거나 기존의 윈도우가 사라질 때 새로운 윈도우가 화면에 나타날 때 (왼쪽 그림)
■새로운 윈도우가 위치한 영역 변경 기존의 윈도우가 화면에서 사라질 때 (오른쪽 그림)
■아래 있던 윈도우에서 새롭게 보여지게 된 영역 변경
window
(client)
buffer
window
(client)
buffer
compositor
(server)
framebuffer
buffer
buffer
copy
window
(client)
buffer
compositor (server)
framebuffer
buffer
copy
31. 화면에 보여지지 않는 부분에서 일어나는 변경 무시 스크린의 영역을 벗어난 곳에 위치할 때 다른 윈도우에 가려져있을 때 투명(blend) vs 불투명(opaque) 영역 관리
window
(client)
buffer
window
(client)
buffer
compositor
(server)
framebuffer
buffer
buffer
window
(client)
buffer
window
(client)
buffer
compositor
(pixman-renderer)
framebuffer
buffer
buffer
32.
33. 프레임버퍼를 디스플레이에 반영하는 과정 SCANOUT 프레임버퍼를 모니터 화면으로 전송 VBLANK(Vertical Blank) 다음 화면 갱신까지 대기 더블버퍼링 스캔아웃(front) 버퍼 + 업데이트(back) 버퍼 일반적으로 초당 60회 프레임버퍼 갱신
■SCANOUT & VBLANK 60회
scanout
vblank
scanout
vblank
…
60 hz
memory (CPU or GPU)
FRAMEBUFFER (back)
CRTC
FRAMEBUFFER (front)
compositor
34. DRM 기반 디스플레이 동기화 (pageflip) DRM 에서 PAGE_FLIP 명령어/이벤트 제공 (모니터 ID, 프레임버퍼 ID) 다음 VBLANK 에서 프레임버퍼 갱신
scanout
vblank
scanout
vblank
…
60 hz
kernel (DRM)
vsync
GPU
pageflip
weston (compositor)
framebuffer
(front back)
buffer
buffer
framebuffer
(back front)
buffer
buffer
: DRM IOCTL (PAGE_FLIP)
intr
35. 현재 디스플레이 동기화 기술의 문제점 사용자 응답성 저하
■프레임버퍼 갱신 후 다음 VBLANK 까지 대기
■사용자 응답성을 높이기 위한 VSYNC 오프 모드 지원 (화면 깨짐 현상 발생) 프레임버퍼 렌더링 시간이 하나의 VBLANK 를 초과
■프레임버퍼 갱신 주기가 지연되는 현상 발생
■실시간 3D 게임에서는 렌더링 시간 예측 불가 렌더링은 GPU 가 하고, 동기화는 디스플레이가 하는 것이 문제
■과거 TV 에서 사용되던 동기화 기술 그대로 답습 (수동적인 2D 영상 감상 최적화)
■NVIDIA G-SYNC 는 렌더링/동기화 모두 GPU 가 수행