카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/31

가상화 GPU 사용.

가상화에서 GPU 사용

1. OpenGL ES 구현
OpenGL ES 2.0 지원.
OpenGL ES 2.0은 많은 모바일 플랫폼에서 가장 낮은 버전.
Virgil3D가 이러한 플랫폼에서 실행 가능해야 한다는 요구 사항으로 진행.

virgil3D를 OpenGL ES 호스트에서 동작하기 위해 시작됨.

Guest :
-Application
-Mesa -> virgl
-kernel -> virtio-gpu
-----------------------
Host :
-QEMU -> virtio-gpu
      -> virglrenderer
OpenGL

qemu, virglrenderer 및 virtio-gpu.
동작 하는 방식은 게스트 애플리케이션이 수정 되지 않고 OpenGL을 메사에게 알려주는 것이다.
메사를 대신 처리 하는 하드웨어에 명령을 전달 하는 것은 게스트의 virtio-gpu를 통해 호스트 qemu 전달 된다.

그런 다음 QEMU는 그래픽 스택 상태 (Gallium 상태)를 수신하고 virglrenderer를 사용하여 호스트 시스템에서 정상적인 OpenGL로 실행하게 한다.

호스트 OpenGL 스택은 메사가 아닌 nvidia의 스택일 수 있다.

2. 개발환경
병렬 처리 그래픽 스택 설정
function add_export_env {
  local VAR="$1"
  shift
  local VAL=$(eval echo "\$$VAR")
  if [ "$VAL" ]; then
    VAL=$(concatenate_colon "$@" "$VAL");
  else
    VAL=$(concatenate_colon "$@");
  fi
  eval "export $VAR=\"$VAL\""
}

function prefix_setup {
  local PREFIX="$1"

  add_export_env PATH "$PREFIX/bin"
  add_export_env LD_LIBRARY_PATH "$PREFIX/lib"
  add_export_env PKG_CONFIG_PATH "$PREFIX/lib/pkgconfig/" "$PREFIX/share/pkgconfig/"
  add_export_env MANPATH "$PREFIX/share/man"
  export ACLOCAL_PATH="$PREFIX/share/aclocal"
  mkdir -p "$ACLOCAL_PATH"
  export ACLOCAL="aclocal -I $ACLOCAL_PATH"
}

function projectshell {
  case "$1" in
    virgl | virglrenderer)
        export ALT_LOCAL="/opt/local/virgl"
        mkdir -p "$ALT_LOCAL"
        prefix_setup "$ALT_LOCAL"
        ;;
}

.bashrc 추가

2.1 libepoxy 빌드
opengl 함수 포인터 관리 라이브러리. 의존성 virglrenderer

git clone https://github.com/anholt/libepoxy.git
cd libepoxy
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install

2.2 virglrenderer 빌드
qemu 가속 렌더링 구성요소.
virtio-gpu 인터페이스를 통해 게스트 커널에서 Gallium 상태를 수신 한 다음 호스트의 OpenGL로 변환.
Gallium에서 사용하는 TGSI 형식의 쉐이더를 OpenGL에서 사용하는 GLSL 형식으로 변환.

git clone git://anongit.freedesktop.org/virglrenderer
cd virglrenderer
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install

2.3 libpciaccess 빌드
PCI 버스의 장치 접근 라이브러리. 메사와 의존성 있음.

git clone git://git.freedesktop.org/git/xorg/lib/libpciaccess
cd libpciaccess
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install

2.4 mesa 빌드
# 의존성 해결
sudo sed -i 's/\#deb-src/deb-src/' /etc/apt/sources.list
sudo apt update
sudo apt-get build-dep mesa

# Mesa 빌드
git clone https://anongit.freedesktop.org/git/mesa/mesa.git
cd mesa
./configure \
    --prefix=$ALT_LOCAL \
    --enable-driglx-direct \
    --enable-gles1 \
    --enable-gles2 \
    --enable-glx-tls \
    --with-egl-platforms='drm x11 wayland' \
    --with-dri-drivers="i915 i965 nouveau" \
    --with-gallium-drivers="nouveau swrast radeonsi"
make -j$(nproc --ignore=1)
make install

2.5 qemu 빌드
git clone git://git.qemu.org/qemu.git
cd qemu
./configure \
    --prefix=$ALT_LOCAL \
    --target-list=x86_64-softmmu \
    --enable-kvm \
    --disable-werror \
    --enable-virglrenderer
make -j$(nproc --ignore=1)
make install

2.6 vm 설정
우분투 17.10 사용 테스트, 테스트할 배포한의 최신 버전 사용해 테스트 한다.
커널 옵션중 virtio-gpu Kconfig 옵션 추가 설정해 빌드 해야함.

wget http://releases.ubuntu.com/17.10/ubuntu-17.10.1-server-amd64.iso
qemu-img create -f qcow2 ubuntu.qcow2 35G
qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -hda ubuntu.qcow2 \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -vga virtio \
    -display sdl,gl=on \
    -boot d -cdrom ubuntu-17.10.1-desktop-amd64.iso

2.7 vm 실행
qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -hda ubuntu.qcow2 \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -vga virtio \
    -display sdl,gl=on

2.8 OpenGL ES 백엔드 QEMU 실행
qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -hda ubuntu.qcow2 \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -vga virtio \
    -display sdl,gl=es

-sdl,gl=core OpenGL 컨텍스트 강제 생성.
-sdl,gl=on OpenGL 컨텍스트 생성 실패 할 경우, OpenGL ES 컨텍스트 생성한다.
-sdl,gl=off 가속화 사용하지 않음.

댓글 없음:

댓글 쓰기