윈도우 매니저 스터디: 1. 윈도우 매니저 출력
TRANSCRIPT
http://nemoux00.wordpress.com
윈도우 매니저 출력 기본 동작 과정
윈도우 버퍼 관리 (메모리 버퍼 vs DRM 버퍼)
컴포지팅/렌더링 방식 (메모리 기반 vs 하드웨어가속 기반)
윈도우 매니저 구조 (출력: 렌더러 + 백엔드)
OPENGL OPENGL 동작 과정 및 소프트웨어 스택 구조
DRI & DRM
컴포지팅
디스플레이 동기화
윈도우 매니저 출력 과정 1. 윈도우 버퍼 공유
■ 메모리 버퍼 기반 vs DRM 버퍼 기반
2. 컴포지팅(렌더링) ■ PIXMAN 렌더러 vs OPENGL 렌더러
3. 디스플레이 동기화 ■ FB 백엔드 vs DRM 백엔드
APPLICATION
APPLICATION
COMPOSITOR
FRAMEBUFFER
CRTC
1
2 3
1 2
렌더링 방식 메모리 기반(PIXMAN) vs 하드웨어가속 기반(OPENGL)
SCREEN
GPU
framebuffer framebuffer
GUI framework (without opengl)
GUI framework (with opengl)
WINDOW
WINDOW
CPU
APPLICATION
APPLICATION
CPU memory
FRAMEBUFFER
CRTC copy
copy
APPLICATION
APPLICATION
GPU memory
FRAMEBUFFER
CRTC
rendering
메모리 기반 (without OPENGL, with PIXMAN)
하드웨어가속 기반 (with OPENGL)
sync
공유 메모리 기반 윈도우 버퍼 관리 WAYLAND 는 로컬 기반 프로토콜이므로 레퍼런스 기반 버퍼 관리
■ 클라이언트는 서버에 버퍼를 복사하지 않고 공유 메모리에 대한 접근 허용
렌더러는 클라이언트와의 공유 메모리에 직접 접근하여 필요한 부분을 프레임버퍼로 복사
application (shm)
buffer
application (shm)
buffer
compositor (pixman-renderer)
framebuffer
buffer
buffer
copy
copy
공유 메모리 기반 윈도우 버퍼 공유 과정 파일디스크립터 공유 (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
DRM 버퍼 기반 윈도우 버퍼 관리 클라이언트가 하드웨어가속을 지원하는 경우 (drm)
■ 렌더러는 클라이언트가 생성한 프레임버퍼를 텍스처로 이용하여 렌더링
클라이언트가 공유 메모리를 지원하는 경우 (shm) ■ 렌더러는 클라이언트의 공유 메모리를 이용하여 텍스처 생성
이로 인해 경우에 따라, PIXMAN 렌더러보다 성능이 떨어질 수도 있다.
application
(shm)
buffer
application (drm)
buffer (framebuffer)
compositor (gl-renderer)
framebuffer
texture
texture
texture
copy
윈도우 버퍼 반환(해제) 시점 메모리 버퍼 + 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
렌더러 + 백엔드 일반적인 어플리케이션은 메모리 버퍼 사용 (하드웨어가속 x)
렌더러는 PIXMAN, OPENGL 두 가지만 존재
백엔드는 FB, DRM 외에도 X11, WAYLAND 등 여러 가지 존재 ■ 원격 지원을 위한 RDP 백엔드도 존재 (Remote Desktop Protocol)
메모리 버퍼 DRM 버퍼
PIXMAN 렌더러 OPENGL 렌더러
FB 백엔드 DRM 백엔드 WAYLAND 백엔드
DRM 백엔드 (≠ OPENGL)
KMS (Kernel Mode Setting) ■ Framebuffer/CRTC/Encoder/Connector
■ 장치 검색 및 해상도/재생률 관리
디스플레이 동기화 ■ PAGE_FLIP 다음 VBLANK 에서 프레임버퍼 교체
■ VSYNC 다음 VSYNC 이벤트 전달
하드웨어 플레인 관리 ■ 마우스 커서 플레인, …
자원 관리 ■ GPU 가 사용하는 시스템 메모리와 그래픽 메모리 관리
■ GPU 가 사용하는 가상 주소 공간 관리 (IOMMU)
■ GPU 에 명령어 스트림 전달 및 실행 (렌더링, DMA, …)
OPENGL 동작 방식 (레스터라이징 방식) 버텍스(vertex) 점
폴리곤(polygon) 면 (삼각형 기반)
텍스쳐(texture) 이미지
3D SPACE
(1, 0, 0) (-1, 0, 0)
(0, 1, 0)
FRAMEBUFFER
레스터라이징 vs 레이트레이싱
Rasterization Ray tracing
OpenGL, DirectX NVidia OptiX, …
기본 동작 저비용, 효과 고비용 기본 동작 고비용, 효과 저비용
실시간 게임, 모델링 등에 활용 영화, 인테리어 CG 제작 등에 활용
Real time ray tracing 그래픽장치 성능 발전
실시간 게임, 모델링 등에 활용
기본 동작 과정 GPU 메모리를 할당받아 필요한 데이터 전달 (텍스쳐, 버텍스, …)
명령어 버퍼에 OPENGL 명령어 순서대로 전달
지정된 명령어 버퍼를 이용하여 렌더링 요청
GPU 가 명령어 버퍼를 이용하여 프레임버퍼에 결과 이미지 렌더링
glVertex() glTexImage()
GPU
batch buffer
texture buffer
frame buffer
eglSwapBuffers()
CRTC
vertex buffer
glBufferData()
소프트웨어 구조 OPENGL 라이브러리/GPU 드라이버
플랫폼 API(GLX/WGL/EGL/…)/렌더링 API
weston
mesa
gl-renderer
EGL-api
gallium
GL-api
i915-driver
drm
kernel
drm-driver (kms, gem, …)
i915-driver nv, radeon, …
nv, radeon, …
OpenGL app OpenGL app
gl-renderer
OpenGL app OpenGL app
nvidia OpenGL library
EGL-api GL-api
nvidia kernel driver
어플리케이션이 윈도우 매니저를 통하지 않고 그래픽 카드에 직접 접근하는 방식
GPU
kernel
X server
OpenGL driver
drm driver
application (X11)
application (OpenGL-X11)
GLX X
2D driver
AIGLX
GPU
kernel
WAYLAND/WESTON
OpenGL driver
drm driver
application (wayland)
application (OpenGL-wayland)
wayland
EGL
EGL EGL
kms kms
MESA/DRM 기준 동작 과정 (하나의 GPU 사용)
WESTON CLIENT MESA client-side MESA server-side
GPU
batch buffer
texture buffer
frame buffer
local name wl_drm wl_drm
wl_drm_buffer EGLImageKHR
eglSwapBuffers
flush (rendering)
wl_buffer
flush (rendering)
texture buffer
batch buffer
frame buffer
CRTC
둘 이상의 GPU 사용시 (파일디스크립터를 이용)
GPU0
batch buffer
texture buffer
frame buffer
GPU1
texture buffer
batch buffer
frame buffer
WESTON CLIENT MESA client-side MESA server-side
fd wl_drm wl_drm
wl_drm_buffer EGLImageKHR
eglSwapBuffers
flush (rendering)
wl_buffer
flush (rendering)
CRTC
DRM 백엔드/GL 렌더러 동작 구조
CLIENT
wl_shm wl_egl_window wl_surface
WAYLAND/WESTON
gl-renderer
texture
shm_buffer egl_texture weston_surface
wl_buffer
compositor- drm
GPU
texture buffer
batch buffer
frame buffer
CRTC
texture buffer
texture buffer
texture texture
texture buffer
batch buffer
frame buffer
EGLSurface
여러 화면을 하나의 화면으로 합쳐주는 것 SCENE GRAPH 각 화면의 위치 정보 관리
다양한 그래픽 관련 분야에서 활용 윈도우 매니저 여러 윈도우를 하나의 프레임버퍼로 합성
위젯 엔진 여러 위젯을 하나의 윈도우 화면으로 합성
…
window
window
framebuffer widget
widget
widget
widget window
widget
widget window
copy
copy copy
copy
변환(transform) 관리 기본 변환 종류
■ 위치(position), 회전(rotation), 크기(size/scale)
상속 관계 표현(o), 상하 관계 표현(x)
레이어(layer) 관리 대부분의 윈도우는 동일한 계층 소속
윈도우의 상하 관계를 표현
플레인(plane) 관리 윈도우가 실제로 그려질 영역 관리
소프트웨어 플레인 vs 하드웨어 플레인
node (transform)
node (transform)
node (transform)
node (transform)
node (transform)
현재 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
하드웨어 플레인 동작 원리 디스플레이에서 처리하는 일종의 컴포지팅
마우스 커서를 위한 독립된 하드웨어 플레인은 필수
사용자 시나리오에 맞는 적절한 하드웨어 플레인 활용 필요
APPLICATION
WINDOW
APPLICATION
WINDOW
APPLICATION
WINDOW
LAYER0
WINDOW
WINDOW
LAYER1
WINDOW
SCREEN
WINDOW
WINDOW
WINDOW
데미지(damage) 관리 목적 PIXMAN 과 GL 렌더러에서 다음 프레임버퍼를 생성하기 위한 메모리 복사 최소화 (이전 프레임버퍼 재활용)
■ 동영상 압축 기술에서 사용하는 기술과 유사한 목적 (I/P 프레임)
이전 프레임버퍼에서 변경이 필요한 부분만 갱신하여 다음 프레임버퍼로 재활용
■ 변경이 필요한 영역을 잘 계산하는 것이 핵심!!!
화면 변경이 필요한 경우 클라이언트가 버퍼의 내용을 갱신할 때
■ 클라이언트는 버퍼의 변경 범위를 서버에 전송
윈도우의 위치/크기/방향이 변경될 때
새로운 윈도우가 나타나거나 기존의 윈도우가 사라질 때
…
클라이언트가 버퍼의 내용을 갱신할 때 이전에 사용했던, 변경 사항이 없는 부분은 그대로 재사용
WAYLAND 의 기본 프로토콜을 이용하여 윈도우 버퍼가 변경된 범위를 전달 (wl_surface.damage)
window (client)
buffer
window (client)
buffer
compositor (server)
framebuffer
buffer
buffer
buffer
damage
damage
copy
윈도우의 위치/크기/방향이 변경될 때 윈도우의 위치(크기/방향)가 변경되어 아래 있던 윈도우가 화면에 보여지는 경우 발생
■ 아래 있던 윈도우에서 새롭게 보여지게 된 영역 변경
■ 위치가 변경된 윈도우를 새로운 위치에서 다시 그림
※ 이러한 이유로, 레퍼런스 기반 버퍼를 사용할 때는 클라이언트가 마지막 윈도우 버퍼를 항상 유지할 필요가 있다. (마지막 윈도우 버퍼가 프레임버퍼에 한번 반영되었다고 끝이 아니다.)
window (client)
buffer
window (client)
buffer
compositor (pixman-renderer)
framebuffer
buffer
buffer
compositor (pixman-renderer)
framebuffer
buffer
buffer
copy
copy
새로운 윈도우가 나타나거나 기존의 윈도우가 사라질 때 새로운 윈도우가 화면에 나타날 때 (왼쪽 그림)
■ 새로운 윈도우가 위치한 영역 변경
기존의 윈도우가 화면에서 사라질 때 (오른쪽 그림)
■ 아래 있던 윈도우에서 새롭게 보여지게 된 영역 변경
window (client)
buffer
window (client)
buffer
compositor (server)
framebuffer
buffer
buffer
copy
window (client)
buffer
compositor (server)
framebuffer
buffer copy
화면에 보여지지 않는 부분에서 일어나는 변경 무시 스크린의 영역을 벗어난 곳에 위치할 때
다른 윈도우에 가려져있을 때
투명(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
프레임버퍼를 디스플레이에 반영하는 과정 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
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
현재 디스플레이 동기화 기술의 문제점 사용자 응답성 저하
■ 프레임버퍼 갱신 후 다음 VBLANK 까지 대기
■ 사용자 응답성을 높이기 위한 VSYNC 오프 모드 지원 (화면 깨짐 현상 발생)
프레임버퍼 렌더링 시간이 하나의 VBLANK 를 초과 ■ 프레임버퍼 갱신 주기가 지연되는 현상 발생
■ 실시간 3D 게임에서는 렌더링 시간 예측 불가
렌더링은 GPU 가 하고, 동기화는 디스플레이가 하는 것이 문제 ■ 과거 TV 에서 사용되던 동기화 기술 그대로 답습 (수동적인 2D 영상 감상 최적화)
■ NVIDIA G-SYNC 는 렌더링/동기화 모두 GPU 가 수행