Merge branch 'feature/KASM-3806_hw3d' into 'master'

Resolve KASM-3806 "Feature/ hw3d"

Closes KASM-3806

See merge request kasm-technologies/internal/KasmVNC!89
This commit is contained in:
Matthew McClaskey 2023-03-06 15:50:59 +00:00
commit 47bdc828c1
24 changed files with 551 additions and 78 deletions

View File

@ -101,6 +101,9 @@ desktop:
height: 768 height: 768
allow_resize: true allow_resize: true
pixel_depth: 24 pixel_depth: 24
gpu:
hw3d: false
drinode: /dev/dri/renderD128
network: network:
protocol: http protocol: http
@ -255,6 +258,7 @@ command_line:
- Cursor lock - Cursor lock
- IME support for languages with extended characters - IME support for languages with extended characters
- Better mobile support - Better mobile support
- DRI3 GPU acceleration with open source drivers (AMDGPU,Intel,ATI,ARM)
Future Goals: Future Goals:

View File

@ -47,7 +47,7 @@ cd /tmp
# default to the version of x in Ubuntu 18.04, otherwise caller will need to specify # default to the version of x in Ubuntu 18.04, otherwise caller will need to specify
XORG_VER=${XORG_VER:-"1.19.6"} XORG_VER=${XORG_VER:-"1.19.6"}
XORG_PATCH=$(echo "$XORG_VER" | grep -Po '^\d.\d+' | sed 's#\.##') 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 #git clone https://kasmweb@bitbucket.org/kasmtech/kasmvnc.git
#cd kasmvnc #cd kasmvnc
@ -64,9 +64,10 @@ cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo . -DBUILD_VIEWER:BOOL=OFF \
-DENABLE_GNUTLS:BOOL=OFF -DENABLE_GNUTLS:BOOL=OFF
make -j5 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 cd unix/xserver
# Apply patches
patch -Np1 -i ../xserver${XORG_PATCH}.patch patch -Np1 -i ../xserver${XORG_PATCH}.patch
case "$XORG_VER" in case "$XORG_VER" in
1.20.*) 1.20.*)
@ -85,23 +86,40 @@ autoreconf -i
# everything after that is based on BUILDING.txt to remove unneeded # everything after that is based on BUILDING.txt to remove unneeded
# components. # components.
ensure_crashpad_can_fetch_line_number_by_address 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 # remove gl check for opensuse
if [ "${KASMVNC_BUILD_OS}" == "opensuse" ] || ([ "${KASMVNC_BUILD_OS}" == "oracle" ] && [ "${KASMVNC_BUILD_OS_CODENAME}" == 9 ]); then 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 sed -i 's/LIBGL="gl >= 7.1.0"/LIBGL="gl >= 1.1"/g' configure
fi fi
# build X11 # build X11
./configure --prefix=/opt/kasmweb \ ./configure \
--with-xkb-path=/usr/share/X11/xkb \ --disable-config-hal \
--with-xkb-output=/var/lib/xkb \ --disable-config-udev \
--with-xkb-bin-directory=/usr/bin \ --disable-dmx \
--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" \ --disable-dri \
--with-sha1=libcrypto \ --disable-dri2 \
--without-dtrace --disable-dri \ --disable-kdrive \
--disable-static \ --disable-static \
--disable-xinerama --disable-xvfb --disable-xnest --disable-xorg \ --disable-xephyr \
--disable-dmx --disable-xwin --disable-xephyr --disable-kdrive \ --disable-xinerama \
--disable-config-hal --disable-config-udev \ --disable-xnest \
--disable-dri2 --enable-glx --disable-xwayland --disable-dri3 --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 # remove array bounds errors for new versions of GCC
find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \; find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \;
make -j5 make -j5

View File

@ -2,7 +2,7 @@ FROM alpine:3.17
ENV KASMVNC_BUILD_OS alpine ENV KASMVNC_BUILD_OS alpine
ENV KASMVNC_BUILD_OS_CODENAME 317 ENV KASMVNC_BUILD_OS_CODENAME 317
ENV XORG_VER 1.20.7 ENV XORG_VER 1.20.14
RUN \ RUN \
echo "**** install build deps ****" && \ echo "**** install build deps ****" && \

View File

@ -2,22 +2,34 @@ FROM fedora:37
ENV KASMVNC_BUILD_OS fedora ENV KASMVNC_BUILD_OS fedora
ENV KASMVNC_BUILD_OS_CODENAME thirtyseven ENV KASMVNC_BUILD_OS_CODENAME thirtyseven
ENV XORG_VER 1.20.7 ENV XORG_VER 1.20.14
RUN \ RUN \
echo "**** install build deps ****" && \ echo "**** install build deps ****" && \
dnf group install -y \
"C Development Tools and Libraries" \
"Development Tools" && \
dnf install -y \ dnf install -y \
autoconf \ autoconf \
automake \ automake \
bison \
byacc \
bzip2 \ bzip2 \
cmake \ cmake \
diffutils \
doxygen \
file \
flex \
fop \
gcc \ gcc \
gcc-c++ \ gcc-c++ \
git \ git \
glibc-devel \
libdrm-devel \ libdrm-devel \
libepoxy-devel \ libepoxy-devel \
libjpeg-turbo-devel \ libjpeg-turbo-devel \
libjpeg-turbo-static \ libjpeg-turbo-static \
libmd-devel \
libpciaccess-devel \ libpciaccess-devel \
libtool \ libtool \
libwebp-devel \ libwebp-devel \
@ -34,14 +46,18 @@ RUN \
libxshmfence-devel \ libxshmfence-devel \
libXtst-devel \ libXtst-devel \
mesa-libEGL-devel \ mesa-libEGL-devel \
mesa-libgbm-devel \
mesa-libGL-devel \ mesa-libGL-devel \
meson \ meson \
mingw64-binutils \
mt-st \
nettle-devel \ nettle-devel \
openssl-devel \ openssl-devel \
patch \ patch \
pixman-devel \ pixman-devel \
wayland-devel \ wayland-devel \
wget \ wget \
which \
xcb-util-devel \ xcb-util-devel \
xcb-util-image-devel \ xcb-util-image-devel \
xcb-util-keysyms-devel \ xcb-util-keysyms-devel \
@ -51,11 +67,13 @@ RUN \
xkbcomp \ xkbcomp \
xkbcomp-devel \ xkbcomp-devel \
xkeyboard-config \ xkeyboard-config \
xmlto \
xorg-x11-font-utils \ xorg-x11-font-utils \
xorg-x11-proto-devel \ xorg-x11-proto-devel \
xorg-x11-server-common \ xorg-x11-server-common \
xorg-x11-server-devel \ xorg-x11-server-devel \
xorg-x11-xtrans-devel xorg-x11-xtrans-devel \
xsltproc
RUN useradd -m docker && echo "docker:docker" | chpasswd RUN useradd -m docker && echo "docker:docker" | chpasswd

View File

@ -19,6 +19,7 @@ RUN zypper install -ny \
gzip \ gzip \
lbzip2 \ lbzip2 \
libbz2-devel \ libbz2-devel \
libgbm-devel \
libGLw-devel \ libGLw-devel \
libgnutls-devel \ libgnutls-devel \
libjpeg8-devel \ libjpeg8-devel \
@ -27,6 +28,7 @@ RUN zypper install -ny \
libtiff-devel \ libtiff-devel \
libXfont2-devel \ libXfont2-devel \
libxkbcommon-x11-devel \ libxkbcommon-x11-devel \
libxshmfence-devel \
make \ make \
Mesa-dri \ Mesa-dri \
Mesa-libglapi-devel \ Mesa-libglapi-devel \

View File

@ -5,27 +5,31 @@ ENV KASMVNC_BUILD_OS_CODENAME 8
ENV XORG_VER 1.20.10 ENV XORG_VER 1.20.10
# Install from stock repos # Install from stock repos
RUN dnf install -y \ RUN \
bzip2-devel \ dnf install -y 'dnf-command(config-manager)' && \
ca-certificates \ dnf config-manager --set-enabled ol8_codeready_builder && \
cmake \ dnf install -y \
dnf-plugins-core \ bzip2-devel \
gcc \ ca-certificates \
gcc-c++ \ cmake \
git \ dnf-plugins-core \
gnutls-devel \ gcc \
libjpeg-turbo-devel \ gcc-c++ \
libpng-devel \ git \
libtiff-devel \ gnutls-devel \
make \ libjpeg-turbo-devel \
mesa-dri-drivers \ libpng-devel \
openssl-devel \ libtiff-devel \
openssl-devel \ libxshmfence-devel \
patch \ make \
tigervnc-server \ mesa-dri-drivers \
wget \ mesa-libgbm-devel \
xorg-x11-font-utils \ openssl-devel \
zlib-devel patch \
tigervnc-server \
wget \
xorg-x11-font-utils \
zlib-devel
# Enable additional repos (epel, powertools, and fusion) # Enable additional repos (epel, powertools, and fusion)
RUN dnf config-manager --set-enabled ol8_codeready_builder RUN dnf config-manager --set-enabled ol8_codeready_builder

View File

@ -5,32 +5,35 @@ ENV KASMVNC_BUILD_OS_CODENAME 9
ENV XORG_VER 1.20.10 ENV XORG_VER 1.20.10
# Install from stock repos # Install from stock repos
RUN dnf config-manager --set-enabled ol9_distro_builder RUN \
RUN dnf install -y \ dnf config-manager --set-enabled ol9_codeready_builder && \
bzip2-devel \ dnf config-manager --set-enabled ol9_distro_builder && \
ca-certificates \ dnf install -y \
cmake \ bzip2-devel \
dnf-plugins-core \ ca-certificates \
gcc \ cmake \
gcc-c++ \ dnf-plugins-core \
git \ gcc \
gnutls-devel \ gcc-c++ \
libjpeg-turbo-devel \ git \
libpng-devel \ gnutls-devel \
libtiff-devel \ libjpeg-turbo-devel \
make \ libpng-devel \
mesa-dri-drivers \ libtiff-devel \
mesa-libGL-devel \ libxshmfence-devel \
openssl-devel \ make \
openssl-devel \ mesa-dri-drivers \
patch \ mesa-libGL-devel \
tigervnc-server \ mesa-libgbm-devel \
wget \ openssl-devel \
xorg-x11-font-utils \ openssl-devel \
zlib-devel patch \
tigervnc-server \
wget \
xorg-x11-font-utils \
zlib-devel
# Enable additional repos (epel, powertools, and fusion) # 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 oracle-epel-release-el9
RUN dnf install -y --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-9.noarch.rpm RUN dnf install -y --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-9.noarch.rpm

View File

@ -64,7 +64,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
needsPermCheck(false), pointerEventTime(0), needsPermCheck(false), pointerEventTime(0),
clientHasCursor(false), clientHasCursor(false),
accessRights(AccessDefault), startTime(time(0)), frameTracking(false), accessRights(AccessDefault), startTime(time(0)), frameTracking(false),
udpFramesSinceFull(0) udpFramesSinceFull(0), complainedAboutNoViewRights(false)
{ {
setStreams(&sock->inStream(), &sock->outStream()); setStreams(&sock->inStream(), &sock->outStream());
peerEndpoint.buf = sock->getPeerEndpoint(); 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; return;
}
// Updates often consists of many small writes, and in continuous // Updates often consists of many small writes, and in continuous
// mode, we will also have small fence messages around the update. We // mode, we will also have small fence messages around the update. We

View File

@ -324,6 +324,7 @@ namespace rfb {
bool frameTracking; bool frameTracking;
uint32_t udpFramesSinceFull; uint32_t udpFramesSinceFull;
bool complainedAboutNoViewRights;
}; };
} }
#endif #endif

4
debian/control vendored
View File

@ -3,7 +3,7 @@ Section: x11
Priority: optional Priority: optional
Maintainer: Kasm Technologies LLC <info@kasmweb.com> Maintainer: Kasm Technologies LLC <info@kasmweb.com>
Build-Depends: debhelper (>= 11), rsync, libjpeg-dev, libjpeg-dev, libpng-dev, 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 Standards-Version: 4.1.3
Homepage: https://github.com/kasmtech/KasmVNC Homepage: https://github.com/kasmtech/KasmVNC
#Vcs-Browser: https://salsa.debian.org/debian/kasmvnc #Vcs-Browser: https://salsa.debian.org/debian/kasmvnc
@ -14,7 +14,7 @@ Architecture: amd64 arm64
Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, ssl-cert, xauth, Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, ssl-cert, xauth,
x11-xkb-utils, xkb-data, procps, libswitch-perl, libyaml-tiny-perl, x11-xkb-utils, xkb-data, procps, libswitch-perl, libyaml-tiny-perl,
libhash-merge-simple-perl, libscalar-list-utils-perl, liblist-moreutils-perl, libhash-merge-simple-perl, libscalar-list-utils-perl, liblist-moreutils-perl,
libtry-tiny-perl libtry-tiny-perl, libgbm1
Provides: vnc-server Provides: vnc-server
Description: KasmVNC provides remote web-based access to a Desktop or application. 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 While VNC is in the name, KasmVNC differs from other VNC variants such

View File

@ -7,7 +7,7 @@ License: GPLv2+
URL: https://github.com/kasmtech/KasmVNC URL: https://github.com/kasmtech/KasmVNC
BuildRequires: rsync 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 Conflicts: tigervnc-server, tigervnc-server-minimal
%description %description

View File

@ -7,7 +7,7 @@ License: GPLv2+
URL: https://github.com/kasmtech/KasmVNC URL: https://github.com/kasmtech/KasmVNC
BuildRequires: rsync 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 Conflicts: tigervnc, tigervnc-x11vnc
%description %description

View File

@ -7,7 +7,7 @@ License: GPLv2+
URL: https://github.com/kasmtech/KasmVNC URL: https://github.com/kasmtech/KasmVNC
BuildRequires: rsync 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 Conflicts: tigervnc-server, tigervnc-server-minimal
%description %description

View File

@ -7,7 +7,7 @@ License: GPLv2+
URL: https://github.com/kasmtech/KasmVNC URL: https://github.com/kasmtech/KasmVNC
BuildRequires: rsync 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 Conflicts: tigervnc-server, tigervnc-server-minimal
%description %description

View File

@ -4,6 +4,9 @@ desktop:
height: 768 height: 768
allow_resize: true allow_resize: true
pixel_depth: 24 pixel_depth: 24
gpu:
hw3d: false
drinode: /dev/dri/renderD128
network: network:
protocol: http protocol: http

View File

@ -5,6 +5,9 @@ desktop:
height: 768 height: 768
allow_resize: true allow_resize: true
pixel_depth: 24 pixel_depth: 24
gpu:
hw3d: false
drinode: /dev/dri/renderD128
network: network:
protocol: http protocol: http

View File

@ -2242,6 +2242,39 @@ sub DefineConfigToCLIConversion {
isPresent($value) && $value ne 'auto'; 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; %cliArgMap = map { ("-" . $_->{name}) => $_ } @xvncOptions;

4
unix/xserver/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/*
!/hw
/hw/*
!/hw/vnc

View File

@ -30,10 +30,14 @@ bin_PROGRAMS = Xvnc
man1_MANS = Xvnc.man 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)/Xi/stubs.c $(top_srcdir)/mi/miinitext.c \
$(top_srcdir)/fb/fbcmap_mi.c buildtime.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 # 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 # need to use the C++ compiler to link things. This is the upstream
# recommendation for coaxing automake. # recommendation for coaxing automake.
@ -44,7 +48,8 @@ Xvnc_CPPFLAGS = $(XVNC_CPPFLAGS) -DKASMVNC -DNO_MODULE_EXTS \
-DXVNCEXTRAVERSION="\".$(KASMVNC_COMMIT_ID)\"" \ -DXVNCEXTRAVERSION="\".$(KASMVNC_COMMIT_ID)\"" \
-DXFree86Server -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \ -DXFree86Server -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \
-DVENDOR_STRING="\"$(VENDOR_STRING)\"" -I$(KASMVNC_SRCDIR)/common -I$(KASMVNC_SRCDIR)/unix/common \ -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) \ Xvnc_LDADD = $(XVNC_LIBS) libvnccommon.la $(COMMON_LIBS) \
$(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XVNC_SYS_LIBS) -lX11 -lwebp -lssl -lcrypto -lcrypt $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XVNC_SYS_LIBS) -lX11 -lwebp -lssl -lcrypto -lcrypt

View File

@ -281,6 +281,15 @@ be either \fB0\fP (off), \fB1\fP (always) or \fB2\fP (auto). Default is
\fB2\fP. \fB2\fP.
. .
.TP .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 .B \-ZlibLevel \fIlevel\fP
Zlib compression level for ZRLE encoding (it does not affect Tight encoding). 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 Acceptable values are between 0 and 9. Default is to use the standard

284
unix/xserver/hw/vnc/dri3.c Normal file
View File

@ -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 <dix-config.h>
#endif
#ifdef DRI3
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <X11/X.h>
#include <X11/Xmd.h>
#include <dri3.h>
#include <drm_fourcc.h>
#include <fb.h>
#include <gcstruct.h>
#include <gbm.h>
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

View File

@ -49,7 +49,7 @@ struct dlp_mimetype_t {
char mime[32]; char mime[32];
}; };
unsigned dlp_num_mimetypes(); unsigned dlp_num_mimetypes(void);
const char *dlp_get_mimetype(const unsigned i); const char *dlp_get_mimetype(const unsigned i);
extern int vncInetdSock; extern int vncInetdSock;
@ -68,7 +68,7 @@ int vncGetSendPrimary(void);
void vncUpdateDesktopName(void); void vncUpdateDesktopName(void);
void vncAnnounceClipboard(int available); void vncAnnounceClipboard(int available);
void vncClearBinaryClipboardData(); void vncClearBinaryClipboardData(void);
void vncSendBinaryClipboardData(const char* mime, const unsigned char *data, void vncSendBinaryClipboardData(const char* mime, const unsigned char *data,
const unsigned len); const unsigned len);
void vncGetBinaryClipboardData(const char *mime, const unsigned char **ptr, void vncGetBinaryClipboardData(const char *mime, const unsigned char **ptr,

View File

@ -72,6 +72,12 @@ from the X Consortium.
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
#endif /* HAS_SHM */ #endif /* HAS_SHM */
#ifdef MITSHM
#include "shmint.h"
#endif
#ifdef HAVE_XSHMFENCE
#include <misyncshm.h>
#endif
#include "dix.h" #include "dix.h"
#include "os.h" #include "os.h"
#include "miline.h" #include "miline.h"
@ -149,6 +155,8 @@ typedef enum { NORMAL_MEMORY_FB, SHARED_MEMORY_FB } fbMemType;
static fbMemType fbmemtype = NORMAL_MEMORY_FB; static fbMemType fbmemtype = NORMAL_MEMORY_FB;
static int lastScreen = -1; static int lastScreen = -1;
static Bool Render = TRUE; static Bool Render = TRUE;
static Bool hw3d = FALSE;
const char *driNode = NULL;
static Bool displaySpecified = FALSE; static Bool displaySpecified = FALSE;
static char displayNumStr[16]; static char displayNumStr[16];
@ -350,6 +358,8 @@ void ddxUseMsg(void)
ErrorF("+/-render turn on/off RENDER extension support" ErrorF("+/-render turn on/off RENDER extension support"
"(default on)\n"); "(default on)\n");
#endif #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("-linebias n adjust thin line pixelization\n");
ErrorF("-blackpixel n pixel value for black\n"); ErrorF("-blackpixel n pixel value for black\n");
ErrorF("-whitepixel n pixel value for white\n"); ErrorF("-whitepixel n pixel value for white\n");
@ -482,6 +492,20 @@ ddxProcessArgument(int argc, char *argv[], int i)
return 1; 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 */ if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */
{ {
Pixel pix; Pixel pix;
@ -1475,7 +1499,7 @@ int vncRandRCreateScreenOutputs(int scrIdx, int extraOutputs)
/* Creating and modifying modes, used by XserverDesktop and init here */ /* Creating and modifying modes, used by XserverDesktop and init here */
int vncRandRCanCreateModes() int vncRandRCanCreateModes(void)
{ {
return 1; return 1;
} }
@ -1684,6 +1708,15 @@ vfbScreenInit(ScreenPtr pScreen, int argc, char **argv)
ret = fbPictureInit (pScreen, 0, 0); ret = fbPictureInit (pScreen, 0, 0);
#endif #endif
#ifdef MITSHM
ShmRegisterFbFuncs(pScreen);
#endif
#ifdef HAVE_XSHMFENCE
if (!miSyncShmScreenInit(pScreen))
return FALSE;
#endif
if (!ret) return FALSE; if (!ret) return FALSE;
#if XORG < 110 #if XORG < 110
@ -1784,7 +1817,7 @@ static void vfbClientStateChange(CallbackListPtr *a, void *b, void *c) {
} }
} }
#if XORG >= 113 #if XORG >= 113 && XORG < 120
#ifdef GLXEXT #ifdef GLXEXT
extern void GlxExtensionInit(void); extern void GlxExtensionInit(void);
@ -1796,6 +1829,10 @@ static ExtensionModule glxExt = {
#endif #endif
#endif #endif
#ifdef DRI3
extern void xvnc_init_dri3(void);
#endif
void void
InitOutput(ScreenInfo *scrInfo, int argc, char **argv) InitOutput(ScreenInfo *scrInfo, int argc, char **argv)
{ {
@ -1872,6 +1909,14 @@ InitOutput(ScreenInfo *scrInfo, int argc, char **argv)
if (!AddCallback(&ClientStateCallback, vfbClientStateChange, 0)) { if (!AddCallback(&ClientStateCallback, vfbClientStateChange, 0)) {
FatalError("AddCallback failed\n"); FatalError("AddCallback failed\n");
} }
if (hw3d) {
#ifdef DRI3
xvnc_init_dri3();
#else
FatalError("DRI3 disabled at compile time\n");
#endif
}
} /* end InitOutput */ } /* end InitOutput */
/* this is just to get the server to link on AIX */ /* this is just to get the server to link on AIX */

View File

@ -80,3 +80,34 @@ Index: xserver/mi/miinitext.c
{GEExtensionInit, "Generic Event Extension", &noGEExtension}, {GEExtensionInit, "Generic Event Extension", &noGEExtension},
{ShapeExtensionInit, "SHAPE", NULL}, {ShapeExtensionInit, "SHAPE", NULL},
#ifdef MITSHM #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 <gcstruct.h>
+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];