diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3f43dfc..196d8fa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -99,23 +99,6 @@ build_ubuntu_bionic_arm: paths: - output/ -build_ubuntu_bionic_libjpeg_turbo: - stage: build - allow_failure: false - before_script: - - *prepare_build - - *prepare_www - after_script: - - *prepare_artfacts - script: - - bash builder/build-package ubuntu bionic +libjpeg-turbo_latest - only: - variables: - - $BUILD_JOBS == 'all' || $BUILD_JOBS =~ $CI_JOB_NAME - artifacts: - paths: - - output/ - build_ubuntu_focal: stage: build allow_failure: true diff --git a/CMakeLists.txt b/CMakeLists.txt index e463d54..aac6aff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,8 @@ find_package(PNG REQUIRED) # Check for libjpeg find_package(JPEG REQUIRED) +# Staticly link libjpeg-turbo +set(JPEG_LIBRARIES "-Wl,-Bstatic -lturbojpeg -Wl,-Bdynamic") # Warn if it doesn't seem to be the accelerated libjpeg that's found set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARIES}) set(CMAKE_REQUIRED_FLAGS -I${JPEG_INCLUDE_DIR}) diff --git a/README.md b/README.md index cec0a57..f226003 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,9 @@ desktop: height: 768 allow_resize: true pixel_depth: 24 + gpu: + hw3d: false + drinode: /dev/dri/renderD128 network: protocol: http @@ -228,6 +231,7 @@ command_line: # New Features! + - Faster jpeg compression (via statically linked libjpeg-turbo) - Webp image compression for better bandwidth usage - Automatic mixing of webp and jpeg based on CPU availability on server - Multi-threaded image encoding for smoother frame rate for servers with more cores @@ -255,6 +259,7 @@ command_line: - Cursor lock - IME support for languages with extended characters - Better mobile support + - DRI3 GPU acceleration with open source drivers (AMDGPU,Intel,ATI,ARM) Future Goals: diff --git a/builder/README.md b/builder/README.md index 2687777..ea05cc1 100644 --- a/builder/README.md +++ b/builder/README.md @@ -48,6 +48,18 @@ It will install the package inside a new container and run KasmVNC. Open browser and point to https://localhost:443/ or https://\:443/ +## Debugging + +To debug a test container, run `test-deb ubuntu focal -s` or `test-deb ubuntu +focal --shell`. It runs a shell instead of starting KasmVNC. + +## Testing performance + +To run a performance test, add `-p` option: +``` +builder/test-deb ubuntu focal -p +``` + # Package development ## deb/rpm package building and testing diff --git a/builder/build.sh b/builder/build.sh index 7728bc1..9cee060 100755 --- a/builder/build.sh +++ b/builder/build.sh @@ -47,7 +47,7 @@ cd /tmp # default to the version of x in Ubuntu 18.04, otherwise caller will need to specify XORG_VER=${XORG_VER:-"1.19.6"} XORG_PATCH=$(echo "$XORG_VER" | grep -Po '^\d.\d+' | sed 's#\.##') -wget --no-check-certificate https://www.x.org/archive/individual/xserver/xorg-server-${XORG_VER}.tar.bz2 +wget --no-check-certificate https://www.x.org/archive/individual/xserver/xorg-server-${XORG_VER}.tar.gz #git clone https://kasmweb@bitbucket.org/kasmtech/kasmvnc.git #cd kasmvnc @@ -64,9 +64,10 @@ cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo . -DBUILD_VIEWER:BOOL=OFF \ -DENABLE_GNUTLS:BOOL=OFF make -j5 -tar -C unix/xserver -xf /tmp/xorg-server-${XORG_VER}.tar.bz2 --strip-components=1 +tar -C unix/xserver -xf /tmp/xorg-server-${XORG_VER}.tar.gz --strip-components=1 cd unix/xserver +# Apply patches patch -Np1 -i ../xserver${XORG_PATCH}.patch case "$XORG_VER" in 1.20.*) @@ -85,23 +86,40 @@ autoreconf -i # everything after that is based on BUILDING.txt to remove unneeded # components. ensure_crashpad_can_fetch_line_number_by_address +# Centos7 is too old for dri3 +if [ ! "${KASMVNC_BUILD_OS}" == "centos" ]; then + CONFIG_OPTIONS="--enable-dri3" +fi # remove gl check for opensuse if [ "${KASMVNC_BUILD_OS}" == "opensuse" ] || ([ "${KASMVNC_BUILD_OS}" == "oracle" ] && [ "${KASMVNC_BUILD_OS_CODENAME}" == 9 ]); then sed -i 's/LIBGL="gl >= 7.1.0"/LIBGL="gl >= 1.1"/g' configure fi + # build X11 -./configure --prefix=/opt/kasmweb \ - --with-xkb-path=/usr/share/X11/xkb \ - --with-xkb-output=/var/lib/xkb \ - --with-xkb-bin-directory=/usr/bin \ - --with-default-font-path="/usr/share/fonts/X11/misc,/usr/share/fonts/X11/cyrillic,/usr/share/fonts/X11/100dpi/:unscaled,/usr/share/fonts/X11/75dpi/:unscaled,/usr/share/fonts/X11/Type1,/usr/share/fonts/X11/100dpi,/usr/share/fonts/X11/75dpi,built-ins" \ - --with-sha1=libcrypto \ - --without-dtrace --disable-dri \ - --disable-static \ - --disable-xinerama --disable-xvfb --disable-xnest --disable-xorg \ - --disable-dmx --disable-xwin --disable-xephyr --disable-kdrive \ - --disable-config-hal --disable-config-udev \ - --disable-dri2 --enable-glx --disable-xwayland --disable-dri3 +./configure \ + --disable-config-hal \ + --disable-config-udev \ + --disable-dmx \ + --disable-dri \ + --disable-dri2 \ + --disable-kdrive \ + --disable-static \ + --disable-xephyr \ + --disable-xinerama \ + --disable-xnest \ + --disable-xorg \ + --disable-xvfb \ + --disable-xwayland \ + --disable-xwin \ + --enable-glx \ + --prefix=/opt/kasmweb \ + --with-default-font-path="/usr/share/fonts/X11/misc,/usr/share/fonts/X11/cyrillic,/usr/share/fonts/X11/100dpi/:unscaled,/usr/share/fonts/X11/75dpi/:unscaled,/usr/share/fonts/X11/Type1,/usr/share/fonts/X11/100dpi,/usr/share/fonts/X11/75dpi,built-ins" \ + --without-dtrace \ + --with-sha1=libcrypto \ + --with-xkb-bin-directory=/usr/bin \ + --with-xkb-output=/var/lib/xkb \ + --with-xkb-path=/usr/share/X11/xkb ${CONFIG_OPTIONS} + # remove array bounds errors for new versions of GCC find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \; make -j5 diff --git a/builder/dockerfile.alpine_317.build b/builder/dockerfile.alpine_317.build index 5450db9..2fdecd3 100644 --- a/builder/dockerfile.alpine_317.build +++ b/builder/dockerfile.alpine_317.build @@ -2,7 +2,7 @@ FROM alpine:3.17 ENV KASMVNC_BUILD_OS alpine ENV KASMVNC_BUILD_OS_CODENAME 317 -ENV XORG_VER 1.20.7 +ENV XORG_VER 1.20.14 RUN \ echo "**** install build deps ****" && \ @@ -68,6 +68,12 @@ RUN \ xorg-server-dev \ xtrans + +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo + RUN useradd -m docker && echo "docker:docker" | chpasswd COPY --chown=docker:docker . /src/ diff --git a/builder/dockerfile.centos_core.build b/builder/dockerfile.centos_core.build index 476c1e4..cb6d4fa 100644 --- a/builder/dockerfile.centos_core.build +++ b/builder/dockerfile.centos_core.build @@ -5,11 +5,11 @@ ENV KASMVNC_BUILD_OS_CODENAME core RUN yum install -y ca-certificates RUN yum install -y build-dep xorg-server libxfont-dev sudo -RUN yum install -y gcc cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver -RUN yum install -y libjpeg-dev libpng-dev libtiff-dev libgif-dev libavcodec-dev openssl-devel +RUN yum install -y gcc cmake git libgnutls28-dev vim wget tightvncserver +RUN yum install -y libpng-dev libtiff-dev libgif-dev libavcodec-dev openssl-devel RUN yum install -y make RUN yum group install -y "Development Tools" -RUN yum install -y xorg-x11-server-devel zlib-devel libjpeg-turbo-devel +RUN yum install -y xorg-x11-server-devel zlib-devel RUN yum install -y libxkbfile-devel libXfont2-devel xorg-x11-font-utils \ xorg-x11-xtrans-devel xorg-x11-xkb-utils-devel libXrandr-devel pam-devel \ gnutls-devel libX11-devel libXtst-devel libXcursor-devel @@ -23,6 +23,10 @@ RUN cd /tmp/libwebp-1.0.2 && \ ./configure --enable-static --disable-shared && \ make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-libjpeg-turbo + RUN useradd -m docker && echo "docker:docker" | chpasswd COPY --chown=docker:docker . /src/ diff --git a/builder/dockerfile.debian_bullseye.build b/builder/dockerfile.debian_bullseye.build index b1a1908..4f0a970 100644 --- a/builder/dockerfile.debian_bullseye.build +++ b/builder/dockerfile.debian_bullseye.build @@ -12,15 +12,13 @@ RUN apt-get update && \ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev -RUN apt-get update && apt-get -y install cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver +RUN apt-get update && apt-get -y install cmake git libgnutls28-dev vim wget tightvncserver RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.debian_buster.build b/builder/dockerfile.debian_buster.build index 9849856..8c8fc7b 100644 --- a/builder/dockerfile.debian_buster.build +++ b/builder/dockerfile.debian_buster.build @@ -12,15 +12,13 @@ RUN apt-get update && \ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev -RUN apt-get update && apt-get -y install cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver +RUN apt-get update && apt-get -y install cmake git libgnutls28-dev vim wget tightvncserver RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.debian_buster.deb.test b/builder/dockerfile.debian_buster.deb.test index 7193650..416e9fc 100644 --- a/builder/dockerfile.debian_buster.deb.test +++ b/builder/dockerfile.debian_buster.deb.test @@ -34,14 +34,6 @@ RUN apt-get purge -y pm-utils xscreensaver* RUN apt-get update && apt-get install -y vim less RUN apt-get update && apt-get -y install lsb-release -RUN apt-get update && apt-get install -y task-cinnamon-desktop -RUN apt-get update && apt-get install -y task-gnome-desktop -RUN mkdir -p /usr/share/man/man1 -RUN apt-get update && apt-get install -y apt-utils openjdk-11-jre -RUN apt-get update && apt-get install -y task-lxde-desktop -RUN apt-get update && apt-get install -y task-mate-desktop -RUN apt-get update && apt-get install -y task-kde-desktop - RUN echo 'source $STARTUPDIR/generate_container_user' >> $HOME/.bashrc RUN mkdir -p $STARTUPDIR diff --git a/builder/dockerfile.fedora_thirtyseven.build b/builder/dockerfile.fedora_thirtyseven.build index b83db05..4557431 100644 --- a/builder/dockerfile.fedora_thirtyseven.build +++ b/builder/dockerfile.fedora_thirtyseven.build @@ -2,22 +2,32 @@ FROM fedora:37 ENV KASMVNC_BUILD_OS fedora ENV KASMVNC_BUILD_OS_CODENAME thirtyseven -ENV XORG_VER 1.20.7 +ENV XORG_VER 1.20.14 RUN \ echo "**** install build deps ****" && \ + dnf group install -y \ + "C Development Tools and Libraries" \ + "Development Tools" && \ dnf install -y \ autoconf \ automake \ + bison \ + byacc \ bzip2 \ cmake \ + diffutils \ + doxygen \ + file \ + flex \ + fop \ gcc \ gcc-c++ \ git \ + glibc-devel \ libdrm-devel \ libepoxy-devel \ - libjpeg-turbo-devel \ - libjpeg-turbo-static \ + libmd-devel \ libpciaccess-devel \ libtool \ libwebp-devel \ @@ -34,14 +44,18 @@ RUN \ libxshmfence-devel \ libXtst-devel \ mesa-libEGL-devel \ + mesa-libgbm-devel \ mesa-libGL-devel \ meson \ + mingw64-binutils \ + mt-st \ nettle-devel \ openssl-devel \ patch \ pixman-devel \ wayland-devel \ wget \ + which \ xcb-util-devel \ xcb-util-image-devel \ xcb-util-keysyms-devel \ @@ -51,11 +65,18 @@ RUN \ xkbcomp \ xkbcomp-devel \ xkeyboard-config \ + xmlto \ xorg-x11-font-utils \ xorg-x11-proto-devel \ xorg-x11-server-common \ xorg-x11-server-devel \ - xorg-x11-xtrans-devel + xorg-x11-xtrans-devel \ + xsltproc + +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.fedora_thirtyseven.rpm.test b/builder/dockerfile.fedora_thirtyseven.rpm.test index 2bce89f..5c7dea3 100644 --- a/builder/dockerfile.fedora_thirtyseven.rpm.test +++ b/builder/dockerfile.fedora_thirtyseven.rpm.test @@ -31,8 +31,7 @@ WORKDIR $HOME RUN dnf install -y openssl xterm gettext wget RUN dnf install -y nss_wrapper -RUN dnf install -y xorg-x11-xauth xorg-x11-xkb-utils \ - xkeyboard-config xorg-x11-server-utils +RUN dnf install -y xorg-x11-xauth xkeyboard-config # xorg-x11-server-Xorg # RUN dnf install -y @xfce-desktop-environment RUN dnf erase -y pm-utils xscreensaver* diff --git a/builder/dockerfile.kali_kali-rolling.build b/builder/dockerfile.kali_kali-rolling.build index 2123440..23346d5 100644 --- a/builder/dockerfile.kali_kali-rolling.build +++ b/builder/dockerfile.kali_kali-rolling.build @@ -15,15 +15,13 @@ RUN apt-get update && \ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev RUN apt-get update && apt-get -y install gcc-11 g++-11 -RUN apt-get update && apt-get -y install cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver +RUN apt-get update && apt-get -y install cmake git libgnutls28-dev vim wget tightvncserver RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make -j$(nproc) && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.opensuse_15.build b/builder/dockerfile.opensuse_15.build index b3d5e56..4d98116 100644 --- a/builder/dockerfile.opensuse_15.build +++ b/builder/dockerfile.opensuse_15.build @@ -19,14 +19,15 @@ RUN zypper install -ny \ gzip \ lbzip2 \ libbz2-devel \ + libgbm-devel \ libGLw-devel \ libgnutls-devel \ - libjpeg8-devel \ libopenssl-devel \ libpng16-devel \ libtiff-devel \ libXfont2-devel \ libxkbcommon-x11-devel \ + libxshmfence-devel \ make \ Mesa-dri \ Mesa-libglapi-devel \ @@ -41,12 +42,10 @@ RUN zypper install -ny \ xorg-x11-util-devel \ zlib-devel -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -u 1000 docker && \ groupadd -g 1000 docker && \ diff --git a/builder/dockerfile.oracle_8.build b/builder/dockerfile.oracle_8.build index 60fc801..d3cc907 100644 --- a/builder/dockerfile.oracle_8.build +++ b/builder/dockerfile.oracle_8.build @@ -5,27 +5,31 @@ ENV KASMVNC_BUILD_OS_CODENAME 8 ENV XORG_VER 1.20.10 # Install from stock repos -RUN dnf install -y \ - bzip2-devel \ - ca-certificates \ - cmake \ - dnf-plugins-core \ - gcc \ - gcc-c++ \ - git \ - gnutls-devel \ - libjpeg-turbo-devel \ - libpng-devel \ - libtiff-devel \ - make \ - mesa-dri-drivers \ - openssl-devel \ - openssl-devel \ - patch \ - tigervnc-server \ - wget \ - xorg-x11-font-utils \ - zlib-devel +RUN \ + dnf install -y 'dnf-command(config-manager)' && \ + dnf config-manager --set-enabled ol8_codeready_builder && \ + dnf install -y \ + bzip2-devel \ + ca-certificates \ + cmake \ + dnf-plugins-core \ + gcc \ + gcc-c++ \ + git \ + gnutls-devel \ + libjpeg-turbo-devel \ + libpng-devel \ + libtiff-devel \ + libxshmfence-devel \ + make \ + mesa-dri-drivers \ + mesa-libgbm-devel \ + openssl-devel \ + patch \ + tigervnc-server \ + wget \ + xorg-x11-font-utils \ + zlib-devel # Enable additional repos (epel, powertools, and fusion) RUN dnf config-manager --set-enabled ol8_codeready_builder @@ -46,12 +50,10 @@ RUN dnf install -y \ libXtst-devel \ libXcursor-devel -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.oracle_9.build b/builder/dockerfile.oracle_9.build index a7bc22d..2b4a102 100644 --- a/builder/dockerfile.oracle_9.build +++ b/builder/dockerfile.oracle_9.build @@ -5,32 +5,35 @@ ENV KASMVNC_BUILD_OS_CODENAME 9 ENV XORG_VER 1.20.10 # Install from stock repos -RUN dnf config-manager --set-enabled ol9_distro_builder -RUN dnf install -y \ - bzip2-devel \ - ca-certificates \ - cmake \ - dnf-plugins-core \ - gcc \ - gcc-c++ \ - git \ - gnutls-devel \ - libjpeg-turbo-devel \ - libpng-devel \ - libtiff-devel \ - make \ - mesa-dri-drivers \ - mesa-libGL-devel \ - openssl-devel \ - openssl-devel \ - patch \ - tigervnc-server \ - wget \ - xorg-x11-font-utils \ - zlib-devel +RUN \ + dnf config-manager --set-enabled ol9_codeready_builder && \ + dnf config-manager --set-enabled ol9_distro_builder && \ + dnf install -y \ + bzip2-devel \ + ca-certificates \ + cmake \ + dnf-plugins-core \ + gcc \ + gcc-c++ \ + git \ + gnutls-devel \ + libjpeg-turbo-devel \ + libpng-devel \ + libtiff-devel \ + libxshmfence-devel \ + make \ + mesa-dri-drivers \ + mesa-libGL-devel \ + mesa-libgbm-devel \ + openssl-devel \ + openssl-devel \ + patch \ + tigervnc-server \ + wget \ + xorg-x11-font-utils \ + zlib-devel # Enable additional repos (epel, powertools, and fusion) -RUN dnf config-manager --set-enabled ol9_codeready_builder RUN dnf install -y oracle-epel-release-el9 RUN dnf install -y --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-9.noarch.rpm @@ -46,12 +49,11 @@ RUN dnf install -y \ libXtst-devel \ libXcursor-devel -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install + +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.ubuntu1604.build b/builder/dockerfile.ubuntu1604.build deleted file mode 100644 index 8ca3260..0000000 --- a/builder/dockerfile.ubuntu1604.build +++ /dev/null @@ -1,21 +0,0 @@ -FROM ubuntu:16.04 - -RUN sed -i 's$# deb-src$deb-src$' /etc/apt/sources.list - -RUN apt-get update && \ - apt-get -y install sudo - -RUN apt-get -y build-dep xorg-server -RUN apt-get -y install cmake git libjpeg-dev libgnutls-dev vim wget tightvncserver -RUN apt-get -y install libjpeg-dev libpng-dev libtiff-dev libgif-dev -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzvf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && ./configure && make && make install - -RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo - -COPY --chown=docker:docker . /src/ - - -USER docker -ENTRYPOINT ["/src/builder/build.sh"] diff --git a/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.build b/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.build deleted file mode 100644 index 2615bff..0000000 --- a/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.build +++ /dev/null @@ -1,39 +0,0 @@ -FROM ubuntu:18.04 - -ENV KASMVNC_BUILD_OS ubuntu -ENV KASMVNC_BUILD_OS_CODENAME bionic -ENV XORG_VER 1.20.10 - -RUN sed -i 's$# deb-src$deb-src$' /etc/apt/sources.list - -RUN apt-get update && \ - apt-get -y install sudo - -RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev -RUN apt-get update && apt-get -y install cmake git libgnutls28-dev vim wget tightvncserver -RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev - -RUN apt-get update && apt-get install -y cmake nasm gcc -RUN git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git -RUN export MAKEFLAGS=-j`nproc`; cd libjpeg-turbo && cmake -G"Unix Makefiles" && make deb -RUN export MAKEFLAGS=-j`nproc`; cd libjpeg-turbo && cmake -DCMAKE_INSTALL_PREFIX=/usr/local -G"Unix Makefiles" && make && make install - -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install - -# Fix for older required libs -#RUN cd /tmp && wget http://launchpadlibrarian.net/347526424/libxfont1-dev_1.5.2-4ubuntu2_amd64.deb && \ -# wget http://launchpadlibrarian.net/347526425/libxfont1_1.5.2-4ubuntu2_amd64.deb && \ -# dpkg -i libxfont1_1.5.2-4ubuntu2_amd64.deb && \ -# dpkg -i libxfont1-dev_1.5.2-4ubuntu2_amd64.deb - -RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo - -COPY --chown=docker:docker . /src - -USER docker -ENTRYPOINT ["/src/builder/build.sh"] diff --git a/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.deb.build b/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.deb.build deleted file mode 100644 index 7782f10..0000000 --- a/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.deb.build +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu:bionic - -RUN apt-get update && \ - apt-get -y install vim build-essential devscripts equivs - -ARG KASMVNC_PACKAGE_DIR -COPY $KASMVNC_PACKAGE_DIR/libjpeg-turbo*deb /tmp/ -RUN apt-get install /tmp/libjpeg-turbo*deb - -# Install build-deps for the package. -COPY ./debian/control /tmp -RUN apt-get update && echo YYY | mk-build-deps --install --remove /tmp/control - -ENV LD_LIBRARY_PATH="/opt/libjpeg-turbo/lib64/:$LD_LIBRARY_PATH" - -ARG L_UID -RUN if [ "$L_UID" -eq 0 ]; then \ - useradd -m docker; \ - else \ - useradd -m docker -u $L_UID;\ - fi - -USER docker diff --git a/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.deb.test b/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.deb.test deleted file mode 100644 index 635ee0f..0000000 --- a/builder/dockerfile.ubuntu_bionic+libjpeg-turbo_latest.deb.test +++ /dev/null @@ -1,60 +0,0 @@ -FROM ubuntu:bionic - -ENV DISPLAY=:1 \ - VNC_PORT=8443 \ - VNC_RESOLUTION=1280x720 \ - MAX_FRAME_RATE=24 \ - VNCOPTIONS="-PreferBandwidth -DynamicQualityMin=4 -DynamicQualityMax=7" \ - HOME=/home/user \ - TERM=xterm \ - STARTUPDIR=/dockerstartup \ - INST_SCRIPTS=/dockerstartup/install \ - KASM_RX_HOME=/dockerstartup/kasmrx \ - DEBIAN_FRONTEND=noninteractive \ - VNC_COL_DEPTH=24 \ - VNC_RESOLUTION=1280x1024 \ - VNC_PW=vncpassword \ - VNC_USER=user \ - VNC_VIEW_ONLY_PW=vncviewonlypassword \ - LD_LIBRARY_PATH=/opt/libjpeg-turbo/lib64/:/usr/local/lib/ \ - OMP_WAIT_POLICY=PASSIVE \ - SHELL=/bin/bash \ - SINGLE_APPLICATION=0 \ - KASMVNC_BUILD_OS=ubuntu \ - KASMVNC_BUILD_OS_CODENAME=bionic - -EXPOSE $VNC_PORT - -WORKDIR $HOME - -### REQUIRED STUFF ### - -RUN apt-get update && apt-get install -y supervisor xfce4 xfce4-terminal xterm libnss-wrapper gettext wget -RUN apt-get purge -y pm-utils xscreensaver* -RUN apt-get update && apt-get install -y vim less -RUN apt-get update && apt-get -y install lsb-release - -RUN echo 'source $STARTUPDIR/generate_container_user' >> $HOME/.bashrc - -RUN mkdir -p $STARTUPDIR -COPY builder/startup/ $STARTUPDIR - -### START CUSTOM STUFF #### -COPY ./builder/scripts/ /tmp/scripts/ -COPY ./debian/changelog /tmp - -ARG KASMVNC_PACKAGE_DIR -COPY $KASMVNC_PACKAGE_DIR/libjpeg-turbo_*.deb /tmp/ -RUN apt-get install /tmp/libjpeg-turbo*deb - -ARG BUILD_DEBIAN_REVISION -COPY $KASMVNC_PACKAGE_DIR/kasmvncserver_*$BUILD_DEBIAN_REVISION*.deb /tmp/ -RUN /tmp/scripts/install_kasmvncserver_package "$BUILD_DEBIAN_REVISION" - -### END CUSTOM STUFF ### - -RUN chown -R 1000:0 $HOME -USER 1000:ssl-cert -WORKDIR $HOME - -ENTRYPOINT [ "/dockerstartup/vnc_startup.sh" ] diff --git a/builder/dockerfile.ubuntu_bionic.build b/builder/dockerfile.ubuntu_bionic.build index f54123b..4095901 100644 --- a/builder/dockerfile.ubuntu_bionic.build +++ b/builder/dockerfile.ubuntu_bionic.build @@ -10,15 +10,13 @@ RUN apt-get update && \ apt-get -y install sudo RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev -RUN apt-get update && apt-get -y install cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver +RUN apt-get update && apt-get -y install cmake git libgnutls28-dev vim wget tightvncserver RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo # Fix for older required libs #RUN cd /tmp && wget http://launchpadlibrarian.net/347526424/libxfont1-dev_1.5.2-4ubuntu2_amd64.deb && \ diff --git a/builder/dockerfile.ubuntu_bionic.test b/builder/dockerfile.ubuntu_bionic.test index de10bd1..a9c2049 100644 --- a/builder/dockerfile.ubuntu_bionic.test +++ b/builder/dockerfile.ubuntu_bionic.test @@ -29,7 +29,7 @@ WORKDIR $HOME ### REQUIRED STUFF ### -RUN apt-get update && apt-get install -y supervisor xfce4 xfce4-terminal xterm libnss-wrapper gettext libjpeg-dev wget +RUN apt-get update && apt-get install -y supervisor xfce4 xfce4-terminal xterm libnss-wrapper gettext wget RUN apt-get purge -y pm-utils xscreensaver* RUN echo 'source $STARTUPDIR/generate_container_user' >> $HOME/.bashrc diff --git a/builder/dockerfile.ubuntu_focal.barebones.deb.test b/builder/dockerfile.ubuntu_focal.barebones.deb.test index 9b16154..d9effe0 100644 --- a/builder/dockerfile.ubuntu_focal.barebones.deb.test +++ b/builder/dockerfile.ubuntu_focal.barebones.deb.test @@ -2,9 +2,13 @@ FROM ubuntu:focal ENV STARTUPDIR=/dockerstartup +COPY ./builder/scripts/ /tmp/scripts/ +COPY ./debian/changelog /tmp + ARG KASMVNC_PACKAGE_DIR COPY $KASMVNC_PACKAGE_DIR/kasmvncserver_*.deb /tmp/ -RUN rm -f /tmp/kasmvncserver_*+*.deb; apt-get update && dpkg -i /tmp/*.deb; apt-get -yf install +RUN /tmp/scripts/install_kasmvncserver_package + RUN apt-get update && apt-get -y install xterm lsb-release RUN mkdir -p $STARTUPDIR diff --git a/builder/dockerfile.ubuntu_focal.build b/builder/dockerfile.ubuntu_focal.build index 5925c92..43094ed 100644 --- a/builder/dockerfile.ubuntu_focal.build +++ b/builder/dockerfile.ubuntu_focal.build @@ -12,15 +12,13 @@ RUN apt-get update && \ RUN apt-get update && apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev -RUN apt-get update && apt-get -y install cmake git libjpeg-dev vim wget +RUN apt-get update && apt-get -y install cmake git vim wget RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.ubuntu_focal.test b/builder/dockerfile.ubuntu_focal.test index 7cf307b..3002fb5 100644 --- a/builder/dockerfile.ubuntu_focal.test +++ b/builder/dockerfile.ubuntu_focal.test @@ -29,7 +29,7 @@ WORKDIR $HOME ### REQUIRED STUFF ### -RUN apt-get update && apt-get install -y supervisor xfce4 xfce4-terminal xterm libnss-wrapper gettext libjpeg-dev wget +RUN apt-get update && apt-get install -y supervisor xfce4 xfce4-terminal xterm libnss-wrapper gettext wget RUN apt-get purge -y pm-utils xscreensaver* RUN echo 'source $STARTUPDIR/generate_container_user' >> $HOME/.bashrc diff --git a/builder/dockerfile.ubuntu_jammy.build b/builder/dockerfile.ubuntu_jammy.build index 4ca442f..33a3709 100644 --- a/builder/dockerfile.ubuntu_jammy.build +++ b/builder/dockerfile.ubuntu_jammy.build @@ -12,15 +12,13 @@ RUN apt-get update && \ RUN apt-get update && apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev -RUN apt-get update && apt-get -y install cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver +RUN apt-get update && apt-get -y install cmake git libgnutls28-dev vim wget tightvncserver RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev -# Additions for webp -RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz -RUN cd /tmp && tar -xzf /tmp/libwebp-* -RUN cd /tmp/libwebp-1.0.2 && \ - ./configure --enable-static --disable-shared && \ - make && make install +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp +RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.ubuntu_jammy.test b/builder/dockerfile.ubuntu_jammy.test index 9adc1b5..a4fb5d7 100644 --- a/builder/dockerfile.ubuntu_jammy.test +++ b/builder/dockerfile.ubuntu_jammy.test @@ -29,7 +29,7 @@ WORKDIR $HOME ### REQUIRED STUFF ### -RUN apt-get update && apt-get install -y supervisor xfce4 xfce4-terminal xterm libnss-wrapper gettext libjpeg-dev wget +RUN apt-get update && apt-get install -y supervisor xfce4 xfce4-terminal xterm libnss-wrapper gettext wget RUN apt-get purge -y pm-utils xscreensaver* RUN echo 'source $STARTUPDIR/generate_container_user' >> $HOME/.bashrc diff --git a/builder/os_ver_cli.sh b/builder/os_ver_cli.sh index f23fb9e..534810d 100644 --- a/builder/os_ver_cli.sh +++ b/builder/os_ver_cli.sh @@ -1,3 +1,5 @@ +#!/bin/bash + default_os=${default_os:-ubuntu} default_os_codename=${default_os_codename:-bionic} diff --git a/builder/process_test_options.sh b/builder/process_test_options.sh new file mode 100644 index 0000000..da8b55c --- /dev/null +++ b/builder/process_test_options.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +usage() { + echo >&2 "Usage: $(basename "$0") [-s|--shell] [-p|--perf-test] [-h|--help] " + exit +} + +process_options() { + local sorted_options=$(getopt -o psh --long perf-test --long shell --long help -- "$@") + eval set -- $sorted_options + + while : ; do + case "$1" in + -p|--perf-test) + entrypoint_args='-interface 0.0.0.0 -selfBench :1' + entrypoint_executable="--entrypoint=/usr/bin/Xvnc" + shift + ;; + -s|--shell) + entrypoint_executable="--entrypoint=bash" + shift + ;; + -h|--help) + print_usage=1 + ;; + --) + shift + break + ;; + esac + done + + leftover_options=("$@") +} + +declare -a leftover_options + +if [ "$#" -eq 0 ]; then + usage + exit +fi + +process_options "$@" +set -- "${leftover_options[@]}" + +if [ -n "$print_usage" ]; then + usage + exit +fi diff --git a/builder/scripts/build-libjpeg-turbo b/builder/scripts/build-libjpeg-turbo new file mode 100755 index 0000000..49134ba --- /dev/null +++ b/builder/scripts/build-libjpeg-turbo @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -euo pipefail + +build_and_install() { + export MAKEFLAGS=-j`nproc` + export CFLAGS="-fpic" + cmake -DCMAKE_INSTALL_PREFIX=/usr/local -G"Unix Makefiles" + make + make install +} + +install_build_dependencies() { + install_packages cmake gcc + ensure_libjpeg_is_fast +} + +ensure_libjpeg_is_fast() { + install_packages nasm +} + +prepare_libjpeg_source() { + git clone --depth=1 https://github.com/libjpeg-turbo/libjpeg-turbo.git + cd libjpeg-turbo +} + +source_dir=$(dirname "$0") +. "$source_dir/common.sh" + +install_build_dependencies +prepare_libjpeg_source +build_and_install diff --git a/builder/scripts/build-webp b/builder/scripts/build-webp new file mode 100755 index 0000000..1393b47 --- /dev/null +++ b/builder/scripts/build-webp @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -euo pipefail + +webp_tar_url=https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz + +prepare_source() { + cd /tmp + wget "$webp_tar_url" + tar -xzf /tmp/libwebp-* + rm /tmp/libwebp-*.tar.gz + cd /tmp/libwebp-* +} + +build_and_install() { + export MAKEFLAGS=-j`nproc` + ./configure --enable-static --disable-shared + make + make install +} + +prepare_source +build_and_install diff --git a/builder/scripts/common.sh b/builder/scripts/common.sh new file mode 100644 index 0000000..4440b66 --- /dev/null +++ b/builder/scripts/common.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +detect_distro() { + if [ -f /etc/centos-release ]; then + DISTRO=centos + elif [ -f /etc/oracle-release ]; then + DISTRO=oracle + elif [ -f /etc/fedora-release ]; then + DISTRO=fedora + elif [ -f /usr/bin/zypper ]; then + DISTRO=opensuse + elif [ -f /etc/alpine-release ]; then + DISTRO=alpine + else + DISTRO=debian + fi +} + +install_packages() { + local install_cmd=no-command-defined + + case "$DISTRO" in + centos) install_cmd="yum install -y" ;; + oracle) install_cmd="dnf install -y" ;; + fedora) install_cmd="dnf install -y" ;; + opensuse) install_cmd="zypper install -y" ;; + alpine) install_cmd="apk add" ;; + *) install_cmd="apt-get update && apt-get install -y" + esac + + eval "$install_cmd $*" +} + +detect_distro diff --git a/builder/test-deb b/builder/test-deb index 50accfa..9a8c11d 100755 --- a/builder/test-deb +++ b/builder/test-deb @@ -3,6 +3,7 @@ set -e cd "$(dirname "$0")/.." +. ./builder/process_test_options.sh . ./builder/os_ver_cli.sh . ./builder/common.sh @@ -11,8 +12,11 @@ docker build --build-arg KASMVNC_PACKAGE_DIR="builder/build/${os_codename}" \ --build-arg BUILD_DEBIAN_REVISION="$build_debian_revision" \ -t "$tester_image" \ -f "builder/dockerfile.${os}_${os_codename}${build_tag}.deb.test" . + docker run -it -p "443:$VNC_PORT" --rm \ -e KASMVNC_VERBOSE_LOGGING=$KASMVNC_VERBOSE_LOGGING \ -e "VNC_USER=foo" -e "VNC_PW=foobar" \ -e "VNC_PORT=$VNC_PORT" \ - "$tester_image" + $entrypoint_executable \ + "$tester_image" \ + $entrypoint_args diff --git a/builder/test-deb-barebones b/builder/test-deb-barebones index d29978e..9ffdb5d 100755 --- a/builder/test-deb-barebones +++ b/builder/test-deb-barebones @@ -3,6 +3,7 @@ set -e cd "$(dirname "$0")/.." +. ./builder/process_test_options.sh . ./builder/common.sh os="${1:-debian}" os_codename="${2:-buster}" @@ -13,4 +14,6 @@ docker build --build-arg KASMVNC_PACKAGE_DIR="builder/build/${os_codename}" \ echo docker run -it -p "443:$VNC_PORT" --rm -e "VNC_USER=foo" -e "VNC_PW=foobar" \ -e "VNC_PORT=$VNC_PORT" \ - kasmvnctester_barebones_${os}:$os_codename + $entrypoint_executable \ + kasmvnctester_barebones_${os}:$os_codename \ + $entrypoint_args diff --git a/builder/test-rpm b/builder/test-rpm index fbf731e..aed8652 100755 --- a/builder/test-rpm +++ b/builder/test-rpm @@ -3,6 +3,7 @@ set -e cd "$(dirname "$0")/.." +. ./builder/process_test_options.sh . ./builder/os_ver_cli.sh . ./builder/common.sh @@ -16,4 +17,6 @@ docker run -it -p "443:$VNC_PORT" --rm \ -e KASMVNC_VERBOSE_LOGGING=$KASMVNC_VERBOSE_LOGGING \ -e "VNC_USER=foo" -e "VNC_PW=foobar" \ -e "VNC_PORT=$VNC_PORT" \ - kasmvnctester_${os}:$os_codename + $entrypoint_executable \ + kasmvnctester_${os}:$os_codename \ + $entrypoint_args diff --git a/builder/test-rpm-barebones b/builder/test-rpm-barebones index b804a75..6318bda 100755 --- a/builder/test-rpm-barebones +++ b/builder/test-rpm-barebones @@ -3,6 +3,7 @@ set -e cd "$(dirname "$0")" +. ./process_test_options.sh . ./common.sh os="${1:-centos}" os_codename="${2:-core}" @@ -12,4 +13,6 @@ docker build --build-arg KASMVNC_PACKAGE_DIR="build/${os}_${os_codename}" \ -f dockerfile.${os}_${os_codename}.barebones.rpm.test . docker run -it -p "443:$VNC_PORT" --rm -e "VNC_USER=foo" -e "VNC_PW=foobar" \ -e "VNC_PORT=$VNC_PORT" \ - kasmvnctester_barebones_${os}:$os_codename + $entrypoint_executable \ + kasmvnctester_barebones_${os}:$os_codename \ + $entrypoint_args diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index 6c96cc6..9abd036 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -64,7 +64,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s, needsPermCheck(false), pointerEventTime(0), clientHasCursor(false), accessRights(AccessDefault), startTime(time(0)), frameTracking(false), - udpFramesSinceFull(0) + udpFramesSinceFull(0), complainedAboutNoViewRights(false) { setStreams(&sock->inStream(), &sock->outStream()); peerEndpoint.buf = sock->getPeerEndpoint(); @@ -1308,8 +1308,14 @@ void VNCSConnectionST::writeFramebufferUpdate() } } - if (!(accessRights & AccessView)) + if (!(accessRights & AccessView)) { + if (!complainedAboutNoViewRights) { + complainedAboutNoViewRights = true; + vlog.error("User %s has no read permissions. If this is not intended, grant them permissions with kasmvncpasswd or via the API", + user); + } return; + } // Updates often consists of many small writes, and in continuous // mode, we will also have small fence messages around the update. We diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index 51826b4..8d71ddd 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -324,6 +324,7 @@ namespace rfb { bool frameTracking; uint32_t udpFramesSinceFull; + bool complainedAboutNoViewRights; }; } #endif diff --git a/debian/control b/debian/control index 55bba16..2c860c5 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: x11 Priority: optional Maintainer: Kasm Technologies LLC Build-Depends: debhelper (>= 11), rsync, libjpeg-dev, libjpeg-dev, libpng-dev, - libtiff-dev, libgif-dev, libavcodec-dev, libssl-dev, libgl1, libxfont2, libsm6, libxext-dev, libxrandr-dev, libxtst-dev, libxcursor-dev, libunwind8 + libtiff-dev, libgif-dev, libavcodec-dev, libssl-dev, libgl1, libxfont2, libsm6, libxext-dev, libxrandr-dev, libxtst-dev, libxcursor-dev, libunwind8, libgbm-dev Standards-Version: 4.1.3 Homepage: https://github.com/kasmtech/KasmVNC #Vcs-Browser: https://salsa.debian.org/debian/kasmvnc @@ -14,14 +14,14 @@ Architecture: amd64 arm64 Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, ssl-cert, xauth, x11-xkb-utils, xkb-data, procps, libswitch-perl, libyaml-tiny-perl, libhash-merge-simple-perl, libscalar-list-utils-perl, liblist-moreutils-perl, - libtry-tiny-perl + libtry-tiny-perl, libgbm1 Provides: vnc-server -Description: KasmVNC provides remote web-based access to a Desktop or application. - While VNC is in the name, KasmVNC differs from other VNC variants such - as TigerVNC, RealVNC, and TurboVNC. KasmVNC has broken from the RFB - specification which defines VNC, in order to support modern technologies - and increase security. KasmVNC is accessed by users from any modern - browser and does not support legacy VNC viewer applications. KasmVNC - uses a modern YAML based configuration at the server and user level, - allowing for ease of management. KasmVNC is maintained by Kasm - Technologies Corp, www.kasmweb.com. +Description: KasmVNC provides remote web-based access to a Desktop or application. + While VNC is in the name, KasmVNC differs from other VNC variants such + as TigerVNC, RealVNC, and TurboVNC. KasmVNC has broken from the RFB + specification which defines VNC, in order to support modern technologies + and increase security. KasmVNC is accessed by users from any modern + browser and does not support legacy VNC viewer applications. KasmVNC + uses a modern YAML based configuration at the server and user level, + allowing for ease of management. KasmVNC is maintained by Kasm + Technologies Corp, www.kasmweb.com. diff --git a/fedora/kasmvncserver.spec b/fedora/kasmvncserver.spec index 412cbf4..92f76a1 100644 --- a/fedora/kasmvncserver.spec +++ b/fedora/kasmvncserver.spec @@ -7,7 +7,7 @@ License: GPLv2+ URL: https://github.com/kasmtech/KasmVNC BuildRequires: rsync -Requires: xorg-x11-xauth, xkeyboard-config, openssl, perl, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny +Requires: xorg-x11-xauth, xkeyboard-config, openssl, perl, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny, mesa-libgbm, libxshmfence Conflicts: tigervnc-server, tigervnc-server-minimal %description diff --git a/opensuse/kasmvncserver.spec b/opensuse/kasmvncserver.spec index 97bcaac..408cdc2 100644 --- a/opensuse/kasmvncserver.spec +++ b/opensuse/kasmvncserver.spec @@ -7,18 +7,18 @@ License: GPLv2+ URL: https://github.com/kasmtech/KasmVNC BuildRequires: rsync -Requires: xauth, hostname, libxkbcommon-x11-0, xkeyboard-config, x11-tools, openssl, perl, libpixman-1-0, libjpeg8, libgomp1, libXfont2-2, libXdmcp6, libglvnd, xkbcomp, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny +Requires: xauth, hostname, libxkbcommon-x11-0, xkeyboard-config, x11-tools, openssl, perl, libpixman-1-0, libjpeg8, libgomp1, libXfont2-2, libXdmcp6, libglvnd, xkbcomp, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny, libgbm1, libxshmfence1 Conflicts: tigervnc, tigervnc-x11vnc %description -KasmVNC provides remote web-based access to a Desktop or application. -While VNC is in the name, KasmVNC differs from other VNC variants such -as TigerVNC, RealVNC, and TurboVNC. KasmVNC has broken from the RFB -specification which defines VNC, in order to support modern technologies -and increase security. KasmVNC is accessed by users from any modern -browser and does not support legacy VNC viewer applications. KasmVNC -uses a modern YAML based configuration at the server and user level, -allowing for ease of management. KasmVNC is maintained by Kasm +KasmVNC provides remote web-based access to a Desktop or application. +While VNC is in the name, KasmVNC differs from other VNC variants such +as TigerVNC, RealVNC, and TurboVNC. KasmVNC has broken from the RFB +specification which defines VNC, in order to support modern technologies +and increase security. KasmVNC is accessed by users from any modern +browser and does not support legacy VNC viewer applications. KasmVNC +uses a modern YAML based configuration at the server and user level, +allowing for ease of management. KasmVNC is maintained by Kasm Technologies Corp, www.kasmweb.com. %prep diff --git a/oracle/kasmvncserver.spec b/oracle/kasmvncserver.spec index ac8484b..f4eb7e9 100644 --- a/oracle/kasmvncserver.spec +++ b/oracle/kasmvncserver.spec @@ -7,7 +7,7 @@ License: GPLv2+ URL: https://github.com/kasmtech/KasmVNC BuildRequires: rsync -Requires: xorg-x11-xauth, xorg-x11-xkb-utils, xkeyboard-config, xorg-x11-server-utils, openssl, perl, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny, hostname +Requires: xorg-x11-xauth, xorg-x11-xkb-utils, xkeyboard-config, xorg-x11-server-utils, openssl, perl, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny, hostname, mesa-libgbm, libxshmfence Conflicts: tigervnc-server, tigervnc-server-minimal %description diff --git a/oracle/kasmvncserver9.spec b/oracle/kasmvncserver9.spec index a74285e..64e6beb 100644 --- a/oracle/kasmvncserver9.spec +++ b/oracle/kasmvncserver9.spec @@ -7,7 +7,7 @@ License: GPLv2+ URL: https://github.com/kasmtech/KasmVNC BuildRequires: rsync -Requires: xorg-x11-xauth, xkeyboard-config, xorg-x11-server-utils, openssl, perl, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny, hostname +Requires: xorg-x11-xauth, xkeyboard-config, xorg-x11-server-utils, openssl, perl, perl-Switch, perl-YAML-Tiny, perl-Hash-Merge-Simple, perl-Scalar-List-Utils, perl-List-MoreUtils, perl-Try-Tiny, hostname, mesa-libgbm, libxshmfence Conflicts: tigervnc-server, tigervnc-server-minimal %description diff --git a/spec/fixtures/defaults_config.yaml b/spec/fixtures/defaults_config.yaml index 9c214c5..b40d6de 100644 --- a/spec/fixtures/defaults_config.yaml +++ b/spec/fixtures/defaults_config.yaml @@ -4,6 +4,9 @@ desktop: height: 768 allow_resize: true pixel_depth: 24 + gpu: + hw3d: false + drinode: /dev/dri/renderD128 network: protocol: http diff --git a/unix/KasmVNC/Config.pm b/unix/KasmVNC/Config.pm index 7bcfdc2..78d49d3 100644 --- a/unix/KasmVNC/Config.pm +++ b/unix/KasmVNC/Config.pm @@ -8,6 +8,8 @@ use Data::Dumper; use Hash::Merge::Simple; use KasmVNC::Utils; +our $logger; + sub merge { my @configsToMerge = map { $_->{data} } @_; my $mergedConfig = Hash::Merge::Simple::merge(@configsToMerge) // {}; @@ -31,7 +33,13 @@ sub load { failIfConfigNotReadable($self->{filename}); - $self->{data} = YAML::Tiny->read($self->{filename})->[0]; + $logger->debug("Loading config " . $self->{filename}); + my $yamlDocuments = YAML::Tiny->read($self->{filename}); + unless (defined $yamlDocuments) { + die "Couldn't load config: $self->{filename}. Probable reason: No newline at end of file\n"; + } + + $self->{data} = $yamlDocuments->[0]; } sub get { diff --git a/unix/KasmVNC/Logger.pm b/unix/KasmVNC/Logger.pm index b8e64af..e5ab497 100644 --- a/unix/KasmVNC/Logger.pm +++ b/unix/KasmVNC/Logger.pm @@ -8,9 +8,18 @@ use Data::Dumper; sub new { my ($class, $args) = @_; my $self = bless { + level => $args->{level} // "warn" }, $class; } +sub debug { + my $self = shift; + + return unless ($self->{level} eq "debug"); + + say { *STDERR } @_; +} + sub warn { my $self = shift; diff --git a/unix/kasmvnc_defaults.yaml b/unix/kasmvnc_defaults.yaml index 1556825..f498364 100644 --- a/unix/kasmvnc_defaults.yaml +++ b/unix/kasmvnc_defaults.yaml @@ -5,6 +5,9 @@ desktop: height: 768 allow_resize: true pixel_depth: 24 + gpu: + hw3d: false + drinode: /dev/dri/renderD128 network: protocol: http diff --git a/unix/vncserver b/unix/vncserver index 14a3c22..cfb0e0e 100755 --- a/unix/vncserver +++ b/unix/vncserver @@ -1171,6 +1171,7 @@ sub DefineFilePathsAndStuff { $KasmVNC::Users::vncPasswdBin = $exedir . "kasmvncpasswd"; $KasmVNC::Users::logger = $logger; + $KasmVNC::Config::logger = $logger; $vncSystemConfigDir = "/etc/kasmvnc"; if ($ENV{KASMVNC_DEVELOPMENT}) { @@ -2023,7 +2024,7 @@ sub DefineConfigToCLIConversion { $self = shift; my @values = @{ listify($self->configValues()) }; - + my $valuesStr = ""; foreach $value (@values) { $valuesStr = $valuesStr . "-http-header '$value' " @@ -2286,6 +2287,39 @@ sub DefineConfigToCLIConversion { isPresent($value) && $value ne 'auto'; } }), + KasmVNC::CliOption->new({ + name => 'hw3d', + configKeys => [ + KasmVNC::ConfigKey->new({ + name => "desktop.gpu.hw3d", + type => KasmVNC::ConfigKey::BOOLEAN + }) + ], + toStringSub => sub { + $self = shift; + my $value = $self->configValue(); + + switch($value) { + case 'true' { + $valuesStr = '-hw3d '; + } + case 'false' { + $valuesStr = ' '; + } + } + + return $valuesStr; + } + }), + KasmVNC::CliOption->new({ + name => 'drinode', + configKeys => [ + KasmVNC::ConfigKey->new({ + name => "desktop.gpu.drinode", + type => KasmVNC::ConfigKey::ANY + }) + ] + }), ); %cliArgMap = map { ("-" . $_->{name}) => $_ } @xvncOptions; @@ -2798,5 +2832,6 @@ sub SetAppSettingsFromConfigAndCli { } sub InitLogger { - $logger = KasmVNC::Logger->new(); + my $debugEnabled = any { $_ eq "-debug" } @ARGV; + $logger = KasmVNC::Logger->new({ level => $debugEnabled ? "debug" : "warn" }); } diff --git a/unix/xserver/.gitignore b/unix/xserver/.gitignore new file mode 100644 index 0000000..9bfed6b --- /dev/null +++ b/unix/xserver/.gitignore @@ -0,0 +1,4 @@ +/* +!/hw +/hw/* +!/hw/vnc diff --git a/unix/xserver/hw/vnc/Makefile.am b/unix/xserver/hw/vnc/Makefile.am index 4a4958e..0a2f93d 100644 --- a/unix/xserver/hw/vnc/Makefile.am +++ b/unix/xserver/hw/vnc/Makefile.am @@ -30,10 +30,14 @@ bin_PROGRAMS = Xvnc man1_MANS = Xvnc.man -Xvnc_SOURCES = xvnc.c \ +Xvnc_SOURCES = xvnc.c dri3.c \ $(top_srcdir)/Xi/stubs.c $(top_srcdir)/mi/miinitext.c \ $(top_srcdir)/fb/fbcmap_mi.c buildtime.c +if DRI3 +XVNC_SYS_LIBS += -lgbm +endif + # Xvnc contains no C++ sources so automake doesn't understand that we # need to use the C++ compiler to link things. This is the upstream # recommendation for coaxing automake. @@ -44,7 +48,8 @@ Xvnc_CPPFLAGS = $(XVNC_CPPFLAGS) -DKASMVNC -DNO_MODULE_EXTS \ -DXVNCEXTRAVERSION="\".$(KASMVNC_COMMIT_ID)\"" \ -DXFree86Server -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \ -DVENDOR_STRING="\"$(VENDOR_STRING)\"" -I$(KASMVNC_SRCDIR)/common -I$(KASMVNC_SRCDIR)/unix/common \ - -I$(top_srcdir)/include ${XSERVERLIBS_CFLAGS} -I$(includedir) + -I$(top_srcdir)/include ${XSERVERLIBS_CFLAGS} -I$(includedir) \ + -I$(top_srcdir)/dri3 @LIBDRM_CFLAGS@ Xvnc_LDADD = $(XVNC_LIBS) libvnccommon.la $(COMMON_LIBS) \ $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XVNC_SYS_LIBS) -lX11 -lwebp -lssl -lcrypto -lcrypt diff --git a/unix/xserver/hw/vnc/Xvnc.man b/unix/xserver/hw/vnc/Xvnc.man index 8da31b6..831a1f8 100644 --- a/unix/xserver/hw/vnc/Xvnc.man +++ b/unix/xserver/hw/vnc/Xvnc.man @@ -281,6 +281,15 @@ be either \fB0\fP (off), \fB1\fP (always) or \fB2\fP (auto). Default is \fB2\fP. . .TP +.B \-hw3d +Enable hardware 3d acceleration. Default is software (llvmpipe usually). +. +.TP +.B \-drinode \fIpath\fP +Use another path instead of /dev/dri/renderD128. You may need this if you have +more than one GPU. +. +.TP .B \-ZlibLevel \fIlevel\fP Zlib compression level for ZRLE encoding (it does not affect Tight encoding). Acceptable values are between 0 and 9. Default is to use the standard diff --git a/unix/xserver/hw/vnc/dri3.c b/unix/xserver/hw/vnc/dri3.c new file mode 100644 index 0000000..e758915 --- /dev/null +++ b/unix/xserver/hw/vnc/dri3.c @@ -0,0 +1,284 @@ +/* Copyright (c) 2023 Kasm + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#ifdef HAVE_DIX_CONFIG_H +#include +#endif + +#ifdef DRI3 + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +extern const char *driNode; + +static struct priv_t { + struct gbm_device *gbm; + int fd; +} priv; + +struct gbm_pixmap { + struct gbm_bo *bo; +}; + +typedef struct gbm_pixmap gbm_pixmap; + +static DevPrivateKeyRec dri3_pixmap_private_key; +static struct timeval start; + + + +static int +xvnc_dri3_open_client(ClientPtr client, + ScreenPtr screen, + RRProviderPtr provider, + int *pfd) +{ + int fd = open(driNode, O_RDWR | O_CLOEXEC); + if (fd < 0) + return BadAlloc; + *pfd = fd; + return Success; +} + +static uint32_t +gbm_format_for_depth(CARD8 depth) +{ + switch (depth) { + case 16: + return GBM_FORMAT_RGB565; + case 24: + return GBM_FORMAT_XRGB8888; + case 30: + return GBM_FORMAT_ARGB2101010; + default: + ErrorF("unexpected depth: %d\n", depth); + /* fallthrough */ + case 32: + return GBM_FORMAT_ARGB8888; + } + +} + +static void dri3_pixmap_set_private(PixmapPtr pixmap, gbm_pixmap *gp) +{ + dixSetPrivate(&pixmap->devPrivates, &dri3_pixmap_private_key, gp); +} + +static gbm_pixmap *gbm_pixmap_get(PixmapPtr pixmap) +{ + return dixLookupPrivate(&pixmap->devPrivates, &dri3_pixmap_private_key); +} + +static PixmapPtr +create_pixmap_for_bo(ScreenPtr screen, struct gbm_bo *bo, CARD8 depth) +{ + PixmapPtr pixmap; + + gbm_pixmap *gp = calloc(1, sizeof(gbm_pixmap)); + if (!gp) + return NULL; + + pixmap = screen->CreatePixmap(screen, gbm_bo_get_width(bo), gbm_bo_get_height(bo), + depth, CREATE_PIXMAP_USAGE_SCRATCH); + if (!pixmap) + return NULL; + + gp->bo = bo; + dri3_pixmap_set_private(pixmap, gp); + + return pixmap; +} + +static PixmapPtr +xvnc_pixmap_from_fds(ScreenPtr screen, CARD8 num_fds, const int *fds, + CARD16 width, CARD16 height, + const CARD32 *strides, const CARD32 *offsets, + CARD8 depth, CARD8 bpp, uint64_t modifier) +{ + struct gbm_bo *bo = NULL; + PixmapPtr pixmap; + + if (width == 0 || height == 0 || num_fds == 0 || + depth < 15 || bpp != BitsPerPixel(depth) || + strides[0] < width * bpp / 8) + return NULL; + + if (num_fds == 1) { + struct gbm_import_fd_data data; + + data.fd = fds[0]; + data.width = width; + data.height = height; + data.stride = strides[0]; + data.format = gbm_format_for_depth(depth); + bo = gbm_bo_import(priv.gbm, GBM_BO_IMPORT_FD, &data, + GBM_BO_USE_RENDERING); + if (!bo) + return NULL; + } else { + return NULL; + } + + pixmap = create_pixmap_for_bo(screen, bo, depth); + if (pixmap == NULL) { + gbm_bo_destroy(bo); + return NULL; + } + + return pixmap; +} + +static int +xvnc_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds, + uint32_t *strides, uint32_t *offsets, + uint64_t *modifier) +{ + gbm_pixmap *gp = gbm_pixmap_get(pixmap); + if (!gp) + return 0; + + fds[0] = gbm_bo_get_fd(gp->bo); + strides[0] = gbm_bo_get_stride(gp->bo); + offsets[0] = 0; + *modifier = DRM_FORMAT_MOD_INVALID; + + return 1; +} + +static Bool +xvnc_get_formats(ScreenPtr screen, + CARD32 *num_formats, CARD32 **formats) +{ + ErrorF("xvnc_get_formats\n"); + return FALSE; +} + +static Bool +xvnc_get_modifiers(ScreenPtr screen, uint32_t format, + uint32_t *num_modifiers, uint64_t **modifiers) +{ + ErrorF("xvnc_get_modifiers\n"); + return FALSE; +} + +static Bool +xvnc_get_drawable_modifiers(DrawablePtr draw, uint32_t format, + uint32_t *num_modifiers, uint64_t **modifiers) +{ + ErrorF("xvnc_get_drawable_modifiers\n"); + return FALSE; +} + +static const dri3_screen_info_rec xvnc_dri3_info = { + .version = 2, + .open = NULL, + .pixmap_from_fds = xvnc_pixmap_from_fds, + .fds_from_pixmap = xvnc_fds_from_pixmap, + .open_client = xvnc_dri3_open_client, + .get_formats = xvnc_get_formats, + .get_modifiers = xvnc_get_modifiers, + .get_drawable_modifiers = xvnc_get_drawable_modifiers, +}; + +void xvnc_sync_dri3_pixmap(PixmapPtr pixmap) +{ + // There doesn't seem to be a good hook or sync point, so we do it manually + // here, right before Present copies from the pixmap + DrawablePtr pDraw; + GCPtr gc; + void *ptr; + uint32_t stride, w, h; + void *opaque = NULL; + gbm_pixmap *gp = gbm_pixmap_get(pixmap); + if (!gp) { + ErrorF("Present tried to copy from a non-dri3 pixmap\n"); + return; + } + + w = gbm_bo_get_width(gp->bo); + h = gbm_bo_get_height(gp->bo); + + ptr = gbm_bo_map(gp->bo, 0, 0, w, h, + GBM_BO_TRANSFER_READ, &stride, &opaque); + if (!ptr) { + ErrorF("gbm map failed, errno %d\n", errno); + return; + } + + pDraw = &pixmap->drawable; + if ((gc = GetScratchGC(pDraw->depth, pDraw->pScreen))) { + ValidateGC(pDraw, gc); + //gc->ops->PutImage(pDraw, gc, pDraw->depth, 0, 0, w, h, 0, ZPixmap, data); + fbPutZImage(pDraw, fbGetCompositeClip(gc), gc->alu, fbGetGCPrivate(gc)->pm, + 0, 0, w, h, ptr, stride / sizeof(FbStip)); + FreeScratchGC(gc); + } + + gbm_bo_unmap(gp->bo, opaque); +} + +void xvnc_init_dri3(void) +{ + memset(&priv, 0, sizeof(priv)); + + gettimeofday(&start, NULL); + + if (!dixRegisterPrivateKey(&dri3_pixmap_private_key, PRIVATE_PIXMAP, 0)) + FatalError("dix\n"); + + if (!driNode) + driNode = "/dev/dri/renderD128"; + + priv.fd = open(driNode, O_RDWR | O_CLOEXEC); + if (!priv.fd) + FatalError("Failed to open %s\n", driNode); + + priv.gbm = gbm_create_device(priv.fd); + if (!priv.gbm) + FatalError("Failed to create gbm\n"); + + if (!dri3_screen_init(screenInfo.screens[0], &xvnc_dri3_info)) + FatalError("Couldn't init dri3\n"); +} + +#endif // DRI3 diff --git a/unix/xserver/hw/vnc/vncExtInit.h b/unix/xserver/hw/vnc/vncExtInit.h index 0b4abfd..c363f19 100644 --- a/unix/xserver/hw/vnc/vncExtInit.h +++ b/unix/xserver/hw/vnc/vncExtInit.h @@ -49,7 +49,7 @@ struct dlp_mimetype_t { char mime[32]; }; -unsigned dlp_num_mimetypes(); +unsigned dlp_num_mimetypes(void); const char *dlp_get_mimetype(const unsigned i); extern int vncInetdSock; @@ -68,7 +68,7 @@ int vncGetSendPrimary(void); void vncUpdateDesktopName(void); void vncAnnounceClipboard(int available); -void vncClearBinaryClipboardData(); +void vncClearBinaryClipboardData(void); void vncSendBinaryClipboardData(const char* mime, const unsigned char *data, const unsigned len); void vncGetBinaryClipboardData(const char *mime, const unsigned char **ptr, diff --git a/unix/xserver/hw/vnc/xvnc.c b/unix/xserver/hw/vnc/xvnc.c index 5f293f9..89cf387 100644 --- a/unix/xserver/hw/vnc/xvnc.c +++ b/unix/xserver/hw/vnc/xvnc.c @@ -72,6 +72,12 @@ from the X Consortium. #include #include #endif /* HAS_SHM */ +#ifdef MITSHM +#include "shmint.h" +#endif +#ifdef HAVE_XSHMFENCE +#include +#endif #include "dix.h" #include "os.h" #include "miline.h" @@ -149,6 +155,8 @@ typedef enum { NORMAL_MEMORY_FB, SHARED_MEMORY_FB } fbMemType; static fbMemType fbmemtype = NORMAL_MEMORY_FB; static int lastScreen = -1; static Bool Render = TRUE; +static Bool hw3d = FALSE; +const char *driNode = NULL; static Bool displaySpecified = FALSE; static char displayNumStr[16]; @@ -350,6 +358,8 @@ void ddxUseMsg(void) ErrorF("+/-render turn on/off RENDER extension support" "(default on)\n"); #endif + ErrorF("-hw3d enable hardware 3d acceleration\n"); + ErrorF("-drinode path use another card than /dev/dri/renderD128\n"); ErrorF("-linebias n adjust thin line pixelization\n"); ErrorF("-blackpixel n pixel value for black\n"); ErrorF("-whitepixel n pixel value for white\n"); @@ -482,6 +492,20 @@ ddxProcessArgument(int argc, char *argv[], int i) return 1; } + if (strcmp (argv[i], "-hw3d") == 0) + { + hw3d = TRUE; + return 1; + } + + if (strcmp (argv[i], "-drinode") == 0) + { + fail_unless_args(argc, i, 1); + ++i; + driNode = argv[i]; + return 2; + } + if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */ { Pixel pix; @@ -1475,7 +1499,7 @@ int vncRandRCreateScreenOutputs(int scrIdx, int extraOutputs) /* Creating and modifying modes, used by XserverDesktop and init here */ -int vncRandRCanCreateModes() +int vncRandRCanCreateModes(void) { return 1; } @@ -1684,6 +1708,15 @@ vfbScreenInit(ScreenPtr pScreen, int argc, char **argv) ret = fbPictureInit (pScreen, 0, 0); #endif +#ifdef MITSHM + ShmRegisterFbFuncs(pScreen); +#endif + +#ifdef HAVE_XSHMFENCE + if (!miSyncShmScreenInit(pScreen)) + return FALSE; +#endif + if (!ret) return FALSE; #if XORG < 110 @@ -1783,8 +1816,8 @@ static void vfbClientStateChange(CallbackListPtr *a, void *b, void *c) { dispatchException &= ~DE_RESET; } } - -#if XORG >= 113 + +#if XORG >= 113 && XORG < 120 #ifdef GLXEXT extern void GlxExtensionInit(void); @@ -1796,6 +1829,10 @@ static ExtensionModule glxExt = { #endif #endif +#ifdef DRI3 +extern void xvnc_init_dri3(void); +#endif + void InitOutput(ScreenInfo *scrInfo, int argc, char **argv) { @@ -1872,6 +1909,14 @@ InitOutput(ScreenInfo *scrInfo, int argc, char **argv) if (!AddCallback(&ClientStateCallback, vfbClientStateChange, 0)) { FatalError("AddCallback failed\n"); } + + if (hw3d) { +#ifdef DRI3 + xvnc_init_dri3(); +#else + FatalError("DRI3 disabled at compile time\n"); +#endif + } } /* end InitOutput */ /* this is just to get the server to link on AIX */ diff --git a/unix/xserver120.patch b/unix/xserver120.patch index 237e1e3..bd9f3ea 100644 --- a/unix/xserver120.patch +++ b/unix/xserver120.patch @@ -80,3 +80,34 @@ Index: xserver/mi/miinitext.c {GEExtensionInit, "Generic Event Extension", &noGEExtension}, {ShapeExtensionInit, "SHAPE", NULL}, #ifdef MITSHM +--- xserver.orig/dri3/Makefile.am 2019-02-26 21:28:50.000000000 +0200 ++++ xserver/dri3/Makefile.am 2023-01-18 11:55:45.315851638 +0200 +@@ -1,7 +1,7 @@ + noinst_LTLIBRARIES = libdri3.la + AM_CFLAGS = \ + -DHAVE_XORG_CONFIG_H \ +- @DIX_CFLAGS@ @XORG_CFLAGS@ ++ @DIX_CFLAGS@ @XORG_CFLAGS@ @LIBDRM_CFLAGS@ + + libdri3_la_SOURCES = \ + dri3.h \ +--- xserver.orig/present/present.c 2019-02-26 21:28:50.000000000 +0200 ++++ xserver/present/present.c 2023-01-20 11:32:27.175493594 +0200 +@@ -27,6 +27,8 @@ + #include "present_priv.h" + #include + ++void xvnc_sync_dri3_pixmap(PixmapPtr pixmap); ++ + /* + * Returns: + * TRUE if the first MSC value is equal to or after the second one +@@ -79,6 +81,8 @@ + ScreenPtr screen = drawable->pScreen; + GCPtr gc; + ++ xvnc_sync_dri3_pixmap(pixmap); ++ + gc = GetScratchGC(drawable->depth, screen); + if (update) { + ChangeGCVal changes[2];