summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorStelios Tsampas2021-10-18 23:26:04 +0300
committerStelios Tsampas2021-10-18 23:26:04 +0300
commit8b32eca39d923ac4053a69c451191c1a259e4f56 (patch)
tree37103ce191d3ab1e7bfe637d22d4e014b52058ea
downloadaur-8b32eca39d923ac4053a69c451191c1a259e4f56.tar.gz
Initial commit
-rw-r--r--.SRCINFO256
-rw-r--r--PKGBUILD345
-rw-r--r--proton-disable_lock.patch31
-rw-r--r--proton-unfuck_makefile.patch264
-rw-r--r--proton-user_compat_data.patch20
-rw-r--r--wine-more_8x5_res.patch15
-rw-r--r--wine-winevulkan_fsr.patch1989
7 files changed, 2920 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..4f1c607ca6f2
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,256 @@
+pkgbase = proton-experimental
+ pkgdesc = Compatibility tool for Steam Play based on Wine and additional components. Monolithic distribution, experimental branch
+ pkgver = 6.3.20211018
+ pkgrel = 1
+ epoch = 1
+ url = https://github.com/ValveSoftware/Proton
+ arch = x86_64
+ arch = x86_64_v3
+ license = custom
+ makedepends = autoconf
+ makedepends = ncurses
+ makedepends = bison
+ makedepends = perl
+ makedepends = fontforge
+ makedepends = flex
+ makedepends = mingw-w64-gcc
+ makedepends = git
+ makedepends = wget
+ makedepends = rsync
+ makedepends = mingw-w64-tools
+ makedepends = lld
+ makedepends = nasm
+ makedepends = meson
+ makedepends = cmake
+ makedepends = python-virtualenv
+ makedepends = python-pip
+ makedepends = glslang
+ makedepends = vulkan-headers
+ makedepends = giflib
+ makedepends = lib32-giflib
+ makedepends = libpng
+ makedepends = lib32-libpng
+ makedepends = gnutls
+ makedepends = lib32-gnutls
+ makedepends = libxinerama
+ makedepends = lib32-libxinerama
+ makedepends = libxcomposite
+ makedepends = lib32-libxcomposite
+ makedepends = libxmu
+ makedepends = lib32-libxmu
+ makedepends = libxxf86vm
+ makedepends = lib32-libxxf86vm
+ makedepends = libldap
+ makedepends = lib32-libldap
+ makedepends = mpg123
+ makedepends = lib32-mpg123
+ makedepends = openal
+ makedepends = lib32-openal
+ makedepends = v4l-utils
+ makedepends = lib32-v4l-utils
+ makedepends = alsa-lib
+ makedepends = lib32-alsa-lib
+ makedepends = libxcomposite
+ makedepends = lib32-libxcomposite
+ makedepends = mesa
+ makedepends = lib32-mesa
+ makedepends = mesa-libgl
+ makedepends = lib32-mesa-libgl
+ makedepends = opencl-icd-loader
+ makedepends = lib32-opencl-icd-loader
+ makedepends = libxslt
+ makedepends = lib32-libxslt
+ makedepends = libpulse
+ makedepends = lib32-libpulse
+ makedepends = libva
+ makedepends = lib32-libva
+ makedepends = gtk3
+ makedepends = lib32-gtk3
+ makedepends = gst-plugins-base-libs
+ makedepends = lib32-gst-plugins-base-libs
+ makedepends = vulkan-icd-loader
+ makedepends = lib32-vulkan-icd-loader
+ makedepends = sdl2>=2.0.16
+ makedepends = lib32-sdl2>=2.0.16
+ makedepends = libcups
+ makedepends = lib32-libcups
+ makedepends = rust
+ makedepends = lib32-rust-libs
+ makedepends = sane
+ makedepends = libgphoto2
+ makedepends = gsm
+ makedepends = ffmpeg
+ makedepends = samba
+ makedepends = opencl-headers
+ makedepends = attr
+ makedepends = lib32-attr
+ makedepends = fontconfig
+ makedepends = lib32-fontconfig
+ makedepends = lcms2
+ makedepends = lib32-lcms2
+ makedepends = libxml2
+ makedepends = lib32-libxml2
+ makedepends = libxcursor
+ makedepends = lib32-libxcursor
+ makedepends = libxrandr
+ makedepends = lib32-libxrandr
+ makedepends = libxdamage
+ makedepends = lib32-libxdamage
+ makedepends = libxi
+ makedepends = lib32-libxi
+ makedepends = gettext
+ makedepends = lib32-gettext
+ makedepends = freetype2
+ makedepends = lib32-freetype2
+ makedepends = glu
+ makedepends = lib32-glu
+ makedepends = libsm
+ makedepends = lib32-libsm
+ makedepends = gcc-libs
+ makedepends = lib32-gcc-libs
+ makedepends = libpcap
+ makedepends = lib32-libpcap
+ makedepends = sdl2>=2.0.16
+ makedepends = lib32-sdl2>=2.0.16
+ makedepends = desktop-file-utils
+ makedepends = python
+ makedepends = steam-native-runtime
+ depends = attr
+ depends = lib32-attr
+ depends = fontconfig
+ depends = lib32-fontconfig
+ depends = lcms2
+ depends = lib32-lcms2
+ depends = libxml2
+ depends = lib32-libxml2
+ depends = libxcursor
+ depends = lib32-libxcursor
+ depends = libxrandr
+ depends = lib32-libxrandr
+ depends = libxdamage
+ depends = lib32-libxdamage
+ depends = libxi
+ depends = lib32-libxi
+ depends = gettext
+ depends = lib32-gettext
+ depends = freetype2
+ depends = lib32-freetype2
+ depends = glu
+ depends = lib32-glu
+ depends = libsm
+ depends = lib32-libsm
+ depends = gcc-libs
+ depends = lib32-gcc-libs
+ depends = libpcap
+ depends = lib32-libpcap
+ depends = sdl2>=2.0.16
+ depends = lib32-sdl2>=2.0.16
+ depends = desktop-file-utils
+ depends = python
+ depends = steam-native-runtime
+ optdepends = giflib
+ optdepends = lib32-giflib
+ optdepends = libpng
+ optdepends = lib32-libpng
+ optdepends = libldap
+ optdepends = lib32-libldap
+ optdepends = gnutls
+ optdepends = lib32-gnutls
+ optdepends = mpg123
+ optdepends = lib32-mpg123
+ optdepends = openal
+ optdepends = lib32-openal
+ optdepends = v4l-utils
+ optdepends = lib32-v4l-utils
+ optdepends = libpulse
+ optdepends = lib32-libpulse
+ optdepends = alsa-plugins
+ optdepends = lib32-alsa-plugins
+ optdepends = alsa-lib
+ optdepends = lib32-alsa-lib
+ optdepends = libjpeg-turbo
+ optdepends = lib32-libjpeg-turbo
+ optdepends = libxcomposite
+ optdepends = lib32-libxcomposite
+ optdepends = libxinerama
+ optdepends = lib32-libxinerama
+ optdepends = ncurses
+ optdepends = lib32-ncurses
+ optdepends = opencl-icd-loader
+ optdepends = lib32-opencl-icd-loader
+ optdepends = libxslt
+ optdepends = lib32-libxslt
+ optdepends = libva
+ optdepends = lib32-libva
+ optdepends = gtk3
+ optdepends = lib32-gtk3
+ optdepends = gst-plugins-base-libs
+ optdepends = lib32-gst-plugins-base-libs
+ optdepends = vulkan-icd-loader
+ optdepends = lib32-vulkan-icd-loader
+ optdepends = sane
+ optdepends = libgphoto2
+ optdepends = gsm
+ optdepends = ffmpeg
+ optdepends = cups
+ optdepends = samba
+ optdepends = dosbox
+ noextract = wine-gecko-2.47.2-x86.tar.xz
+ noextract = wine-gecko-2.47.2-x86_64.tar.xz
+ noextract = wine-mono-6.4.1-x86.tar.xz
+ options = !staticlibs
+ options = !lto
+ source = proton::git+https://github.com/ValveSoftware/Proton.git#tag=experimental-6.3-20211018
+ source = wine-valve::git+https://github.com/ValveSoftware/wine.git
+ source = dxvk-valve::git+https://github.com/ValveSoftware/dxvk.git
+ source = openvr::git+https://github.com/ValveSoftware/openvr.git
+ source = liberation-fonts::git+https://github.com/liberationfonts/liberation-fonts.git
+ source = FAudio::git+https://github.com/FNA-XNA/FAudio.git
+ source = gstreamer::git+https://gitlab.freedesktop.org/gstreamer/gstreamer.git
+ source = gst-plugins-base::git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git
+ source = gst-plugins-good::git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git
+ source = gst-orc::git+https://gitlab.freedesktop.org/gstreamer/orc.git
+ source = vkd3d-proton::git+https://github.com/HansKristian-Work/vkd3d-proton.git
+ source = OpenXR-SDK::git+https://github.com/KhronosGroup/OpenXR-SDK.git
+ source = dxvk-nvapi::git+https://github.com/jp7677/dxvk-nvapi.git
+ source = dxil-spirv::git+https://github.com/HansKristian-Work/dxil-spirv.git
+ source = SPIRV-Headers::git+https://github.com/KhronosGroup/SPIRV-Headers.git
+ source = Vulkan-Headers::git+https://github.com/KhronosGroup/Vulkan-Headers.git
+ source = vkd3d-zfigura::git+https://repo.or.cz/vkd3d/zf.git
+ source = https://dl.winehq.org/wine/wine-gecko/2.47.2/wine-gecko-2.47.2-x86.tar.xz
+ source = https://dl.winehq.org/wine/wine-gecko/2.47.2/wine-gecko-2.47.2-x86_64.tar.xz
+ source = https://github.com/madewokherd/wine-mono/releases/download/wine-mono-6.4.1/wine-mono-6.4.1-x86.tar.xz
+ source = https://raw.githubusercontent.com/Sporif/dxvk-async/1.9.2/dxvk-async.patch
+ source = wine-winevulkan_fsr.patch
+ source = wine-more_8x5_res.patch
+ source = proton-unfuck_makefile.patch
+ source = proton-disable_lock.patch
+ source = proton-user_compat_data.patch
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = 8fab46ea2110b2b0beed414e3ebb4e038a3da04900e7a28492ca3c3ccf9fea94
+ sha256sums = b4476706a4c3f23461da98bed34f355ff623c5d2bb2da1e2fa0c6a310bc33014
+ sha256sums = a70c865e590058fa6fc3aa47425646405bdda27f78b9aa6d2030d2d2a8efadbb
+ sha256sums = 9212a9c42ac8c9c7b9ba7378685b27e7ea0e7a8a8aaac1f3f4d37590ada3e991
+ sha256sums = b4e9c0c4959fcb3f7b7f25e35e5e0577dac5d54fe18e6edb15852a2a4196f2a2
+ sha256sums = 9005d8169266ba0b93be30e1475fe9a3697464796f553886c155ec1d77d71215
+ sha256sums = dd267386b793314b339a8b45e1335bc1820c77d4aa3c8c3946544f2017da2fce
+ sha256sums = 12a587972a101a6d0c279a3820135277097c5f3e9f5990c5741d5fb1626dc770
+ sha256sums = cfe984e2b3d65b01e2875e51b8ef8b8d6f1268dd09a88d5611655f24b46cff8d
+
+pkgname = proton-experimental
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..f5b57e6b120a
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,345 @@
+# Maintainer: loathingkernel <loathingkernel _a_ gmail _d_ com>
+
+pkgname=proton-experimental
+_srctag=6.3-20211018
+_commit=
+pkgver=${_srctag//-/.}
+_geckover=2.47.2
+_monover=6.4.1
+_dxvkver=1.9.2
+pkgrel=1
+epoch=1
+pkgdesc="Compatibility tool for Steam Play based on Wine and additional components. Monolithic distribution, experimental branch"
+url="https://github.com/ValveSoftware/Proton"
+arch=(x86_64 x86_64_v3)
+options=(!staticlibs !lto)
+license=('custom')
+
+depends=(
+ attr lib32-attr
+ fontconfig lib32-fontconfig
+ lcms2 lib32-lcms2
+ libxml2 lib32-libxml2
+ libxcursor lib32-libxcursor
+ libxrandr lib32-libxrandr
+ libxdamage lib32-libxdamage
+ libxi lib32-libxi
+ gettext lib32-gettext
+ freetype2 lib32-freetype2
+ glu lib32-glu
+ libsm lib32-libsm
+ gcc-libs lib32-gcc-libs
+ libpcap lib32-libpcap
+ 'sdl2>=2.0.16' 'lib32-sdl2>=2.0.16'
+ desktop-file-utils
+ python
+ steam-native-runtime
+)
+
+makedepends=(autoconf ncurses bison perl fontforge flex mingw-w64-gcc
+ git wget rsync mingw-w64-tools lld nasm meson cmake python-virtualenv python-pip
+ glslang vulkan-headers
+ giflib lib32-giflib
+ libpng lib32-libpng
+ gnutls lib32-gnutls
+ libxinerama lib32-libxinerama
+ libxcomposite lib32-libxcomposite
+ libxmu lib32-libxmu
+ libxxf86vm lib32-libxxf86vm
+ libldap lib32-libldap
+ mpg123 lib32-mpg123
+ openal lib32-openal
+ v4l-utils lib32-v4l-utils
+ alsa-lib lib32-alsa-lib
+ libxcomposite lib32-libxcomposite
+ mesa lib32-mesa
+ mesa-libgl lib32-mesa-libgl
+ opencl-icd-loader lib32-opencl-icd-loader
+ libxslt lib32-libxslt
+ libpulse lib32-libpulse
+ libva lib32-libva
+ gtk3 lib32-gtk3
+ gst-plugins-base-libs lib32-gst-plugins-base-libs
+ vulkan-icd-loader lib32-vulkan-icd-loader
+ 'sdl2>=2.0.16' 'lib32-sdl2>=2.0.16'
+ libcups lib32-libcups
+ rust lib32-rust-libs
+ sane
+ libgphoto2
+ gsm
+ ffmpeg
+ samba
+ opencl-headers
+)
+
+optdepends=(
+ giflib lib32-giflib
+ libpng lib32-libpng
+ libldap lib32-libldap
+ gnutls lib32-gnutls
+ mpg123 lib32-mpg123
+ openal lib32-openal
+ v4l-utils lib32-v4l-utils
+ libpulse lib32-libpulse
+ alsa-plugins lib32-alsa-plugins
+ alsa-lib lib32-alsa-lib
+ libjpeg-turbo lib32-libjpeg-turbo
+ libxcomposite lib32-libxcomposite
+ libxinerama lib32-libxinerama
+ ncurses lib32-ncurses
+ opencl-icd-loader lib32-opencl-icd-loader
+ libxslt lib32-libxslt
+ libva lib32-libva
+ gtk3 lib32-gtk3
+ gst-plugins-base-libs lib32-gst-plugins-base-libs
+ vulkan-icd-loader lib32-vulkan-icd-loader
+ sane
+ libgphoto2
+ gsm
+ ffmpeg
+ cups
+ samba dosbox
+)
+
+makedepends=(${makedepends[@]} ${depends[@]})
+#install=${pkgname}.install
+source=(
+ proton::git+https://github.com/ValveSoftware/Proton.git#tag=experimental-${_srctag}
+ wine-valve::git+https://github.com/ValveSoftware/wine.git
+ dxvk-valve::git+https://github.com/ValveSoftware/dxvk.git
+ openvr::git+https://github.com/ValveSoftware/openvr.git
+ liberation-fonts::git+https://github.com/liberationfonts/liberation-fonts.git
+ FAudio::git+https://github.com/FNA-XNA/FAudio.git
+ gstreamer::git+https://gitlab.freedesktop.org/gstreamer/gstreamer.git
+ gst-plugins-base::git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git
+ gst-plugins-good::git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git
+ gst-orc::git+https://gitlab.freedesktop.org/gstreamer/orc.git
+ vkd3d-proton::git+https://github.com/HansKristian-Work/vkd3d-proton.git
+ OpenXR-SDK::git+https://github.com/KhronosGroup/OpenXR-SDK.git
+ dxvk-nvapi::git+https://github.com/jp7677/dxvk-nvapi.git
+ dxil-spirv::git+https://github.com/HansKristian-Work/dxil-spirv.git
+ SPIRV-Headers::git+https://github.com/KhronosGroup/SPIRV-Headers.git
+ Vulkan-Headers::git+https://github.com/KhronosGroup/Vulkan-Headers.git
+ vkd3d-zfigura::git+https://repo.or.cz/vkd3d/zf.git
+ https://dl.winehq.org/wine/wine-gecko/${_geckover}/wine-gecko-${_geckover}-x86{,_64}.tar.xz
+ https://github.com/madewokherd/wine-mono/releases/download/wine-mono-${_monover}/wine-mono-${_monover}-x86.tar.xz
+ https://raw.githubusercontent.com/Sporif/dxvk-async/${_dxvkver}/dxvk-async.patch
+ wine-winevulkan_fsr.patch
+ wine-more_8x5_res.patch
+ proton-unfuck_makefile.patch
+ proton-disable_lock.patch
+ proton-user_compat_data.patch
+)
+noextract=(
+ wine-gecko-${_geckover}-{x86,x86_64}.tar.xz
+ wine-mono-${_monover}-x86.tar.xz
+)
+
+prepare() {
+ # I know this is fugly and it should NOT be done
+ # but the afdko package from AUR breaks regularly.
+ # Install it from pip in a virtualenv
+ virtualenv --app-data "$srcdir"/build_venv/cache --no-wheel build_venv
+ source build_venv/bin/activate
+ pip install --no-cache-dir afdko
+ pip install --no-cache-dir pefile
+
+ [ ! -d gecko ] && mkdir gecko
+ mv wine-gecko-${_geckover}-x86{,_64}.tar.xz gecko/
+
+ [ ! -d mono ] && mkdir mono
+ mv wine-mono-${_monover}-x86.tar.xz mono/
+
+ [ ! -d build ] && mkdir build
+ cd proton
+
+ pushd media-converter
+ export RUSTUP_TOOLCHAIN=stable
+ export CARGO_HOME="${srcdir}"/build/.cargo
+ cargo update
+ cargo fetch --locked --target "i686-unknown-linux-gnu"
+ cargo fetch --locked --target "x86_64-unknown-linux-gnu"
+ popd
+
+ _submodules=(
+ wine-valve::wine
+ dxvk-valve::dxvk
+ openvr
+ liberation-fonts::fonts/liberation-fonts
+ FAudio
+ gstreamer
+ gst-plugins-base
+ gst-plugins-good
+ gst-orc
+ vkd3d-proton
+ OpenXR-SDK
+ dxvk-nvapi
+ SPIRV-Headers
+ Vulkan-Headers
+ vkd3d-zfigura::vkd3d
+ )
+
+ for submodule in "${_submodules[@]}"; do
+ git submodule init "${submodule#*::}"
+ git config submodule."${submodule#*::}".url "$srcdir"/"${submodule%::*}"
+ git submodule update "${submodule#*::}"
+ done
+
+ pushd vkd3d-proton
+ for submodule in subprojects/{dxil-spirv,Vulkan-Headers,SPIRV-Headers}; do
+ git submodule init "${submodule}"
+ git config submodule."${submodule}".url "$srcdir"/"${submodule#*/}"
+ git submodule update "${submodule}"
+ done
+ pushd subprojects/dxil-spirv
+ git submodule init third_party/spirv-headers
+ git config submodule.third_party/spirv-headers.url "$srcdir"/SPIRV-Headers
+ git submodule update third_party/spirv-headers
+ popd
+ popd
+
+ pushd dxvk-nvapi
+ git submodule init external/Vulkan-Headers
+ git config submodule.external/Vulkan-Headers.url "$srcdir"/Vulkan-Headers
+ git submodule update external/Vulkan-Headers
+ popd
+
+ pushd wine
+ # Add FSR for fshack (doesn't compile)
+ #patch -p1 -i "$srcdir"/wine-winevulkan_fsr.patch
+ # Adds more 16:10 resolutions for use with FSR
+ patch -p1 -i "$srcdir"/wine-more_8x5_res.patch
+ popd
+
+ pushd dxvk
+ # Uncomment to enable dxvk async patch.
+ # Enable at your own risk. If you don't know what it is,
+ # and its implications, leave it as is. You have been warned.
+ # I am not liable if anything happens to you by using it.
+ patch -p1 -i "$srcdir"/dxvk-async.patch
+ popd
+
+ patch -p1 -i "$srcdir"/proton-unfuck_makefile.patch
+ patch -p1 -i "$srcdir"/proton-disable_lock.patch
+ patch -p1 -i "$srcdir"/proton-user_compat_data.patch
+}
+
+build() {
+ source build_venv/bin/activate
+
+ cd build
+ ROOTLESS_CONTAINER="" \
+ ../proton/configure.sh \
+ --container-engine="" \
+ --proton-sdk-image="" \
+ --steam-runtime=native \
+ --no-proton-sdk \
+ --build-name="${pkgname}"
+
+ # Export CFLAGS used by upstream
+ # -O2 is adjusted to -O3 since AVX is disabled
+ # This overrides CFLAGS from makepkg.conf, if you comment these you are on your own
+ # If you want the "best" possbile optimizations for your system you can use
+ # `-march=native` and remove the `-mtune=core-avx2` option.
+ export CFLAGS="-O3 -march=nocona -mtune=core-avx2 -pipe"
+ export CXXFLAGS="-O3 -march=nocona -mtune=core-avx2 -pipe"
+
+ # If using -march=native and the CPU supports AVX, launching a d3d9
+ # game can cause an Unhandled exception. The cause seems to be the
+ # combination of AVX instructions and tree vectorization (implied by O3),
+ # all tested archictures from sandybridge to haswell are affected.
+ # Disabling AVX (and AVX2 as a side-effect).
+ # Since Wine 5.16 AVX is supported. Testing showed 32bit applications
+ # crashing with AVX regardless, but 64bit applications worked just fine.
+ # So disable AVX only for the 32bit binaries and AVX2 for the 64bit.
+ # AVX2 seems to degrade performance. So disregard the above.
+ # Relevant Wine issues
+ # https://bugs.winehq.org/show_bug.cgi?id=45289
+ # https://bugs.winehq.org/show_bug.cgi?id=43516
+ export CFLAGS+=" -mno-avx -mno-avx2"
+ export CXXFLAGS+=" -mno-avx -mno-avx2"
+ # Filter known bad flags before applying optimizations
+ # Filter fstack-protector{ ,-all,-strong} flag for MingW.
+ # https://github.com/Joshua-Ashton/d9vk/issues/476
+ #export CFLAGS+=" -fno-stack-protector"
+ export CFLAGS="${CFLAGS// -fstack-protector*([\-all|\-strong])/}"
+ #export CXXFLAGS+=" -fno-stack-protector"
+ export CXXFLAGS="${CXXFLAGS// -fstack-protector*([\-all|\-strong])/}"
+ # From wine-staging PKGBUILD
+ # Doesn't compile with these flags in MingW so remove them.
+ # They are also filtered in Wine PKGBUILDs so remove them
+ # for winelib versions too.
+ # Doesn't compile without remove these flags as of 4.10
+ export CFLAGS="${CFLAGS/ -fno-plt/}"
+ export CXXFLAGS="${CXXFLAGS/ -fno-plt/}"
+ export LDFLAGS="${LDFLAGS/,-z,now/}"
+ # MingW Wine builds fail with relro
+ export LDFLAGS="${LDFLAGS/,-z,relro/}"
+
+ export RUSTUP_TOOLCHAIN=stable
+ export WINEESYNC=0
+ export WINEFSYNC=0
+ SUBJOBS=$([[ "$MAKEFLAGS" =~ -j\ *([1-9][0-9]*) ]] && echo "${BASH_REMATCH[1]}" || echo "$(nproc)") \
+ make -j1 dist
+}
+
+package() {
+ cd build
+
+ local _compatdir="$pkgdir/usr/share/steam/compatibilitytools.d"
+ mkdir -p "$_compatdir"
+ cp -rf --no-dereference --preserve=mode,links dist "$_compatdir/${pkgname}"
+
+ mkdir -p "$pkgdir/usr/share/licenses/${pkgname}"
+ mv "$_compatdir/${pkgname}"/LICENSE{,.OFL} \
+ "$pkgdir/usr/share/licenses/${pkgname}"
+
+ cd "$_compatdir/${pkgname}/files"
+ i686-w64-mingw32-strip --strip-unneeded \
+ $(find lib/wine \( -iname fakedlls \) -prune -false -or -iname "*.dll" -or -iname "*.exe")
+ x86_64-w64-mingw32-strip --strip-unneeded \
+ $(find lib64/wine \( -iname fakedlls \) -prune -false -or -iname "*.dll" -or -iname "*.exe")
+
+ local _geckodir="share/wine/gecko/wine-gecko-${_geckover}"
+ i686-w64-mingw32-strip --strip-unneeded \
+ $(find "$_geckodir"-x86 -iname "*.dll" -or -iname "*.exe")
+ x86_64-w64-mingw32-strip --strip-unneeded \
+ $(find "$_geckodir"-x86_64 -iname "*.dll" -or -iname "*.exe")
+
+ local _monodir="share/wine/mono/wine-mono-${_monover}"
+ i686-w64-mingw32-strip --strip-unneeded \
+ $(find "$_monodir"/lib/mono -iname "*.dll" -or -iname "*.exe")
+ i686-w64-mingw32-strip --strip-unneeded \
+ "$_monodir"/lib/x86/*.dll \
+ $(find "$_monodir" -iname "*x86.dll" -or -iname "*x86.exe")
+ x86_64-w64-mingw32-strip --strip-unneeded \
+ "$_monodir"/lib/x86_64/*.dll \
+ $(find "$_monodir" -iname "*x86_64.dll" -or -iname "*x86_64.exe")
+}
+
+sha256sums=('SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ '8fab46ea2110b2b0beed414e3ebb4e038a3da04900e7a28492ca3c3ccf9fea94'
+ 'b4476706a4c3f23461da98bed34f355ff623c5d2bb2da1e2fa0c6a310bc33014'
+ 'a70c865e590058fa6fc3aa47425646405bdda27f78b9aa6d2030d2d2a8efadbb'
+ '9212a9c42ac8c9c7b9ba7378685b27e7ea0e7a8a8aaac1f3f4d37590ada3e991'
+ 'b4e9c0c4959fcb3f7b7f25e35e5e0577dac5d54fe18e6edb15852a2a4196f2a2'
+ '9005d8169266ba0b93be30e1475fe9a3697464796f553886c155ec1d77d71215'
+ 'dd267386b793314b339a8b45e1335bc1820c77d4aa3c8c3946544f2017da2fce'
+ '12a587972a101a6d0c279a3820135277097c5f3e9f5990c5741d5fb1626dc770'
+ 'cfe984e2b3d65b01e2875e51b8ef8b8d6f1268dd09a88d5611655f24b46cff8d')
diff --git a/proton-disable_lock.patch b/proton-disable_lock.patch
new file mode 100644
index 000000000000..4ee2e92917ca
--- /dev/null
+++ b/proton-disable_lock.patch
@@ -0,0 +1,31 @@
+diff --git a/proton b/proton
+index 7d75ff9..b4661b0 100755
+--- a/proton
++++ b/proton
+@@ -291,7 +291,6 @@ class Proton:
+ self.user_settings_file = self.path("user_settings.py")
+ self.wine_bin = self.bin_dir + "wine"
+ self.wineserver_bin = self.bin_dir + "wineserver"
+- self.dist_lock = FileLock(self.path("dist.lock"), timeout=-1)
+
+ def path(self, d):
+ return self.base_dir + d
+@@ -1279,8 +1278,6 @@ if __name__ == "__main__":
+
+ g_proton = Proton(os.path.dirname(sys.argv[0]))
+
+- g_proton.cleanup_legacy_dist()
+- g_proton.do_steampipe_fixups()
+
+ g_compatdata = CompatData(os.environ["STEAM_COMPAT_DATA_PATH"])
+
+@@ -1289,7 +1286,8 @@ if __name__ == "__main__":
+ g_session.init_wine()
+
+ if g_proton.missing_default_prefix():
+- g_proton.make_default_prefix()
++ log("Default prefix is missing, something is very wrong.")
++ sys.exit(1)
+
+ g_session.init_session(sys.argv[1] != "runinprefix")
+
diff --git a/proton-unfuck_makefile.patch b/proton-unfuck_makefile.patch
new file mode 100644
index 000000000000..36431eb4c4d4
--- /dev/null
+++ b/proton-unfuck_makefile.patch
@@ -0,0 +1,264 @@
+diff --git a/build/makefile_base.mak b/build/makefile_base.mak
+index 57ca0fb..6b913fe 100644
+--- a/build/makefile_base.mak
++++ b/build/makefile_base.mak
+@@ -63,7 +63,6 @@ ifeq ($(ENABLE_CCACHE),1)
+ export CCACHE_DIR := $(if $(CCACHE_DIR),$(CCACHE_DIR),$(HOME)/.ccache)
+ DOCKER_OPTS := -v $(CCACHE_DIR):$(CCACHE_DIR)$(CONTAINER_MOUNT_OPTS) $(CCACHE_ENV) -e CCACHE_DIR=$(CCACHE_DIR) $(DOCKER_OPTS)
+ else
+- export CCACHE_DISABLE := 1
+ DOCKER_OPTS := $(CCACHE_ENV) -e CCACHE_DISABLE=1 $(DOCKER_OPTS)
+ endif
+
+@@ -171,7 +170,8 @@ else
+ endif
+
+ CROSSLDFLAGS += -Wl,--file-alignment,4096
+-OPTIMIZE_FLAGS := -O2 -march=nocona -mtune=core-avx2 -mfpmath=sse
++CFLAGS ?= -O2 -march=nocona -mtune=core-avx2
++OPTIMIZE_FLAGS := $(CFLAGS) -mfpmath=sse
+ SANITY_FLAGS := -fwrapv -fno-strict-aliasing
+ DEBUG_FLAGS := -gdwarf-2 -gstrict-dwarf
+ COMMON_FLAGS = $(DEBUG_FLAGS) $(OPTIMIZE_FLAGS) $(SANITY_FLAGS) -ffile-prefix-map=$(CCACHE_BASEDIR)=.
+@@ -356,8 +356,8 @@ ALL_TARGETS += dist
+ GOAL_TARGETS += dist
+
+ dist_prefix: wine gst_good
+- find $(DST_LIBDIR32)/wine -type f -execdir chmod a-w '{}' '+'
+- find $(DST_LIBDIR64)/wine -type f -execdir chmod a-w '{}' '+'
++ find $(DST_LIBDIR32)/wine -type f -execdir chmod go-w '{}' '+'
++ find $(DST_LIBDIR64)/wine -type f -execdir chmod go-w '{}' '+'
+ rm -rf $(abspath $(DIST_PREFIX))
+ python3 $(SRCDIR)/default_pfx.py $(abspath $(DIST_PREFIX)) $(abspath $(DST_DIR)) $(STEAM_RUNTIME_RUNSH)
+
+@@ -409,6 +409,9 @@ endif # ifeq ($(CONTAINER),)
+ ##
+
+ GST_COMMON_MESON_ARGS := \
++ -Db_lto=true \
++ -Db_pie=true \
++ -Ddoc=disabled \
+ -Dexamples=disabled \
+ -Dtests=disabled \
+ -Dgtk_doc=disabled \
+@@ -421,6 +424,7 @@ GST_COMMON_MESON_ARGS := \
+
+ GST_ORC_MESON_ARGS := \
+ -Dorc-test=disabled \
++ -Dpackage-name="GStreamer Orc (Proton)" \
+ $(GST_COMMON_MESON_ARGS)
+
+ $(eval $(call rules-source,gst_orc,$(SRCDIR)/gst-orc))
+@@ -437,6 +441,9 @@ GSTREAMER_MESON_ARGS := \
+ -Dbenchmarks=disabled \
+ -Dtools=disabled \
+ -Dbash-completion=disabled \
++ -Dptp-helper-permissions=capabilities \
++ -Ddbghelp=disabled \
++ -Dpackage-name="GStreamer (Proton)" \
+ $(GST_COMMON_MESON_ARGS)
+
+ GSTREAMER_DEPENDS = gst_orc
+@@ -475,6 +482,7 @@ GST_BASE_MESON_ARGS := \
+ -Dxshm=disabled \
+ -Dxvideo=disabled \
+ -Dtools=disabled \
++ -Dpackage-name="GStreamer Base Plugins (Proton)" \
+ $(GST_COMMON_MESON_ARGS)
+
+ GST_BASE_DEPENDS = gst_orc gstreamer
+@@ -536,6 +544,7 @@ GST_GOOD_MESON_ARGS := \
+ -Dximagesrc=disabled \
+ -Dy4m=disabled \
+ -Dtools=disabled \
++ -Dpackage-name="GStreamer Good Plugins (Proton)" \
+ $(GST_COMMON_MESON_ARGS)
+
+ GST_GOOD_DEPENDS = gst_orc gstreamer gst_base
+@@ -674,8 +683,14 @@ WINE_SOURCE_ARGS = \
+ --exclude include/config.h.in \
+
+ WINE_CONFIGURE_ARGS = \
++ --with-x \
++ --with-gstreamer \
++ --with-faudio \
+ --with-mingw \
+ --without-xpresent \
++ --without-vkd3d \
++ --without-oss \
++ --disable-win16 \
+ --disable-tests
+
+ WINE_CONFIGURE_ARGS64 = --enable-win64
+@@ -804,17 +819,18 @@ VKD3D_CONFIGURE_ARGS = \
+ --disable-tests \
+ --disable-demos \
+ --without-ncurses \
+- WIDL=$(WINE_OBJ64)/tools/widl/widl
+
+ VKD3D_CONFIGURE_ARGS32 = \
+ --host=i686-w64-mingw32 \
+ CC="$(CCACHE_BIN) i686-w64-mingw32-gcc" \
+ LD="i686-w64-mingw32-ld" \
++ WIDL=$(WINE_OBJ32)/tools/widl/widl
+
+ VKD3D_CONFIGURE_ARGS64 = \
+ --host=x86_64-w64-mingw32 \
+ CC="$(CCACHE_BIN) x86_64-w64-mingw32-gcc" \
+ LD="x86_64-w64-mingw32-ld" \
++ WIDL=$(WINE_OBJ64)/tools/widl/widl
+
+ VKD3D_LDFLAGS = -static-libgcc $(CROSSLDFLAGS)
+ VKD3D_LDFLAGS32 = -L$(WINE_OBJ32)/dlls/vulkan-1/
+@@ -844,7 +860,7 @@ VKD3D_PROTON_SOURCE_ARGS = \
+ --exclude vkd3d_build.h.in \
+ --exclude vkd3d_version.h.in \
+
+-VKD3D_PROTON_MESON_ARGS = -Denable_standalone_d3d12=true
++VKD3D_PROTON_MESON_ARGS = -Denable_d3d12=true
+ VKD3D_PROTON_MESON_ARGS32 = \
+ --bindir=$(VKD3D_PROTON_DST32)/lib/wine/vkd3d-proton \
+ --cross-file=$(VKD3D_PROTON_OBJ32)/build-win32.txt
+diff --git a/make/rules-autoconf.mk b/make/rules-autoconf.mk
+index 6567f05..cb41249 100644
+--- a/make/rules-autoconf.mk
++++ b/make/rules-autoconf.mk
+@@ -21,8 +21,8 @@ $$(OBJ)/.$(1)-configure$(3): $$(OBJ)/.$(1)-pre-configure
+ --prefix="$$($(2)_DST$(3))" \
+ --libdir="$$($(2)_DST$(3))/lib$(subst 32,,$(3))" \
+ $$($(2)_ENV$(3)) \
+- CROSSCFLAGS="$$(COMMON_FLAGS)" \
+- CROSSCXXFLAGS="$$(COMMON_FLAGS) -std=c++17" \
++ CROSSCFLAGS="$$(COMMON_FLAGS) -fno-builtin-sin -fno-builtin-sinf -fno-builtin-cos -fno-builtin-cosf" \
++ CROSSCXXFLAGS="$$(COMMON_FLAGS) -fno-builtin-sin -fno-builtin-sinf -fno-builtin-cos -fno-builtin-cosf -std=c++17" \
+ CROSSLDFLAGS="$$(CROSSLDFLAGS)" \
+ $$($(2)_CONFIGURE_ARGS) \
+ $$($(2)_CONFIGURE_ARGS$(3))
+@@ -32,9 +32,9 @@ $$(OBJ)/.$(1)-configure$(3): $$(OBJ)/.$(1)-pre-configure
+ $$(OBJ)/.$(1)-build$(3):
+ @echo ":: building $(3)bit $(1)..." >&2
+ cd "$$($(2)_OBJ$(3))" && env $$($(2)_ENV$(3)) \
+- $$(MAKE)
++ $$(MAKE) -j$$(SUBJOBS)
+ cd "$$($(2)_OBJ$(3))" && env $$($(2)_ENV$(3)) \
+- $$(MAKE) install
++ $$(MAKE) -j$$(SUBJOBS) install
+ touch $$@
+ endif
+ endef
+diff --git a/make/rules-cargo.mk b/make/rules-cargo.mk
+index 5369fb4..21db917 100644
+--- a/make/rules-cargo.mk
++++ b/make/rules-cargo.mk
+@@ -14,7 +14,9 @@ $(OBJ)/.$(1)-configure$(3):
+ $(OBJ)/.$(1)-build$(3):
+ @echo ":: building $(3)bit $(1)..." >&2
+ cd $$($(2)_SRC) && env $$($(2)_ENV$(3)) \
+- cargo build --target "$$(ARCH$(3))-unknown-linux-gnu" --target-dir $$($(2)_OBJ$(3)) $$(CARGO_BUILD_ARG)
++ cargo update --offline --verbose
++ cd $$($(2)_SRC) && env $$($(2)_ENV$(3)) \
++ cargo build --locked --offline --verbose --target "$$(ARCH$(3))-unknown-linux-gnu" --target-dir $$($(2)_OBJ$(3)) $$(CARGO_BUILD_ARG)
+ touch $$@
+ endif
+ endef
+diff --git a/make/rules-cmake.mk b/make/rules-cmake.mk
+index 4c61951..3a31610 100644
+--- a/make/rules-cmake.mk
++++ b/make/rules-cmake.mk
+@@ -15,7 +15,7 @@ $$(OBJ)/.$(1)-configure$(3): $$($(2)_SRC)/CMakeLists.txt
+ cmake "$$($(2)_SRC)" \
+ -DCMAKE_INSTALL_PREFIX="$$($(2)_DST$(3))" \
+ -DCMAKE_INSTALL_LIBDIR="lib$(subst 32,,$(3))" \
+- -DCMAKE_BUILD_TYPE=plain \
++ -DCMAKE_BUILD_TYPE=Release \
+ $$($(2)_CMAKE_ARGS) \
+ $$($(2)_CMAKE_ARGS$(3))
+
+@@ -24,9 +24,9 @@ $$(OBJ)/.$(1)-configure$(3): $$($(2)_SRC)/CMakeLists.txt
+ $$(OBJ)/.$(1)-build$(3):
+ @echo ":: building $(3)bit $(1)..." >&2
+ cd "$$($(2)_OBJ$(3))" && env $$($(2)_ENV$(3)) \
+- $$(MAKE)
++ $$(MAKE) -j$$(SUBJOBS)
+ cd "$$($(2)_OBJ$(3))" && env $$($(2)_ENV$(3)) \
+- $$(MAKE) install
++ $$(MAKE) -j$$(SUBJOBS) install
+ touch $$@
+ endif
+ endef
+diff --git a/make/rules-common.mk b/make/rules-common.mk
+index 083655b..28d7785 100644
+--- a/make/rules-common.mk
++++ b/make/rules-common.mk
+@@ -108,18 +108,22 @@ CONTAINERGOALS := $(CONTAINERGOALS) $(filter $(1),$(MAKECMDGOALS))
+
+
+ $(2)_ENV$(3) = \
++ WINEDEBUG="-all" \
++ WINEPREFIX="$$(OBJ)/pfx-wine$(3)" \
++ WINEDLLOVERRIDES="winemenubuilder=d;mscoree=d;mshtml=d" \
+ CARGO_HOME=$$(OBJ)/.cargo \
+- CARGO_TARGET_$$(call toupper,$$(ARCH$(3))-unknown-linux-gnu)_LINKER="$$(ARCH$(3))-linux-gnu-gcc" \
++ CARGO_TARGET_$$(call toupper,$$(ARCH$(3))-unknown-linux-gnu)_LINKER="gcc" \
++ CARGO_TARGET_$$(call toupper,$$(ARCH$(3))-unknown-linux-gnu)_RUSTFLAGS="$$(RUSTFLAGS)" \
+ CCACHE_BASEDIR="$$(CCACHE_BASEDIR)" \
+ STRIP="$$(STRIP)" \
+- CC="$$(CCACHE_BIN) $$(ARCH$(3))-linux-gnu-gcc" \
+- CXX="$$(CCACHE_BIN) $$(ARCH$(3))-linux-gnu-g++" \
++ CC="$$(CCACHE_BIN) gcc -m$(3)" \
++ CXX="$$(CCACHE_BIN) g++ -m$(3)" \
+ LD="$$(ARCH$(3))-linux-gnu-ld" \
+- PKG_CONFIG="$$(ARCH$(3))-linux-gnu-pkg-config" \
++ PKG_CONFIG="$$(ARCH$(3))-pc-linux-gnu-pkg-config" \
+ CROSSCC="$$(CCACHE_BIN) $$(ARCH$(3))-w64-mingw32-gcc" \
+ CROSSCXX="$$(CCACHE_BIN) $$(ARCH$(3))-w64-mingw32-g++" \
+ CROSSLD="$$(ARCH$(3))-w64-mingw32-ld" \
+- CROSSPKG_CONFIG="$$(ARCH$(3))-linux-gnu-pkg-config" \
++ CROSSPKG_CONFIG="$$(ARCH$(3))-pc-linux-gnu-pkg-config" \
+ PATH="$$(call list-join,:,$$(foreach d,$$($(2)_DEPS$(3)),$$($$(d)_BINDIR$(3))),,:):$$(SRC)/glslang/bin:$$$$PATH" \
+ LD_LIBRARY_PATH="$$(call list-join,:,$$(foreach d,$$($(2)_DEPS$(3)),$$($$(d)_LIBDIR$(3))),,:)$$$$LD_LIBRARY_PATH" \
+ PKG_CONFIG_PATH="$$(call list-join,:,$$(foreach d,$$($(2)_DEPS$(3)),$$($$(d)_LIBDIR$(3))/pkgconfig))" \
+diff --git a/make/rules-meson.mk b/make/rules-meson.mk
+index 7b982fa..8e08128 100644
+--- a/make/rules-meson.mk
++++ b/make/rules-meson.mk
+@@ -11,7 +11,7 @@ $$(OBJ)/.$(1)-configure$(3): $$($(2)_SRC)/meson.build
+ @echo ":: configuring $(3)bit $(1)..." >&2
+ rm -rf "$$($(2)_OBJ$(3))/meson-private/coredata.dat"
+
+- grep -s -v -e c_args -e cpp_args -e link_args "$$($(2)_SRC)/build-win$(3).txt" | \
++ grep -s -v -e c_args -e cpp_args "$$($(2)_SRC)/build-win$(3).txt" | \
+ sed -e "s:\[properties\]:[properties]\nc_args = [$$(call list-quote,$$(COMMON_FLAGS))]:" \
+ -e "s:\[properties\]:[properties]\ncpp_args = [$$(call list-quote,$$(COMMON_FLAGS))]:" \
+ -e "s:\[properties\]:[properties]\nlink_args = [$$(call list-quote,$$(CROSSLDFLAGS))]:" \
+@@ -21,7 +21,7 @@ $$(OBJ)/.$(1)-configure$(3): $$($(2)_SRC)/meson.build
+ meson "$$($(2)_OBJ$(3))" "$$($(2)_SRC)" \
+ --prefix="$$($(2)_DST$(3))" \
+ --libdir="lib$(subst 32,,$(3))" \
+- --buildtype=plain \
++ --buildtype=release \
+ $$($(2)_MESON_ARGS) \
+ $$($(2)_MESON_ARGS$(3)) \
+ $$(MESON_STRIP_ARG)
+@@ -31,7 +31,7 @@ $$(OBJ)/.$(1)-configure$(3): $$($(2)_SRC)/meson.build
+ $$(OBJ)/.$(1)-build$(3):
+ @echo ":: building $(3)bit $(1)..." >&2
+ env $$($(2)_ENV$(3)) \
+- ninja $$(filter -j%,$$(MAKEFLAGS)) -C "$$($(2)_OBJ$(3))" install $(-v?)
++ ninja -j$$(SUBJOBS) -C "$$($(2)_OBJ$(3))" install $(-v?)
+ touch $$@
+ endif
+ endef
+diff --git a/make/rules-winemaker.mk b/make/rules-winemaker.mk
+index 8a0f0ce..36a107c 100644
+--- a/make/rules-winemaker.mk
++++ b/make/rules-winemaker.mk
+@@ -29,7 +29,7 @@ $(OBJ)/.$(1)-build$(3):
+ @echo ":: building $(3)bit $(1)..." >&2
+ rsync -arx "$$($(2)_SRC)/" "$$($(2)_OBJ$(3))/"
+ env $$($(2)_ENV$(3)) \
+- $$(MAKE) -C "$$($(2)_OBJ$(3))" LIBRARIES="$$($(2)_LDFLAGS)"
++ $$(MAKE) -j$$(SUBJOBS) -C "$$($(2)_OBJ$(3))" LIBRARIES="$$($(2)_LDFLAGS)"
+ cd "$$($(2)_OBJ$(3))" && touch "$(basename $(4)).spec" && env $$($(2)_ENV$(3)) \
+ winebuild --dll --fake-module -E "$(basename $(4)).spec" -o "$(4).fake"
+ mkdir -p $$($(2)_DST$(3))/lib$(subst 32,,$(3))/wine/fakedlls/
diff --git a/proton-user_compat_data.patch b/proton-user_compat_data.patch
new file mode 100644
index 000000000000..58b2aef04c2f
--- /dev/null
+++ b/proton-user_compat_data.patch
@@ -0,0 +1,20 @@
+diff --git a/proton b/proton
+index 7d75ff9..ca847ce 100755
+--- a/proton
++++ b/proton
+@@ -1277,6 +1277,15 @@ if __name__ == "__main__":
+ log("No compat data path?")
+ sys.exit(1)
+
++ if "PROTON_USER_COMPAT_DATA" in os.environ:
++ if nonzero(os.environ["PROTON_USER_COMPAT_DATA"]):
++ compatpath = os.environ["STEAM_COMPAT_DATA_PATH"].split('/')
++ os.environ["STEAM_COMPAT_DATA_PATH"] = "{}/{}/{}/{}".format(
++ os.environ["STEAM_COMPAT_CLIENT_INSTALL_PATH"],
++ compatpath[-3], compatpath[-2], compatpath[-1])
++ if not os.path.exists(os.environ["STEAM_COMPAT_DATA_PATH"]):
++ os.makedirs(os.environ["STEAM_COMPAT_DATA_PATH"])
++
+ g_proton = Proton(os.path.dirname(sys.argv[0]))
+
+ g_proton.cleanup_legacy_dist()
diff --git a/wine-more_8x5_res.patch b/wine-more_8x5_res.patch
new file mode 100644
index 000000000000..acc09936ffd3
--- /dev/null
+++ b/wine-more_8x5_res.patch
@@ -0,0 +1,15 @@
+diff --git a/dlls/winex11.drv/fs.c b/dlls/winex11.drv/fs.c
+index c37899605e7..6470d2ffbb9 100644
+--- a/dlls/winex11.drv/fs.c
++++ b/dlls/winex11.drv/fs.c
+@@ -78,6 +78,10 @@ static struct fs_monitor_size fs_monitor_sizes[] =
+ {2880, 1620}, /* 16:9 */
+ {2954, 1662}, /* 16:9 - 'FSR 2160p Ultra Quality' */
+ {3200, 1800}, /* 16:9 */
++ {640, 400}, /* 8:5 */
++ {840, 525}, /* 8:5 */
++ {960, 600}, /* 8:5 */
++ {1280, 800}, /* 8:5 */
+ {1440, 900}, /* 8:5 */
+ {1680, 1050}, /* 8:5 */
+ {1920, 1200}, /* 8:5 */
diff --git a/wine-winevulkan_fsr.patch b/wine-winevulkan_fsr.patch
new file mode 100644
index 000000000000..99d4e3e76102
--- /dev/null
+++ b/wine-winevulkan_fsr.patch
@@ -0,0 +1,1989 @@
+From 1b7461a01d3ba261a511108c1ff4d872fb0305fe Mon Sep 17 00:00:00 2001
+From: Georg Lehmann <dadschoorse@gmail.com>
+Date: Sat, 26 Jun 2021 17:46:47 +0200
+Subject: [PATCH] winevulkan: fshack: Enable shaderStorageImageWriteWithoutFormat.
+
+Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
+---
+ dlls/winevulkan/vulkan.c | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
+index e159c87..b1fdbd6 100644
+--- a/dlls/winevulkan/vulkan.c
++++ b/dlls/winevulkan/vulkan.c
+@@ -881,0 +882,2 @@ VkResult WINAPI __wine_create_vk_device_with_callback(VkPhysicalDevice phys_dev,
++ VkPhysicalDeviceFeatures features = {0};
++ VkPhysicalDeviceFeatures2 *features2;
+@@ -914,0 +917,20 @@ VkResult WINAPI __wine_create_vk_device_with_callback(VkPhysicalDevice phys_dev,
++ /* Enable shaderStorageImageWriteWithoutFormat for fshack
++ * This is available on all hardware and driver combinations we care about.
++ */
++ if (create_info_host.pEnabledFeatures)
++ {
++ features = *create_info_host.pEnabledFeatures;
++ features.shaderStorageImageWriteWithoutFormat = VK_TRUE;
++ create_info_host.pEnabledFeatures = &features;
++ }
++ if ((features2 = wine_vk_find_struct(&create_info_host, PHYSICAL_DEVICE_FEATURES_2)))
++ {
++ features2->features.shaderStorageImageWriteWithoutFormat = VK_TRUE;
++ }
++ else if (!create_info_host.pEnabledFeatures)
++ {
++ features.shaderStorageImageWriteWithoutFormat = VK_TRUE;
++ create_info_host.pEnabledFeatures = &features;
++ }
++
++
+--
+libgit2 1.1.1
+
+From 079f65ea20bc54df42e5c2c047a05694fd9fafb6 Mon Sep 17 00:00:00 2001
+From: Georg Lehmann <dadschoorse@gmail.com>
+Date: Thu, 15 Jul 2021 18:50:05 +0200
+Subject: [PATCH] winevulkan: fshack: Implement fsr.
+
+Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
+---
+ dlls/winevulkan/make_vulkan | 2 +-
+ dlls/winevulkan/vulkan.c | 1567 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ dlls/winevulkan/vulkan_private.h | 24 ++++++++++++++++++------
+ dlls/winex11.drv/fs.c | 17 +++++++++++++++++
+ dlls/winex11.drv/vulkan.c | 8 +++++++-
+ dlls/winex11.drv/x11drv.h | 1 +
+ include/wine/vulkan_driver.h | 2 +-
+ 7 files changed, 1254 insertions(+), 367 deletions(-)
+
+diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
+index 5a0ef02..59e49a9 100755
+--- a/dlls/winevulkan/make_vulkan
++++ b/dlls/winevulkan/make_vulkan
+@@ -2703 +2703 @@ class VkGenerator(object):
+- f.write(" VkBool32 (*query_fs_hack)(VkSurfaceKHR surface, VkExtent2D *real_sz, VkExtent2D *user_sz, VkRect2D *dst_blit, VkFilter *filter);\n")
++ f.write(" VkBool32 (*query_fs_hack)(VkSurfaceKHR surface, VkExtent2D *real_sz, VkExtent2D *user_sz, VkRect2D *dst_blit, VkFilter *filter, BOOL *fsr, float *sharpness);\n")
+diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
+index b1fdbd6..905e78d 100644
+--- a/dlls/winevulkan/vulkan.c
++++ b/dlls/winevulkan/vulkan.c
+@@ -2009 +2009 @@ layout(binding = 0) uniform sampler2D texSampler;
+-layout(binding = 1, rgba8) uniform writeonly image2D outImage;
++layout(binding = 1) uniform writeonly image2D outImage;
+@@ -2022 +2022 @@ void main()
+- imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), c.bgra);
++ imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), c);
+@@ -2026,47 +2026,46 @@ const uint32_t blit_comp_spv[] = {
+- 0x07230203,0x00010000,0x00080006,0x00000037,0x00000000,0x00020011,0x00000001,0x0006000b,
+- 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+- 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00060010,0x00000004,
+- 0x00000011,0x00000008,0x00000008,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005,
+- 0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000009,0x63786574,0x64726f6f,0x00000000,
+- 0x00080005,0x0000000d,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,
+- 0x00060005,0x00000012,0x68737570,0x736e6f43,0x746e6174,0x00000073,0x00050006,0x00000012,
+- 0x00000000,0x7366666f,0x00007465,0x00050006,0x00000012,0x00000001,0x65747865,0x0073746e,
+- 0x00050005,0x00000014,0x736e6f63,0x746e6174,0x00000073,0x00030005,0x00000021,0x00000063,
+- 0x00050005,0x00000025,0x53786574,0x6c706d61,0x00007265,0x00050005,0x0000002c,0x4974756f,
+- 0x6567616d,0x00000000,0x00040047,0x0000000d,0x0000000b,0x0000001c,0x00050048,0x00000012,
+- 0x00000000,0x00000023,0x00000000,0x00050048,0x00000012,0x00000001,0x00000023,0x00000008,
+- 0x00030047,0x00000012,0x00000002,0x00040047,0x00000025,0x00000022,0x00000000,0x00040047,
+- 0x00000025,0x00000021,0x00000000,0x00040047,0x0000002c,0x00000022,0x00000000,0x00040047,
+- 0x0000002c,0x00000021,0x00000001,0x00030047,0x0000002c,0x00000019,0x00040047,0x00000036,
+- 0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,
+- 0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,
+- 0x00000007,0x00000007,0x00040015,0x0000000a,0x00000020,0x00000000,0x00040017,0x0000000b,
+- 0x0000000a,0x00000003,0x00040020,0x0000000c,0x00000001,0x0000000b,0x0004003b,0x0000000c,
+- 0x0000000d,0x00000001,0x00040017,0x0000000e,0x0000000a,0x00000002,0x0004001e,0x00000012,
+- 0x00000007,0x00000007,0x00040020,0x00000013,0x00000009,0x00000012,0x0004003b,0x00000013,
+- 0x00000014,0x00000009,0x00040015,0x00000015,0x00000020,0x00000001,0x0004002b,0x00000015,
+- 0x00000016,0x00000000,0x00040020,0x00000017,0x00000009,0x00000007,0x0004002b,0x00000015,
+- 0x0000001b,0x00000001,0x00040017,0x0000001f,0x00000006,0x00000004,0x00040020,0x00000020,
+- 0x00000007,0x0000001f,0x00090019,0x00000022,0x00000006,0x00000001,0x00000000,0x00000000,
+- 0x00000000,0x00000001,0x00000000,0x0003001b,0x00000023,0x00000022,0x00040020,0x00000024,
+- 0x00000000,0x00000023,0x0004003b,0x00000024,0x00000025,0x00000000,0x0004002b,0x00000006,
+- 0x00000028,0x00000000,0x00090019,0x0000002a,0x00000006,0x00000001,0x00000000,0x00000000,
+- 0x00000000,0x00000002,0x00000004,0x00040020,0x0000002b,0x00000000,0x0000002a,0x0004003b,
+- 0x0000002b,0x0000002c,0x00000000,0x00040017,0x00000030,0x00000015,0x00000002,0x0004002b,
+- 0x0000000a,0x00000034,0x00000008,0x0004002b,0x0000000a,0x00000035,0x00000001,0x0006002c,
+- 0x0000000b,0x00000036,0x00000034,0x00000034,0x00000035,0x00050036,0x00000002,0x00000004,
+- 0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,
+- 0x0004003b,0x00000020,0x00000021,0x00000007,0x0004003d,0x0000000b,0x0000000f,0x0000000d,
+- 0x0007004f,0x0000000e,0x00000010,0x0000000f,0x0000000f,0x00000000,0x00000001,0x00040070,
+- 0x00000007,0x00000011,0x00000010,0x00050041,0x00000017,0x00000018,0x00000014,0x00000016,
+- 0x0004003d,0x00000007,0x00000019,0x00000018,0x00050083,0x00000007,0x0000001a,0x00000011,
+- 0x00000019,0x00050041,0x00000017,0x0000001c,0x00000014,0x0000001b,0x0004003d,0x00000007,
+- 0x0000001d,0x0000001c,0x00050088,0x00000007,0x0000001e,0x0000001a,0x0000001d,0x0003003e,
+- 0x00000009,0x0000001e,0x0004003d,0x00000023,0x00000026,0x00000025,0x0004003d,0x00000007,
+- 0x00000027,0x00000009,0x00070058,0x0000001f,0x00000029,0x00000026,0x00000027,0x00000002,
+- 0x00000028,0x0003003e,0x00000021,0x00000029,0x0004003d,0x0000002a,0x0000002d,0x0000002c,
+- 0x0004003d,0x0000000b,0x0000002e,0x0000000d,0x0007004f,0x0000000e,0x0000002f,0x0000002e,
+- 0x0000002e,0x00000000,0x00000001,0x0004007c,0x00000030,0x00000031,0x0000002f,0x0004003d,
+- 0x0000001f,0x00000032,0x00000021,0x0009004f,0x0000001f,0x00000033,0x00000032,0x00000032,
+- 0x00000002,0x00000001,0x00000000,0x00000003,0x00040063,0x0000002d,0x00000031,0x00000033,
+- 0x000100fd,0x00010038
++ 0x07230203,0x00010000,0x0008000a,0x00000036,0x00000000,0x00020011,0x00000001,0x00020011,
++ 0x00000038,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
++ 0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000d,
++ 0x00060010,0x00000004,0x00000011,0x00000008,0x00000008,0x00000001,0x00030003,0x00000002,
++ 0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000009,0x63786574,
++ 0x64726f6f,0x00000000,0x00080005,0x0000000d,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,
++ 0x496e6f69,0x00000044,0x00060005,0x00000012,0x68737570,0x736e6f43,0x746e6174,0x00000073,
++ 0x00050006,0x00000012,0x00000000,0x7366666f,0x00007465,0x00050006,0x00000012,0x00000001,
++ 0x65747865,0x0073746e,0x00050005,0x00000014,0x736e6f63,0x746e6174,0x00000073,0x00030005,
++ 0x00000021,0x00000063,0x00050005,0x00000025,0x53786574,0x6c706d61,0x00007265,0x00050005,
++ 0x0000002c,0x4974756f,0x6567616d,0x00000000,0x00040047,0x0000000d,0x0000000b,0x0000001c,
++ 0x00050048,0x00000012,0x00000000,0x00000023,0x00000000,0x00050048,0x00000012,0x00000001,
++ 0x00000023,0x00000008,0x00030047,0x00000012,0x00000002,0x00040047,0x00000025,0x00000022,
++ 0x00000000,0x00040047,0x00000025,0x00000021,0x00000000,0x00040047,0x0000002c,0x00000022,
++ 0x00000000,0x00040047,0x0000002c,0x00000021,0x00000001,0x00030047,0x0000002c,0x00000019,
++ 0x00040047,0x00000035,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,
++ 0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000002,
++ 0x00040020,0x00000008,0x00000007,0x00000007,0x00040015,0x0000000a,0x00000020,0x00000000,
++ 0x00040017,0x0000000b,0x0000000a,0x00000003,0x00040020,0x0000000c,0x00000001,0x0000000b,
++ 0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040017,0x0000000e,0x0000000a,0x00000002,
++ 0x0004001e,0x00000012,0x00000007,0x00000007,0x00040020,0x00000013,0x00000009,0x00000012,
++ 0x0004003b,0x00000013,0x00000014,0x00000009,0x00040015,0x00000015,0x00000020,0x00000001,
++ 0x0004002b,0x00000015,0x00000016,0x00000000,0x00040020,0x00000017,0x00000009,0x00000007,
++ 0x0004002b,0x00000015,0x0000001b,0x00000001,0x00040017,0x0000001f,0x00000006,0x00000004,
++ 0x00040020,0x00000020,0x00000007,0x0000001f,0x00090019,0x00000022,0x00000006,0x00000001,
++ 0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,0x00000023,0x00000022,
++ 0x00040020,0x00000024,0x00000000,0x00000023,0x0004003b,0x00000024,0x00000025,0x00000000,
++ 0x0004002b,0x00000006,0x00000028,0x00000000,0x00090019,0x0000002a,0x00000006,0x00000001,
++ 0x00000000,0x00000000,0x00000000,0x00000002,0x00000000,0x00040020,0x0000002b,0x00000000,
++ 0x0000002a,0x0004003b,0x0000002b,0x0000002c,0x00000000,0x00040017,0x00000030,0x00000015,
++ 0x00000002,0x0004002b,0x0000000a,0x00000033,0x00000008,0x0004002b,0x0000000a,0x00000034,
++ 0x00000001,0x0006002c,0x0000000b,0x00000035,0x00000033,0x00000033,0x00000034,0x00050036,
++ 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000008,
++ 0x00000009,0x00000007,0x0004003b,0x00000020,0x00000021,0x00000007,0x0004003d,0x0000000b,
++ 0x0000000f,0x0000000d,0x0007004f,0x0000000e,0x00000010,0x0000000f,0x0000000f,0x00000000,
++ 0x00000001,0x00040070,0x00000007,0x00000011,0x00000010,0x00050041,0x00000017,0x00000018,
++ 0x00000014,0x00000016,0x0004003d,0x00000007,0x00000019,0x00000018,0x00050083,0x00000007,
++ 0x0000001a,0x00000011,0x00000019,0x00050041,0x00000017,0x0000001c,0x00000014,0x0000001b,
++ 0x0004003d,0x00000007,0x0000001d,0x0000001c,0x00050088,0x00000007,0x0000001e,0x0000001a,
++ 0x0000001d,0x0003003e,0x00000009,0x0000001e,0x0004003d,0x00000023,0x00000026,0x00000025,
++ 0x0004003d,0x00000007,0x00000027,0x00000009,0x00070058,0x0000001f,0x00000029,0x00000026,
++ 0x00000027,0x00000002,0x00000028,0x0003003e,0x00000021,0x00000029,0x0004003d,0x0000002a,
++ 0x0000002d,0x0000002c,0x0004003d,0x0000000b,0x0000002e,0x0000000d,0x0007004f,0x0000000e,
++ 0x0000002f,0x0000002e,0x0000002e,0x00000000,0x00000001,0x0004007c,0x00000030,0x00000031,
++ 0x0000002f,0x0004003d,0x0000001f,0x00000032,0x00000021,0x00040063,0x0000002d,0x00000031,
++ 0x00000032,0x000100fd,0x00010038
+@@ -2075 +2074,749 @@ const uint32_t blit_comp_spv[] = {
+-static VkResult create_pipeline(VkDevice device, struct VkSwapchainKHR_T *swapchain, VkShaderModule shaderModule)
++/*
++#version 460
++#extension GL_GOOGLE_include_directive: require
++
++layout(local_size_x=8, local_size_y=8, local_size_z=1) in;
++
++layout(binding = 0) uniform sampler2D texSampler;
++layout(binding = 1) uniform writeonly image2D outImage;
++
++#define A_GPU 1
++#define A_GLSL 1
++//#include "ffx_a.h"
++#define FSR_EASU_F 1
++AF4 FsrEasuRF(AF2 p){return AF4(textureGather(texSampler, p, 0));}
++AF4 FsrEasuGF(AF2 p){return AF4(textureGather(texSampler, p, 1));}
++AF4 FsrEasuBF(AF2 p){return AF4(textureGather(texSampler, p, 2));}
++//#include "ffx_fsr1.h"
++
++layout(push_constant) uniform pushConstants {
++ uvec4 c1, c2, c3, c4;
++};
++
++
++void main()
++{
++ vec3 color;
++
++ if (any(greaterThanEqual(gl_GlobalInvocationID.xy, c4.zw)))
++ return;
++
++ FsrEasuF(color, uvec2(gl_GlobalInvocationID.xy), c1, c2, c3, c4);
++
++ imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1.0));
++}
++*/
++const uint32_t fsr_easu_comp_spv[] = {
++ 0x07230203,0x00010000,0x0008000a,0x0000129e,0x00000000,0x00020011,0x00000001,0x00020011,
++ 0x00000038,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
++ 0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x000004ee,
++ 0x00060010,0x00000004,0x00000011,0x00000008,0x00000008,0x00000001,0x00030003,0x00000002,
++ 0x000001cc,0x000a0004,0x475f4c47,0x4c474f4f,0x70635f45,0x74735f70,0x5f656c79,0x656e696c,
++ 0x7269645f,0x69746365,0x00006576,0x00080004,0x475f4c47,0x4c474f4f,0x6e695f45,0x64756c63,
++ 0x69645f65,0x74636572,0x00657669,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,
++ 0x000000bc,0x53786574,0x6c706d61,0x00007265,0x00080005,0x000004ee,0x475f6c67,0x61626f6c,
++ 0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,0x000004f1,0x68737570,0x736e6f43,
++ 0x746e6174,0x00000073,0x00040006,0x000004f1,0x00000000,0x00003163,0x00040006,0x000004f1,
++ 0x00000001,0x00003263,0x00040006,0x000004f1,0x00000002,0x00003363,0x00040006,0x000004f1,
++ 0x00000003,0x00003463,0x00030005,0x000004f3,0x00000000,0x00050005,0x00000517,0x4974756f,
++ 0x6567616d,0x00000000,0x00040047,0x000000bc,0x00000022,0x00000000,0x00040047,0x000000bc,
++ 0x00000021,0x00000000,0x00040047,0x000004ee,0x0000000b,0x0000001c,0x00050048,0x000004f1,
++ 0x00000000,0x00000023,0x00000000,0x00050048,0x000004f1,0x00000001,0x00000023,0x00000010,
++ 0x00050048,0x000004f1,0x00000002,0x00000023,0x00000020,0x00050048,0x000004f1,0x00000003,
++ 0x00000023,0x00000030,0x00030047,0x000004f1,0x00000002,0x00040047,0x00000517,0x00000022,
++ 0x00000000,0x00040047,0x00000517,0x00000021,0x00000001,0x00030047,0x00000517,0x00000019,
++ 0x00040047,0x00000523,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,
++ 0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x0000000c,0x00000006,0x00000002,
++ 0x00040017,0x00000011,0x00000006,0x00000003,0x00040017,0x00000016,0x00000006,0x00000004,
++ 0x00040015,0x0000001b,0x00000020,0x00000000,0x00020014,0x0000004f,0x00040017,0x00000060,
++ 0x0000001b,0x00000002,0x00040017,0x00000062,0x0000001b,0x00000004,0x0004002b,0x00000006,
++ 0x00000093,0x3f800000,0x0004002b,0x00000006,0x0000009b,0x00000000,0x0004002b,0x0000001b,
++ 0x000000a3,0x7ef07ebb,0x0004002b,0x0000001b,0x000000ac,0x5f347d74,0x0004002b,0x0000001b,
++ 0x000000b1,0x00000001,0x00090019,0x000000b9,0x00000006,0x00000001,0x00000000,0x00000000,
++ 0x00000000,0x00000001,0x00000000,0x0003001b,0x000000ba,0x000000b9,0x00040020,0x000000bb,
++ 0x00000000,0x000000ba,0x0004003b,0x000000bb,0x000000bc,0x00000000,0x00040015,0x000000bf,
++ 0x00000020,0x00000001,0x0004002b,0x000000bf,0x000000c0,0x00000000,0x0004002b,0x000000bf,
++ 0x000000cb,0x00000001,0x0004002b,0x000000bf,0x000000d6,0x00000002,0x0004002b,0x0000001b,
++ 0x000000e0,0x00000000,0x0004002b,0x00000006,0x0000010d,0x3ecccccd,0x0004002b,0x00000006,
++ 0x00000112,0xbf800000,0x0004002b,0x00000006,0x00000123,0x3fc80000,0x0004002b,0x00000006,
++ 0x00000128,0xbf100000,0x0004002b,0x00000006,0x00000230,0x3f000000,0x0004002b,0x00000006,
++ 0x000002f5,0x38000000,0x0004002b,0x00000006,0x0000033e,0xbf000000,0x0004002b,0x00000006,
++ 0x00000348,0xbe947ae1,0x0005002c,0x0000000c,0x0000039c,0x0000009b,0x00000112,0x0005002c,
++ 0x0000000c,0x000003b7,0x00000093,0x00000112,0x0005002c,0x0000000c,0x000003d2,0x00000112,
++ 0x00000093,0x0005002c,0x0000000c,0x000003ed,0x0000009b,0x00000093,0x0005002c,0x0000000c,
++ 0x00000423,0x00000112,0x0000009b,0x0005002c,0x0000000c,0x0000043e,0x00000093,0x00000093,
++ 0x0004002b,0x00000006,0x00000459,0x40000000,0x0005002c,0x0000000c,0x0000045a,0x00000459,
++ 0x00000093,0x0005002c,0x0000000c,0x00000475,0x00000459,0x0000009b,0x0005002c,0x0000000c,
++ 0x00000490,0x00000093,0x0000009b,0x0005002c,0x0000000c,0x000004ab,0x00000093,0x00000459,
++ 0x0005002c,0x0000000c,0x000004c6,0x0000009b,0x00000459,0x00040017,0x000004ec,0x0000001b,
++ 0x00000003,0x00040020,0x000004ed,0x00000001,0x000004ec,0x0004003b,0x000004ed,0x000004ee,
++ 0x00000001,0x0006001e,0x000004f1,0x00000062,0x00000062,0x00000062,0x00000062,0x00040020,
++ 0x000004f2,0x00000009,0x000004f1,0x0004003b,0x000004f2,0x000004f3,0x00000009,0x0004002b,
++ 0x000000bf,0x000004f4,0x00000003,0x00040020,0x000004f5,0x00000009,0x00000062,0x00040017,
++ 0x000004f9,0x0000004f,0x00000002,0x00090019,0x00000515,0x00000006,0x00000001,0x00000000,
++ 0x00000000,0x00000000,0x00000002,0x00000000,0x00040020,0x00000516,0x00000000,0x00000515,
++ 0x0004003b,0x00000516,0x00000517,0x00000000,0x00040017,0x0000051b,0x000000bf,0x00000002,
++ 0x0004002b,0x0000001b,0x00000522,0x00000008,0x0006002c,0x000004ec,0x00000523,0x00000522,
++ 0x00000522,0x000000b1,0x0007002c,0x00000016,0x0000127a,0x00000230,0x00000230,0x00000230,
++ 0x00000230,0x00030001,0x0000000c,0x0000129d,0x00050036,0x00000002,0x00000004,0x00000000,
++ 0x00000003,0x000200f8,0x00000005,0x000300f7,0x00000524,0x00000000,0x000300fb,0x000000e0,
++ 0x00000525,0x000200f8,0x00000525,0x0004003d,0x000004ec,0x000004ef,0x000004ee,0x0007004f,
++ 0x00000060,0x000004f0,0x000004ef,0x000004ef,0x00000000,0x00000001,0x00050041,0x000004f5,
++ 0x000004f6,0x000004f3,0x000004f4,0x0004003d,0x00000062,0x000004f7,0x000004f6,0x0007004f,
++ 0x00000060,0x000004f8,0x000004f7,0x000004f7,0x00000002,0x00000003,0x000500ae,0x000004f9,
++ 0x000004fa,0x000004f0,0x000004f8,0x0004009a,0x0000004f,0x000004fb,0x000004fa,0x000300f7,
++ 0x000004fd,0x00000000,0x000400fa,0x000004fb,0x000004fc,0x000004fd,0x000200f8,0x000004fc,
++ 0x000200f9,0x00000524,0x000200f8,0x000004fd,0x00050051,0x0000001b,0x00000502,0x000004ef,
++ 0x00000000,0x00050051,0x0000001b,0x00000503,0x000004ef,0x00000001,0x00050050,0x00000060,
++ 0x00000504,0x00000502,0x00000503,0x00050041,0x000004f5,0x00000508,0x000004f3,0x000000c0,
++ 0x0004003d,0x00000062,0x00000509,0x00000508,0x00050041,0x000004f5,0x0000050b,0x000004f3,
++ 0x000000cb,0x0004003d,0x00000062,0x0000050c,0x0000050b,0x00050041,0x000004f5,0x0000050e,
++ 0x000004f3,0x000000d6,0x0004003d,0x00000062,0x0000050f,0x0000050e,0x00040070,0x0000000c,
++ 0x00000618,0x00000504,0x00050051,0x0000001b,0x0000061b,0x00000509,0x00000000,0x00050051,
++ 0x0000001b,0x0000061c,0x00000509,0x00000001,0x00050050,0x00000060,0x0000061d,0x0000061b,
++ 0x0000061c,0x0004007c,0x0000000c,0x0000061e,0x0000061d,0x00050085,0x0000000c,0x0000061f,
++ 0x00000618,0x0000061e,0x00050051,0x0000001b,0x00000622,0x00000509,0x00000002,0x00050051,
++ 0x0000001b,0x00000623,0x00000509,0x00000003,0x00050050,0x00000060,0x00000624,0x00000622,
++ 0x00000623,0x0004007c,0x0000000c,0x00000625,0x00000624,0x00050081,0x0000000c,0x00000626,
++ 0x0000061f,0x00000625,0x0006000c,0x0000000c,0x00000628,0x00000001,0x00000008,0x00000626,
++ 0x00050083,0x0000000c,0x0000062b,0x00000626,0x00000628,0x00050051,0x0000001b,0x0000062f,
++ 0x0000050c,0x00000000,0x00050051,0x0000001b,0x00000630,0x0000050c,0x00000001,0x00050050,
++ 0x00000060,0x00000631,0x0000062f,0x00000630,0x0004007c,0x0000000c,0x00000632,0x00000631,
++ 0x00050085,0x0000000c,0x00000633,0x00000628,0x00000632,0x00050051,0x0000001b,0x00000636,
++ 0x0000050c,0x00000002,0x00050051,0x0000001b,0x00000637,0x0000050c,0x00000003,0x00050050,
++ 0x00000060,0x00000638,0x00000636,0x00000637,0x0004007c,0x0000000c,0x00000639,0x00000638,
++ 0x00050081,0x0000000c,0x0000063a,0x00000633,0x00000639,0x00050051,0x0000001b,0x0000063e,
++ 0x0000050f,0x00000000,0x00050051,0x0000001b,0x0000063f,0x0000050f,0x00000001,0x00050050,
++ 0x00000060,0x00000640,0x0000063e,0x0000063f,0x0004007c,0x0000000c,0x00000641,0x00000640,
++ 0x00050081,0x0000000c,0x00000642,0x0000063a,0x00000641,0x00050051,0x0000001b,0x00000646,
++ 0x0000050f,0x00000002,0x00050051,0x0000001b,0x00000647,0x0000050f,0x00000003,0x00050050,
++ 0x00000060,0x00000648,0x00000646,0x00000647,0x0004007c,0x0000000c,0x00000649,0x00000648,
++ 0x00050081,0x0000000c,0x0000064a,0x0000063a,0x00000649,0x00050051,0x0000001b,0x0000064e,
++ 0x000004f7,0x00000000,0x00050051,0x0000001b,0x0000064f,0x000004f7,0x00000001,0x00050050,
++ 0x00000060,0x00000650,0x0000064e,0x0000064f,0x0004007c,0x0000000c,0x00000651,0x00000650,
++ 0x00050081,0x0000000c,0x00000652,0x0000063a,0x00000651,0x0004003d,0x000000ba,0x00000845,
++ 0x000000bc,0x00060060,0x00000016,0x00000847,0x00000845,0x0000063a,0x000000c0,0x00060060,
++ 0x00000016,0x00000851,0x00000845,0x0000063a,0x000000cb,0x00060060,0x00000016,0x0000085b,
++ 0x00000845,0x0000063a,0x000000d6,0x00060060,0x00000016,0x00000865,0x00000845,0x00000642,
++ 0x000000c0,0x00060060,0x00000016,0x0000086f,0x00000845,0x00000642,0x000000cb,0x00060060,
++ 0x00000016,0x00000879,0x00000845,0x00000642,0x000000d6,0x00060060,0x00000016,0x00000883,
++ 0x00000845,0x0000064a,0x000000c0,0x00060060,0x00000016,0x0000088d,0x00000845,0x0000064a,
++ 0x000000cb,0x00060060,0x00000016,0x00000897,0x00000845,0x0000064a,0x000000d6,0x00060060,
++ 0x00000016,0x000008a1,0x00000845,0x00000652,0x000000c0,0x00060060,0x00000016,0x000008ab,
++ 0x00000845,0x00000652,0x000000cb,0x00060060,0x00000016,0x000008b5,0x00000845,0x00000652,
++ 0x000000d6,0x00050085,0x00000016,0x0000066d,0x0000085b,0x0000127a,0x00050085,0x00000016,
++ 0x00000670,0x00000847,0x0000127a,0x00050081,0x00000016,0x00000672,0x00000670,0x00000851,
++ 0x00050081,0x00000016,0x00000673,0x0000066d,0x00000672,0x00050085,0x00000016,0x00000676,
++ 0x00000879,0x0000127a,0x00050085,0x00000016,0x00000679,0x00000865,0x0000127a,0x00050081,
++ 0x00000016,0x0000067b,0x00000679,0x0000086f,0x00050081,0x00000016,0x0000067c,0x00000676,
++ 0x0000067b,0x00050085,0x00000016,0x0000067f,0x00000897,0x0000127a,0x00050085,0x00000016,
++ 0x00000682,0x00000883,0x0000127a,0x00050081,0x00000016,0x00000684,0x00000682,0x0000088d,
++ 0x00050081,0x00000016,0x00000685,0x0000067f,0x00000684,0x00050085,0x00000016,0x00000688,
++ 0x000008b5,0x0000127a,0x00050085,0x00000016,0x0000068b,0x000008a1,0x0000127a,0x00050081,
++ 0x00000016,0x0000068d,0x0000068b,0x000008ab,0x00050081,0x00000016,0x0000068e,0x00000688,
++ 0x0000068d,0x00050051,0x00000006,0x00000690,0x00000673,0x00000000,0x00050051,0x00000006,
++ 0x00000692,0x00000673,0x00000001,0x00050051,0x00000006,0x00000694,0x0000067c,0x00000000,
++ 0x00050051,0x00000006,0x00000696,0x0000067c,0x00000001,0x00050051,0x00000006,0x00000698,
++ 0x0000067c,0x00000002,0x00050051,0x00000006,0x0000069a,0x0000067c,0x00000003,0x00050051,
++ 0x00000006,0x0000069c,0x00000685,0x00000000,0x00050051,0x00000006,0x0000069e,0x00000685,
++ 0x00000001,0x00050051,0x00000006,0x000006a0,0x00000685,0x00000002,0x00050051,0x00000006,
++ 0x000006a2,0x00000685,0x00000003,0x00050051,0x00000006,0x000006a4,0x0000068e,0x00000002,
++ 0x00050051,0x00000006,0x000006a6,0x0000068e,0x00000003,0x00050051,0x00000006,0x00000913,
++ 0x0000062b,0x00000000,0x00050083,0x00000006,0x00000914,0x00000093,0x00000913,0x00050051,
++ 0x00000006,0x00000917,0x0000062b,0x00000001,0x00050083,0x00000006,0x00000918,0x00000093,
++ 0x00000917,0x00050085,0x00000006,0x00000919,0x00000914,0x00000918,0x00050083,0x00000006,
++ 0x00000939,0x000006a2,0x00000698,0x00050083,0x00000006,0x0000093c,0x00000698,0x0000069a,
++ 0x0006000c,0x00000006,0x0000093e,0x00000001,0x00000004,0x00000939,0x0006000c,0x00000006,
++ 0x00000940,0x00000001,0x00000004,0x0000093c,0x0007000c,0x00000006,0x00000941,0x00000001,
++ 0x00000028,0x0000093e,0x00000940,0x0004007c,0x0000001b,0x00000993,0x00000941,0x00050082,
++ 0x0000001b,0x00000994,0x000000a3,0x00000993,0x0004007c,0x00000006,0x00000995,0x00000994,
++ 0x00050083,0x00000006,0x00000946,0x000006a2,0x0000069a,0x00050085,0x00000006,0x00000949,
++ 0x00000946,0x00000919,0x0006000c,0x00000006,0x0000094f,0x00000001,0x00000004,0x00000946,
++ 0x00050085,0x00000006,0x00000951,0x0000094f,0x00000995,0x0008000c,0x00000006,0x000009a0,
++ 0x00000001,0x0000002b,0x00000951,0x0000009b,0x00000093,0x00050085,0x00000006,0x00000955,
++ 0x000009a0,0x000009a0,0x00050085,0x00000006,0x00000958,0x00000955,0x00000919,0x00050083,
++ 0x00000006,0x0000095d,0x00000696,0x00000698,0x00050083,0x00000006,0x00000960,0x00000698,
++ 0x00000690,0x0006000c,0x00000006,0x00000962,0x00000001,0x00000004,0x0000095d,0x0006000c,
++ 0x00000006,0x00000964,0x00000001,0x00000004,0x00000960,0x0007000c,0x00000006,0x00000965,
++ 0x00000001,0x00000028,0x00000962,0x00000964,0x0004007c,0x0000001b,0x000009ac,0x00000965,
++ 0x00050082,0x0000001b,0x000009ad,0x000000a3,0x000009ac,0x0004007c,0x00000006,0x000009ae,
++ 0x000009ad,0x00050083,0x00000006,0x0000096a,0x00000696,0x00000690,0x00050085,0x00000006,
++ 0x0000096d,0x0000096a,0x00000919,0x0006000c,0x00000006,0x00000973,0x00000001,0x00000004,
++ 0x0000096a,0x00050085,0x00000006,0x00000975,0x00000973,0x000009ae,0x0008000c,0x00000006,
++ 0x000009b9,0x00000001,0x0000002b,0x00000975,0x0000009b,0x00000093,0x00050085,0x00000006,
++ 0x00000979,0x000009b9,0x000009b9,0x00050085,0x00000006,0x0000097c,0x00000979,0x00000919,
++ 0x00050081,0x00000006,0x0000097e,0x00000958,0x0000097c,0x00050085,0x00000006,0x000009e8,
++ 0x00000913,0x00000918,0x00050083,0x00000006,0x000009fe,0x000006a0,0x000006a2,0x0006000c,
++ 0x00000006,0x00000a03,0x00000001,0x00000004,0x000009fe,0x0007000c,0x00000006,0x00000a06,
++ 0x00000001,0x00000028,0x00000a03,0x0000093e,0x0004007c,0x0000001b,0x00000a58,0x00000a06,
++ 0x00050082,0x0000001b,0x00000a59,0x000000a3,0x00000a58,0x0004007c,0x00000006,0x00000a5a,
++ 0x00000a59,0x00050083,0x00000006,0x00000a0b,0x000006a0,0x00000698,0x00050085,0x00000006,
++ 0x00000a0e,0x00000a0b,0x000009e8,0x00050081,0x00000006,0x00000a11,0x00000949,0x00000a0e,
++ 0x0006000c,0x00000006,0x00000a14,0x00000001,0x00000004,0x00000a0b,0x00050085,0x00000006,
++ 0x00000a16,0x00000a14,0x00000a5a,0x0008000c,0x00000006,0x00000a65,0x00000001,0x0000002b,
++ 0x00000a16,0x0000009b,0x00000093,0x00050085,0x00000006,0x00000a1a,0x00000a65,0x00000a65,
++ 0x00050085,0x00000006,0x00000a1d,0x00000a1a,0x000009e8,0x00050081,0x00000006,0x00000a1f,
++ 0x0000097e,0x00000a1d,0x00050083,0x00000006,0x00000a22,0x0000069c,0x000006a2,0x00050083,
++ 0x00000006,0x00000a25,0x000006a2,0x00000692,0x0006000c,0x00000006,0x00000a27,0x00000001,
++ 0x00000004,0x00000a22,0x0006000c,0x00000006,0x00000a29,0x00000001,0x00000004,0x00000a25,
++ 0x0007000c,0x00000006,0x00000a2a,0x00000001,0x00000028,0x00000a27,0x00000a29,0x0004007c,
++ 0x0000001b,0x00000a71,0x00000a2a,0x00050082,0x0000001b,0x00000a72,0x000000a3,0x00000a71,
++ 0x0004007c,0x00000006,0x00000a73,0x00000a72,0x00050083,0x00000006,0x00000a2f,0x0000069c,
++ 0x00000692,0x00050085,0x00000006,0x00000a32,0x00000a2f,0x000009e8,0x00050081,0x00000006,
++ 0x00000a35,0x0000096d,0x00000a32,0x0006000c,0x00000006,0x00000a38,0x00000001,0x00000004,
++ 0x00000a2f,0x00050085,0x00000006,0x00000a3a,0x00000a38,0x00000a73,0x0008000c,0x00000006,
++ 0x00000a7e,0x00000001,0x0000002b,0x00000a3a,0x0000009b,0x00000093,0x00050085,0x00000006,
++ 0x00000a3e,0x00000a7e,0x00000a7e,0x00050085,0x00000006,0x00000a41,0x00000a3e,0x000009e8,
++ 0x00050081,0x00000006,0x00000a43,0x00000a1f,0x00000a41,0x00050085,0x00000006,0x00000ab7,
++ 0x00000914,0x00000917,0x00050083,0x00000006,0x00000ac3,0x0000069c,0x00000696,0x00050083,
++ 0x00000006,0x00000ac6,0x00000696,0x00000694,0x0006000c,0x00000006,0x00000ac8,0x00000001,
++ 0x00000004,0x00000ac3,0x0006000c,0x00000006,0x00000aca,0x00000001,0x00000004,0x00000ac6,
++ 0x0007000c,0x00000006,0x00000acb,0x00000001,0x00000028,0x00000ac8,0x00000aca,0x0004007c,
++ 0x0000001b,0x00000b1d,0x00000acb,0x00050082,0x0000001b,0x00000b1e,0x000000a3,0x00000b1d,
++ 0x0004007c,0x00000006,0x00000b1f,0x00000b1e,0x00050083,0x00000006,0x00000ad0,0x0000069c,
++ 0x00000694,0x00050085,0x00000006,0x00000ad3,0x00000ad0,0x00000ab7,0x00050081,0x00000006,
++ 0x00000ad6,0x00000a11,0x00000ad3,0x0006000c,0x00000006,0x00000ad9,0x00000001,0x00000004,
++ 0x00000ad0,0x00050085,0x00000006,0x00000adb,0x00000ad9,0x00000b1f,0x0008000c,0x00000006,
++ 0x00000b2a,0x00000001,0x0000002b,0x00000adb,0x0000009b,0x00000093,0x00050085,0x00000006,
++ 0x00000adf,0x00000b2a,0x00000b2a,0x00050085,0x00000006,0x00000ae2,0x00000adf,0x00000ab7,
++ 0x00050081,0x00000006,0x00000ae4,0x00000a43,0x00000ae2,0x00050083,0x00000006,0x00000ae7,
++ 0x000006a6,0x00000696,0x0006000c,0x00000006,0x00000aec,0x00000001,0x00000004,0x00000ae7,
++ 0x0007000c,0x00000006,0x00000aef,0x00000001,0x00000028,0x00000aec,0x00000962,0x0004007c,
++ 0x0000001b,0x00000b36,0x00000aef,0x00050082,0x0000001b,0x00000b37,0x000000a3,0x00000b36,
++ 0x0004007c,0x00000006,0x00000b38,0x00000b37,0x00050083,0x00000006,0x00000af4,0x000006a6,
++ 0x00000698,0x00050085,0x00000006,0x00000af7,0x00000af4,0x00000ab7,0x00050081,0x00000006,
++ 0x00000afa,0x00000a35,0x00000af7,0x0006000c,0x00000006,0x00000afd,0x00000001,0x00000004,
++ 0x00000af4,0x00050085,0x00000006,0x00000aff,0x00000afd,0x00000b38,0x0008000c,0x00000006,
++ 0x00000b43,0x00000001,0x0000002b,0x00000aff,0x0000009b,0x00000093,0x00050085,0x00000006,
++ 0x00000b03,0x00000b43,0x00000b43,0x00050085,0x00000006,0x00000b06,0x00000b03,0x00000ab7,
++ 0x00050081,0x00000006,0x00000b08,0x00000ae4,0x00000b06,0x00050085,0x00000006,0x00000b84,
++ 0x00000913,0x00000917,0x00050083,0x00000006,0x00000b88,0x0000069e,0x0000069c,0x0006000c,
++ 0x00000006,0x00000b8d,0x00000001,0x00000004,0x00000b88,0x0007000c,0x00000006,0x00000b90,
++ 0x00000001,0x00000028,0x00000b8d,0x00000ac8,0x0004007c,0x0000001b,0x00000be2,0x00000b90,
++ 0x00050082,0x0000001b,0x00000be3,0x000000a3,0x00000be2,0x0004007c,0x00000006,0x00000be4,
++ 0x00000be3,0x00050083,0x00000006,0x00000b95,0x0000069e,0x00000696,0x00050085,0x00000006,
++ 0x00000b98,0x00000b95,0x00000b84,0x00050081,0x00000006,0x00000b9b,0x00000ad6,0x00000b98,
++ 0x00060052,0x0000000c,0x0000116f,0x00000b9b,0x0000129d,0x00000000,0x0006000c,0x00000006,
++ 0x00000b9e,0x00000001,0x00000004,0x00000b95,0x00050085,0x00000006,0x00000ba0,0x00000b9e,
++ 0x00000be4,0x0008000c,0x00000006,0x00000bef,0x00000001,0x0000002b,0x00000ba0,0x0000009b,
++ 0x00000093,0x00050085,0x00000006,0x00000ba4,0x00000bef,0x00000bef,0x00050085,0x00000006,
++ 0x00000ba7,0x00000ba4,0x00000b84,0x00050081,0x00000006,0x00000ba9,0x00000b08,0x00000ba7,
++ 0x00050083,0x00000006,0x00000bac,0x000006a4,0x0000069c,0x0006000c,0x00000006,0x00000bb1,
++ 0x00000001,0x00000004,0x00000bac,0x0007000c,0x00000006,0x00000bb4,0x00000001,0x00000028,
++ 0x00000bb1,0x00000a27,0x0004007c,0x0000001b,0x00000bfb,0x00000bb4,0x00050082,0x0000001b,
++ 0x00000bfc,0x000000a3,0x00000bfb,0x0004007c,0x00000006,0x00000bfd,0x00000bfc,0x00050083,
++ 0x00000006,0x00000bb9,0x000006a4,0x000006a2,0x00050085,0x00000006,0x00000bbc,0x00000bb9,
++ 0x00000b84,0x00050081,0x00000006,0x00000bbf,0x00000afa,0x00000bbc,0x00060052,0x0000000c,
++ 0x00001172,0x00000bbf,0x0000116f,0x00000001,0x0006000c,0x00000006,0x00000bc2,0x00000001,
++ 0x00000004,0x00000bb9,0x00050085,0x00000006,0x00000bc4,0x00000bc2,0x00000bfd,0x0008000c,
++ 0x00000006,0x00000c08,0x00000001,0x0000002b,0x00000bc4,0x0000009b,0x00000093,0x00050085,
++ 0x00000006,0x00000bc8,0x00000c08,0x00000c08,0x00050085,0x00000006,0x00000bcb,0x00000bc8,
++ 0x00000b84,0x00050081,0x00000006,0x00000bcd,0x00000ba9,0x00000bcb,0x00050085,0x0000000c,
++ 0x000006d7,0x00001172,0x00001172,0x00050051,0x00000006,0x000006d9,0x000006d7,0x00000000,
++ 0x00050051,0x00000006,0x000006db,0x000006d7,0x00000001,0x00050081,0x00000006,0x000006dc,
++ 0x000006d9,0x000006db,0x000500b8,0x0000004f,0x000006df,0x000006dc,0x000002f5,0x0004007c,
++ 0x0000001b,0x00000c18,0x000006dc,0x000500c2,0x0000001b,0x00000c1a,0x00000c18,0x000000b1,
++ 0x00050082,0x0000001b,0x00000c1b,0x000000ac,0x00000c1a,0x0004007c,0x00000006,0x00000c1c,
++ 0x00000c1b,0x000200f9,0x000006e7,0x000200f8,0x000006e7,0x000600a9,0x00000006,0x0000129c,
++ 0x000006df,0x00000093,0x00000c1c,0x000300f7,0x000006ef,0x00000000,0x000400fa,0x000006df,
++ 0x000006ea,0x000006ec,0x000200f8,0x000006ec,0x000200f9,0x000006ef,0x000200f8,0x000006ea,
++ 0x000200f9,0x000006ef,0x000200f8,0x000006ef,0x000700f5,0x00000006,0x0000127e,0x00000b9b,
++ 0x000006ec,0x00000093,0x000006ea,0x00060052,0x0000000c,0x00001177,0x0000127e,0x00001172,
++ 0x00000000,0x00050050,0x0000000c,0x00000c2d,0x0000129c,0x0000129c,0x00050085,0x0000000c,
++ 0x000006f5,0x00001177,0x00000c2d,0x00050085,0x00000006,0x000006f8,0x00000bcd,0x00000230,
++ 0x00050085,0x00000006,0x000006fb,0x000006f8,0x000006f8,0x00050051,0x00000006,0x000006fd,
++ 0x000006f5,0x00000000,0x00050085,0x00000006,0x00000700,0x000006fd,0x000006fd,0x00050051,
++ 0x00000006,0x00000702,0x000006f5,0x00000001,0x00050085,0x00000006,0x00000705,0x00000702,
++ 0x00000702,0x00050081,0x00000006,0x00000706,0x00000700,0x00000705,0x0006000c,0x00000006,
++ 0x00000709,0x00000001,0x00000004,0x000006fd,0x0006000c,0x00000006,0x0000070c,0x00000001,
++ 0x00000004,0x00000702,0x0007000c,0x00000006,0x0000070d,0x00000001,0x00000028,0x00000709,
++ 0x0000070c,0x0004007c,0x0000001b,0x00000c36,0x0000070d,0x00050082,0x0000001b,0x00000c37,
++ 0x000000a3,0x00000c36,0x0004007c,0x00000006,0x00000c38,0x00000c37,0x00050085,0x00000006,
++ 0x0000070f,0x00000706,0x00000c38,0x00050083,0x00000006,0x00000713,0x0000070f,0x00000093,
++ 0x00050085,0x00000006,0x00000715,0x00000713,0x000006fb,0x00050081,0x00000006,0x00000716,
++ 0x00000093,0x00000715,0x00050085,0x00000006,0x0000071a,0x0000033e,0x000006fb,0x00050081,
++ 0x00000006,0x0000071b,0x00000093,0x0000071a,0x00050050,0x0000000c,0x0000071c,0x00000716,
++ 0x0000071b,0x00050085,0x00000006,0x00000720,0x00000348,0x000006fb,0x00050081,0x00000006,
++ 0x00000721,0x00000230,0x00000720,0x0004007c,0x0000001b,0x00000c53,0x00000721,0x00050082,
++ 0x0000001b,0x00000c54,0x000000a3,0x00000c53,0x0004007c,0x00000006,0x00000c55,0x00000c54,
++ 0x00050051,0x00000006,0x00000725,0x00000865,0x00000002,0x00050051,0x00000006,0x00000727,
++ 0x0000086f,0x00000002,0x00050051,0x00000006,0x00000729,0x00000879,0x00000002,0x00060050,
++ 0x00000011,0x0000072a,0x00000725,0x00000727,0x00000729,0x00050051,0x00000006,0x0000072c,
++ 0x00000883,0x00000003,0x00050051,0x00000006,0x0000072e,0x0000088d,0x00000003,0x00050051,
++ 0x00000006,0x00000730,0x00000897,0x00000003,0x00060050,0x00000011,0x00000731,0x0000072c,
++ 0x0000072e,0x00000730,0x00050051,0x00000006,0x00000733,0x00000865,0x00000001,0x00050051,
++ 0x00000006,0x00000735,0x0000086f,0x00000001,0x00050051,0x00000006,0x00000737,0x00000879,
++ 0x00000001,0x00060050,0x00000011,0x00000738,0x00000733,0x00000735,0x00000737,0x0007000c,
++ 0x00000011,0x00000c5e,0x00000001,0x00000025,0x00000731,0x00000738,0x0007000c,0x00000011,
++ 0x00000c5f,0x00000001,0x00000025,0x0000072a,0x00000c5e,0x00050051,0x00000006,0x0000073b,
++ 0x00000883,0x00000000,0x00050051,0x00000006,0x0000073d,0x0000088d,0x00000000,0x00050051,
++ 0x00000006,0x0000073f,0x00000897,0x00000000,0x00060050,0x00000011,0x00000740,0x0000073b,
++ 0x0000073d,0x0000073f,0x0007000c,0x00000011,0x00000741,0x00000001,0x00000025,0x00000c5f,
++ 0x00000740,0x0007000c,0x00000011,0x00000c65,0x00000001,0x00000028,0x00000731,0x00000738,
++ 0x0007000c,0x00000011,0x00000c66,0x00000001,0x00000028,0x0000072a,0x00000c65,0x0007000c,
++ 0x00000011,0x0000075f,0x00000001,0x00000028,0x00000c66,0x00000740,0x00050083,0x0000000c,
++ 0x00000763,0x0000039c,0x0000062b,0x00050051,0x00000006,0x00000765,0x00000847,0x00000000,
++ 0x00050051,0x00000006,0x00000767,0x00000851,0x00000000,0x00050051,0x00000006,0x00000769,
++ 0x0000085b,0x00000000,0x00060050,0x00000011,0x0000076a,0x00000765,0x00000767,0x00000769,
++ 0x00050051,0x00000006,0x00000c7c,0x00000763,0x00000000,0x00050085,0x00000006,0x00000c7f,
++ 0x00000c7c,0x000006fd,0x00050051,0x00000006,0x00000c81,0x00000763,0x00000001,0x00050085,
++ 0x00000006,0x00000c84,0x00000c81,0x00000702,0x00050081,0x00000006,0x00000c85,0x00000c7f,
++ 0x00000c84,0x00060052,0x0000000c,0x0000119e,0x00000c85,0x0000129d,0x00000000,0x0004007f,
++ 0x00000006,0x00000c8b,0x00000702,0x00050085,0x00000006,0x00000c8c,0x00000c7c,0x00000c8b,
++ 0x00050085,0x00000006,0x00000c91,0x00000c81,0x000006fd,0x00050081,0x00000006,0x00000c92,
++ 0x00000c8c,0x00000c91,0x00060052,0x0000000c,0x000011a4,0x00000c92,0x0000119e,0x00000001,
++ 0x00050085,0x0000000c,0x00000c96,0x000011a4,0x0000071c,0x00050051,0x00000006,0x00000c98,
++ 0x00000c96,0x00000000,0x00050085,0x00000006,0x00000c9b,0x00000c98,0x00000c98,0x00050051,
++ 0x00000006,0x00000c9d,0x00000c96,0x00000001,0x00050085,0x00000006,0x00000ca0,0x00000c9d,
++ 0x00000c9d,0x00050081,0x00000006,0x00000ca1,0x00000c9b,0x00000ca0,0x0007000c,0x00000006,
++ 0x00000ca4,0x00000001,0x00000025,0x00000ca1,0x00000c55,0x00050085,0x00000006,0x00000ca7,
++ 0x0000010d,0x00000ca4,0x00050081,0x00000006,0x00000ca9,0x00000ca7,0x00000112,0x00050085,
++ 0x00000006,0x00000cac,0x00000721,0x00000ca4,0x00050081,0x00000006,0x00000cae,0x00000cac,
++ 0x00000112,0x00050085,0x00000006,0x00000cb1,0x00000ca9,0x00000ca9,0x00050085,0x00000006,
++ 0x00000cb4,0x00000cae,0x00000cae,0x00050085,0x00000006,0x00000cb7,0x00000123,0x00000cb1,
++ 0x00050081,0x00000006,0x00000cb9,0x00000cb7,0x00000128,0x00050085,0x00000006,0x00000cbc,
++ 0x00000cb9,0x00000cb4,0x0005008e,0x00000011,0x00000cbf,0x0000076a,0x00000cbc,0x00050083,
++ 0x0000000c,0x00000775,0x000003b7,0x0000062b,0x00050051,0x00000006,0x00000777,0x00000847,
++ 0x00000001,0x00050051,0x00000006,0x00000779,0x00000851,0x00000001,0x00050051,0x00000006,
++ 0x0000077b,0x0000085b,0x00000001,0x00060050,0x00000011,0x0000077c,0x00000777,0x00000779,
++ 0x0000077b,0x00050051,0x00000006,0x00000ce0,0x00000775,0x00000000,0x00050085,0x00000006,
++ 0x00000ce3,0x00000ce0,0x000006fd,0x00050051,0x00000006,0x00000ce5,0x00000775,0x00000001,
++ 0x00050085,0x00000006,0x00000ce8,0x00000ce5,0x00000702,0x00050081,0x00000006,0x00000ce9,
++ 0x00000ce3,0x00000ce8,0x00060052,0x0000000c,0x000011b1,0x00000ce9,0x0000129d,0x00000000,
++ 0x00050085,0x00000006,0x00000cf0,0x00000ce0,0x00000c8b,0x00050085,0x00000006,0x00000cf5,
++ 0x00000ce5,0x000006fd,0x00050081,0x00000006,0x00000cf6,0x00000cf0,0x00000cf5,0x00060052,
++ 0x0000000c,0x000011b7,0x00000cf6,0x000011b1,0x00000001,0x00050085,0x0000000c,0x00000cfa,
++ 0x000011b7,0x0000071c,0x00050051,0x00000006,0x00000cfc,0x00000cfa,0x00000000,0x00050085,
++ 0x00000006,0x00000cff,0x00000cfc,0x00000cfc,0x00050051,0x00000006,0x00000d01,0x00000cfa,
++ 0x00000001,0x00050085,0x00000006,0x00000d04,0x00000d01,0x00000d01,0x00050081,0x00000006,
++ 0x00000d05,0x00000cff,0x00000d04,0x0007000c,0x00000006,0x00000d08,0x00000001,0x00000025,
++ 0x00000d05,0x00000c55,0x00050085,0x00000006,0x00000d0b,0x0000010d,0x00000d08,0x00050081,
++ 0x00000006,0x00000d0d,0x00000d0b,0x00000112,0x00050085,0x00000006,0x00000d10,0x00000721,
++ 0x00000d08,0x00050081,0x00000006,0x00000d12,0x00000d10,0x00000112,0x00050085,0x00000006,
++ 0x00000d15,0x00000d0d,0x00000d0d,0x00050085,0x00000006,0x00000d18,0x00000d12,0x00000d12,
++ 0x00050085,0x00000006,0x00000d1b,0x00000123,0x00000d15,0x00050081,0x00000006,0x00000d1d,
++ 0x00000d1b,0x00000128,0x00050085,0x00000006,0x00000d20,0x00000d1d,0x00000d18,0x0005008e,
++ 0x00000011,0x00000d23,0x0000077c,0x00000d20,0x00050081,0x00000011,0x00000d25,0x00000cbf,
++ 0x00000d23,0x00050081,0x00000006,0x00000d28,0x00000cbc,0x00000d20,0x00050083,0x0000000c,
++ 0x00000787,0x000003d2,0x0000062b,0x00050051,0x00000006,0x00000789,0x00000865,0x00000000,
++ 0x00050051,0x00000006,0x0000078b,0x0000086f,0x00000000,0x00050051,0x00000006,0x0000078d,
++ 0x00000879,0x00000000,0x00060050,0x00000011,0x0000078e,0x00000789,0x0000078b,0x0000078d,
++ 0x00050051,0x00000006,0x00000d44,0x00000787,0x00000000,0x00050085,0x00000006,0x00000d47,
++ 0x00000d44,0x000006fd,0x00050051,0x00000006,0x00000d49,0x00000787,0x00000001,0x00050085,
++ 0x00000006,0x00000d4c,0x00000d49,0x00000702,0x00050081,0x00000006,0x00000d4d,0x00000d47,
++ 0x00000d4c,0x00060052,0x0000000c,0x000011c4,0x00000d4d,0x0000129d,0x00000000,0x00050085,
++ 0x00000006,0x00000d54,0x00000d44,0x00000c8b,0x00050085,0x00000006,0x00000d59,0x00000d49,
++ 0x000006fd,0x00050081,0x00000006,0x00000d5a,0x00000d54,0x00000d59,0x00060052,0x0000000c,
++ 0x000011ca,0x00000d5a,0x000011c4,0x00000001,0x00050085,0x0000000c,0x00000d5e,0x000011ca,
++ 0x0000071c,0x00050051,0x00000006,0x00000d60,0x00000d5e,0x00000000,0x00050085,0x00000006,
++ 0x00000d63,0x00000d60,0x00000d60,0x00050051,0x00000006,0x00000d65,0x00000d5e,0x00000001,
++ 0x00050085,0x00000006,0x00000d68,0x00000d65,0x00000d65,0x00050081,0x00000006,0x00000d69,
++ 0x00000d63,0x00000d68,0x0007000c,0x00000006,0x00000d6c,0x00000001,0x00000025,0x00000d69,
++ 0x00000c55,0x00050085,0x00000006,0x00000d6f,0x0000010d,0x00000d6c,0x00050081,0x00000006,
++ 0x00000d71,0x00000d6f,0x00000112,0x00050085,0x00000006,0x00000d74,0x00000721,0x00000d6c,
++ 0x00050081,0x00000006,0x00000d76,0x00000d74,0x00000112,0x00050085,0x00000006,0x00000d79,
++ 0x00000d71,0x00000d71,0x00050085,0x00000006,0x00000d7c,0x00000d76,0x00000d76,0x00050085,
++ 0x00000006,0x00000d7f,0x00000123,0x00000d79,0x00050081,0x00000006,0x00000d81,0x00000d7f,
++ 0x00000128,0x00050085,0x00000006,0x00000d84,0x00000d81,0x00000d7c,0x0005008e,0x00000011,
++ 0x00000d87,0x0000078e,0x00000d84,0x00050081,0x00000011,0x00000d89,0x00000d25,0x00000d87,
++ 0x00050081,0x00000006,0x00000d8c,0x00000d28,0x00000d84,0x00050083,0x0000000c,0x00000799,
++ 0x000003ed,0x0000062b,0x00050051,0x00000006,0x00000da8,0x00000799,0x00000000,0x00050085,
++ 0x00000006,0x00000dab,0x00000da8,0x000006fd,0x00050051,0x00000006,0x00000dad,0x00000799,
++ 0x00000001,0x00050085,0x00000006,0x00000db0,0x00000dad,0x00000702,0x00050081,0x00000006,
++ 0x00000db1,0x00000dab,0x00000db0,0x00060052,0x0000000c,0x000011d7,0x00000db1,0x0000129d,
++ 0x00000000,0x00050085,0x00000006,0x00000db8,0x00000da8,0x00000c8b,0x00050085,0x00000006,
++ 0x00000dbd,0x00000dad,0x000006fd,0x00050081,0x00000006,0x00000dbe,0x00000db8,0x00000dbd,
++ 0x00060052,0x0000000c,0x000011dd,0x00000dbe,0x000011d7,0x00000001,0x00050085,0x0000000c,
++ 0x00000dc2,0x000011dd,0x0000071c,0x00050051,0x00000006,0x00000dc4,0x00000dc2,0x00000000,
++ 0x00050085,0x00000006,0x00000dc7,0x00000dc4,0x00000dc4,0x00050051,0x00000006,0x00000dc9,
++ 0x00000dc2,0x00000001,0x00050085,0x00000006,0x00000dcc,0x00000dc9,0x00000dc9,0x00050081,
++ 0x00000006,0x00000dcd,0x00000dc7,0x00000dcc,0x0007000c,0x00000006,0x00000dd0,0x00000001,
++ 0x00000025,0x00000dcd,0x00000c55,0x00050085,0x00000006,0x00000dd3,0x0000010d,0x00000dd0,
++ 0x00050081,0x00000006,0x00000dd5,0x00000dd3,0x00000112,0x00050085,0x00000006,0x00000dd8,
++ 0x00000721,0x00000dd0,0x00050081,0x00000006,0x00000dda,0x00000dd8,0x00000112,0x00050085,
++ 0x00000006,0x00000ddd,0x00000dd5,0x00000dd5,0x00050085,0x00000006,0x00000de0,0x00000dda,
++ 0x00000dda,0x00050085,0x00000006,0x00000de3,0x00000123,0x00000ddd,0x00050081,0x00000006,
++ 0x00000de5,0x00000de3,0x00000128,0x00050085,0x00000006,0x00000de8,0x00000de5,0x00000de0,
++ 0x0005008e,0x00000011,0x00000deb,0x00000738,0x00000de8,0x00050081,0x00000011,0x00000ded,
++ 0x00000d89,0x00000deb,0x00050081,0x00000006,0x00000df0,0x00000d8c,0x00000de8,0x0004007f,
++ 0x0000000c,0x000007ab,0x0000062b,0x00050051,0x00000006,0x00000e0c,0x000007ab,0x00000000,
++ 0x00050085,0x00000006,0x00000e0f,0x00000e0c,0x000006fd,0x00050051,0x00000006,0x00000e11,
++ 0x000007ab,0x00000001,0x00050085,0x00000006,0x00000e14,0x00000e11,0x00000702,0x00050081,
++ 0x00000006,0x00000e15,0x00000e0f,0x00000e14,0x00060052,0x0000000c,0x000011ea,0x00000e15,
++ 0x0000129d,0x00000000,0x00050085,0x00000006,0x00000e1c,0x00000e0c,0x00000c8b,0x00050085,
++ 0x00000006,0x00000e21,0x00000e11,0x000006fd,0x00050081,0x00000006,0x00000e22,0x00000e1c,
++ 0x00000e21,0x00060052,0x0000000c,0x000011f0,0x00000e22,0x000011ea,0x00000001,0x00050085,
++ 0x0000000c,0x00000e26,0x000011f0,0x0000071c,0x00050051,0x00000006,0x00000e28,0x00000e26,
++ 0x00000000,0x00050085,0x00000006,0x00000e2b,0x00000e28,0x00000e28,0x00050051,0x00000006,
++ 0x00000e2d,0x00000e26,0x00000001,0x00050085,0x00000006,0x00000e30,0x00000e2d,0x00000e2d,
++ 0x00050081,0x00000006,0x00000e31,0x00000e2b,0x00000e30,0x0007000c,0x00000006,0x00000e34,
++ 0x00000001,0x00000025,0x00000e31,0x00000c55,0x00050085,0x00000006,0x00000e37,0x0000010d,
++ 0x00000e34,0x00050081,0x00000006,0x00000e39,0x00000e37,0x00000112,0x00050085,0x00000006,
++ 0x00000e3c,0x00000721,0x00000e34,0x00050081,0x00000006,0x00000e3e,0x00000e3c,0x00000112,
++ 0x00050085,0x00000006,0x00000e41,0x00000e39,0x00000e39,0x00050085,0x00000006,0x00000e44,
++ 0x00000e3e,0x00000e3e,0x00050085,0x00000006,0x00000e47,0x00000123,0x00000e41,0x00050081,
++ 0x00000006,0x00000e49,0x00000e47,0x00000128,0x00050085,0x00000006,0x00000e4c,0x00000e49,
++ 0x00000e44,0x0005008e,0x00000011,0x00000e4f,0x0000072a,0x00000e4c,0x00050081,0x00000011,
++ 0x00000e51,0x00000ded,0x00000e4f,0x00050081,0x00000006,0x00000e54,0x00000df0,0x00000e4c,
++ 0x00050083,0x0000000c,0x000007bd,0x00000423,0x0000062b,0x00050051,0x00000006,0x000007bf,
++ 0x00000865,0x00000003,0x00050051,0x00000006,0x000007c1,0x0000086f,0x00000003,0x00050051,
++ 0x00000006,0x000007c3,0x00000879,0x00000003,0x00060050,0x00000011,0x000007c4,0x000007bf,
++ 0x000007c1,0x000007c3,0x00050051,0x00000006,0x00000e70,0x000007bd,0x00000000,0x00050085,
++ 0x00000006,0x00000e73,0x00000e70,0x000006fd,0x00050051,0x00000006,0x00000e75,0x000007bd,
++ 0x00000001,0x00050085,0x00000006,0x00000e78,0x00000e75,0x00000702,0x00050081,0x00000006,
++ 0x00000e79,0x00000e73,0x00000e78,0x00060052,0x0000000c,0x000011fd,0x00000e79,0x0000129d,
++ 0x00000000,0x00050085,0x00000006,0x00000e80,0x00000e70,0x00000c8b,0x00050085,0x00000006,
++ 0x00000e85,0x00000e75,0x000006fd,0x00050081,0x00000006,0x00000e86,0x00000e80,0x00000e85,
++ 0x00060052,0x0000000c,0x00001203,0x00000e86,0x000011fd,0x00000001,0x00050085,0x0000000c,
++ 0x00000e8a,0x00001203,0x0000071c,0x00050051,0x00000006,0x00000e8c,0x00000e8a,0x00000000,
++ 0x00050085,0x00000006,0x00000e8f,0x00000e8c,0x00000e8c,0x00050051,0x00000006,0x00000e91,
++ 0x00000e8a,0x00000001,0x00050085,0x00000006,0x00000e94,0x00000e91,0x00000e91,0x00050081,
++ 0x00000006,0x00000e95,0x00000e8f,0x00000e94,0x0007000c,0x00000006,0x00000e98,0x00000001,
++ 0x00000025,0x00000e95,0x00000c55,0x00050085,0x00000006,0x00000e9b,0x0000010d,0x00000e98,
++ 0x00050081,0x00000006,0x00000e9d,0x00000e9b,0x00000112,0x00050085,0x00000006,0x00000ea0,
++ 0x00000721,0x00000e98,0x00050081,0x00000006,0x00000ea2,0x00000ea0,0x00000112,0x00050085,
++ 0x00000006,0x00000ea5,0x00000e9d,0x00000e9d,0x00050085,0x00000006,0x00000ea8,0x00000ea2,
++ 0x00000ea2,0x00050085,0x00000006,0x00000eab,0x00000123,0x00000ea5,0x00050081,0x00000006,
++ 0x00000ead,0x00000eab,0x00000128,0x00050085,0x00000006,0x00000eb0,0x00000ead,0x00000ea8,
++ 0x0005008e,0x00000011,0x00000eb3,0x000007c4,0x00000eb0,0x00050081,0x00000011,0x00000eb5,
++ 0x00000e51,0x00000eb3,0x00050081,0x00000006,0x00000eb8,0x00000e54,0x00000eb0,0x00050083,
++ 0x0000000c,0x000007cf,0x0000043e,0x0000062b,0x00050051,0x00000006,0x00000ed4,0x000007cf,
++ 0x00000000,0x00050085,0x00000006,0x00000ed7,0x00000ed4,0x000006fd,0x00050051,0x00000006,
++ 0x00000ed9,0x000007cf,0x00000001,0x00050085,0x00000006,0x00000edc,0x00000ed9,0x00000702,
++ 0x00050081,0x00000006,0x00000edd,0x00000ed7,0x00000edc,0x00060052,0x0000000c,0x00001210,
++ 0x00000edd,0x0000129d,0x00000000,0x00050085,0x00000006,0x00000ee4,0x00000ed4,0x00000c8b,
++ 0x00050085,0x00000006,0x00000ee9,0x00000ed9,0x000006fd,0x00050081,0x00000006,0x00000eea,
++ 0x00000ee4,0x00000ee9,0x00060052,0x0000000c,0x00001216,0x00000eea,0x00001210,0x00000001,
++ 0x00050085,0x0000000c,0x00000eee,0x00001216,0x0000071c,0x00050051,0x00000006,0x00000ef0,
++ 0x00000eee,0x00000000,0x00050085,0x00000006,0x00000ef3,0x00000ef0,0x00000ef0,0x00050051,
++ 0x00000006,0x00000ef5,0x00000eee,0x00000001,0x00050085,0x00000006,0x00000ef8,0x00000ef5,
++ 0x00000ef5,0x00050081,0x00000006,0x00000ef9,0x00000ef3,0x00000ef8,0x0007000c,0x00000006,
++ 0x00000efc,0x00000001,0x00000025,0x00000ef9,0x00000c55,0x00050085,0x00000006,0x00000eff,
++ 0x0000010d,0x00000efc,0x00050081,0x00000006,0x00000f01,0x00000eff,0x00000112,0x00050085,
++ 0x00000006,0x00000f04,0x00000721,0x00000efc,0x00050081,0x00000006,0x00000f06,0x00000f04,
++ 0x00000112,0x00050085,0x00000006,0x00000f09,0x00000f01,0x00000f01,0x00050085,0x00000006,
++ 0x00000f0c,0x00000f06,0x00000f06,0x00050085,0x00000006,0x00000f0f,0x00000123,0x00000f09,
++ 0x00050081,0x00000006,0x00000f11,0x00000f0f,0x00000128,0x00050085,0x00000006,0x00000f14,
++ 0x00000f11,0x00000f0c,0x0005008e,0x00000011,0x00000f17,0x00000740,0x00000f14,0x00050081,
++ 0x00000011,0x00000f19,0x00000eb5,0x00000f17,0x00050081,0x00000006,0x00000f1c,0x00000eb8,
++ 0x00000f14,0x00050083,0x0000000c,0x000007e1,0x0000045a,0x0000062b,0x00050051,0x00000006,
++ 0x000007e3,0x00000883,0x00000001,0x00050051,0x00000006,0x000007e5,0x0000088d,0x00000001,
++ 0x00050051,0x00000006,0x000007e7,0x00000897,0x00000001,0x00060050,0x00000011,0x000007e8,
++ 0x000007e3,0x000007e5,0x000007e7,0x00050051,0x00000006,0x00000f38,0x000007e1,0x00000000,
++ 0x00050085,0x00000006,0x00000f3b,0x00000f38,0x000006fd,0x00050051,0x00000006,0x00000f3d,
++ 0x000007e1,0x00000001,0x00050085,0x00000006,0x00000f40,0x00000f3d,0x00000702,0x00050081,
++ 0x00000006,0x00000f41,0x00000f3b,0x00000f40,0x00060052,0x0000000c,0x00001223,0x00000f41,
++ 0x0000129d,0x00000000,0x00050085,0x00000006,0x00000f48,0x00000f38,0x00000c8b,0x00050085,
++ 0x00000006,0x00000f4d,0x00000f3d,0x000006fd,0x00050081,0x00000006,0x00000f4e,0x00000f48,
++ 0x00000f4d,0x00060052,0x0000000c,0x00001229,0x00000f4e,0x00001223,0x00000001,0x00050085,
++ 0x0000000c,0x00000f52,0x00001229,0x0000071c,0x00050051,0x00000006,0x00000f54,0x00000f52,
++ 0x00000000,0x00050085,0x00000006,0x00000f57,0x00000f54,0x00000f54,0x00050051,0x00000006,
++ 0x00000f59,0x00000f52,0x00000001,0x00050085,0x00000006,0x00000f5c,0x00000f59,0x00000f59,
++ 0x00050081,0x00000006,0x00000f5d,0x00000f57,0x00000f5c,0x0007000c,0x00000006,0x00000f60,
++ 0x00000001,0x00000025,0x00000f5d,0x00000c55,0x00050085,0x00000006,0x00000f63,0x0000010d,
++ 0x00000f60,0x00050081,0x00000006,0x00000f65,0x00000f63,0x00000112,0x00050085,0x00000006,
++ 0x00000f68,0x00000721,0x00000f60,0x00050081,0x00000006,0x00000f6a,0x00000f68,0x00000112,
++ 0x00050085,0x00000006,0x00000f6d,0x00000f65,0x00000f65,0x00050085,0x00000006,0x00000f70,
++ 0x00000f6a,0x00000f6a,0x00050085,0x00000006,0x00000f73,0x00000123,0x00000f6d,0x00050081,
++ 0x00000006,0x00000f75,0x00000f73,0x00000128,0x00050085,0x00000006,0x00000f78,0x00000f75,
++ 0x00000f70,0x0005008e,0x00000011,0x00000f7b,0x000007e8,0x00000f78,0x00050081,0x00000011,
++ 0x00000f7d,0x00000f19,0x00000f7b,0x00050081,0x00000006,0x00000f80,0x00000f1c,0x00000f78,
++ 0x00050083,0x0000000c,0x000007f3,0x00000475,0x0000062b,0x00050051,0x00000006,0x000007f5,
++ 0x00000883,0x00000002,0x00050051,0x00000006,0x000007f7,0x0000088d,0x00000002,0x00050051,
++ 0x00000006,0x000007f9,0x00000897,0x00000002,0x00060050,0x00000011,0x000007fa,0x000007f5,
++ 0x000007f7,0x000007f9,0x00050051,0x00000006,0x00000f9c,0x000007f3,0x00000000,0x00050085,
++ 0x00000006,0x00000f9f,0x00000f9c,0x000006fd,0x00050051,0x00000006,0x00000fa1,0x000007f3,
++ 0x00000001,0x00050085,0x00000006,0x00000fa4,0x00000fa1,0x00000702,0x00050081,0x00000006,
++ 0x00000fa5,0x00000f9f,0x00000fa4,0x00060052,0x0000000c,0x00001236,0x00000fa5,0x0000129d,
++ 0x00000000,0x00050085,0x00000006,0x00000fac,0x00000f9c,0x00000c8b,0x00050085,0x00000006,
++ 0x00000fb1,0x00000fa1,0x000006fd,0x00050081,0x00000006,0x00000fb2,0x00000fac,0x00000fb1,
++ 0x00060052,0x0000000c,0x0000123c,0x00000fb2,0x00001236,0x00000001,0x00050085,0x0000000c,
++ 0x00000fb6,0x0000123c,0x0000071c,0x00050051,0x00000006,0x00000fb8,0x00000fb6,0x00000000,
++ 0x00050085,0x00000006,0x00000fbb,0x00000fb8,0x00000fb8,0x00050051,0x00000006,0x00000fbd,
++ 0x00000fb6,0x00000001,0x00050085,0x00000006,0x00000fc0,0x00000fbd,0x00000fbd,0x00050081,
++ 0x00000006,0x00000fc1,0x00000fbb,0x00000fc0,0x0007000c,0x00000006,0x00000fc4,0x00000001,
++ 0x00000025,0x00000fc1,0x00000c55,0x00050085,0x00000006,0x00000fc7,0x0000010d,0x00000fc4,
++ 0x00050081,0x00000006,0x00000fc9,0x00000fc7,0x00000112,0x00050085,0x00000006,0x00000fcc,
++ 0x00000721,0x00000fc4,0x00050081,0x00000006,0x00000fce,0x00000fcc,0x00000112,0x00050085,
++ 0x00000006,0x00000fd1,0x00000fc9,0x00000fc9,0x00050085,0x00000006,0x00000fd4,0x00000fce,
++ 0x00000fce,0x00050085,0x00000006,0x00000fd7,0x00000123,0x00000fd1,0x00050081,0x00000006,
++ 0x00000fd9,0x00000fd7,0x00000128,0x00050085,0x00000006,0x00000fdc,0x00000fd9,0x00000fd4,
++ 0x0005008e,0x00000011,0x00000fdf,0x000007fa,0x00000fdc,0x00050081,0x00000011,0x00000fe1,
++ 0x00000f7d,0x00000fdf,0x00050081,0x00000006,0x00000fe4,0x00000f80,0x00000fdc,0x00050083,
++ 0x0000000c,0x00000805,0x00000490,0x0000062b,0x00050051,0x00000006,0x00001000,0x00000805,
++ 0x00000000,0x00050085,0x00000006,0x00001003,0x00001000,0x000006fd,0x00050051,0x00000006,
++ 0x00001005,0x00000805,0x00000001,0x00050085,0x00000006,0x00001008,0x00001005,0x00000702,
++ 0x00050081,0x00000006,0x00001009,0x00001003,0x00001008,0x00060052,0x0000000c,0x00001249,
++ 0x00001009,0x0000129d,0x00000000,0x00050085,0x00000006,0x00001010,0x00001000,0x00000c8b,
++ 0x00050085,0x00000006,0x00001015,0x00001005,0x000006fd,0x00050081,0x00000006,0x00001016,
++ 0x00001010,0x00001015,0x00060052,0x0000000c,0x0000124f,0x00001016,0x00001249,0x00000001,
++ 0x00050085,0x0000000c,0x0000101a,0x0000124f,0x0000071c,0x00050051,0x00000006,0x0000101c,
++ 0x0000101a,0x00000000,0x00050085,0x00000006,0x0000101f,0x0000101c,0x0000101c,0x00050051,
++ 0x00000006,0x00001021,0x0000101a,0x00000001,0x00050085,0x00000006,0x00001024,0x00001021,
++ 0x00001021,0x00050081,0x00000006,0x00001025,0x0000101f,0x00001024,0x0007000c,0x00000006,
++ 0x00001028,0x00000001,0x00000025,0x00001025,0x00000c55,0x00050085,0x00000006,0x0000102b,
++ 0x0000010d,0x00001028,0x00050081,0x00000006,0x0000102d,0x0000102b,0x00000112,0x00050085,
++ 0x00000006,0x00001030,0x00000721,0x00001028,0x00050081,0x00000006,0x00001032,0x00001030,
++ 0x00000112,0x00050085,0x00000006,0x00001035,0x0000102d,0x0000102d,0x00050085,0x00000006,
++ 0x00001038,0x00001032,0x00001032,0x00050085,0x00000006,0x0000103b,0x00000123,0x00001035,
++ 0x00050081,0x00000006,0x0000103d,0x0000103b,0x00000128,0x00050085,0x00000006,0x00001040,
++ 0x0000103d,0x00001038,0x0005008e,0x00000011,0x00001043,0x00000731,0x00001040,0x00050081,
++ 0x00000011,0x00001045,0x00000fe1,0x00001043,0x00050081,0x00000006,0x00001048,0x00000fe4,
++ 0x00001040,0x00050083,0x0000000c,0x00000817,0x000004ab,0x0000062b,0x00050051,0x00000006,
++ 0x00000819,0x000008a1,0x00000002,0x00050051,0x00000006,0x0000081b,0x000008ab,0x00000002,
++ 0x00050051,0x00000006,0x0000081d,0x000008b5,0x00000002,0x00060050,0x00000011,0x0000081e,
++ 0x00000819,0x0000081b,0x0000081d,0x00050051,0x00000006,0x00001064,0x00000817,0x00000000,
++ 0x00050085,0x00000006,0x00001067,0x00001064,0x000006fd,0x00050051,0x00000006,0x00001069,
++ 0x00000817,0x00000001,0x00050085,0x00000006,0x0000106c,0x00001069,0x00000702,0x00050081,
++ 0x00000006,0x0000106d,0x00001067,0x0000106c,0x00060052,0x0000000c,0x0000125c,0x0000106d,
++ 0x0000129d,0x00000000,0x00050085,0x00000006,0x00001074,0x00001064,0x00000c8b,0x00050085,
++ 0x00000006,0x00001079,0x00001069,0x000006fd,0x00050081,0x00000006,0x0000107a,0x00001074,
++ 0x00001079,0x00060052,0x0000000c,0x00001262,0x0000107a,0x0000125c,0x00000001,0x00050085,
++ 0x0000000c,0x0000107e,0x00001262,0x0000071c,0x00050051,0x00000006,0x00001080,0x0000107e,
++ 0x00000000,0x00050085,0x00000006,0x00001083,0x00001080,0x00001080,0x00050051,0x00000006,
++ 0x00001085,0x0000107e,0x00000001,0x00050085,0x00000006,0x00001088,0x00001085,0x00001085,
++ 0x00050081,0x00000006,0x00001089,0x00001083,0x00001088,0x0007000c,0x00000006,0x0000108c,
++ 0x00000001,0x00000025,0x00001089,0x00000c55,0x00050085,0x00000006,0x0000108f,0x0000010d,
++ 0x0000108c,0x00050081,0x00000006,0x00001091,0x0000108f,0x00000112,0x00050085,0x00000006,
++ 0x00001094,0x00000721,0x0000108c,0x00050081,0x00000006,0x00001096,0x00001094,0x00000112,
++ 0x00050085,0x00000006,0x00001099,0x00001091,0x00001091,0x00050085,0x00000006,0x0000109c,
++ 0x00001096,0x00001096,0x00050085,0x00000006,0x0000109f,0x00000123,0x00001099,0x00050081,
++ 0x00000006,0x000010a1,0x0000109f,0x00000128,0x00050085,0x00000006,0x000010a4,0x000010a1,
++ 0x0000109c,0x0005008e,0x00000011,0x000010a7,0x0000081e,0x000010a4,0x00050081,0x00000011,
++ 0x000010a9,0x00001045,0x000010a7,0x00050081,0x00000006,0x000010ac,0x00001048,0x000010a4,
++ 0x00050083,0x0000000c,0x00000829,0x000004c6,0x0000062b,0x00050051,0x00000006,0x0000082b,
++ 0x000008a1,0x00000003,0x00050051,0x00000006,0x0000082d,0x000008ab,0x00000003,0x00050051,
++ 0x00000006,0x0000082f,0x000008b5,0x00000003,0x00060050,0x00000011,0x00000830,0x0000082b,
++ 0x0000082d,0x0000082f,0x00050051,0x00000006,0x000010c8,0x00000829,0x00000000,0x00050085,
++ 0x00000006,0x000010cb,0x000010c8,0x000006fd,0x00050051,0x00000006,0x000010cd,0x00000829,
++ 0x00000001,0x00050085,0x00000006,0x000010d0,0x000010cd,0x00000702,0x00050081,0x00000006,
++ 0x000010d1,0x000010cb,0x000010d0,0x00060052,0x0000000c,0x0000126f,0x000010d1,0x0000129d,
++ 0x00000000,0x00050085,0x00000006,0x000010d8,0x000010c8,0x00000c8b,0x00050085,0x00000006,
++ 0x000010dd,0x000010cd,0x000006fd,0x00050081,0x00000006,0x000010de,0x000010d8,0x000010dd,
++ 0x00060052,0x0000000c,0x00001275,0x000010de,0x0000126f,0x00000001,0x00050085,0x0000000c,
++ 0x000010e2,0x00001275,0x0000071c,0x00050051,0x00000006,0x000010e4,0x000010e2,0x00000000,
++ 0x00050085,0x00000006,0x000010e7,0x000010e4,0x000010e4,0x00050051,0x00000006,0x000010e9,
++ 0x000010e2,0x00000001,0x00050085,0x00000006,0x000010ec,0x000010e9,0x000010e9,0x00050081,
++ 0x00000006,0x000010ed,0x000010e7,0x000010ec,0x0007000c,0x00000006,0x000010f0,0x00000001,
++ 0x00000025,0x000010ed,0x00000c55,0x00050085,0x00000006,0x000010f3,0x0000010d,0x000010f0,
++ 0x00050081,0x00000006,0x000010f5,0x000010f3,0x00000112,0x00050085,0x00000006,0x000010f8,
++ 0x00000721,0x000010f0,0x00050081,0x00000006,0x000010fa,0x000010f8,0x00000112,0x00050085,
++ 0x00000006,0x000010fd,0x000010f5,0x000010f5,0x00050085,0x00000006,0x00001100,0x000010fa,
++ 0x000010fa,0x00050085,0x00000006,0x00001103,0x00000123,0x000010fd,0x00050081,0x00000006,
++ 0x00001105,0x00001103,0x00000128,0x00050085,0x00000006,0x00001108,0x00001105,0x00001100,
++ 0x0005008e,0x00000011,0x0000110b,0x00000830,0x00001108,0x00050081,0x00000011,0x0000110d,
++ 0x000010a9,0x0000110b,0x00050081,0x00000006,0x00001110,0x000010ac,0x00001108,0x00050088,
++ 0x00000006,0x00001125,0x00000093,0x00001110,0x00060050,0x00000011,0x0000112e,0x00001125,
++ 0x00001125,0x00001125,0x00050085,0x00000011,0x00000840,0x0000110d,0x0000112e,0x0007000c,
++ 0x00000011,0x00000841,0x00000001,0x00000028,0x00000741,0x00000840,0x0007000c,0x00000011,
++ 0x00000842,0x00000001,0x00000025,0x0000075f,0x00000841,0x0004003d,0x00000515,0x00000518,
++ 0x00000517,0x0004007c,0x0000051b,0x0000051c,0x000004f0,0x00050051,0x00000006,0x0000051e,
++ 0x00000842,0x00000000,0x00050051,0x00000006,0x0000051f,0x00000842,0x00000001,0x00050051,
++ 0x00000006,0x00000520,0x00000842,0x00000002,0x00070050,0x00000016,0x00000521,0x0000051e,
++ 0x0000051f,0x00000520,0x00000093,0x00040063,0x00000518,0x0000051c,0x00000521,0x000200f9,
++ 0x00000524,0x000200f8,0x00000524,0x000100fd,0x00010038
++};
++
++/*
++#version 460
++#extension GL_GOOGLE_include_directive: require
++
++layout(local_size_x=8, local_size_y=8, local_size_z=1) in;
++
++layout(binding = 0) uniform sampler2D texSampler;
++layout(binding = 1) uniform writeonly image2D outImage;
++
++layout(push_constant) uniform pushConstants {
++ uvec2 c1;
++ ivec2 extent;
++ ivec4 viewport;
++};
++
++#define A_GPU 1
++#define A_GLSL 1
++//#include "ffx_a.h"
++#define FSR_RCAS_F 1
++vec4 FsrRcasLoadF(ivec2 p) { return texelFetch(texSampler, clamp(p, ivec2(0), extent), 0); }
++void FsrRcasInputF(inout float r, inout float g, inout float b) {}
++//#include "ffx_fsr1.h"
++
++
++void main()
++{
++ vec3 color;
++
++ if (any(lessThan(gl_GlobalInvocationID.xy, uvec2(viewport.xy))) ||
++ any(greaterThan(gl_GlobalInvocationID.xy, uvec2(viewport.zw))))
++ {
++ color = vec3(0.0, 0.0, 0.0);
++ }
++ else
++ {
++ FsrRcasF(color.r, color.g, color.b, uvec2(gl_GlobalInvocationID.xy - viewport.xy), c1.xyxx);
++ }
++
++ imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1.0));
++}
++*/
++const uint32_t fsr_rcas_comp_spv[] = {
++ 0x07230203,0x00010000,0x0008000a,0x0000061e,0x00000000,0x00020011,0x00000001,0x00020011,
++ 0x00000038,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
++ 0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000287,
++ 0x00060010,0x00000004,0x00000011,0x00000008,0x00000008,0x00000001,0x00030003,0x00000002,
++ 0x000001cc,0x000a0004,0x475f4c47,0x4c474f4f,0x70635f45,0x74735f70,0x5f656c79,0x656e696c,
++ 0x7269645f,0x69746365,0x00006576,0x00080004,0x475f4c47,0x4c474f4f,0x6e695f45,0x64756c63,
++ 0x69645f65,0x74636572,0x00657669,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,
++ 0x0000007b,0x53786574,0x6c706d61,0x00007265,0x00060005,0x00000081,0x68737570,0x736e6f43,
++ 0x746e6174,0x00000073,0x00040006,0x00000081,0x00000000,0x00003163,0x00050006,0x00000081,
++ 0x00000001,0x65747865,0x0000746e,0x00060006,0x00000081,0x00000002,0x77656976,0x74726f70,
++ 0x00000000,0x00030005,0x00000083,0x00000000,0x00080005,0x00000287,0x475f6c67,0x61626f6c,
++ 0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00050005,0x000002c0,0x4974756f,0x6567616d,
++ 0x00000000,0x00040047,0x0000007b,0x00000022,0x00000000,0x00040047,0x0000007b,0x00000021,
++ 0x00000000,0x00050048,0x00000081,0x00000000,0x00000023,0x00000000,0x00050048,0x00000081,
++ 0x00000001,0x00000023,0x00000008,0x00050048,0x00000081,0x00000002,0x00000023,0x00000010,
++ 0x00030047,0x00000081,0x00000002,0x00040047,0x00000287,0x0000000b,0x0000001c,0x00040047,
++ 0x000002c0,0x00000022,0x00000000,0x00040047,0x000002c0,0x00000021,0x00000001,0x00030047,
++ 0x000002c0,0x00000019,0x00040047,0x000002cb,0x0000000b,0x00000019,0x00020013,0x00000002,
++ 0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040015,0x0000000c,
++ 0x00000020,0x00000000,0x00040015,0x00000026,0x00000020,0x00000001,0x00040017,0x00000027,
++ 0x00000026,0x00000002,0x00040017,0x00000029,0x00000006,0x00000004,0x00040017,0x00000034,
++ 0x0000000c,0x00000002,0x0004002b,0x00000006,0x00000054,0x3f800000,0x0004002b,0x00000006,
++ 0x0000005c,0x00000000,0x0004002b,0x0000000c,0x00000065,0x7ef19fff,0x0004002b,0x00000006,
++ 0x00000071,0x40000000,0x00090019,0x00000078,0x00000006,0x00000001,0x00000000,0x00000000,
++ 0x00000000,0x00000001,0x00000000,0x0003001b,0x00000079,0x00000078,0x00040020,0x0000007a,
++ 0x00000000,0x00000079,0x0004003b,0x0000007a,0x0000007b,0x00000000,0x0004002b,0x00000026,
++ 0x0000007e,0x00000000,0x0005002c,0x00000027,0x0000007f,0x0000007e,0x0000007e,0x00040017,
++ 0x00000080,0x00000026,0x00000004,0x0005001e,0x00000081,0x00000034,0x00000027,0x00000080,
++ 0x00040020,0x00000082,0x00000009,0x00000081,0x0004003b,0x00000082,0x00000083,0x00000009,
++ 0x0004002b,0x00000026,0x00000084,0x00000001,0x00040020,0x00000085,0x00000009,0x00000027,
++ 0x00040017,0x00000090,0x00000006,0x00000003,0x0004002b,0x00000026,0x00000094,0xffffffff,
++ 0x0005002c,0x00000027,0x00000095,0x0000007e,0x00000094,0x0005002c,0x00000027,0x0000009c,
++ 0x00000094,0x0000007e,0x0005002c,0x00000027,0x000000a8,0x00000084,0x0000007e,0x0005002c,
++ 0x00000027,0x000000af,0x0000007e,0x00000084,0x0004002b,0x0000000c,0x000000b9,0x00000001,
++ 0x0004002b,0x00000006,0x00000154,0x3e800000,0x0004002b,0x00000006,0x000001d3,0xc0800000,
++ 0x0004002b,0x00000006,0x000001d7,0x40800000,0x0004002b,0x00000006,0x0000022e,0xbe400000,
++ 0x00020014,0x00000284,0x00040017,0x00000285,0x0000000c,0x00000003,0x00040020,0x00000286,
++ 0x00000001,0x00000285,0x0004003b,0x00000286,0x00000287,0x00000001,0x0004002b,0x00000026,
++ 0x0000028a,0x00000002,0x00040020,0x0000028b,0x00000009,0x00000080,0x00040017,0x00000290,
++ 0x00000284,0x00000002,0x0006002c,0x00000090,0x000002a2,0x0000005c,0x0000005c,0x0000005c,
++ 0x00040020,0x000002b3,0x00000009,0x00000034,0x00090019,0x000002be,0x00000006,0x00000001,
++ 0x00000000,0x00000000,0x00000000,0x00000002,0x00000000,0x00040020,0x000002bf,0x00000000,
++ 0x000002be,0x0004003b,0x000002bf,0x000002c0,0x00000000,0x0004002b,0x0000000c,0x000002ca,
++ 0x00000008,0x0006002c,0x00000285,0x000002cb,0x000002ca,0x000002ca,0x000000b9,0x00030001,
++ 0x00000090,0x0000061d,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
++ 0x00000005,0x0004003d,0x00000285,0x00000288,0x00000287,0x0007004f,0x00000034,0x00000289,
++ 0x00000288,0x00000288,0x00000000,0x00000001,0x00050041,0x0000028b,0x0000028c,0x00000083,
++ 0x0000028a,0x0004003d,0x00000080,0x0000028d,0x0000028c,0x0007004f,0x00000027,0x0000028e,
++ 0x0000028d,0x0000028d,0x00000000,0x00000001,0x0004007c,0x00000034,0x0000028f,0x0000028e,
++ 0x000500b0,0x00000290,0x00000291,0x00000289,0x0000028f,0x0004009a,0x00000284,0x00000292,
++ 0x00000291,0x000400a8,0x00000284,0x00000293,0x00000292,0x000300f7,0x00000295,0x00000000,
++ 0x000400fa,0x00000293,0x00000294,0x00000295,0x000200f8,0x00000294,0x0007004f,0x00000027,
++ 0x0000029a,0x0000028d,0x0000028d,0x00000002,0x00000003,0x0004007c,0x00000034,0x0000029b,
++ 0x0000029a,0x000500ac,0x00000290,0x0000029c,0x00000289,0x0000029b,0x0004009a,0x00000284,
++ 0x0000029d,0x0000029c,0x000200f9,0x00000295,0x000200f8,0x00000295,0x000700f5,0x00000284,
++ 0x0000029e,0x00000292,0x00000005,0x0000029d,0x00000294,0x000300f7,0x000002a0,0x00000000,
++ 0x000400fa,0x0000029e,0x0000029f,0x000002a3,0x000200f8,0x0000029f,0x000200f9,0x000002a0,
++ 0x000200f8,0x000002a3,0x00050082,0x00000034,0x000002aa,0x00000289,0x0000028f,0x00050041,
++ 0x000002b3,0x000002b4,0x00000083,0x0000007e,0x0004003d,0x00000034,0x000002b5,0x000002b4,
++ 0x0004007c,0x00000027,0x00000353,0x000002aa,0x00050080,0x00000027,0x00000355,0x00000353,
++ 0x00000095,0x0004003d,0x00000079,0x000004b3,0x0000007b,0x00050041,0x00000085,0x000004b5,
++ 0x00000083,0x00000084,0x0004003d,0x00000027,0x000004b6,0x000004b5,0x0008000c,0x00000027,
++ 0x000004b7,0x00000001,0x0000002d,0x00000355,0x0000007f,0x000004b6,0x00040064,0x00000078,
++ 0x000004b8,0x000004b3,0x0007005f,0x00000029,0x000004b9,0x000004b8,0x000004b7,0x00000002,
++ 0x0000007e,0x00050080,0x00000027,0x00000359,0x00000353,0x0000009c,0x0008000c,0x00000027,
++ 0x000004c0,0x00000001,0x0000002d,0x00000359,0x0000007f,0x000004b6,0x00040064,0x00000078,
++ 0x000004c1,0x000004b3,0x0007005f,0x00000029,0x000004c2,0x000004c1,0x000004c0,0x00000002,
++ 0x0000007e,0x0008000c,0x00000027,0x000004c9,0x00000001,0x0000002d,0x00000353,0x0000007f,
++ 0x000004b6,0x00040064,0x00000078,0x000004ca,0x000004b3,0x0007005f,0x00000029,0x000004cb,
++ 0x000004ca,0x000004c9,0x00000002,0x0000007e,0x00050080,0x00000027,0x00000360,0x00000353,
++ 0x000000a8,0x0008000c,0x00000027,0x000004d2,0x00000001,0x0000002d,0x00000360,0x0000007f,
++ 0x000004b6,0x00040064,0x00000078,0x000004d3,0x000004b3,0x0007005f,0x00000029,0x000004d4,
++ 0x000004d3,0x000004d2,0x00000002,0x0000007e,0x00050080,0x00000027,0x00000364,0x00000353,
++ 0x000000af,0x0008000c,0x00000027,0x000004db,0x00000001,0x0000002d,0x00000364,0x0000007f,
++ 0x000004b6,0x00040064,0x00000078,0x000004dc,0x000004b3,0x0007005f,0x00000029,0x000004dd,
++ 0x000004dc,0x000004db,0x00000002,0x0000007e,0x00050051,0x00000006,0x00000368,0x000004b9,
++ 0x00000000,0x00050051,0x00000006,0x0000036a,0x000004b9,0x00000001,0x00050051,0x00000006,
++ 0x0000036c,0x000004b9,0x00000002,0x00050051,0x00000006,0x0000036e,0x000004c2,0x00000000,
++ 0x00050051,0x00000006,0x00000370,0x000004c2,0x00000001,0x00050051,0x00000006,0x00000372,
++ 0x000004c2,0x00000002,0x00050051,0x00000006,0x00000374,0x000004cb,0x00000000,0x00050051,
++ 0x00000006,0x00000376,0x000004cb,0x00000001,0x00050051,0x00000006,0x00000378,0x000004cb,
++ 0x00000002,0x00050051,0x00000006,0x0000037a,0x000004d4,0x00000000,0x00050051,0x00000006,
++ 0x0000037c,0x000004d4,0x00000001,0x00050051,0x00000006,0x0000037e,0x000004d4,0x00000002,
++ 0x00050051,0x00000006,0x00000380,0x000004dd,0x00000000,0x00050051,0x00000006,0x00000382,
++ 0x000004dd,0x00000001,0x00050051,0x00000006,0x00000384,0x000004dd,0x00000002,0x0007000c,
++ 0x00000006,0x0000055a,0x00000001,0x00000025,0x0000036e,0x0000037a,0x0007000c,0x00000006,
++ 0x0000055b,0x00000001,0x00000025,0x00000368,0x0000055a,0x0007000c,0x00000006,0x00000404,
++ 0x00000001,0x00000025,0x0000055b,0x00000380,0x0007000c,0x00000006,0x00000561,0x00000001,
++ 0x00000025,0x00000370,0x0000037c,0x0007000c,0x00000006,0x00000562,0x00000001,0x00000025,
++ 0x0000036a,0x00000561,0x0007000c,0x00000006,0x0000040a,0x00000001,0x00000025,0x00000562,
++ 0x00000382,0x0007000c,0x00000006,0x00000568,0x00000001,0x00000025,0x00000372,0x0000037e,
++ 0x0007000c,0x00000006,0x00000569,0x00000001,0x00000025,0x0000036c,0x00000568,0x0007000c,
++ 0x00000006,0x00000410,0x00000001,0x00000025,0x00000569,0x00000384,0x0007000c,0x00000006,
++ 0x0000056f,0x00000001,0x00000028,0x0000036e,0x0000037a,0x0007000c,0x00000006,0x00000570,
++ 0x00000001,0x00000028,0x00000368,0x0000056f,0x0007000c,0x00000006,0x00000416,0x00000001,
++ 0x00000028,0x00000570,0x00000380,0x0007000c,0x00000006,0x00000576,0x00000001,0x00000028,
++ 0x00000370,0x0000037c,0x0007000c,0x00000006,0x00000577,0x00000001,0x00000028,0x0000036a,
++ 0x00000576,0x0007000c,0x00000006,0x0000041c,0x00000001,0x00000028,0x00000577,0x00000382,
++ 0x0007000c,0x00000006,0x0000057d,0x00000001,0x00000028,0x00000372,0x0000037e,0x0007000c,
++ 0x00000006,0x0000057e,0x00000001,0x00000028,0x0000036c,0x0000057d,0x0007000c,0x00000006,
++ 0x00000422,0x00000001,0x00000028,0x0000057e,0x00000384,0x00050088,0x00000006,0x00000587,
++ 0x00000154,0x00000416,0x00050085,0x00000006,0x00000428,0x00000404,0x00000587,0x00050088,
++ 0x00000006,0x00000593,0x00000154,0x0000041c,0x00050085,0x00000006,0x0000042e,0x0000040a,
++ 0x00000593,0x00050088,0x00000006,0x0000059f,0x00000154,0x00000422,0x00050085,0x00000006,
++ 0x00000434,0x00000410,0x0000059f,0x00050083,0x00000006,0x00000438,0x00000054,0x00000416,
++ 0x00050085,0x00000006,0x0000043b,0x000001d7,0x00000404,0x00050081,0x00000006,0x0000043e,
++ 0x0000043b,0x000001d3,0x00050088,0x00000006,0x000005ab,0x00000054,0x0000043e,0x00050085,
++ 0x00000006,0x00000440,0x00000438,0x000005ab,0x00050083,0x00000006,0x00000444,0x00000054,
++ 0x0000041c,0x00050085,0x00000006,0x00000447,0x000001d7,0x0000040a,0x00050081,0x00000006,
++ 0x0000044a,0x00000447,0x000001d3,0x00050088,0x00000006,0x000005b7,0x00000054,0x0000044a,
++ 0x00050085,0x00000006,0x0000044c,0x00000444,0x000005b7,0x00050083,0x00000006,0x00000450,
++ 0x00000054,0x00000422,0x00050085,0x00000006,0x00000453,0x000001d7,0x00000410,0x00050081,
++ 0x00000006,0x00000456,0x00000453,0x000001d3,0x00050088,0x00000006,0x000005c3,0x00000054,
++ 0x00000456,0x00050085,0x00000006,0x00000458,0x00000450,0x000005c3,0x0004007f,0x00000006,
++ 0x0000045a,0x00000428,0x0007000c,0x00000006,0x0000045c,0x00000001,0x00000028,0x0000045a,
++ 0x00000440,0x0004007f,0x00000006,0x0000045e,0x0000042e,0x0007000c,0x00000006,0x00000460,
++ 0x00000001,0x00000028,0x0000045e,0x0000044c,0x0004007f,0x00000006,0x00000462,0x00000434,
++ 0x0007000c,0x00000006,0x00000464,0x00000001,0x00000028,0x00000462,0x00000458,0x0007000c,
++ 0x00000006,0x000005cf,0x00000001,0x00000028,0x00000460,0x00000464,0x0007000c,0x00000006,
++ 0x000005d0,0x00000001,0x00000028,0x0000045c,0x000005cf,0x0007000c,0x00000006,0x0000046b,
++ 0x00000001,0x00000025,0x000005d0,0x0000005c,0x0007000c,0x00000006,0x0000046c,0x00000001,
++ 0x00000028,0x0000022e,0x0000046b,0x00050051,0x0000000c,0x0000046e,0x000002b5,0x00000000,
++ 0x0004007c,0x00000006,0x0000046f,0x0000046e,0x00050085,0x00000006,0x00000470,0x0000046c,
++ 0x0000046f,0x00050085,0x00000006,0x00000473,0x000001d7,0x00000470,0x00050081,0x00000006,
++ 0x00000475,0x00000473,0x00000054,0x0004007c,0x0000000c,0x000005e1,0x00000475,0x00050082,
++ 0x0000000c,0x000005e2,0x00000065,0x000005e1,0x0004007c,0x00000006,0x000005e3,0x000005e2,
++ 0x0004007f,0x00000006,0x000005e6,0x000005e3,0x00050085,0x00000006,0x000005e8,0x000005e6,
++ 0x00000475,0x00050081,0x00000006,0x000005ea,0x000005e8,0x00000071,0x00050085,0x00000006,
++ 0x000005eb,0x000005e3,0x000005ea,0x00050081,0x00000006,0x00000611,0x00000368,0x0000036e,
++ 0x00050081,0x00000006,0x00000612,0x00000611,0x00000380,0x00050081,0x00000006,0x00000613,
++ 0x00000612,0x0000037a,0x00050085,0x00000006,0x00000485,0x00000470,0x00000613,0x00050081,
++ 0x00000006,0x00000487,0x00000485,0x00000374,0x00050085,0x00000006,0x00000489,0x00000487,
++ 0x000005eb,0x00050081,0x00000006,0x00000614,0x0000036a,0x00000370,0x00050081,0x00000006,
++ 0x00000615,0x00000614,0x00000382,0x00050081,0x00000006,0x00000616,0x00000615,0x0000037c,
++ 0x00050085,0x00000006,0x00000498,0x00000470,0x00000616,0x00050081,0x00000006,0x0000049a,
++ 0x00000498,0x00000376,0x00050085,0x00000006,0x0000049c,0x0000049a,0x000005eb,0x00050081,
++ 0x00000006,0x00000617,0x0000036c,0x00000372,0x00050081,0x00000006,0x00000618,0x00000617,
++ 0x00000384,0x00050081,0x00000006,0x00000619,0x00000618,0x0000037e,0x00050085,0x00000006,
++ 0x000004ab,0x00000470,0x00000619,0x00050081,0x00000006,0x000004ad,0x000004ab,0x00000378,
++ 0x00050085,0x00000006,0x000004af,0x000004ad,0x000005eb,0x00060052,0x00000090,0x00000609,
++ 0x00000489,0x0000061d,0x00000000,0x00060052,0x00000090,0x0000060b,0x0000049c,0x00000609,
++ 0x00000001,0x00060052,0x00000090,0x0000060d,0x000004af,0x0000060b,0x00000002,0x000200f9,
++ 0x000002a0,0x000200f8,0x000002a0,0x000700f5,0x00000090,0x0000061c,0x000002a2,0x0000029f,
++ 0x0000060d,0x000002a3,0x0004003d,0x000002be,0x000002c1,0x000002c0,0x0004007c,0x00000027,
++ 0x000002c4,0x00000289,0x00050051,0x00000006,0x000002c6,0x0000061c,0x00000000,0x00050051,
++ 0x00000006,0x000002c7,0x0000061c,0x00000001,0x00050051,0x00000006,0x000002c8,0x0000061c,
++ 0x00000002,0x00070050,0x00000029,0x000002c9,0x000002c6,0x000002c7,0x000002c8,0x00000054,
++ 0x00040063,0x000002c1,0x000002c4,0x000002c9,0x000100fd,0x00010038
++};
++
++static void destroy_pipeline(VkDevice device, struct fs_comp_pipeline *pipeline)
++{
++ device->funcs.p_vkDestroyPipeline(device->device, pipeline->pipeline, NULL);
++ pipeline->pipeline = VK_NULL_HANDLE;
++
++ device->funcs.p_vkDestroyPipelineLayout(device->device, pipeline->pipeline_layout, NULL);
++ pipeline->pipeline_layout = VK_NULL_HANDLE;
++}
++
++static VkResult create_pipeline(VkDevice device, struct VkSwapchainKHR_T *swapchain,
++ const uint32_t *code, uint32_t code_size, uint32_t push_size, struct fs_comp_pipeline *pipeline)
+@@ -2077 +2823,0 @@ static VkResult create_pipeline(VkDevice device, struct VkSwapchainKHR_T *swapch
+- VkResult res;
+@@ -2082,0 +2829,35 @@ static VkResult create_pipeline(VkDevice device, struct VkSwapchainKHR_T *swapch
++ VkPipelineLayoutCreateInfo pipelineLayoutInfo = {0};
++ VkShaderModuleCreateInfo shaderInfo = {0};
++ VkPushConstantRange pushConstants;
++ VkShaderModule shaderModule = 0;
++ VkResult res;
++
++ pipeline->push_size = push_size;
++
++ pushConstants.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
++ pushConstants.offset = 0;
++ pushConstants.size = push_size;
++
++ pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
++ pipelineLayoutInfo.setLayoutCount = 1;
++ pipelineLayoutInfo.pSetLayouts = &swapchain->descriptor_set_layout;
++ pipelineLayoutInfo.pushConstantRangeCount = 1;
++ pipelineLayoutInfo.pPushConstantRanges = &pushConstants;
++
++ res = device->funcs.p_vkCreatePipelineLayout(device->device, &pipelineLayoutInfo, NULL, &pipeline->pipeline_layout);
++ if(res != VK_SUCCESS)
++ {
++ ERR("vkCreatePipelineLayout: %d\n", res);
++ goto fail;
++ }
++
++ shaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
++ shaderInfo.codeSize = code_size;
++ shaderInfo.pCode = code;
++
++ res = device->funcs.p_vkCreateShaderModule(device->device, &shaderInfo, NULL, &shaderModule);
++ if(res != VK_SUCCESS)
++ {
++ ERR("vkCreateShaderModule: %d\n", res);
++ goto fail;
++ }
+@@ -2089 +2870 @@ static VkResult create_pipeline(VkDevice device, struct VkSwapchainKHR_T *swapch
+- pipelineInfo.layout = swapchain->pipeline_layout;
++ pipelineInfo.layout = pipeline->pipeline_layout;
+@@ -2093,5 +2874,3 @@ static VkResult create_pipeline(VkDevice device, struct VkSwapchainKHR_T *swapch
+- res = device->funcs.p_vkCreateComputePipelines(device->device, VK_NULL_HANDLE, 1, &pipelineInfo, NULL, &swapchain->pipeline);
+- if(res != VK_SUCCESS){
+- ERR("vkCreateComputePipelines: %d\n", res);
+- return res;
+- }
++ res = device->funcs.p_vkCreateComputePipelines(device->device, VK_NULL_HANDLE, 1, &pipelineInfo, NULL, &pipeline->pipeline);
++ if(res == VK_SUCCESS)
++ goto out;
+@@ -2099 +2878,9 @@ static VkResult create_pipeline(VkDevice device, struct VkSwapchainKHR_T *swapch
+- return VK_SUCCESS;
++ ERR("vkCreateComputePipelines: %d\n", res);
++
++fail:
++ destroy_pipeline(device, pipeline);
++
++out:
++ device->funcs.p_vkDestroyShaderModule(device->device, shaderModule, NULL);
++
++ return res;
+@@ -2131 +2918 @@ static VkResult create_descriptor_set(VkDevice device, struct VkSwapchainKHR_T *
+- realDescriptorImageInfo.imageView = hack->blit_view;
++ realDescriptorImageInfo.imageView = swapchain->fsr ? hack->fsr_view : hack->swapchain_view;
+@@ -2150,0 +2938,19 @@ static VkResult create_descriptor_set(VkDevice device, struct VkSwapchainKHR_T *
++ if (swapchain->fsr)
++ {
++ res = device->funcs.p_vkAllocateDescriptorSets(device->device, &descriptorAllocInfo, &hack->fsr_set);
++ if (res != VK_SUCCESS)
++ {
++ ERR("vkAllocateDescriptorSets: %d\n", res);
++ return res;
++ }
++
++ userDescriptorImageInfo.imageView = hack->fsr_view;
++
++ realDescriptorImageInfo.imageView = hack->swapchain_view;
++
++ descriptorWrites[0].dstSet = hack->fsr_set;
++ descriptorWrites[1].dstSet = hack->fsr_set;
++
++ device->funcs.p_vkUpdateDescriptorSets(device->device, 2, descriptorWrites, 0, NULL);
++ }
++
+@@ -2154 +2960 @@ static VkResult create_descriptor_set(VkDevice device, struct VkSwapchainKHR_T *
+-static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapchain)
++static VkResult init_compute_state(VkDevice device, struct VkSwapchainKHR_T *swapchain)
+@@ -2162,5 +2968 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- VkPipelineLayoutCreateInfo pipelineLayoutInfo = {0};
+- VkPushConstantRange pushConstants;
+- VkShaderModuleCreateInfo shaderInfo = {0};
+- VkShaderModule shaderModule = 0;
+- VkDeviceSize blitMemTotal = 0, offs;
++ VkDeviceSize fsrMemTotal = 0, offs;
+@@ -2169 +2971 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- VkMemoryRequirements_host blitMemReq;
++ VkMemoryRequirements_host fsrMemReq;
+@@ -2174 +2976 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- VkMemoryRequirements blitMemReq;
++ VkMemoryRequirements fsrMemReq;
+@@ -2179 +2981 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- uint32_t blit_memory_type = -1, i;
++ uint32_t fsr_memory_type = -1, i;
+@@ -2184,3 +2986,3 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
+- samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
+- samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
++ samplerInfo.addressModeU = swapchain->fsr ? VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE : VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
++ samplerInfo.addressModeV = swapchain->fsr ? VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE : VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
++ samplerInfo.addressModeW = swapchain->fsr ? VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE : VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
+@@ -2214,0 +3017,7 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
++ if (swapchain->fsr)
++ {
++ poolSizes[0].descriptorCount *= 2;
++ poolSizes[1].descriptorCount *= 2;
++ poolInfo.maxSets *= 2;
++ }
++
+@@ -2243,27 +3052 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- pushConstants.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
+- pushConstants.offset = 0;
+- pushConstants.size = 4 * sizeof(float); /* 2 * vec2 */
+-
+- pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+- pipelineLayoutInfo.setLayoutCount = 1;
+- pipelineLayoutInfo.pSetLayouts = &swapchain->descriptor_set_layout;
+- pipelineLayoutInfo.pushConstantRangeCount = 1;
+- pipelineLayoutInfo.pPushConstantRanges = &pushConstants;
+-
+- res = device->funcs.p_vkCreatePipelineLayout(device->device, &pipelineLayoutInfo, NULL, &swapchain->pipeline_layout);
+- if(res != VK_SUCCESS){
+- ERR("vkCreatePipelineLayout: %d\n", res);
+- goto fail;
+- }
+-
+- shaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+- shaderInfo.codeSize = sizeof(blit_comp_spv);
+- shaderInfo.pCode = blit_comp_spv;
+-
+- res = device->funcs.p_vkCreateShaderModule(device->device, &shaderInfo, NULL, &shaderModule);
+- if(res != VK_SUCCESS){
+- ERR("vkCreateShaderModule: %d\n", res);
+- goto fail;
+- }
+-
+- res = create_pipeline(device, swapchain, shaderModule);
++ res = create_pipeline(device, swapchain, blit_comp_spv, sizeof(blit_comp_spv), 4 * sizeof(float) /* 2 * vec2 */, &swapchain->blit_pipeline);
+@@ -2273 +3056,8 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- device->funcs.p_vkDestroyShaderModule(device->device, shaderModule, NULL);
++ if (swapchain->fsr)
++ {
++ res = create_pipeline(device, swapchain, fsr_easu_comp_spv, sizeof(fsr_easu_comp_spv), 16 * sizeof(uint32_t) /* 4 * uvec4 */, &swapchain->fsr_easu_pipeline);
++ if (res != VK_SUCCESS)
++ goto fail;
++ res = create_pipeline(device, swapchain, fsr_rcas_comp_spv, sizeof(fsr_rcas_comp_spv), 8 * sizeof(uint32_t) /* uvec4 + ivec4 */, &swapchain->fsr_rcas_pipeline);
++ if (res != VK_SUCCESS)
++ goto fail;
+@@ -2275,4 +3065,3 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- if(!(swapchain->surface_usage & VK_IMAGE_USAGE_STORAGE_BIT)){
+- TRACE("using intermediate blit images\n");
+- /* create intermediate blit images */
+- for(i = 0; i < swapchain->n_images; ++i){
++ /* create intermediate fsr images */
++ for (i = 0; i < swapchain->n_images; ++i)
++ {
+@@ -2283,2 +3072,2 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- imageInfo.extent.width = swapchain->real_extent.width;
+- imageInfo.extent.height = swapchain->real_extent.height;
++ imageInfo.extent.width = swapchain->blit_dst.extent.width;
++ imageInfo.extent.height = swapchain->blit_dst.extent.height;
+@@ -2291 +3080 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- imageInfo.usage = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
++ imageInfo.usage = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+@@ -2294 +3083 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- res = device->funcs.p_vkCreateImage(device->device, &imageInfo, NULL, &hack->blit_image);
++ res = device->funcs.p_vkCreateImage(device->device, &imageInfo, NULL, &hack->fsr_image);
+@@ -2300 +3089 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- device->funcs.p_vkGetImageMemoryRequirements(device->device, hack->blit_image, &blitMemReq);
++ device->funcs.p_vkGetImageMemoryRequirements(device->device, hack->fsr_image, &fsrMemReq);
+@@ -2302 +3091 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- offs = blitMemTotal % blitMemReq.alignment;
++ offs = fsrMemTotal % fsrMemReq.alignment;
+@@ -2304 +3093 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- blitMemTotal += blitMemReq.alignment - offs;
++ fsrMemTotal += fsrMemReq.alignment - offs;
+@@ -2306 +3095 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- blitMemTotal += blitMemReq.size;
++ fsrMemTotal += fsrMemReq.size;
+@@ -2314,2 +3103,2 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- if(blitMemReq.memoryTypeBits & (1 << i)){
+- blit_memory_type = i;
++ if(fsrMemReq.memoryTypeBits & (1 << i)){
++ fsr_memory_type = i;
+@@ -2321 +3110 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- if(blit_memory_type == -1){
++ if(fsr_memory_type == -1){
+@@ -2328,2 +3117,2 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- allocInfo.allocationSize = blitMemTotal;
+- allocInfo.memoryTypeIndex = blit_memory_type;
++ allocInfo.allocationSize = fsrMemTotal;
++ allocInfo.memoryTypeIndex = fsr_memory_type;
+@@ -2331 +3120 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- res = device->funcs.p_vkAllocateMemory(device->device, &allocInfo, NULL, &swapchain->blit_image_memory);
++ res = device->funcs.p_vkAllocateMemory(device->device, &allocInfo, NULL, &swapchain->fsr_image_memory);
+@@ -2338 +3127 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- blitMemTotal = 0;
++ fsrMemTotal = 0;
+@@ -2342 +3131 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- device->funcs.p_vkGetImageMemoryRequirements(device->device, hack->blit_image, &blitMemReq);
++ device->funcs.p_vkGetImageMemoryRequirements(device->device, hack->fsr_image, &fsrMemReq);
+@@ -2344 +3133 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- offs = blitMemTotal % blitMemReq.alignment;
++ offs = fsrMemTotal % fsrMemReq.alignment;
+@@ -2346 +3135 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- blitMemTotal += blitMemReq.alignment - offs;
++ fsrMemTotal += fsrMemReq.alignment - offs;
+@@ -2348 +3137 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- res = device->funcs.p_vkBindImageMemory(device->device, hack->blit_image, swapchain->blit_image_memory, blitMemTotal);
++ res = device->funcs.p_vkBindImageMemory(device->device, hack->fsr_image, swapchain->fsr_image_memory, fsrMemTotal);
+@@ -2354 +3143,24 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- blitMemTotal += blitMemReq.size;
++ fsrMemTotal += fsrMemReq.size;
++ }
++
++ /* create imageviews */
++ for (i = 0; i < swapchain->n_images; ++i)
++ {
++ struct fs_hack_image *hack = &swapchain->fs_hack_images[i];
++
++ viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
++ viewInfo.image = hack->fsr_image;
++ viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
++ viewInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
++ viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
++ viewInfo.subresourceRange.baseMipLevel = 0;
++ viewInfo.subresourceRange.levelCount = 1;
++ viewInfo.subresourceRange.baseArrayLayer = 0;
++ viewInfo.subresourceRange.layerCount = 1;
++
++ res = device->funcs.p_vkCreateImageView(device->device, &viewInfo, NULL, &hack->fsr_view);
++ if(res != VK_SUCCESS)
++ {
++ ERR("vkCreateImageView(blit): %d\n", res);
++ goto fail;
++ }
+@@ -2356,2 +3168,2 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- }else
+- TRACE("blitting directly to swapchain images\n");
++ }
++
+@@ -2364 +3176 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- viewInfo.image = hack->blit_image ? hack->blit_image : hack->swapchain_image;
++ viewInfo.image = hack->swapchain_image;
+@@ -2366 +3178 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- viewInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
++ viewInfo.format = swapchain->format;
+@@ -2373 +3185 @@ static VkResult init_blit_images(VkDevice device, struct VkSwapchainKHR_T *swapc
+- res = device->funcs.p_vkCreateImageView(device->device, &viewInfo, NULL, &hack->blit_view);
++ res = device->funcs.p_vkCreateImageView(device->device, &viewInfo, NULL, &hack->swapchain_view);
+@@ -2390,2 +3202,2 @@ fail:
+- device->funcs.p_vkDestroyImageView(device->device, hack->blit_view, NULL);
+- hack->blit_view = VK_NULL_HANDLE;
++ device->funcs.p_vkDestroyImageView(device->device, hack->fsr_view, NULL);
++ hack->fsr_view = VK_NULL_HANDLE;
+@@ -2393,3 +3205,2 @@ fail:
+- device->funcs.p_vkDestroyImage(device->device, hack->blit_image, NULL);
+- hack->blit_image = VK_NULL_HANDLE;
+- }
++ device->funcs.p_vkDestroyImageView(device->device, hack->swapchain_view, NULL);
++ hack->swapchain_view = VK_NULL_HANDLE;
+@@ -2397,4 +3208,3 @@ fail:
+- device->funcs.p_vkDestroyShaderModule(device->device, shaderModule, NULL);
+-
+- device->funcs.p_vkDestroyPipeline(device->device, swapchain->pipeline, NULL);
+- swapchain->pipeline = VK_NULL_HANDLE;
++ device->funcs.p_vkDestroyImage(device->device, hack->fsr_image, NULL);
++ hack->fsr_image = VK_NULL_HANDLE;
++ }
+@@ -2402,2 +3212,3 @@ fail:
+- device->funcs.p_vkDestroyPipelineLayout(device->device, swapchain->pipeline_layout, NULL);
+- swapchain->pipeline_layout = VK_NULL_HANDLE;
++ destroy_pipeline(device, &swapchain->blit_pipeline);
++ destroy_pipeline(device, &swapchain->fsr_easu_pipeline);
++ destroy_pipeline(device, &swapchain->fsr_rcas_pipeline);
+@@ -2411,2 +3222,2 @@ fail:
+- device->funcs.p_vkFreeMemory(device->device, swapchain->blit_image_memory, NULL);
+- swapchain->blit_image_memory = VK_NULL_HANDLE;
++ device->funcs.p_vkFreeMemory(device->device, swapchain->fsr_image_memory, NULL);
++ swapchain->fsr_image_memory = VK_NULL_HANDLE;
+@@ -2423 +3234,2 @@ static void destroy_fs_hack_image(VkDevice device, struct VkSwapchainKHR_T *swap
+- device->funcs.p_vkDestroyImageView(device->device, hack->blit_view, NULL);
++ device->funcs.p_vkDestroyImageView(device->device, hack->swapchain_view, NULL);
++ device->funcs.p_vkDestroyImageView(device->device, hack->fsr_view, NULL);
+@@ -2425 +3237 @@ static void destroy_fs_hack_image(VkDevice device, struct VkSwapchainKHR_T *swap
+- device->funcs.p_vkDestroyImage(device->device, hack->blit_image, NULL);
++ device->funcs.p_vkDestroyImage(device->device, hack->fsr_image, NULL);
+@@ -2652 +3464 @@ VkResult WINAPI wine_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCrea
+- vk_funcs->query_fs_hack(native_info.surface, &object->real_extent, &user_sz, &object->blit_dst, &object->fs_hack_filter) &&
++ vk_funcs->query_fs_hack(native_info.surface, &object->real_extent, &user_sz, &object->blit_dst, &object->fs_hack_filter, &object->fsr, &object->sharpness) &&
+@@ -2677 +3489,3 @@ VkResult WINAPI wine_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCrea
+- native_info.imageUsage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; /* XXX: check if supported by surface */
++ native_info.imageUsage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT; /* XXX: check if supported by surface */
++
++ object->format = native_info.imageFormat;
+@@ -2709,3 +3523,2 @@ VkResult WINAPI wine_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCrea
+- /* FIXME: would be nice to do this on-demand, but games can use up all
+- * memory so we fail to allocate later */
+- result = init_blit_images(device, object);
++
++ result = init_compute_state(device, object);
+@@ -2714,0 +3528 @@ VkResult WINAPI wine_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCrea
++ WINE_VK_REMOVE_HANDLE_MAPPING(device->phys_dev->instance, object);
+@@ -2814 +3628 @@ VkResult WINAPI wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice
+- vk_funcs->query_fs_hack(wine_surface_from_handle(surface)->driver_surface, NULL, &user_res, NULL, NULL)){
++ vk_funcs->query_fs_hack(wine_surface_from_handle(surface)->driver_surface, NULL, &user_res, NULL, NULL, NULL, NULL)){
+@@ -2841 +3655 @@ VkResult WINAPI wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice
+- vk_funcs->query_fs_hack(wine_surface_from_handle(surface_info->surface)->driver_surface, NULL, &user_res, NULL, NULL)){
++ vk_funcs->query_fs_hack(wine_surface_from_handle(surface_info->surface)->driver_surface, NULL, &user_res, NULL, NULL, NULL, NULL)){
+@@ -3200,2 +4014,3 @@ void WINAPI wine_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain
+- device->funcs.p_vkDestroyPipeline(device->device, object->pipeline, NULL);
+- device->funcs.p_vkDestroyPipelineLayout(device->device, object->pipeline_layout, NULL);
++ destroy_pipeline(device, &object->blit_pipeline);
++ destroy_pipeline(device, &object->fsr_easu_pipeline);
++ destroy_pipeline(device, &object->fsr_rcas_pipeline);
+@@ -3206 +4021 @@ void WINAPI wine_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain
+- device->funcs.p_vkFreeMemory(device->device, object->blit_image_memory, NULL);
++ device->funcs.p_vkFreeMemory(device->device, object->fsr_image_memory, NULL);
+@@ -3282,0 +4098,32 @@ static VkCommandBuffer create_hack_cmd(VkQueue queue, struct VkSwapchainKHR_T *s
++static void bind_pipeline(VkDevice device, VkCommandBuffer cmd, struct fs_comp_pipeline *pipeline, VkDescriptorSet set, void *push_data)
++{
++ device->funcs.p_vkCmdBindPipeline(cmd,
++ VK_PIPELINE_BIND_POINT_COMPUTE, pipeline->pipeline);
++
++ device->funcs.p_vkCmdBindDescriptorSets(cmd,
++ VK_PIPELINE_BIND_POINT_COMPUTE, pipeline->pipeline_layout,
++ 0, 1, &set, 0, NULL);
++
++ device->funcs.p_vkCmdPushConstants(cmd,
++ pipeline->pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT,
++ 0, pipeline->push_size, push_data);
++}
++
++#if defined(USE_STRUCT_CONVERSION)
++static void init_barrier(VkImageMemoryBarrier_host *barrier)
++#else
++static void init_barrier(VkImageMemoryBarrier *barrier)
++#endif
++{
++ barrier->sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
++ barrier->pNext = NULL;
++ barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
++ barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
++ barrier->subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
++ barrier->subresourceRange.baseMipLevel = 0;
++ barrier->subresourceRange.levelCount = 1;
++ barrier->subresourceRange.baseArrayLayer = 0;
++ barrier->subresourceRange.layerCount = 1;
++}
++
++
+@@ -3285,2 +4131,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- VkResult result;
+- VkImageCopy region = {0};
+@@ -3288 +4133 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- VkImageMemoryBarrier_host barriers[3] = {{0}};
++ VkImageMemoryBarrier_host barriers[2] = {{0}};
+@@ -3291 +4136 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- VkImageMemoryBarrier barriers[3] = {{0}};
++ VkImageMemoryBarrier barriers[2] = {{0}};
+@@ -3294,0 +4140 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
++ VkResult result;
+@@ -3298,8 +4144,2 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+-#if 0
+- /* DOOM runs out of memory when allocating blit images after loading. */
+- if(!swapchain->blit_image_memory){
+- result = init_blit_images(device, swapchain);
+- if(result != VK_SUCCESS)
+- return result;
+- }
+-#endif
++ init_barrier(&barriers[0]);
++ init_barrier(&barriers[1]);
+@@ -3314 +4153,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+@@ -3317,2 +4155,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+@@ -3320,5 +4156,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[0].subresourceRange.baseMipLevel = 0;
+- barriers[0].subresourceRange.levelCount = 1;
+- barriers[0].subresourceRange.baseArrayLayer = 0;
+- barriers[0].subresourceRange.layerCount = 1;
+@@ -3329,2 +4161 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- /* transition blit image from whatever to GENERAL */
+- barriers[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
++ /* transition swapchain image from whatever to GENERAL */
+@@ -3333,8 +4164 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[1].image = hack->blit_image ? hack->blit_image : hack->swapchain_image;
+- barriers[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[1].subresourceRange.baseMipLevel = 0;
+- barriers[1].subresourceRange.levelCount = 1;
+- barriers[1].subresourceRange.baseArrayLayer = 0;
+- barriers[1].subresourceRange.layerCount = 1;
++ barriers[1].image = hack->swapchain_image;
+@@ -3342 +4166 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[1].dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
++ barriers[1].dstAccessMask = 0;
+@@ -3355,6 +4178,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- device->funcs.p_vkCmdBindPipeline(hack->cmd,
+- VK_PIPELINE_BIND_POINT_COMPUTE, swapchain->pipeline);
+-
+- device->funcs.p_vkCmdBindDescriptorSets(hack->cmd,
+- VK_PIPELINE_BIND_POINT_COMPUTE, swapchain->pipeline_layout,
+- 0, 1, &hack->descriptor_set, 0, NULL);
+@@ -3368,3 +4186,2 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- device->funcs.p_vkCmdPushConstants(hack->cmd,
+- swapchain->pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT,
+- 0, sizeof(constants), constants);
++
++ bind_pipeline(device, hack->cmd, &swapchain->blit_pipeline, hack->descriptor_set, constants);
+@@ -3377 +4193,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+@@ -3380,2 +4195,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+@@ -3383,6 +4197 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[0].subresourceRange.baseMipLevel = 0;
+- barriers[0].subresourceRange.levelCount = 1;
+- barriers[0].subresourceRange.baseArrayLayer = 0;
+- barriers[0].subresourceRange.layerCount = 1;
+- barriers[0].srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
++ barriers[0].srcAccessMask = 0;
+@@ -3390,0 +4200,7 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
++ /* transition swapchain image from GENERAL to PRESENT_SRC */
++ barriers[1].oldLayout = VK_IMAGE_LAYOUT_GENERAL;
++ barriers[1].newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
++ barriers[1].image = hack->swapchain_image;
++ barriers[1].srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
++ barriers[1].dstAccessMask = 0;
++
+@@ -3398 +4214 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- 1, barriers
++ 2, barriers
+@@ -3401,114 +4216,0 @@ static VkResult record_compute_cmd(VkDevice device, struct VkSwapchainKHR_T *swa
+- if(hack->blit_image){
+- /* for the copy... */
+- /* no transition, just a barrier for our access masks (w -> r) */
+- barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+- barriers[0].oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+- barriers[0].newLayout = VK_IMAGE_LAYOUT_GENERAL;
+- barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].image = hack->blit_image;
+- barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[0].subresourceRange.baseMipLevel = 0;
+- barriers[0].subresourceRange.levelCount = 1;
+- barriers[0].subresourceRange.baseArrayLayer = 0;
+- barriers[0].subresourceRange.layerCount = 1;
+- barriers[0].srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
+- barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+-
+- /* for the copy... */
+- /* transition swapchain image from whatever to TRANSFER_DST
+- * we don't care about the contents... */
+- barriers[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+- barriers[1].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+- barriers[1].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+- barriers[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[1].image = hack->swapchain_image;
+- barriers[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[1].subresourceRange.baseMipLevel = 0;
+- barriers[1].subresourceRange.levelCount = 1;
+- barriers[1].subresourceRange.baseArrayLayer = 0;
+- barriers[1].subresourceRange.layerCount = 1;
+- barriers[1].srcAccessMask = 0;
+- barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+-
+- device->funcs.p_vkCmdPipelineBarrier(
+- hack->cmd,
+- VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+- VK_PIPELINE_STAGE_TRANSFER_BIT,
+- 0,
+- 0, NULL,
+- 0, NULL,
+- 2, barriers
+- );
+-
+- /* copy from blit image to swapchain image */
+- region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- region.srcSubresource.layerCount = 1;
+- region.srcOffset.x = 0;
+- region.srcOffset.y = 0;
+- region.srcOffset.z = 0;
+- region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- region.dstSubresource.layerCount = 1;
+- region.dstOffset.x = 0;
+- region.dstOffset.y = 0;
+- region.dstOffset.z = 0;
+- region.extent.width = swapchain->real_extent.width;
+- region.extent.height = swapchain->real_extent.height;
+- region.extent.depth = 1;
+-
+- device->funcs.p_vkCmdCopyImage(hack->cmd,
+- hack->blit_image, VK_IMAGE_LAYOUT_GENERAL,
+- hack->swapchain_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+- 1, &region);
+-
+- /* transition swapchain image from TRANSFER_DST_OPTIMAL to PRESENT_SRC */
+- barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+- barriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+- barriers[0].newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
+- barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].image = hack->swapchain_image;
+- barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[0].subresourceRange.baseMipLevel = 0;
+- barriers[0].subresourceRange.levelCount = 1;
+- barriers[0].subresourceRange.baseArrayLayer = 0;
+- barriers[0].subresourceRange.layerCount = 1;
+- barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+- barriers[0].dstAccessMask = 0;
+-
+- device->funcs.p_vkCmdPipelineBarrier(
+- hack->cmd,
+- VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+- VK_PIPELINE_STAGE_TRANSFER_BIT,
+- 0,
+- 0, NULL,
+- 0, NULL,
+- 1, barriers
+- );
+- }else{
+- /* transition swapchain image from GENERAL to PRESENT_SRC */
+- barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+- barriers[0].oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+- barriers[0].newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
+- barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].image = hack->swapchain_image;
+- barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[0].subresourceRange.baseMipLevel = 0;
+- barriers[0].subresourceRange.levelCount = 1;
+- barriers[0].subresourceRange.baseArrayLayer = 0;
+- barriers[0].subresourceRange.layerCount = 1;
+- barriers[0].srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
+- barriers[0].dstAccessMask = 0;
+-
+- device->funcs.p_vkCmdPipelineBarrier(
+- hack->cmd,
+- VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+- VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+- 0,
+- 0, NULL,
+- 0, NULL,
+- 1, barriers
+- );
+- }
+@@ -3540,0 +4243,3 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
++ init_barrier(&barriers[0]);
++ init_barrier(&barriers[1]);
++
+@@ -3547 +4251,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+@@ -3550,2 +4253,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+@@ -3553,5 +4254,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[0].subresourceRange.baseMipLevel = 0;
+- barriers[0].subresourceRange.levelCount = 1;
+- barriers[0].subresourceRange.baseArrayLayer = 0;
+- barriers[0].subresourceRange.layerCount = 1;
+@@ -3559 +4256 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
++ barriers[0].dstAccessMask = 0;
+@@ -3562 +4258,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+@@ -3565,2 +4260,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+@@ -3568,5 +4261,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[1].subresourceRange.baseMipLevel = 0;
+- barriers[1].subresourceRange.levelCount = 1;
+- barriers[1].subresourceRange.baseArrayLayer = 0;
+- barriers[1].subresourceRange.layerCount = 1;
+@@ -3622 +4310,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+@@ -3625,2 +4312,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+@@ -3628,5 +4313,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[0].subresourceRange.baseMipLevel = 0;
+- barriers[0].subresourceRange.levelCount = 1;
+- barriers[0].subresourceRange.baseArrayLayer = 0;
+- barriers[0].subresourceRange.layerCount = 1;
+@@ -3637 +4317,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+@@ -3640,2 +4319,0 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+- barriers[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+@@ -3643,6 +4321 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
+- barriers[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+- barriers[1].subresourceRange.baseMipLevel = 0;
+- barriers[1].subresourceRange.levelCount = 1;
+- barriers[1].subresourceRange.baseArrayLayer = 0;
+- barriers[1].subresourceRange.layerCount = 1;
+- barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
++ barriers[1].srcAccessMask = 0;
+@@ -3669,0 +4343,169 @@ static VkResult record_graphics_cmd(VkDevice device, struct VkSwapchainKHR_T *sw
++static VkResult record_fsr_cmd(VkDevice device, struct VkSwapchainKHR_T *swapchain, struct fs_hack_image *hack)
++{
++#if defined(USE_STRUCT_CONVERSION)
++ VkImageMemoryBarrier_host barriers[3] = {{0}};
++ VkCommandBufferBeginInfo_host beginInfo = {0};
++#else
++ VkImageMemoryBarrier barriers[3] = {{0}};
++ VkCommandBufferBeginInfo beginInfo = {0};
++#endif
++ union
++ {
++ uint32_t uint[16];
++ float fp[16];
++ } c;
++ VkResult result;
++
++ TRACE("recording compute command\n");
++
++ init_barrier(&barriers[0]);
++ init_barrier(&barriers[1]);
++ init_barrier(&barriers[2]);
++
++ beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
++ beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
++
++ device->funcs.p_vkBeginCommandBuffer(hack->cmd, &beginInfo);
++
++ /* 1st pass (easu) */
++ /* transition user image from PRESENT_SRC to SHADER_READ */
++ barriers[0].oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
++ barriers[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
++ barriers[0].image = hack->user_image;
++ barriers[0].srcAccessMask = 0;
++ barriers[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
++
++ /* storage image... */
++ /* transition fsr image from whatever to GENERAL */
++ barriers[1].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
++ barriers[1].newLayout = VK_IMAGE_LAYOUT_GENERAL;
++ barriers[1].image = hack->swapchain_image;
++ barriers[1].srcAccessMask = 0;
++ barriers[1].dstAccessMask = 0;
++
++ device->funcs.p_vkCmdPipelineBarrier(
++ hack->cmd,
++ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
++ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
++ 0,
++ 0, NULL,
++ 0, NULL,
++ 2, barriers
++ );
++
++ /* perform easu shader */
++
++ c.fp[0] = swapchain->user_extent.width * (1.0f / swapchain->blit_dst.extent.width);
++ c.fp[1] = swapchain->user_extent.height * (1.0f / swapchain->blit_dst.extent.height);
++ c.fp[2] = 0.5f * c.fp[0] - 0.5f;
++ c.fp[3] = 0.5f * c.fp[1] - 0.5f;
++ // Viewport pixel position to normalized image space.
++ // This is used to get upper-left of 'F' tap.
++ c.fp[4] = 1.0f / swapchain->user_extent.width;
++ c.fp[5] = 1.0f / swapchain->user_extent.height;
++ // Centers of gather4, first offset from upper-left of 'F'.
++ // +---+---+
++ // | | |
++ // +--(0)--+
++ // | b | c |
++ // +---F---+---+---+
++ // | e | f | g | h |
++ // +--(1)--+--(2)--+
++ // | i | j | k | l |
++ // +---+---+---+---+
++ // | n | o |
++ // +--(3)--+
++ // | | |
++ // +---+---+
++ c.fp[6] = 1.0f * c.fp[4];
++ c.fp[7] = -1.0f * c.fp[5];
++ // These are from (0) instead of 'F'.
++ c.fp[8] = -1.0f * c.fp[4];
++ c.fp[9] = 2.0f * c.fp[5];
++ c.fp[10] = 1.0f * c.fp[4];
++ c.fp[11] = 2.0f * c.fp[5];
++ c.fp[12] = 0.0f * c.fp[4];
++ c.fp[13] = 4.0f * c.fp[5];
++ c.uint[14] = swapchain->blit_dst.extent.width;
++ c.uint[15] = swapchain->blit_dst.extent.height;
++
++ bind_pipeline(device, hack->cmd, &swapchain->fsr_easu_pipeline, hack->descriptor_set, c.uint);
++
++ /* local sizes in shader are 8 */
++ device->funcs.p_vkCmdDispatch(hack->cmd, ceil(swapchain->blit_dst.extent.width / 8.),
++ ceil(swapchain->blit_dst.extent.height / 8.), 1);
++
++ /* transition user image from SHADER_READ back to PRESENT_SRC */
++ barriers[0].oldLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
++ barriers[0].newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
++ barriers[0].image = hack->user_image;
++ barriers[0].srcAccessMask = 0;
++ barriers[0].dstAccessMask = 0;
++
++ /* transition fsr image from GENERAL to SHADER_READ */
++ barriers[1].oldLayout = VK_IMAGE_LAYOUT_GENERAL;
++ barriers[1].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
++ barriers[1].image = hack->swapchain_image;
++ barriers[1].srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
++ barriers[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
++
++ /* transition swapchain image from whatever to GENERAL */
++ barriers[2].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
++ barriers[2].newLayout = VK_IMAGE_LAYOUT_GENERAL;
++ barriers[2].image = hack->swapchain_image;
++ barriers[2].srcAccessMask = 0;
++ barriers[2].dstAccessMask = 0;
++
++ device->funcs.p_vkCmdPipelineBarrier(
++ hack->cmd,
++ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
++ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
++ 0,
++ 0, NULL,
++ 0, NULL,
++ 3, barriers
++ );
++
++ /* 2nd pass (rcas) */
++
++ c.fp[0] = exp2f(-swapchain->sharpness);
++ c.uint[2] = swapchain->blit_dst.extent.width;
++ c.uint[3] = swapchain->blit_dst.extent.height;
++ c.uint[4] = swapchain->blit_dst.offset.x;
++ c.uint[5] = swapchain->blit_dst.offset.y;
++ c.uint[6] = swapchain->blit_dst.offset.x + swapchain->blit_dst.extent.width;
++ c.uint[7] = swapchain->blit_dst.offset.y + swapchain->blit_dst.extent.height;
++
++ bind_pipeline(device, hack->cmd, &swapchain->fsr_rcas_pipeline, hack->fsr_set, c.uint);
++
++ /* local sizes in shader are 8 */
++ device->funcs.p_vkCmdDispatch(hack->cmd, ceil(swapchain->real_extent.width / 8.),
++ ceil(swapchain->real_extent.height / 8.), 1);
++
++ /* transition swapchain image from GENERAL to PRESENT_SRC */
++ barriers[0].oldLayout = VK_IMAGE_LAYOUT_GENERAL;
++ barriers[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
++ barriers[0].image = hack->swapchain_image;
++ barriers[0].srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
++ barriers[0].dstAccessMask = 0;
++
++ device->funcs.p_vkCmdPipelineBarrier(
++ hack->cmd,
++ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
++ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
++ 0,
++ 0, NULL,
++ 0, NULL,
++ 1, barriers
++ );
++
++ result = device->funcs.p_vkEndCommandBuffer(hack->cmd);
++ if (result != VK_SUCCESS)
++ {
++ ERR("vkEndCommandBuffer: %d\n", result);
++ return result;
++ }
++
++ return VK_SUCCESS;
++}
++
+@@ -3712,7 +4554,16 @@ VkResult WINAPI wine_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pP
+- if(queue->device->queue_props[queue_idx].queueFlags & VK_QUEUE_GRAPHICS_BIT)
+- res = record_graphics_cmd(queue->device, swapchain, hack);
+- else if(queue->device->queue_props[queue_idx].queueFlags & VK_QUEUE_COMPUTE_BIT)
+- res = record_compute_cmd(queue->device, swapchain, hack);
+- else{
+- ERR("Present queue is neither graphics nor compute queue!\n");
+- res = VK_ERROR_DEVICE_LOST;
++ if (swapchain->fsr)
++ {
++ if(queue->device->queue_props[queue_idx].queueFlags & VK_QUEUE_COMPUTE_BIT)
++ res = record_fsr_cmd(queue->device, swapchain, hack);
++ }
++ else
++ {
++ if(queue->device->queue_props[queue_idx].queueFlags & VK_QUEUE_GRAPHICS_BIT)
++ res = record_graphics_cmd(queue->device, swapchain, hack);
++ if(queue->device->queue_props[queue_idx].queueFlags & VK_QUEUE_COMPUTE_BIT)
++ res = record_compute_cmd(queue->device, swapchain, hack);
++ else
++ {
++ ERR("Present queue is neither graphics nor compute queue!\n");
++ res = VK_ERROR_DEVICE_LOST;
++ }
+diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h
+index 39c74cc..dcbdc83 100644
+--- a/dlls/winevulkan/vulkan_private.h
++++ b/dlls/winevulkan/vulkan_private.h
+@@ -105 +105 @@ struct fs_hack_image
+- VkImage blit_image;
++ VkImage fsr_image;
+@@ -108,2 +108,9 @@ struct fs_hack_image
+- VkImageView user_view, blit_view;
+- VkDescriptorSet descriptor_set;
++ VkImageView user_view, swapchain_view, fsr_view;
++ VkDescriptorSet descriptor_set, fsr_set;
++};
++
++struct fs_comp_pipeline
++{
++ VkPipelineLayout pipeline_layout;
++ VkPipeline pipeline;
++ uint32_t push_size;
+@@ -123 +130 @@ struct VkSwapchainKHR_T
+- VkDeviceMemory user_image_memory, blit_image_memory;
++ VkDeviceMemory user_image_memory, fsr_image_memory;
+@@ -130,2 +137,7 @@ struct VkSwapchainKHR_T
+- VkPipelineLayout pipeline_layout;
+- VkPipeline pipeline;
++ VkFormat format;
++ BOOL fsr;
++ float sharpness;
++
++ struct fs_comp_pipeline blit_pipeline;
++ struct fs_comp_pipeline fsr_easu_pipeline;
++ struct fs_comp_pipeline fsr_rcas_pipeline;
+diff --git a/dlls/winex11.drv/fs.c b/dlls/winex11.drv/fs.c
+index f66f291..5c5a634 100644
+--- a/dlls/winex11.drv/fs.c
++++ b/dlls/winex11.drv/fs.c
+@@ -537,0 +538,17 @@ BOOL fs_hack_is_integer(void)
++BOOL fs_hack_is_fsr(float *sharpness)
++{
++ static int is_fsr = -1;
++ if (is_fsr < 0)
++ {
++ const char *e = getenv("WINE_FULLSCREEN_FSR");
++ is_fsr = e && strcmp(e, "0");
++ }
++ TRACE("is_fsr: %s", is_fsr ? "TRUE" : "FALSE");
++ if (is_fsr && sharpness)
++ {
++ *sharpness = 0.0f; /* TODO */
++ TRACE("sharpness: %2.4f\n", *sharpness);
++ }
++ return is_fsr;
++}
++
+diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
+index 04d7495..4b24932 100644
+--- a/dlls/winex11.drv/vulkan.c
++++ b/dlls/winex11.drv/vulkan.c
+@@ -829 +829 @@ static VkBool32 X11DRV_query_fs_hack(VkSurfaceKHR surface, VkExtent2D *real_sz,
+- VkRect2D *dst_blit, VkFilter *filter)
++ VkRect2D *dst_blit, VkFilter *filter, BOOL *fsr, float *sharpness)
+@@ -879,0 +880,3 @@ static VkBool32 X11DRV_query_fs_hack(VkSurfaceKHR surface, VkExtent2D *real_sz,
++ if (fsr)
++ *fsr = fs_hack_is_fsr(sharpness);
++
+@@ -911,0 +915,3 @@ static VkBool32 X11DRV_query_fs_hack(VkSurfaceKHR surface, VkExtent2D *real_sz,
++ if (fsr)
++ *fsr = fs_hack_is_fsr(sharpness);
++
+diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
+index dc24cf4..5c8947b 100644
+--- a/dlls/winex11.drv/x11drv.h
++++ b/dlls/winex11.drv/x11drv.h
+@@ -631,0 +632 @@ extern BOOL fs_hack_is_integer(void) DECLSPEC_HIDDEN;
++extern BOOL fs_hack_is_fsr(float *sharpness) DECLSPEC_HIDDEN;
+diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h
+index 7bde252..9a4ed86 100644
+--- a/include/wine/vulkan_driver.h
++++ b/include/wine/vulkan_driver.h
+@@ -55 +55 @@ struct vulkan_funcs
+- VkBool32 (*query_fs_hack)(VkSurfaceKHR surface, VkExtent2D *real_sz, VkExtent2D *user_sz, VkRect2D *dst_blit, VkFilter *filter);
++ VkBool32 (*query_fs_hack)(VkSurfaceKHR surface, VkExtent2D *real_sz, VkExtent2D *user_sz, VkRect2D *dst_blit, VkFilter *filter, BOOL *fsr, float *sharpness);
+--
+libgit2 1.1.1
+
+From e24d70bc219f45d02a420ae6f2e32aa95a33f5ba Mon Sep 17 00:00:00 2001
+From: Georg Lehmann <dadschoorse@gmail.com>
+Date: Sat, 17 Jul 2021 23:23:15 +0200
+Subject: [PATCH] winex11.drv: Env var for sharpness strenght.
+
+Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
+---
+ dlls/winex11.drv/fs.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/dlls/winex11.drv/fs.c b/dlls/winex11.drv/fs.c
+index 5c5a634..6a2e004 100644
+--- a/dlls/winex11.drv/fs.c
++++ b/dlls/winex11.drv/fs.c
+@@ -540,0 +541 @@ BOOL fs_hack_is_fsr(float *sharpness)
++ int sharpness_int = 2;
+@@ -549 +550,4 @@ BOOL fs_hack_is_fsr(float *sharpness)
+- *sharpness = 0.0f; /* TODO */
++ const char *e = getenv("WINE_FULLSCREEN_FSR_STRENGTH");
++ if (e)
++ sharpness_int = atoi(e);
++ *sharpness = (float) sharpness_int / 10.0f;
+--
+libgit2 1.1.1
+
+From 6ff58e82429607c1e326faf5315f88ffa34eb2c2 Mon Sep 17 00:00:00 2001
+From: Georg Lehmann <dadschoorse@gmail.com>
+Date: Sun, 18 Jul 2021 12:32:12 +0200
+Subject: [PATCH] winevulkan: fsr: Fix srgb.
+
+Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
+---
+ dlls/winevulkan/vulkan.c | 41 +++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 37 insertions(+), 4 deletions(-)
+
+diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
+index 905e78d..d747f06 100644
+--- a/dlls/winevulkan/vulkan.c
++++ b/dlls/winevulkan/vulkan.c
+@@ -2959,0 +2960,18 @@ static VkResult create_descriptor_set(VkDevice device, struct VkSwapchainKHR_T *
++static VkFormat srgb_to_unorm(VkFormat format)
++{
++ switch (format)
++ {
++ case VK_FORMAT_R8G8B8A8_SRGB: return VK_FORMAT_R8G8B8A8_UNORM;
++ case VK_FORMAT_B8G8R8A8_SRGB: return VK_FORMAT_B8G8R8A8_UNORM;
++ case VK_FORMAT_R8G8B8_SRGB: return VK_FORMAT_R8G8B8_UNORM;
++ case VK_FORMAT_B8G8R8_SRGB: return VK_FORMAT_B8G8R8_UNORM;
++ case VK_FORMAT_A8B8G8R8_SRGB_PACK32: return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
++ default: return format;
++ }
++}
++
++static BOOL is_srgb(VkFormat format)
++{
++ return format != srgb_to_unorm(format);
++}
++
+@@ -3077 +3095 @@ static VkResult init_compute_state(VkDevice device, struct VkSwapchainKHR_T *swa
+- imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
++ imageInfo.format = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
+@@ -3154 +3172 @@ static VkResult init_compute_state(VkDevice device, struct VkSwapchainKHR_T *swa
+- viewInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
++ viewInfo.format = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
+@@ -3178 +3196 @@ static VkResult init_compute_state(VkDevice device, struct VkSwapchainKHR_T *swa
+- viewInfo.format = swapchain->format;
++ viewInfo.format = srgb_to_unorm(swapchain->format);
+@@ -3317,0 +3336,7 @@ static VkResult init_fs_hack_images(VkDevice device, struct VkSwapchainKHR_T *sw
++
++ if (is_srgb(createinfo->imageFormat))
++ imageInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
++
++ if (createinfo->flags & VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR)
++ imageInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT;
++
+@@ -3383 +3408 @@ static VkResult init_fs_hack_images(VkDevice device, struct VkSwapchainKHR_T *sw
+- viewInfo.format = createinfo->imageFormat;
++ viewInfo.format = srgb_to_unorm(createinfo->imageFormat);
+@@ -3492,0 +3518,3 @@ VkResult WINAPI wine_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCrea
++ if (object->fsr)
++ native_info.imageFormat = srgb_to_unorm(native_info.imageFormat);
++
+@@ -4557,0 +4586,5 @@ VkResult WINAPI wine_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pP
++ else
++ {
++ ERR("Present queue is not a compute queue!\n");
++ res = VK_ERROR_DEVICE_LOST;
++ }
+--
+libgit2 1.1.1
+
+From 07ca57aea113aa6c7b20be7bcd3dd2d3c2bdbde2 Mon Sep 17 00:00:00 2001
+From: Georg Lehmann <dadschoorse@gmail.com>
+Date: Wed, 21 Jul 2021 22:56:13 +0200
+Subject: [PATCH] winevulkan: Allow forcing a negative mip bias.
+
+Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
+---
+ dlls/winevulkan/make_vulkan | 1 +
+ dlls/winevulkan/vulkan.c | 41 +++++++++++++++++++++++++++++++++++++++++
+ dlls/winevulkan/vulkan_thunks.c | 6 ------
+ dlls/winevulkan/vulkan_thunks.h | 1 +
+ 4 files changed, 43 insertions(+), 6 deletions(-)
+
+diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
+index 59e49a9..cd3b9af 100755
+--- a/dlls/winevulkan/make_vulkan
++++ b/dlls/winevulkan/make_vulkan
+@@ -176,0 +177 @@ FUNCTION_OVERRIDES = {
++ "vkCreateSampler" : {"dispatch": True, "driver" : False, "thunk" : False},
+diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
+index d747f06..c9b2f57 100644
+--- a/dlls/winevulkan/vulkan.c
++++ b/dlls/winevulkan/vulkan.c
+@@ -4673,0 +4674,41 @@ VkResult WINAPI wine_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pP
++struct wine_vk_sampler_bias
++{
++ float bias;
++ BOOL aniso_only;
++};
++
++static BOOL WINAPI get_mip_bias(INIT_ONCE *once, void *param, void **context)
++{
++ struct wine_vk_sampler_bias *bias = param;
++
++ const char *c = getenv("WINE_VULKAN_BIAS_ALL_SAMPLERS");
++
++ bias->aniso_only = !(c && strcmp(c, "0"));
++
++ c = getenv("WINE_VULKAN_NEGATIVE_MIP_BIAS");
++ if (c)
++ bias->bias = ((float) -atoi(c)) / 100.0f;
++ else
++ bias->bias = 0.0f;
++
++ return TRUE;
++}
++
++VkResult WINAPI wine_vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkSampler *sampler)
++{
++ static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
++ static struct wine_vk_sampler_bias bias;
++ VkSamplerCreateInfo wine_info;
++
++ TRACE("%p, %p, %p, %p\n", device, create_info, allocator, sampler);
++
++ wine_info = *create_info;
++
++ InitOnceExecuteOnce(&init_once, get_mip_bias, &bias, NULL);
++
++ if (wine_info.anisotropyEnable || !bias.aniso_only)
++ wine_info.mipLodBias += bias.bias;
++
++ return device->funcs.p_vkCreateSampler(device->device, &wine_info, NULL, sampler);
++}
++
+diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
+index c9a30a2..84267ac 100644
+--- a/dlls/winevulkan/vulkan_thunks.c
++++ b/dlls/winevulkan/vulkan_thunks.c
+@@ -5633,6 +5632,0 @@ static VkResult WINAPI wine_vkCreateRenderPass2KHR(VkDevice device, const VkRend
+-VkResult WINAPI wine_vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSampler *pSampler)
+-{
+- TRACE("%p, %p, %p, %p\n", device, pCreateInfo, pAllocator, pSampler);
+- return device->funcs.p_vkCreateSampler(device->device, pCreateInfo, NULL, pSampler);
+-}
+-
+diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h
+index 50bf7ee..cd29a1a 100644
+--- a/dlls/winevulkan/vulkan_thunks.h
++++ b/dlls/winevulkan/vulkan_thunks.h
+@@ -24,0 +25 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDev
++VkResult WINAPI wine_vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSampler *pSampler);
+--
+libgit2 1.1.1
+