5.3 X Windows Acceleration
5.3.1 Introduction
X-Windows System(일명 X11 또는 X)은 클라이언트-서버 기반의 portable(작고 가벼운) 그래픽 디스플레이 시스템이다. X11은 i.MX 6에서만 지원된다.
주 디스플레이에 대한 모든 그리기 작업을 처리하는 기본 프레임 버퍼 드라이버로 X-Windows System을 샐행할 수 있다. 2D GPU(graphics processing unit)를 사용할 수 있으므로 일부 그리기 작업을 가속화할 수 있다. 고 수준의 X 작업을 X-Windows System으로 가속화되는 저 수준의 그리기 작업으로 분리될 수 있다.
5.3.2 Hardware Operation
GPU가 있는 i.MX에서 X-Windows System의 가속은 Vivante GC320 2D GPU를 사용한다.
가속은 프레임 버퍼 메모리에 따라 달라진다.
5.3.3 Software Operation
X-Windows 가속은 EXA 인터페이스 버전 2.5를 지원하는 X.org X Server 버전 1.11.x와 이후 버전에 대해서 지원한다.
다음 목록에는 X11에서 가속화되는 작업 유형이 요약되어 있다. 모든 작업에는 on screen(화면에 보이는 영역)이나 off screen(화면에 보이지 않는 영역)에 사용되는 프레임 버퍼 메모리가 포함된다 :
- 직사각형 영역 solid fill (지정된 색으로 채우기)
- 시스템 메모리의 이미지를 비디오 메모리로 업로드
- source-target 직사각형 영역이 겹칠 수 있으므로 동일한 픽셀 형식의 직사각형 영역을 복사
- 다음 옵션으로 대부분의 XRender 컴포지트 작업을 지원하는 직사각형 영역을 복사 :
- 픽셀 형식 변환
- 반복되는 패턴 source
- source와 target의 Porter-Duff 블렌딩
- source 알파 마스킹
다음 목록에는 X-Windows 가속의 일부로 지원되는 추가 기능이 포함되어 있다 :
- 프레임 버퍼 메모리에 직접 X pixmap 할당
- EGL window surface가 X-window 인 EGL swap 버퍼
- X-window는 EGL surface에 직접 사용할 수 있는 X pixmap으로 컴포지트될 수 있다.
5.3.4 X-Windows Acceleration Architecture
다음 블록 다이어그램은 X-Windows System의 가속과 관련된 컴포넌트를 보여준다 :
녹색으로 표시된 컴포넌트는 Vivante 2D/3D GPU 드라이버의 일부분으로 지원(OpenGL/ES, EGL을 포함)되는 컴포넌트이다. 밝은 회색으로 표시된 컴포넌트는 가속 없는 X-Windows System의 표준 컴포넌트이다. 주황색으로 표시된 컴포넌트는 X-Windows System에서 가속을 지원하기 위해 추가된 컴포넌트로 아래에 간략하게 설명되어 있다.
i.MX X Driver 라이브러리 모듈(vivante-drv.so)은 X 서버에서 로드되고, GC320 2D GPU 코어를 포함하는 i.MX 플랫폼용 X-Windows 가속 인터페이스의 고수준 구현을 포함한다. /dev/fb0에 있는 선형으로 연속된 전체 프레임 버퍼 메모리는 on screen와 off screen 모두에서 X에 대한 pixmap을 할당하는 데 사용된다. 프레임 버퍼 메모리에 저장된 X pixmap의 GPU 주소를 X 클라이언트가 쿼리할 수 있도록 하는 사용자 지정 X 확장을 드라이버에서 지원한다.
libGAL.so 라이브러리 모듈(libGAL.so)에는 GC320 GPU 모듈에 대한 레지스터 레벨의 프로그래밍 인터페이스가 포함되어 있다. 여기에는 디바이스로 스트리밍할 수 있는 패킷에 레지스터 프로그래밍 커맨드의 저장을 포함한다. libGAL.so 라이브러리 함수는 i.MX X Driver 코드에서 호출된다.
EGL-X 라이브러리 모듈(libEGL.so)에는 EGL 플랫폼별로 지원되는 저수준 함수의 X-Windows 구현이 포함된다. 이를 통해 X-window와 X pixmap 객체를 EGL window와 pixmap surface로 사용할 수 있다. EGL-X 라이브러리는 프레임 버퍼 메모리에 저장된 X pixmap의 GPU 주소를 쿼리하기 위해 i.MX X Driver 모듈의 X 확장과 함께 구현시 Xlib 함수 호출을 사용한다.
5.3.5 i.MX Driver for X-Windows System
vivante-drv.so라고 하는 i.MX X Driver는 가속을 제공하기 위해 X 서버의 EXA 인터페이스를 구현한다.
vivante-drv.so라고 하는 Vivante X Driver는 가속을 제공하기 위해 X 서버의 EXA 인터페이스를 구현한다.
다음 목록은 이 구현의 상세한 세부 정보를 설명한다 :
- 구현은 X용 fbdev 프레임 버퍼 드라이버의 소스를 기반으로 한다. 그래서 가속이 비활성화된 경우 대체가 될 수 있다.
- 구현은 X 서버 EXA 버전 2.5.0을 기반으로 한다.
- 300x300 픽셀 미만을 포함하는 source/target drawable(그리기 가능한)을 제외(이 경우 소프트웨어 렌더링으로 대체된다.)하고 EXA solid fill 작업은 가속화된다.
- 400x120 픽셀 미만을 포함하는 source/target drawable을 제외(이 경우 소프트웨어 렌더링으로 대체된다.)하고 EXA 복사 작업은 가속화된다.
- 400x400 픽셀 미만을 포함하는 source drawable 제외(이 경우 소프트웨어 렌더링으로 대체된다.)하고 EXA putimage(비디오 메모리로 업로드)은 가속화된다. EXA solid fill와 복사 작업의 경우, solid plane 마스크와 GXcopy raster-op 작업만 가속화된다.
- EXA 복사 작업의 경우, raster-op 작업(GXandInverted, GXnor, GXorReverse, GXorInverted, GXnand)은 가속되지 않는다.
- EXA 컴포지트는 렌더링을 위한 source/mask/target의 많은 옵션과 조합을 허용한다.
- (일반적으로 사용되는)대부분의 EXA 컴포지트 작업이 가속화된다.
EXA 컴포지트 작업의 다음 유형이 가속화된다 :
- 최소 640 픽셀을 포함하는 source/target drawable에 대한 컴포지트 작업. 640 픽셀 미만인 경우 컴포지트 경로는 소프트웨어에 속한다.
- 200x200 픽셀보다 많이 포함되는 source/target drawable일 경우 단순 소스 컴포지트 작업이 사용된다(마스크를 사용한 작업은 지원되지 않음).
- target이 있는 불변 source(알파 마스크가 있거나 없는)의 컴포지트.
- target이 있는 반복 패턴 source(알파 마스크가 있거나 없는)의 컴포지트.
- 블렌딩 함수만 : SOURCE, OVER, IN, IN-REVERSE, OUT-REVERSE, AND (이 중 일부는 가속되는 component-alpha blending을 지원하는 데 필요함)
- 일반적으로 EXA 컴포지트 작업의 다음 유형(덜 일반적으로 사용됨)은 가속되지 않는다 :
- 변형(즉 크기 조정이나 회전) source와 마스크
- 그라디언트 source
- 반복 패턴의 알파 마스크
구현은 EXA callback 인터페이스를 통하여 X에 대한 모든 pixmap 할당을 처리한다. GPU의 물리적 주소에서 액세스할 수 있는 메모리를 할당하려는 첫 번째 시도가 이루어진다. GPU에서 액세스 가능한 남아 있는 메모리가 충분하지 않으면 이 시도는 실패할 수 있고, pixmap에 요청되는 픽셀당 비트가 8 미만인 경우에도 실패할 수 있다. GPU에서 액세스 가능한 메모리를 할당하려는 시도가 실패하면, 시스템 메모리가 할당된다. pixmap 메모리가 시스템에서 할당되면, 이 pixmap은 GPU 가속 옵션에 포함될 수 없다. pixmap 메모리에 액세스하는 데 사용되는 pitch 바이트 수는 GPU 액세스 가능 메모리 또는 시스템에서 할당되었는지 여부에 따라 다를 수 있다. X pixmap에 대한 메모리가 할당되면, GPU 액세스 가능 메모리이든 시스템이든 상관없이 pixmap이 잠겨(locked) 다른 유형의 메모리로 마이그레이션할 수 없다. GPU 액세스 메모리에 대해 시스템 가상 주소를 항상 사용할 수 있으므로, GPU 액세스 가능 메모리에서 시스템 메모리로 pixmap 마이그레이션은 필요하지 않다. 시스템 메모리에서 GPU 액세스 가능 메모리로 pixmap 마이그레이션은 현재 구현되어 있지 않다. 하지만 초기 할당 시 GPU 액세스 가능 메모리가 충분하지 않지만 (할당 해제를 통해)나중에 더 많은 메모리를 사용할 수 있게 되는 상황에서는 도움이 된다. Vivante 2D GPU의 GPU 액세스 가능 메모리 pitch(수평) 정렬은 8픽셀이다. 메모리를 GPU 액세스 가능 메모리에서 할당할 수 있으므로, 이러한 픽셀은 OpenGL/ES 그리기 작업을 위해 EGL에서 사용될 수 있다. /dev/fb0에 할당된 모든 메모리는 EXA에서 사용된 메모리를 기반으로 하는 내부 선형 offscreen 메모리 관리자에서 사용할 수 있다. screen 메모리를 넘어서는 이 메모리의 부분(portion)은 이 메모리 영역이 GPU에서 액세스할 수 있는 X pixmap 할당에 사용할 수 있다. /dev/fb0에 할당된 메모리 양은 화면에 필요한 양보다 몇 MB 더 커야 한다. 필요한 실제 양은 사용된 X-Windows와 pixmap 수, 텍스처로 X pixmap을 사용할 수 있는 가능성, X-Windows가 XComposite 확장을 사용하고 있는지 여부에 따라 다르다. X 확장, 즉 Fig. 1에 표시된 VIVEXT는 X pixmap이 GPU 액세스 가능 메모리에 할당된 경우, X 클라이언트가 X pixmap과 관련된 GPU 물리적 주소를 쿼리할 수 있도록 제공된다.
5.3.6 i.MX Direct Rendering Infrastructure (DRI) for X-Windows System
DRI라고 하는 Direct Rendering Infrastructure는 X Windows System에서 그래픽 하드웨어를 안전하고 효율적인 방식으로 직접 액세스할 수 있도록 하는 프레임워크이다. 여기에는 X 서버, 여러 클라이언트 라이브러리, 커널(DRM, Direct Rendering Manager)에 대한 변경 사항이 포함된다. DRI의 가장 중요한 활동은 프레임 버퍼 메모리에 직접 렌더링하는 빠른 OpenGL과 OpenGL ES 구현을 만드는 것이다. DRI가 없으면, OpenGL 드라이버는 최종 렌더링(간접 렌더링)을 위해 X 서버에 의존해야 하므로 전체 성능이 크게 저하된다.
Vivante의 DRI OpenGL 구현 컴포넌트는 다음과 같다 :
- DRM(Direct Rendering Manager)은 하드웨어에 대한 액세스를 동기화하고 다양한 클래스의 비디오 메모리 버퍼를 관리하기 위해 사용자 영역(userland)에 API를 제공하는 커널 모듈이다. Vivante의 DRI 구현은 DRI 디바이스의 open/close와 FB의 lock/unlock를 위해 선택된 DRM API를 사용한다. 대부분의 다른 버퍼 관리와 DMA 관리 기능은 Vivante의 특정 커널 모듈인 galcore.ko에서 처리된다.
- EXA 드라이버는 X 서버가 시작될 때 DRM을 초기화하는 DRI-enabled DDX 2D 드라이버이다. 모든 X Window pixmap 버퍼는 GPU 메모리를 EXA 드라이버로 할당하므로, 버퍼 정보가 X 서버 프로세스에서 X 클라이언트 프로세스로(GL이나 GLES 애플리케이션) 정확하게 전달되면 GPU는 이러한 버퍼에 직접 렌더링할 수 있다.
- Vivante 전용 X 확장인 "vivext"는 X 서버에서 X 클라이언트로 버퍼 정보를 전달한다. 이 Vivante X 확장은 다음 세가지 인터페이스를 포함한다 :
- DrawableFlush - X 클라이언트가 X 서버로 drawable surface의 GPU 캐시를 플러시하도록 알릴 수 있도록 한다.
- DrawableInfo - X 클라이언트가 X 서버로 drawable information(위치, 크기, 물리 주소, stride, cliplist 등)를 쿼리할 수 있도록 한다.
- PixmapPhysAddr - X 클라이언트가 X 서버로 pixmap 버퍼의 물리 주소와 stride를 쿼리할 수 있도록 한다.
Ubuntu Unity2D 데스크탑과 GL/GLES 애플리케이션 윈도우의 통합은 다음 단계로 수행된다 :
- GL/GLES 애플리케이션은 EXA 드라이버에서 할당된 pixmap 버퍼 프레임에 렌더링한다.
- SwapBuffers 구현에서, 드라이버는 pixmap 버퍼 영역이 Xdamage와 Xfixes API를 통해 손상되었음을 X 서버에 알린다.
- 그런 다음 X 서버는 데스크탑의 다른 윈도우에 대해 윈도우 overlap 특성을 적절히 유지하면서 Unity2D 데스크탑에 최신 pixmap 버퍼를 제공한다.
Ubuntu Unity2D와 같은 컴포지트 X 데스크탑에서 GLES/GL 애플리케이션은 항상 전체 윈도우 직사각형의 백 버퍼로 렌더링된다. 윈도우 클리핑이 필요하지 않다. 따라서 Vivante DRI 구현은 GPU의 resolve 함수를 활용하고 윈도우 백 버퍼에 직접 렌더링할 수 있다.
Gnome, Xwin 등과 같은 레거시 X 윈도우 데스크탑에서 GLES/GL 애플리케이션은 프레임 버퍼 surface에 직접 렌더링해야 한다. 따라서 DRI 드라이버는 VIVEXT 확장 DrawableInfo 인터페이스를 사용하여 윈도우의 클립 목록(cliplist)을 얻은 다음, 클립 목록에 따라 렌더링 대상의 sub-region을 프레임 버퍼를 복사한다. 이렇게 하면 GLES/GL 윈도우가 데스크탑의 다른 윈도우와 적절하게 overlap 된다. 그러나 렌더링 대상의 sub-region을 프레임 버퍼에 복사하는 것은 sub-region의 시작 주소와 alignment가 GPU의 복사 요구 사항을 충족하지 않을 수 있으므로 CPU에서 수행해야 한다.
Vivante DRI 구현은 런타임에 X 윈도우 관리자(컴포지트 데스크탑 관리자나 레거시 데스크탑 관리자) 유형을 감지할 수 있고, GLES/GL 애플리케이션을 위한 적절한 DRI 렌더링 경로를 사용할 수 있다.
5.3.7 EGL-X Library
EGL-X 라이브러리는 X Window System에서 사용되는 저 수준 EGL 인터페이스를 구현한다. 다음 목록은 이 구현과 관련된 세부 정보를 설명한다 :
- eglDisplay 네이티브 디스플레이 유형은 X에서 "Display*" 이다.
- eglWindowSurfacenative 윈도우 surface 유형은 X에서 "Window" 이다.
- eglPixmapSurface 네이티브 pixmap surface 유형은 X에서 "Pixmap" 이다.
eglWindowSurface가 생성될 때, 이중 버퍼링에 사용되는 백 버퍼는 윈도우 surface(선택된 eglConfig 기반)와 다른 representation(표현, 내용)을 가질 수 있다. eglSwapBuffers가 호출될 때, 백 버퍼 content(내용)에 가장 효율적인 blit을 윈도우 surface에 제공하는 representation(표현, 내용)을 사용하여 각 백 버퍼를 생성하려고 시도한다.
백 버퍼는 필요한 크기의 X pixmap을 생성하여 할당된다. offscreen 프레임 버퍼 메모리에 할당된 경우, 이 X pixmap에 대한 프레임 버퍼의 물리 주소를 쿼리하려면 Vivante X 드라이버 모듈용 X 확장을 사용한다.
5.3.8 xorg.conf for i.MX
i.MX 6 Driver를 사용하려면, /etc/X11/xorg.conf 파일을 올바르게 구성해야 한다.
Vivante X Driver를 사용하려면, /etc/X11/xorg.conf 파일을 올바르게 구성해야 한다. 이 구성은 일부 필수 항목과 선택 항목을 포함하는 "Device" 섹션에 나타난다. 다음 예는 Vivante X Driver를 사용하기 위한 기본 구성을 보여준다 :
Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
EndSection
Section "Module"
Load "dbe"
Load "extmod"
Load "freetype"
Load "glx"
Load "dri"
EndSection
Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "XkbLayout" "us"
Option "XkbModel" "pc105"
Option "XkbRules" "xorg"
EndSection
Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
EndSection
Section "Device"
Identifier "Your Accelerated Framebuffer Device"
Driver "vivante"
Option "fbdev" "/dev/fb0"
Option "vivante_fbdev" "/dev/fb0"
Option "HWcursor" "false"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
EndSection
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Your Accelerated Framebuffer Device"
DefaultDepth 24
EndSection
Section "DRI"
Mode 0666
EndSection
Mandatory Strings (필수 문자열)
Vivante X Driver에서 인식하는 몇 가지 중요한 항목은 다음에서 설명된다.
Device Identifier and Screen Device String (디바이스 식별자와 스크린 디바이스 문자열)
Device 섹션에서 필수 Identifier 항목은 이 그래픽 디바이스와 연결할 고유 이름을 지정한다.
Section "Device"
Identifier "Your Accelerated Framebuffer Device"
다음 항목은 특정 그래픽 디바이스를 스크린에 연결한다. Device의 Identifier 문자열은 xorg.conf 파일의 Screensection에 있는 Device 문자열과 일치해야 한다. 예를 들어 :
Section "Screen"
Identifier "Default Screen"
<other entries>
Device "Your Accelerated Framebuffer Device"
<other entries>
EndSection
Device Driver String (디바이스 드라이버 문자열)
필수 Driver 항목은 로드 가능한 Vivante X 드라이버의 이름을 지정한다.
Driver "vivante"
Device fbdevPath Strings
필수 항목인 fbdev와 vivante_dev는 사용하려는 프레임 버퍼 디바이스의 경로를 지정한다.
Section "Device"
Identifier "Your Accelerated Framebuffer Device"
Driver "vivante"
Option "fbdev" "/dev/fb0"
Option "vivante_fbdev" "/dev/fb0"
<other entries>
EndSection
5.3.9 Setting Up X-Windows System Acceleration on Yocto
Prerequisites(전제 조건) :
- xserver-xorg-video-imx-viv-(ver).tar.gz, GPU 드라이버 기반 Vivante EXA 플러그인 소스 코드
- drm-update-arm.patch, libdrm xf86drm.h에 대한 Arm 잠금 구현을 추가한 패치이다. libdrm의 원본 xh86drm.h 헤더 파일에는 Arm 아키텍처를 지원하는 잠금이 없다. 이 패치는 커뮤니티의 Yocto Project 레이어 Yocto_build/sources/meta-freescale/recipes-graphics/drm/libdrm/mx6에 있으며 아래에 표시된다 :
drm-update-arm.patch :
+#elif defined(__arm__) + #undef DRM_DEV_MODE + #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) + + #define DRM_CAS(lock,old,new,__ret) \ + do { \ + __asm__ __volatile__ ( \ + "1: ldrex %0, [%1]\n" \ + " teq %0, %2\n" \ + " strexeq %0, %3, [%1]\n" \ + : "r" (__ret) \ + : "r" (lock), "r" (old), "r" (new) \ + : "cc","memory"); \ + } while (0) + #endif /* architecture */ #endif /* __GNUC__ >= 2 */
Build and install instructions(빌드와 설치 지침) :
- Yocto 환경에서 적절한 위치와 올바른 레시피로 필수 모듈 또는 패치를 설치한다.
- 올바른 drm 헤더 파일(xf86drm.h)로 XServer를 빌드한다. dri 모듈을 만드는 것이 목적이다.
- "bitbake xf86-video-imxfb-vivante" 명령으로 GPU EXA 모듈을 빌드한다. 성공적으로 빌드되면 vivante_drv.so가 생성되며, 대상 보드 rootfs의 /usr/lib/xorg/modules/에 xorg와 libdri 라이브러리와 함께 설치된다.
- 대상 보드 rootfs에 pre-Yocto-built imx-gpu-viv 바이너리를 설치한다. X11을 가속화하려면 X11 백엔드가 필요하다.
- 이제 대상 보드에서 X11 애플리케이션을 실행할 준비가 되었다.
주의
Arm 코어 버전 xf86drm.h를 사용하지 않으면, X11 애플리케이션이 다운된다.
5.3.10 Setting Up X Window System Acceleration
- 플랫폼에 적합한 패키지를 설치한다.
- 디바이스 파일 /dev/galcore가 있는지 확인한다.
- /etc/X11/xorg.conf 파일에 이전 섹션에서 설명한 대로 올바른 항목이 포함되어 있는지 확인한다.
- 위의 단계를 수행했다고 가정하고 다음을 수행하여 X Window System 가속이 실제로 작동하는지 확인한다.
- /var/log/Xorg.0.log 로그 파일을 검사하고 다음 줄이 있는지 확인한다.
ㅡ
[ 41.752] (II) Loading /usr/lib/xorg/modules/drivers/vivante_drv.so
[ 41.752] (II) VIVANTE(0): using default device
[ 41.752] (II) VIVANTE(0): Creating default Display subsection in Screen section "Default Screen" for depth/fbbpp 24/32
[ 41.752] (**) VIVANTE(0): Depth 24, (--) framebufferbpp 32
[ 41.752] (==) VIVANTE(0): RGB weight 888
[ 41.752] (==) VIVANTE(0): Default visual is TrueColor
[ 41.753] (==) VIVANTE(0): Using gamma correction (1.0, 1.0, 1.0)
[ 41.753] (II) VIVANTE(0): hardware: DISP3 BG (video memory: 8100kB)
[ 41.753] (II) VIVANTE(0): checking modes against framebuffer device...
[ 41.753] (II) VIVANTE(0): checking modes against monitor...
[ 41.753] (--) VIVANTE(0): Virtual size is 1920x1080 (pitch 1920)
[ 41.753] (**) VIVANTE(0): Built-in mode "current": 148.5 MHz, 67.5 kHz, 60.0 Hz
[ 41.753] (II) VIVANTE(0): Modeline "current"x0.0 148.50 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync -csync (67.5 kHz)
[ 41.753] (==) VIVANTE(0): DPI set to (96, 96)
[ 41.753] (II) Loading sub module "fb"
[ 41.753] (II) LoadModule: "fb"
[ 41.754] (II) Loading /usr/lib/xorg/modules/libfb.so
[ 41.755] (II) Module fb: vendor="X.Org Foundation"
[ 41.755] compiled for 1.10.4, module version = 1.0.0
[ 41.755] ABI class: X.Org ANSI C Emulation, version 0.4
[ 41.755] (II) Loading sub module "exa"
[ 41.755] (II) LoadModule: "exa"
[ 41.756] (II) Loading /usr/lib/xorg/modules/libexa.so
[ 41.756] (II) Module exa: vendor="X.Org Foundation"
[ 41.756] compiled for 1.10.4, module version = 2.5.0
[ 41.756] ABI class: X.Org Video Driver, version 10.0
[ 41.756] (--) Depth 24 pixmap format is 32 bpp
[ 41.797] (II) VIVANTE(0): FB Start = 0x33142000 FB Base = 0x33142000 FB Offset = (nil)
[ 41.797] (II) VIVANTE(0): test Initializing EXA
[ 41.798] (II) EXA(0): Driver allocated offscreenpixmaps
[ 41.798] (II) EXA(0): Driver registered support for the following operations:
[ 41.798] (II) Solid
[ 41.798] (II) Copy
[ 41.798] (II) Composite (RENDER acceleration)
[ 41.798] (II) UploadToScreen
[ 42.075] (==) VIVANTE(0): Backing store disabled
[ 42.084] (==) VIVANTE(0): DPMS enabled
5.3.11 Troubleshooting
- 프레임 버퍼 디바이스는 환경 변수로 지정할 수 있다. 이는 여러 프레임 버퍼 디바이스가 있는 경우에 특히 유용하다.
export FB_FRAMEBUFFER_0=/dev/fb2
- 위의 방법으로 문제가 해결되지 않는 경우 :
- DRM이 정상적으로 부팅된 경우, 자세한 내용은 /var/log/X11.n (n은 인스턴스 번호를 나타냄) 로그 파일을 확인한다.
- DRM이 정상적으로 부팅되지 않은 경우, 커널 모드 드라이버 설치를 확인한다.(섹션 6.4.2와 6.4.3 참조)
- 윈도우는 생성되지만 아무것도 그려지지 않음
- OpenGL 애플리케이션을 실행하고 윈도우가 생성되었지만 아무것도 그려지지 않은 경우, ${__GL_DEV_FB} 환경 변수를 export한다.
export __GL_DEV_FB=$FB_FRAMEBUFFER_0.
- OpenGL 애플리케이션을 실행하고 윈도우가 생성되었지만 아무것도 그려지지 않은 경우, ${__GL_DEV_FB} 환경 변수를 export한다.
- Display 메세지를 열 수 없으면
- "Cannot open Display"와 유사한 메세지가 표시되면, 다음 명령을 사용하여 X 가 인스턴스 :0에서 실행 중인지 또는 :1에서 실행 중인지 확인한다. 사용법 :
$ ps –ef|grep X
- 그런 다음 반환된 인스턴스 번호에 따라 다음 환경 변수를 추가한다
export DISPLAY=:n
- 그런 다음 다시 실행한다.
- "Cannot open Display"와 유사한 메세지가 표시되면, 다음 명령을 사용하여 X 가 인스턴스 :0에서 실행 중인지 또는 :1에서 실행 중인지 확인한다. 사용법 :
- UART 터미널은 lightdm으로 GPU 애플리케이션을 실행할 수 없다.
- 대신 ssh 터미널을 사용
- EXA 빌드 스크립트 실패
- 로그 파일을 확인하고 시스템 시간이 바르게 설정되었는지 확인한다.
- 잘못된 MIT-MAGIC-COOKIE-1 Key 에러 메세지
- 일부 GPU 애플리케이션은 root를 사용하여 실행할 수 없다. 대신 대체 계정을 사용한다.
- GPU 애플리케이션 실행 중 세스먼트 폴트 발생
- dev/galcore 속성이 666으로 업데이트 되었는지 확인
- 시스템 부팅시 이 속성을 자동으로 업데이트하려면,
- /etc/udev/rules.d/<bsp-specific.rules> 파일을 찾아 편집한다.
- 추가 : "KERNEL=="galcore",MODE="666""
- 마지막으로 커널과 GPU 드라이버가 일치하는지 확인한다.
- Compiz가 실행중인지 확인
- Table 6의 OpenGL Development Packages를 설치한 후 호스트나 대상에 문제가 있는 경우, 다음 명령을 사용하여 compiz가 실행 중인지 확인한다 :
$ ps –ef|grep compiz
- compiz가 실행중이면, Ubuntu는 기본으로 Unity3D를 사용한다. 기본 윈도우 관리자를 Unity2D로 설정하려면,
- /var/lib/AccountsService/users/<username> 파일을 찾아 편집한다.
- ubuntu를 ubuntu-2d로 변경한다.
- Table 6의 OpenGL Development Packages를 설치한 후 호스트나 대상에 문제가 있는 경우, 다음 명령을 사용하여 compiz가 실행 중인지 확인한다 :
※ on screen : 화면에 보이는 영역
※ off screen : 화면에 보이지는 않지만 장면의 일부로 여겨지는 영역
※ solid fill : 그래픽에서 지정된 색으로 특정 영역 채우기
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - Storage (0) | 2022.07.12 |
---|---|
i.MX Linux Reference Manual (0) | 2022.06.28 |
i.MX Linux Reference Manual - Graphics - Wayland (0) | 2022.06.24 |
i.MX Linux Reference Manual - Graphics - Graphics Processing Unit (GPU) (0) | 2022.06.24 |
i.MX Linux Reference Manual - Graphics (0) | 2022.06.24 |