From db2c378fa0cccecbcd96e6a85adc6c96393825b9 Mon Sep 17 00:00:00 2001 From: Spoike Date: Fri, 28 Jul 2017 01:49:25 +0000 Subject: [PATCH] centerprints with links now show cursors. q2 temp entity tweaks. still more work to be done. support sRGB (mostly)properly in gl+vk+d3d9+d3d11. vulkan tweaks - multisample works under certain conditions. additional other changes to comply... cvars to enable some other device extensions. removed r_viewleaf. now using clusters for q1 too. improved compat with quakespasm's sky command. Added vid_winthread cvar, to handle window messages on a separate thread. When set this allows the game to keep redrawing when the user is resizing the window etc. Finally added renderers option to menusys. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5130 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- build_setup.sh | 834 ++++----- build_wip.sh | 658 +++---- engine/client/cl_ents.c | 2 +- engine/client/cl_input.c | 2 +- engine/client/cl_parse.c | 6 +- engine/client/cl_pred.c | 2 +- engine/client/cl_screen.c | 170 +- engine/client/cl_tent.c | 371 ++-- engine/client/clq2_ents.c | 24 +- engine/client/image.c | 11 + engine/client/keys.c | 20 +- engine/client/keys.h | 15 +- engine/client/merged.h | 1 + engine/client/p_classic.c | 2 +- engine/client/p_null.c | 2 +- engine/client/p_script.c | 12 +- engine/client/pr_csqc.c | 2 +- engine/client/r_2d.c | 3 +- engine/client/r_partset.c | 149 +- engine/client/r_surf.c | 128 +- engine/client/renderer.c | 129 +- engine/client/screen.h | 1 + engine/client/snd_directx.c | 20 +- engine/client/snd_dma.c | 2 + engine/client/snd_win.c | 5 + engine/client/snd_xaudio.c | 26 +- engine/client/sound.h | 2 +- engine/common/common.c | 4 +- engine/common/fs_dzip.c | 32 +- engine/common/log.c | 18 +- engine/common/particles.h | 5 +- engine/common/protocol.h | 19 +- engine/common/q1bsp.c | 56 +- engine/common/q3common.c | 9 +- engine/gl/gl_backend.c | 15 +- engine/gl/gl_bloom.c | 20 +- engine/gl/gl_draw.c | 6 +- engine/gl/gl_font.c | 16 + engine/gl/gl_model.c | 14 +- engine/gl/gl_model.h | 1 - engine/gl/gl_shader.c | 2 +- engine/gl/gl_shadow.c | 3 +- engine/gl/gl_vidcommon.c | 2 + engine/gl/gl_vidnt.c | 14 +- engine/gl/gl_warp.c | 12 +- engine/gl/glmod_doom.c | 248 ++- engine/gl/glquake.h | 5 +- engine/gl/glsupp.h | 6 +- engine/gl/r_bishaders.h | 1056 ++++++----- engine/partcfgs/q2part.cfg | 149 +- engine/qclib/qccmain.c | 2 +- engine/server/pr_cmds.c | 2 +- engine/server/savegame.c | 45 +- engine/server/sv_ents.c | 11 +- engine/server/sv_phys.c | 28 +- engine/server/svq2_game.c | 3 + engine/server/svq3_game.c | 3 +- engine/server/world.c | 8 +- engine/shaders/Makefile | 4 +- engine/shaders/vulkan/altwater.glsl | 42 +- engine/vk/vk_backend.c | 503 +++-- engine/vk/vk_init.c | 761 +++++--- engine/vk/vkrenderer.h | 52 +- engine/vulkan/vk_platform.h | 16 +- engine/vulkan/vulkan.h | 2569 +++++++++++++++++++++++++- quakec/menusys/menu/options_video.qc | 2 + specs/csqc_for_idiots.txt | 2 + 67 files changed, 6083 insertions(+), 2281 deletions(-) diff --git a/build_setup.sh b/build_setup.sh index e45e4386..0faf6397 100755 --- a/build_setup.sh +++ b/build_setup.sh @@ -1,417 +1,417 @@ -#!/bin/bash -#sets up dependancies for debian-jessie (8.7) -#this script must be run twice. first time as root, which installs system packages -#second time as a regular user (probably not your normal one), which installs 3rd-party stuff - -SVNROOT=$(cd "$(dirname "$BASH_SOURCE")" && pwd) -FTEROOT=$(realpath $SVNROOT/..) -FTEROOT=${FTEROOT:-~} -FTECONFIG=$SVNROOT/build.cfg - -BUILDFOLDER=`echo ~`/htdocs -BUILDLOGFOLDER=$BUILDFOLDER/build_logs - -#mac defaults -OSXCROSSROOT=$FTEROOT/osxcross - -#emscripten defaults -EMSCRIPTENROOT=$FTEROOT/emsdk-portable - -#nacl defaults -NACLROOT=$FTEROOT/nacl_sdk -NACLSDKVERSION=pepper_49 - -#android defaults -ANDROIDROOT=$FTEROOT/android -if [ ! -z "$(uname -o 2>&1 | grep Cygwin)" ]; then - ANDROID_HOSTSYSTEM=windows-x86_64 -else - ANDROID_HOSTSYSTEM=linux-$(uname -m) -fi -ANDROIDBUILDTOOLS=25.0.0 -ANDROID_ZIPALIGN=$ANDROIDROOT/build-tools/$ANDROIDBUILDTOOLS/zipalign #relative to ndk tools - -THREADS="-j 4" - -#windows is always cross compiled, so we don't have issues with non-native ffmpeg -PLUGINS_LINUXx86="ode qi ezhud xmpp irc" -PLUGINS_LINUXx64="ode qi ezhud xmpp irc" -PLUGINS_LINUXx32="qi ezhud xmpp irc" -PLUGINS_LINUXarmhf="qi ezhud xmpp irc" -if [ "$(uname -m)" != "x86_64" ]; then - PLUGINS_LINUXx86="ffmpeg ode qi ezhud xmpp irc" -fi -if [ "$(uname -m)" == "x86_64" ]; then - PLUGINS_LINUX64="ffmpeg ode qi ezhud xmpp irc" -fi -#windows doesn't cross compile, so no system dependancy issues -#skip some dependancies if we're running on cygwin, ode is buggy. -if [ "$(uname -s)" == "Linux" ]; then - PLUGINS_WINDOWS="ffmpeg ode qi ezhud xmpp irc" -else - PLUGINS_WINDOWS="qi ezhud xmpp irc" -fi - -echo -echo "This is Spike's script to set up various cross compilers and dependancies." -echo "This script will check dependancies. If something isn't installed you can either rerun the script as root (which will ONLY install system packages), or manually apt-get or whatever. You can then re-run the script as a regular user to finish configuring 3rd party dependancies." -echo -echo "You can change your choices later by just re-running this script" -echo "(Your settings will be autosaved in $FTECONFIG)" -echo -echo "If you just want to compile a native build, just use the following command:" -echo "cd $SVNROOT/engine && make gl-rel" -echo "(if you're in cygwin, add FTE_TARGET=win32 to compile for native windows)" -echo "(add plugins-rel qcc-rel qccgui-rel sv-rel vk-rel etc for additional targets)" -echo "(or use -dbg if you want debug builds for whatever reason)" -echo - -#always execute it if it exists, so that we preserve custom paths etc that are not prompted for here -if [ -e $FTECONFIG ]; then - . $FTECONFIG - - if [ $UID -eq 0 ]; then - REUSE_CONFIG=y #root shouldn't be writing/owning the config file. - else - read -n 1 -p "Reuse previous build config? [y/N] " REUSE_CONFIG && echo - REUSE_CONFIG=${REUSE_CONFIG:-n} - fi -else - if [ $UID -eq 0 ]; then - exit #root can't create the output, as that would take ownership. - else - REUSE_CONFIG=n - fi -fi - -if [ "$REUSE_CONFIG" != "y" ]; then - #linux compiles are native-only, so don't bug out on cygwin which lacks a cross compiler. - BUILD_LINUXx86=n - BUILD_LINUXx64=n - BUILD_LINUXx32=n - BUILD_LINUXarmhf=n - if [ "$(uname -s)" == "Linux" ]; then - read -n 1 -p "Build for Linux x86? [Y/n] " BUILD_LINUXx86 && echo - read -n 1 -p "Build for Linux x86_64? [Y/n] " BUILD_LINUXx64 && echo - read -n 1 -p "Build for Linux x32? [y/N] " BUILD_LINUXx32 && echo - #ubuntu's gcc-multilib-arm-foo package conflicts with gcc-multilib... - #the whole point of multilib was to avoid conflicts... someone fucked up. - #read -n 1 -p "Build for Linux armhf [y/N] " BUILD_LINUXarmhf && echo - else - echo "Skipping Linux options." - fi - BUILD_CYGWIN=n - BUILD_MSVC=n - if [ "$(uname -o)" == "Cygwin" ]; then - read -n 1 -p "Build for Cygwin? [y/N] " BUILD_CYGWIN && echo - read -n 1 -p "Build with MSVC? (requires windows7 sdk) [y/N] " BUILD_MSVC && echo - else - echo "Skipping Cygwin options." - fi - read -n 1 -p "Build for Windows? [Y/n] " BUILD_WINDOWS && echo - read -n 1 -p "Build for Dos? [y/N] " BUILD_WINDOWS && echo - read -n 1 -p "Build for SDL? [y/N] " BUILD_SDL && echo - read -n 1 -p "Build for Android? [y/N] " BUILD_ANDROID && echo - read -n 1 -p "Build for Emscripten? [y/N] " BUILD_WEB && echo - if [ 0 -ne 0 ]; then - read -n 1 -p "Build for MacOSX? [y/N] " BUILD_MAC && echo - else - echo "Skipping mac option." - fi - read -n 1 -p "Build for NaCL? [y/N] " BUILD_NACL && echo -fi - -BUILD_LINUXx86=${BUILD_LINUXx86:-y} -BUILD_LINUXx64=${BUILD_LINUXx64:-y} -BUILD_LINUXx32=${BUILD_LINUXx32:-n} -BUILD_LINUXarmhf=${BUILD_LINUXarmhf:-n} -BUILD_CYGWIN=${BUILD_CYGWIN:-n} -BUILD_WINDOWS=${BUILD_WINDOWS:-y} -BUILD_DOS=${BUILD_DOS:-n} -BUILD_MSVC=${BUILD_MSVC:-n} -BUILD_SDL=${BUILD_SDL:-n} -BUILD_ANDROID=${BUILD_ANDROID:-n} -BUILD_WEB=${BUILD_WEB:-n} -BUILD_MAC=${BUILD_MAC:-n} -BUILD_NACL=${BUILD_NACL:-n} - -if [ "$UID" != "0" ]; then - echo "#path config for fte build scripts" >$FTECONFIG - echo "THREADS=\"$THREADS\"" >>$FTECONFIG - echo "BUILDFOLDER=\"$BUILDFOLDER\"" >>$FTECONFIG - echo "BUILDLOGFOLDER=\"$BUILDLOGFOLDER\"" >>$FTECONFIG - echo "SVNROOT=\"$SVNROOT\"" >>$FTECONFIG - echo "ANDROIDROOT=\"$ANDROIDROOT\"" >>$FTECONFIG - echo "export ANDROID_HOSTSYSTEM=\"ANDROID_HOSTSYSTEM\"" >>$FTECONFIG - echo "export ANDROID_ZIPALIGN=\"ANDROID_ZIPALIGN\"" >>$FTECONFIG - echo "EMSCRIPTENROOT=\"$EMSCRIPTENROOT\"" >>$FTECONFIG - echo "OSXCROSSROOT=\"$OSXCROSSROOT\"" >>$FTECONFIG - echo "NACLROOT=\"$NACLROOT\"" >>$FTECONFIG - echo "NACL_SDK_ROOT=\"$NACLROOT/nacl_sdk/$NACLSDKVERSION\"" >>$FTECONFIG - echo "NACLSDKVERSION=\"$NACLSDKVERSION\"" >>$FTECONFIG - - echo "BUILD_LINUXx86=\"$BUILD_LINUXx86\"" >>$FTECONFIG - echo "BUILD_LINUXx64=\"$BUILD_LINUXx64\"" >>$FTECONFIG - echo "BUILD_LINUXx32=\"$BUILD_LINUXx32\"" >>$FTECONFIG - echo "BUILD_LINUXarmhf=\"$BUILD_LINUXarmhf\"" >>$FTECONFIG - echo "BUILD_CYGWIN=\"$BUILD_CYGWIN\"" >>$FTECONFIG - echo "BUILD_WINDOWS=\"$BUILD_WINDOWS\"" >>$FTECONFIG - echo "BUILD_DOS=\"$BUILD_DOS\"" >>$FTECONFIG - echo "BUILD_MSVC=\"$BUILD_MSVC\"" >>$FTECONFIG - echo "BUILD_ANDROID=\"$BUILD_ANDROID\"" >>$FTECONFIG - echo "BUILD_SDL=\"$BUILD_SDL\"" >>$FTECONFIG - echo "BUILD_WEB=\"$BUILD_WEB\"" >>$FTECONFIG - echo "BUILD_MAC=\"$BUILD_MAC\"" >>$FTECONFIG - echo "BUILD_NACL=\"$BUILD_NACL\"" >>$FTECONFIG - - echo "PLUGINS_WINDOWS=\"$PLUGINS_WINDOWS\"" >>$FTECONFIG - echo "PLUGINS_LINUXx86=\"$PLUGINS_LINUXx86\"" >>$FTECONFIG - echo "PLUGINS_LINUXx64=\"$PLUGINS_LINUXx64\"" >>$FTECONFIG - echo "PLUGINS_LINUXx32=\"$PLUGINS_LINUXx32\"" >>$FTECONFIG - echo "PLUGINS_LINUXarmhf=\"$PLUGINS_LINUXarmhf\"" >>$FTECONFIG -fi - -true -true=$? -false -false=$? - -if [ "$(uname -s)" == "Linux" ]; then - . /etc/os-release -fi -function debianpackages { - #make sure apt-get is installed - if [ -z `which apt-get 2>>/dev/null` ]; then - return $false - fi - local ret=$true - for i in "$@" - do - dpkg -s $i 2>&1 >> /dev/null - if [ $? -eq 1 ]; then - ret=$false - fi - done - - if [ $ret == $false ]; then - if [ $UID -eq 0 ]; then - apt-get install --no-install-recommends $@ - ret=$true - else - echo "Packages not installed. Run as root to easily install dependancies." - fi - fi - return $ret -} -function jessiepackages { - if [ "$PRETTY_NAME" != "Debian GNU/Linux 8 (jessie)" ]; then - return $false - fi - - debianpackages $@ - return $? -} - -#we don't really know what system we're on. assume they have any system dependancies. -#fixme: args are programs findable with which -function otherpackages { - if [ -z "$PRETTY_NAME" ]; then - return $true - fi - return $false -} - - -#Note: only the native linux-sdl target can be compiled, as libSDL[2]-dev doesn't support multiarch properly, and we depend upon it instead of building from source (thus ensuring it has whatever distro stuff needed... though frankly that should be inside the .so instead of the headers). - -if [ $UID -eq 0 ] && [ ! -z `which apt-get` ]; then - #because multiarch requires separate packages for some things, we'll need to set that up now (in case noone did that yet) - dpkg --add-architecture i386 - apt-get update -fi - -#generic crap. much of this is needed to set up and decompress dependancies and stuff. -debianpackages subversion make automake libtool p7zip-full zip || otherpackages z7 make svn || exit - -if [ "$BUILD_LINUXx86" == "y" ]; then - #for building linux targets - debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev libvorbis-dev || otherpackages gcc || exit - jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit - if [[ "$PLUGINS_LINUXx86" =~ "ffmpeg" ]]; then - debianpackages libswscale-dev libavcodec-dev || otherpackages || exit - fi -fi -if [ "$BUILD_LINUXx64" == "y" ]; then - #for building linux targets - debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev || otherpackages gcc || exit - jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit - if [[ "$PLUGINS_LINUXx64" =~ "ffmpeg" ]]; then - debianpackages libswscale-dev libavcodec-dev || otherpackages || exit - fi -fi -if [ "$BUILD_LINUXx32" == "y" ]; then - #for building linux targets - debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev || otherpackages gcc || exit - jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit -fi -if [ "$BUILD_LINUXarmhf" == "y" ]; then - #for building linux targets - debianpackages gcc-multilib-arm-linux-gnueabihf g++-multilib-arm-linux-gnueabihf mesa-common-dev libasound2-dev || otherpackages gcc || exit - jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit -fi -if [ "$BUILD_SDL" == "y" ]; then - #for building SDL targets - debianpackages libSDL1.2-dev libSDL2-dev libspeex-dev libspeexdsp-dev || otherpackages || exit -fi - -if [ "$BUILD_WINDOWS" == "y" ]; then - #for building windows targets - debianpackages mingw-w64 || otherpackages x86_64-w64-mingw32-gcc || exit -fi - - -if [ "$BUILD_ANDROID" == "y" ]; then - ( (jessiepackages openjdk-8-jdk-headless || debianpackages openjdk-8-jdk-headless ) && debianpackages ant) || otherpackages || exit -fi - -if [ "$BUILD_WEB" == "y" ]; then - ( (jessiepackages cmake || debianpackages cmake) && debianpackages git build-essential) || exit -fi - -if [ "$BUILD_MAC" == "y" ]; then - debianpackages git cmake libxml2-dev fuse || otherpackages || exit -fi -debianpackages subversion make build-essential || otherpackages svn make || exit - -echo "System Package checks complete." - -if [ "$UID" == "0" ]; then - #avoid root taking ownership of anything. - echo "Refusing to update/rebuild toolchains as root." - echo "Please continue running this script as a regular user." - exit -fi - -echo -echo "(Any new toolchains will be installed to $FTEROOT)" -echo "(Say no if you're certain you already set up everything)" -read -n 1 -p "Rebuild/update any toolchains now? [y/N] " REBUILD_TOOLCHAINS && echo -REBUILD_TOOLCHAINS=${REBUILD_TOOLCHAINS:-n} -mkdir -p $FTEROOT - -#dos shit -if [ "$BUILD_DOS" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then - echo "You'll need to manually install djgpp for DOS builds." -fi - -#android shit. WARNING: should come first as it spits out some EULAs that need confirming. -if [ "$BUILD_ANDROID" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then - mkdir -p $ANDROIDROOT - cd $ANDROIDROOT - wget -N https://dl.google.com/android/repository/tools_r25.2.3-linux.zip - unzip -qn tools_r25.2.3-linux.zip - cd tools/bin - #yes, android-8 is fucking old now. newer versions won't work on older devices. - echo "downloading android build tools" - ./sdkmanager "build-tools;$ANDROID_BUILDTOOLS" - echo "downloading android platform tools" - ./sdkmanager "platform-tools" - echo "downloading android-9" - ./sdkmanager "platforms;android-9" - echo "downloading android ndk" - ./sdkmanager "ndk-bundle" - cd ~ -fi - -#emscripten/web shit -if [ "$BUILD_WEB" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then - mkdir -p $EMSCRIPTENROOT - cd $EMSCRIPTENROOT/.. - wget -N https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz - cd $EMSCRIPTENROOT - tar xzf ../emsdk-portable.tar.gz --strip-components=1 - ./emsdk install latest - ./emsdk activate latest - cd ~ -fi - - -#osxcross, for mac crap -if [ "$BUILD_MAC" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then - echo "Setting up OSXCross... THIS IS TOTALLY UNTESTED" - read -p "You need to download xcode first. Where did you download the .dmg file to?" XCODE - git clone https://github.com/tpoechtrager/osxcross.git $OSXCROSSROOT - cd $OSXCROSSROOT - tools/gen_sdk_package_darling_dmg.sh $XCODE - cp *.tar.xz - SDK_VERSION=10.10 UNATTENDED=0 ./build.sh - cd ~ -fi - -if [ "$BUILD_NACL" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then - echo "Setting up NaCL..." - mkdir -p $NACLROOT - cd $NACLROOT/.. - wget -N https://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip - unzip -qn nacl_sdk.zip - cd $NACLROOT - ./naclsdk update $NACLSDKVERSION -fi - - -#initial checkout of fte's svn -if [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then - if [ ! -d $SVNROOT ]; then - svn checkout https://svn.code.sf.net/p/fteqw/code/trunk $SVNROOT - else - cd $SVNROOT - svn up - fi - - #FIXME: there may be race conditions when compiling. - #so make sure we've pre-built certain targets without using -j - #linux distros vary too much with various dependancies and versions and such, so we might as well pre-build our own copies of certain libraries. this really only needs to be done once, but its safe to retry anyway. - cd $SVNROOT/engine - if [ "$BUILD_LINUXx86" == "y" ]; then - echo "Making libraries (x86)..." - make FTE_TARGET=linux32 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null - fi - if [ "$BUILD_LINUXx64" == "y" ]; then - echo "Making libraries (linux x86_64)..." - make FTE_TARGET=linux64 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null - fi - if [ "$BUILD_LINUXx32" == "y" ]; then - echo "Making libraries (linux x32)..." - make FTE_TARGET=linuxx32 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null - fi - if [ "$BUILD_LINUXarmhf" == "y" ]; then - echo "Making libraries (linux armhf)..." - make FTE_TARGET=linuxarmhf makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null - fi - if [ "$BUILD_WINDOWS" == "y" ] && [[ "$PLUGINS_WINDOWS" =~ "ode" ]]; then - echo "Prebuilding ODE library (win32)..." - make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=ode 2>&1 >>/dev/null - echo "Prebuilding ODE library (win64)..." - make FTE_TARGET=win64 plugins-rel NATIVE_PLUGINS=ode 2>&1 >>/dev/null - fi - if [ "$BUILD_LINUXx86" == "y" ] && [[ "$PLUGINS_LINUXx86" =~ "ode" ]]; then - echo "Prebuilding ODE library (linux x86)..." - make FTE_TARGET=linux32 plugins-rel NATIVE_PLUGINS=ode CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null - fi - if [ "$BUILD_LINUXx64" == "y" ] && [[ "$PLUGINS_LINUXx64" =~ "ode" ]]; then - echo "Prebuilding ODE library (linux x86_64)..." - make FTE_TARGET=linux64 plugins-rel NATIVE_PLUGINS=ode CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null - fi - if [ "$BUILD_WINDOWS" == "y" ]; then - echo "Obtaining ffmpeg library (win32)..." - make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=ffmpeg 2>&1 >>/dev/null - echo "Obtaining ffmpeg library (win64)..." - make FTE_TARGET=win64 plugins-rel NATIVE_PLUGINS=ffmpeg 2>&1 >>/dev/null - fi - cd ~ -fi - - - -echo "Setup script complete." -echo "When you run build_wip.sh output will be written to $BUILDFOLDER/*" +#!/bin/bash +#sets up dependancies for debian-jessie (8.7) +#this script must be run twice. first time as root, which installs system packages +#second time as a regular user (probably not your normal one), which installs 3rd-party stuff + +SVNROOT=$(cd "$(dirname "$BASH_SOURCE")" && pwd) +FTEROOT=$(realpath $SVNROOT/..) +FTEROOT=${FTEROOT:-~} +FTECONFIG=$SVNROOT/build.cfg + +BUILDFOLDER=`echo ~`/htdocs +BUILDLOGFOLDER=$BUILDFOLDER/build_logs + +#mac defaults +OSXCROSSROOT=$FTEROOT/osxcross + +#emscripten defaults +EMSCRIPTENROOT=$FTEROOT/emsdk-portable + +#nacl defaults +NACLROOT=$FTEROOT/nacl_sdk +NACLSDKVERSION=pepper_49 + +#android defaults +ANDROIDROOT=$FTEROOT/android +if [ ! -z "$(uname -o 2>&1 | grep Cygwin)" ]; then + ANDROID_HOSTSYSTEM=windows-x86_64 +else + ANDROID_HOSTSYSTEM=linux-$(uname -m) +fi +ANDROIDBUILDTOOLS=25.0.0 +ANDROID_ZIPALIGN=$ANDROIDROOT/build-tools/$ANDROIDBUILDTOOLS/zipalign #relative to ndk tools + +THREADS="-j 4" + +#windows is always cross compiled, so we don't have issues with non-native ffmpeg +PLUGINS_LINUXx86="ode qi ezhud xmpp irc" +PLUGINS_LINUXx64="ode qi ezhud xmpp irc" +PLUGINS_LINUXx32="qi ezhud xmpp irc" +PLUGINS_LINUXarmhf="qi ezhud xmpp irc" +if [ "$(uname -m)" != "x86_64" ]; then + PLUGINS_LINUXx86="ffmpeg ode qi ezhud xmpp irc" +fi +if [ "$(uname -m)" == "x86_64" ]; then + PLUGINS_LINUX64="ffmpeg ode qi ezhud xmpp irc" +fi +#windows doesn't cross compile, so no system dependancy issues +#skip some dependancies if we're running on cygwin, ode is buggy. +if [ "$(uname -s)" == "Linux" ]; then + PLUGINS_WINDOWS="ffmpeg ode qi ezhud xmpp irc" +else + PLUGINS_WINDOWS="qi ezhud xmpp irc" +fi + +echo +echo "This is Spike's script to set up various cross compilers and dependancies." +echo "This script will check dependancies. If something isn't installed you can either rerun the script as root (which will ONLY install system packages), or manually apt-get or whatever. You can then re-run the script as a regular user to finish configuring 3rd party dependancies." +echo +echo "You can change your choices later by just re-running this script" +echo "(Your settings will be autosaved in $FTECONFIG)" +echo +echo "If you just want to compile a native build, just use the following command:" +echo "cd $SVNROOT/engine && make gl-rel" +echo "(if you're in cygwin, add FTE_TARGET=win32 to compile for native windows)" +echo "(add plugins-rel qcc-rel qccgui-rel sv-rel vk-rel etc for additional targets)" +echo "(or use -dbg if you want debug builds for whatever reason)" +echo + +#always execute it if it exists, so that we preserve custom paths etc that are not prompted for here +if [ -e $FTECONFIG ]; then + . $FTECONFIG + + if [ $UID -eq 0 ]; then + REUSE_CONFIG=y #root shouldn't be writing/owning the config file. + else + read -n 1 -p "Reuse previous build config? [y/N] " REUSE_CONFIG && echo + REUSE_CONFIG=${REUSE_CONFIG:-n} + fi +else + if [ $UID -eq 0 ]; then + exit #root can't create the output, as that would take ownership. + else + REUSE_CONFIG=n + fi +fi + +if [ "$REUSE_CONFIG" != "y" ]; then + #linux compiles are native-only, so don't bug out on cygwin which lacks a cross compiler. + BUILD_LINUXx86=n + BUILD_LINUXx64=n + BUILD_LINUXx32=n + BUILD_LINUXarmhf=n + if [ "$(uname -s)" == "Linux" ]; then + read -n 1 -p "Build for Linux x86? [Y/n] " BUILD_LINUXx86 && echo + read -n 1 -p "Build for Linux x86_64? [Y/n] " BUILD_LINUXx64 && echo + read -n 1 -p "Build for Linux x32? [y/N] " BUILD_LINUXx32 && echo + #ubuntu's gcc-multilib-arm-foo package conflicts with gcc-multilib... + #the whole point of multilib was to avoid conflicts... someone fucked up. + #read -n 1 -p "Build for Linux armhf [y/N] " BUILD_LINUXarmhf && echo + else + echo "Skipping Linux options." + fi + BUILD_CYGWIN=n + BUILD_MSVC=n + if [ "$(uname -o)" == "Cygwin" ]; then + read -n 1 -p "Build for Cygwin? [y/N] " BUILD_CYGWIN && echo + read -n 1 -p "Build with MSVC? (requires windows7 sdk) [y/N] " BUILD_MSVC && echo + else + echo "Skipping Cygwin options." + fi + read -n 1 -p "Build for Windows? [Y/n] " BUILD_WINDOWS && echo + read -n 1 -p "Build for Dos? [y/N] " BUILD_WINDOWS && echo + read -n 1 -p "Build for SDL? [y/N] " BUILD_SDL && echo + read -n 1 -p "Build for Android? [y/N] " BUILD_ANDROID && echo + read -n 1 -p "Build for Emscripten? [y/N] " BUILD_WEB && echo + if [ 0 -ne 0 ]; then + read -n 1 -p "Build for MacOSX? [y/N] " BUILD_MAC && echo + else + echo "Skipping mac option." + fi + read -n 1 -p "Build for NaCL? [y/N] " BUILD_NACL && echo +fi + +BUILD_LINUXx86=${BUILD_LINUXx86:-y} +BUILD_LINUXx64=${BUILD_LINUXx64:-y} +BUILD_LINUXx32=${BUILD_LINUXx32:-n} +BUILD_LINUXarmhf=${BUILD_LINUXarmhf:-n} +BUILD_CYGWIN=${BUILD_CYGWIN:-n} +BUILD_WINDOWS=${BUILD_WINDOWS:-y} +BUILD_DOS=${BUILD_DOS:-n} +BUILD_MSVC=${BUILD_MSVC:-n} +BUILD_SDL=${BUILD_SDL:-n} +BUILD_ANDROID=${BUILD_ANDROID:-n} +BUILD_WEB=${BUILD_WEB:-n} +BUILD_MAC=${BUILD_MAC:-n} +BUILD_NACL=${BUILD_NACL:-n} + +if [ "$UID" != "0" ]; then + echo "#path config for fte build scripts" >$FTECONFIG + echo "THREADS=\"$THREADS\"" >>$FTECONFIG + echo "BUILDFOLDER=\"$BUILDFOLDER\"" >>$FTECONFIG + echo "BUILDLOGFOLDER=\"$BUILDLOGFOLDER\"" >>$FTECONFIG + echo "SVNROOT=\"$SVNROOT\"" >>$FTECONFIG + echo "ANDROIDROOT=\"$ANDROIDROOT\"" >>$FTECONFIG + echo "export ANDROID_HOSTSYSTEM=\"ANDROID_HOSTSYSTEM\"" >>$FTECONFIG + echo "export ANDROID_ZIPALIGN=\"ANDROID_ZIPALIGN\"" >>$FTECONFIG + echo "EMSCRIPTENROOT=\"$EMSCRIPTENROOT\"" >>$FTECONFIG + echo "OSXCROSSROOT=\"$OSXCROSSROOT\"" >>$FTECONFIG + echo "NACLROOT=\"$NACLROOT\"" >>$FTECONFIG + echo "NACL_SDK_ROOT=\"$NACLROOT/nacl_sdk/$NACLSDKVERSION\"" >>$FTECONFIG + echo "NACLSDKVERSION=\"$NACLSDKVERSION\"" >>$FTECONFIG + + echo "BUILD_LINUXx86=\"$BUILD_LINUXx86\"" >>$FTECONFIG + echo "BUILD_LINUXx64=\"$BUILD_LINUXx64\"" >>$FTECONFIG + echo "BUILD_LINUXx32=\"$BUILD_LINUXx32\"" >>$FTECONFIG + echo "BUILD_LINUXarmhf=\"$BUILD_LINUXarmhf\"" >>$FTECONFIG + echo "BUILD_CYGWIN=\"$BUILD_CYGWIN\"" >>$FTECONFIG + echo "BUILD_WINDOWS=\"$BUILD_WINDOWS\"" >>$FTECONFIG + echo "BUILD_DOS=\"$BUILD_DOS\"" >>$FTECONFIG + echo "BUILD_MSVC=\"$BUILD_MSVC\"" >>$FTECONFIG + echo "BUILD_ANDROID=\"$BUILD_ANDROID\"" >>$FTECONFIG + echo "BUILD_SDL=\"$BUILD_SDL\"" >>$FTECONFIG + echo "BUILD_WEB=\"$BUILD_WEB\"" >>$FTECONFIG + echo "BUILD_MAC=\"$BUILD_MAC\"" >>$FTECONFIG + echo "BUILD_NACL=\"$BUILD_NACL\"" >>$FTECONFIG + + echo "PLUGINS_WINDOWS=\"$PLUGINS_WINDOWS\"" >>$FTECONFIG + echo "PLUGINS_LINUXx86=\"$PLUGINS_LINUXx86\"" >>$FTECONFIG + echo "PLUGINS_LINUXx64=\"$PLUGINS_LINUXx64\"" >>$FTECONFIG + echo "PLUGINS_LINUXx32=\"$PLUGINS_LINUXx32\"" >>$FTECONFIG + echo "PLUGINS_LINUXarmhf=\"$PLUGINS_LINUXarmhf\"" >>$FTECONFIG +fi + +true +true=$? +false +false=$? + +if [ "$(uname -s)" == "Linux" ]; then + . /etc/os-release +fi +function debianpackages { + #make sure apt-get is installed + if [ -z `which apt-get 2>>/dev/null` ]; then + return $false + fi + local ret=$true + for i in "$@" + do + dpkg -s $i 2>&1 >> /dev/null + if [ $? -eq 1 ]; then + ret=$false + fi + done + + if [ $ret == $false ]; then + if [ $UID -eq 0 ]; then + apt-get install --no-install-recommends $@ + ret=$true + else + echo "Packages not installed. Run as root to easily install dependancies." + fi + fi + return $ret +} +function jessiepackages { + if [ "$PRETTY_NAME" != "Debian GNU/Linux 8 (jessie)" ]; then + return $false + fi + + debianpackages $@ + return $? +} + +#we don't really know what system we're on. assume they have any system dependancies. +#fixme: args are programs findable with which +function otherpackages { + if [ -z "$PRETTY_NAME" ]; then + return $true + fi + return $false +} + + +#Note: only the native linux-sdl target can be compiled, as libSDL[2]-dev doesn't support multiarch properly, and we depend upon it instead of building from source (thus ensuring it has whatever distro stuff needed... though frankly that should be inside the .so instead of the headers). + +if [ $UID -eq 0 ] && [ ! -z `which apt-get` ]; then + #because multiarch requires separate packages for some things, we'll need to set that up now (in case noone did that yet) + dpkg --add-architecture i386 + apt-get update +fi + +#generic crap. much of this is needed to set up and decompress dependancies and stuff. +debianpackages subversion make automake libtool p7zip-full zip || otherpackages z7 make svn || exit + +if [ "$BUILD_LINUXx86" == "y" ]; then + #for building linux targets + debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev libvorbis-dev || otherpackages gcc || exit + jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit + if [[ "$PLUGINS_LINUXx86" =~ "ffmpeg" ]]; then + debianpackages libswscale-dev libavcodec-dev || otherpackages || exit + fi +fi +if [ "$BUILD_LINUXx64" == "y" ]; then + #for building linux targets + debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev || otherpackages gcc || exit + jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit + if [[ "$PLUGINS_LINUXx64" =~ "ffmpeg" ]]; then + debianpackages libswscale-dev libavcodec-dev || otherpackages || exit + fi +fi +if [ "$BUILD_LINUXx32" == "y" ]; then + #for building linux targets + debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev || otherpackages gcc || exit + jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit +fi +if [ "$BUILD_LINUXarmhf" == "y" ]; then + #for building linux targets + debianpackages gcc-multilib-arm-linux-gnueabihf g++-multilib-arm-linux-gnueabihf mesa-common-dev libasound2-dev || otherpackages gcc || exit + jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit +fi +if [ "$BUILD_SDL" == "y" ]; then + #for building SDL targets + debianpackages libSDL1.2-dev libSDL2-dev libspeex-dev libspeexdsp-dev || otherpackages || exit +fi + +if [ "$BUILD_WINDOWS" == "y" ]; then + #for building windows targets + debianpackages mingw-w64 || otherpackages x86_64-w64-mingw32-gcc || exit +fi + + +if [ "$BUILD_ANDROID" == "y" ]; then + ( (jessiepackages openjdk-8-jdk-headless || debianpackages openjdk-8-jdk-headless ) && debianpackages ant) || otherpackages || exit +fi + +if [ "$BUILD_WEB" == "y" ]; then + ( (jessiepackages cmake || debianpackages cmake) && debianpackages git build-essential) || exit +fi + +if [ "$BUILD_MAC" == "y" ]; then + debianpackages git cmake libxml2-dev fuse || otherpackages || exit +fi +debianpackages subversion make build-essential || otherpackages svn make || exit + +echo "System Package checks complete." + +if [ "$UID" == "0" ]; then + #avoid root taking ownership of anything. + echo "Refusing to update/rebuild toolchains as root." + echo "Please continue running this script as a regular user." + exit +fi + +echo +echo "(Any new toolchains will be installed to $FTEROOT)" +echo "(Say no if you're certain you already set up everything)" +read -n 1 -p "Rebuild/update any toolchains now? [y/N] " REBUILD_TOOLCHAINS && echo +REBUILD_TOOLCHAINS=${REBUILD_TOOLCHAINS:-n} +mkdir -p $FTEROOT + +#dos shit +if [ "$BUILD_DOS" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then + echo "You'll need to manually install djgpp for DOS builds." +fi + +#android shit. WARNING: should come first as it spits out some EULAs that need confirming. +if [ "$BUILD_ANDROID" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then + mkdir -p $ANDROIDROOT + cd $ANDROIDROOT + wget -N https://dl.google.com/android/repository/tools_r25.2.3-linux.zip + unzip -qn tools_r25.2.3-linux.zip + cd tools/bin + #yes, android-8 is fucking old now. newer versions won't work on older devices. + echo "downloading android build tools" + ./sdkmanager "build-tools;$ANDROID_BUILDTOOLS" + echo "downloading android platform tools" + ./sdkmanager "platform-tools" + echo "downloading android-9" + ./sdkmanager "platforms;android-9" + echo "downloading android ndk" + ./sdkmanager "ndk-bundle" + cd ~ +fi + +#emscripten/web shit +if [ "$BUILD_WEB" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then + mkdir -p $EMSCRIPTENROOT + cd $EMSCRIPTENROOT/.. + wget -N https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz + cd $EMSCRIPTENROOT + tar xzf ../emsdk-portable.tar.gz --strip-components=1 + ./emsdk install latest + ./emsdk activate latest + cd ~ +fi + + +#osxcross, for mac crap +if [ "$BUILD_MAC" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then + echo "Setting up OSXCross... THIS IS TOTALLY UNTESTED" + read -p "You need to download xcode first. Where did you download the .dmg file to?" XCODE + git clone https://github.com/tpoechtrager/osxcross.git $OSXCROSSROOT + cd $OSXCROSSROOT + tools/gen_sdk_package_darling_dmg.sh $XCODE + cp *.tar.xz + SDK_VERSION=10.10 UNATTENDED=0 ./build.sh + cd ~ +fi + +if [ "$BUILD_NACL" == "y" ] && [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then + echo "Setting up NaCL..." + mkdir -p $NACLROOT + cd $NACLROOT/.. + wget -N https://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip + unzip -qn nacl_sdk.zip + cd $NACLROOT + ./naclsdk update $NACLSDKVERSION +fi + + +#initial checkout of fte's svn +if [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then + if [ ! -d $SVNROOT ]; then + svn checkout https://svn.code.sf.net/p/fteqw/code/trunk $SVNROOT + else + cd $SVNROOT + svn up + fi + + #FIXME: there may be race conditions when compiling. + #so make sure we've pre-built certain targets without using -j + #linux distros vary too much with various dependancies and versions and such, so we might as well pre-build our own copies of certain libraries. this really only needs to be done once, but its safe to retry anyway. + cd $SVNROOT/engine + if [ "$BUILD_LINUXx86" == "y" ]; then + echo "Making libraries (x86)..." + make FTE_TARGET=linux32 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null + fi + if [ "$BUILD_LINUXx64" == "y" ]; then + echo "Making libraries (linux x86_64)..." + make FTE_TARGET=linux64 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null + fi + if [ "$BUILD_LINUXx32" == "y" ]; then + echo "Making libraries (linux x32)..." + make FTE_TARGET=linuxx32 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null + fi + if [ "$BUILD_LINUXarmhf" == "y" ]; then + echo "Making libraries (linux armhf)..." + make FTE_TARGET=linuxarmhf makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null + fi + if [ "$BUILD_WINDOWS" == "y" ] && [[ "$PLUGINS_WINDOWS" =~ "ode" ]]; then + echo "Prebuilding ODE library (win32)..." + make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=ode 2>&1 >>/dev/null + echo "Prebuilding ODE library (win64)..." + make FTE_TARGET=win64 plugins-rel NATIVE_PLUGINS=ode 2>&1 >>/dev/null + fi + if [ "$BUILD_LINUXx86" == "y" ] && [[ "$PLUGINS_LINUXx86" =~ "ode" ]]; then + echo "Prebuilding ODE library (linux x86)..." + make FTE_TARGET=linux32 plugins-rel NATIVE_PLUGINS=ode CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null + fi + if [ "$BUILD_LINUXx64" == "y" ] && [[ "$PLUGINS_LINUXx64" =~ "ode" ]]; then + echo "Prebuilding ODE library (linux x86_64)..." + make FTE_TARGET=linux64 plugins-rel NATIVE_PLUGINS=ode CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null + fi + if [ "$BUILD_WINDOWS" == "y" ]; then + echo "Obtaining ffmpeg library (win32)..." + make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=ffmpeg 2>&1 >>/dev/null + echo "Obtaining ffmpeg library (win64)..." + make FTE_TARGET=win64 plugins-rel NATIVE_PLUGINS=ffmpeg 2>&1 >>/dev/null + fi + cd ~ +fi + + + +echo "Setup script complete." +echo "When you run build_wip.sh output will be written to $BUILDFOLDER/*" diff --git a/build_wip.sh b/build_wip.sh index 4ff48d05..7e3ff937 100755 --- a/build_wip.sh +++ b/build_wip.sh @@ -1,329 +1,329 @@ -#!/bin/bash -START=$(date +%s) - -SVNROOT=$(cd "$(dirname "$(readlink "$BASH_SOURCE")")" && pwd) -FTECONFIG=$SVNROOT/build.cfg - -HOME=`echo ~` -BASE=$SVNROOT/.. -#set this if you want non-default branding, for customised builds. -#export BRANDING=wastes - -#defaults, if we're not set up properly. -#should be overriden in build.cfg -BUILDFOLDER=$HOME/htdocs -BUILDLOGFOLDER=$BUILDFOLDER/build_logs -SVNROOT=$BASE/fteqw-code -BUILD_LINUXx86=y -BUILD_LINUXx64=y -BUILD_WINDOWS=y -BUILD_ANDROID=y -BUILD_WEB=y -PLUGINS_LINUXx86="qi ezhud xmpp irc" -PLUGINS_LINUXx64="qi ezhud xmpp irc" -PLUGINS_LINUXx32="qi ezhud xmpp irc" -PLUGINS_WINDOWS="avplug ode qi ezhud xmpp irc" -THREADS="-j 4" - -########### NaCL stuff -NACL_SDK_ROOT=/opt/nacl_sdk/pepper_31/ - -if [ -e $FTECONFIG ]; then - . $FTECONFIG -else - echo "WARNING: $FTECONFIG does not exist yet." -fi - -export NACL_SDK_ROOT - -########### Emscripten / Web Stuff -export EMSDK=$EMSCRIPTENROOT -#export WEB_PREJS="--pre-js $HOME/prejs.js" - -########### Android Stuff. so messy... -#This is some android password that you should keep private. You should keep the keystore file private too, of course. Frankly, that part is more important than this small random number. -KEYPASSFILE=$BASE/.fte_keypass -if [ ! -e $KEYPASSFILE ]; then - dd if=/dev/urandom count=9 bs=1 2>/dev/null | base64 > $KEYPASSFILE - chmod 400 $KEYPASSFILE -fi -KEYPASS=`cat $KEYPASSFILE` -export JAVA_HOME=/usr -if [ ! -z "$ANDROIDROOT" ]; then - export ANDROID_HOME=$ANDROIDROOT -fi -if [ ! -z "$ANDROIDNDKROOT" ]; then - export ANDROID_NDK_ROOT=$ANDROIDNDKROOT -else - export ANDROID_NDK_ROOT=$ANDROID_HOME/ndk-bundle -fi -export KEYTOOLARGS="-keypass $KEYPASS -storepass $KEYPASS -dname \"CN=fteqw.com, OU=ID, O=FTE, L=Unknown, S=Unknown, C=GB\"" -export JARSIGNARGS="-storepass $KEYPASS" - -########### Various Output etc Paths -QCCBUILDFOLDER=$BUILDFOLDER/fteqcc -SVNFOLDER=$SVNROOT/engine/release -ARCHIVEFOLDER=$BUILDFOLDER/archive -SVNDBGFOLDER=$SVNROOT/engine/debug -WARNINGLEVEL="-w" -FILELOCK=$BASE/.fte_buildlock - -#./ccache-alias.sh - -exec 9>$FILELOCK -if ! flock -n 9 ; then - echo "Build script is already running!"; - exit 1 -fi - -mkdir -p $BUILDLOGFOLDER -if [ ! -d $SVNROOT ]; then - #just in case... - svn checkout https://svn.code.sf.net/p/fteqw/code/trunk $SVNROOT -fi - -cd $SVNROOT/ - -echo "SVN Update" -svn update - -cd engine - -date > $BUILDLOGFOLDER/buildlog.txt -echo "Starting build" >> $BUILDLOGFOLDER/buildlog.txt - -function build { - BUILDSTART=$(date +%s) - NAME=$1 - DEST=$2 - shift; shift - make clean >> /dev/null - echo -n "Making $NAME... " - date > $BUILDLOGFOLDER/$DEST.txt - echo make $THREADS $* >> $BUILDLOGFOLDER/$DEST.txt 2>&1 - make $THREADS $* >> $BUILDLOGFOLDER/$DEST.txt 2>&1 - if [ $? -eq 0 ]; then - BUILDEND=$(date +%s) - BUILDTIME=$(( $BUILDEND - $BUILDSTART )) - echo "$BUILDTIME seconds" - echo "$NAME done, took $BUILDTIME seconds" >> $BUILDLOGFOLDER/buildlog.txt - rm -rf $BUILDFOLDER/$DEST >> /dev/null 2>&1 - mkdir $BUILDFOLDER/$DEST 2>> /dev/null - mkdir $BUILDFOLDER/$DEST/debug 2>> /dev/null - cp $SVNFOLDER/* $BUILDFOLDER/$DEST >> /dev/null 2>> /dev/null - cp $SVNDBGFOLDER/* $BUILDFOLDER/$DEST/debug >> /dev/null 2>> /dev/null - rm -rf $BUILDFOLDER/$DEST/*.a >> /dev/null 2>&1 - rm -rf $BUILDFOLDER/$DEST/debug/*.a >> /dev/null 2>&1 - rmdir $BUILDFOLDER/$DEST/debug 2>> /dev/null - else - echo "$NAME failed" >> $BUILDLOGFOLDER/buildlog.txt - echo "failed" - fi -} - -function build_fteqcc { - echo "--- no code ---" -} - -echo "--- Engine builds ---" -#the -fno-finite-math-only is to avoid a glibc dependancy -if [ "$BUILD_LINUXx86" != "n" ]; then - NATIVE_PLUGINS="$PLUGINS_LINUXx86" build "Linux 32-bit" linux_x86 FTE_TARGET=linux32 CPUOPTIMIZATIONS=-fno-finite-math-only qcc-rel rel dbg vk-rel plugins-rel plugins-dbg -fi -if [ "$BUILD_LINUXx64" != "n" ]; then - NATIVE_PLUGINS="$PLUGINS_LINUXx64" build "Linux 64-bit" linux_amd64 FTE_TARGET=linux64 LDFLAGS="-Llibs/64" CPUOPTIMIZATIONS=-fno-finite-math-only qcc-rel rel dbg vk-rel plugins-rel plugins-dbg -fi -if [ "$BUILD_LINUXx32" != "n" ]; then -# CFLAGS="-DNO_JPEG" - NATIVE_PLUGINS="$PLUGINS_LINUXx32" build "Linux x32" linux_x32 FTE_TARGET=linuxx32 CPUOPTIMIZATIONS=-fno-finite-math-only qcc-rel rel dbg plugins-rel plugins-dbg -fi -if [ "$BUILD_LINUXarmhf" != "n" ]; then - #debian/ubuntu's armhf targets armv7. we instead target armv6, because that means we work on rpi too (but still with hard-float). It should be compatible although we likely need more ops. - NATIVE_PLUGINS="$PLUGINS_LINUXarmhf" build "Linux ARMhf" linux_armhf FTE_TARGET=linuxarmhf CPUOPTIMIZATIONS=-fno-finite-math-only rel dbg qcc-rel plugins-rel plugins-dbg -fi -if [ "$BUILD_CYGWIN" != "n" ]; then - NATIVE_PLUGINS="qi ezhud" build "Cygwin" cygwin qcc-rel rel dbg plugins-rel plugins-dbg -fi -if [ "$BUILD_WINDOWS" != "n" ]; then - NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows 32-bit" win32 FTE_TARGET=win32 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel NATIVE_PLUGINS="$PLUGINS_WINDOWS" - NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows 64-bit" win64 FTE_TARGET=win64 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel -fi -if [ "$BUILD_MSVC" != "n" ]; then - NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows MSVC 32-bit" msvc FTE_TARGET=vc BITS=32 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel - NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows MSVC 64-bit" msvc FTE_TARGET=vc BITS=64 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel -fi -export NATIVE_PLUGINS="qi ezhud xmpp irc" -if [ "$BUILD_ANDROID" != "n" ]; then - build "Android" android droid-rel -fi -if [ "$BUILD_WINDOWS" != "n" ]; then - build "NPFTE" npfte npfte-rel -fi -if [ "$BUILD_DOS" == "y" ]; then - #no networking makes dedicated servers useless. and only a crappy sw renderer is implemented right now. - #the qcc might be useful to someone though! - build "DOS" dos m-rel qcc-rel -fi -if [ "$BUILD_WEB" != "n" ]; then - source $EMSDK/emsdk_env.sh >> /dev/null - build "Emscripten" web FTE_TARGET=web gl-rel CC=emcc -fi -if [ "$BUILD_LINUX" != "n" ] && [ "$BUILD_SDL" != "n" ] && [ "$(uname -m)" != "x86_64" ]; then - build "Linux 32-bit (SDL)" linux_x86_sdl FTE_TARGET=SDL BITS=32 LTO=1 -fi -if [ "$BUILD_LINUX" != "n" ] && [ "$BUILD_SDL" != "n" ] && [ "$(uname -m)" == "x86_64" ]; then - build "Linux 64-bit (SDL)" linux_amd64_sdl FTE_TARGET=SDL BITS=64 LDFLAGS="-Llibs/64" LTO=1 -fi -if [ "$BUILD_WINDOWS" != "n" ] && [ "$BUILD_SDL" != "n" ]; then - build "Windows 32-bit (SDL)" win32_sdl FTE_TARGET=win32_SDL gl-rel mingl-rel - build "Windows 64-bit (SDL)" win64_sdl FTE_TARGET=win64_SDL LDFLAGS="-L./libs/mingw64-libs/" gl-rel mingl-rel - CFLAGS="$WARNINGLEVEL -DNOLEGACY -DOMIT_QCC" build "Windows 32-bit nocompat" nocompat FTE_TARGET=win32 LTO=1 NOCOMPAT=1 BOTLIB_CFLAGS="" BOTLIB_OBJS="" gl-rel m-rel -k -fi -if [ "$BUILD_NACL" != "n" ]; then - #non-pnacl is supported ONLY in chrome's store crap, but pnacl works anywhere. -# build "Native Client 64-bit" nacl_amd64 FTE_TARGET=nacl NARCH=x86_64 gl-rel -# build "Native Client 32-bit" nacl_x86 FTE_TARGET=nacl NARCH=x86_32 gl-rel -#internal compiler error build "Native Client ARM" nacl_arm FTE_TARGET=nacl NARCH=arm gl-rel - build "Native Client Portable" nacl_portable FTE_TARGET=nacl NARCH=pnacl gl-rel -fi -####build "MorphOS" morphos CFLAGS="-I$BASE/morphos/os-include/ -I$BASE/morphos/lib/ -L$BASE/morphos/lib/ -I$BASE/zlib/zlib-1.2.5 -L$BASE/zlib/zlib-1.2.5 -I./libs $WARNINGLEVEL" gl-rel mingl-rel sv-rel qcc-rel -if [ "$BUILD_MAC" != "n" ]; then - #build "MacOSX" macosx_tiger CFLAGS="-I$BASE/mac/x86/include/ -L$BASE/mac/x86/lib -I./libs" FTE_TARGET=macosx_x86 sv-rel gl-rel mingl-rel qcc-rel - #FIXME: figure out how to do universal binaries or whatever they're called - build "MacOSX 32-bit" osx32 CC=o32-clang CXX=o32-clang++ FTE_TARGET=osx_x86 BITS=32 sv-rel gl-rel mingl-rel qcc-rel - build "MacOSX 64-bit" osx64 CC=o64-clang CXX=o64-clang++ FTE_TARGET=osx_x86_64 BITS=64 sv-rel gl-rel mingl-rel qcc-rel -fi - -#third party stuff / misc crap -if [ "$BUILD_WEB" != "n" ]; then - cp $BASE/3rdparty/web/* $BUILDFOLDER/web/ -fi -if [ "$BUILD_WINDOWS" != "n" ]; then - cp $BASE/3rdparty/win32/3rdparty.zip $BUILDFOLDER/win32/3rdparty.zip - cp $BASE/3rdparty/win64/3rdparty.zip $BUILDFOLDER/win64/3rdparty.zip - if [ "$BUILD_SDL" != "n" ]; then - cp $SVNROOT/engine/libs/SDL2-2.0.1/i686-w64-mingw32/bin/SDL2.dll $BUILDFOLDER/win32_sdl - cp $SVNROOT/engine/libs/SDL2-2.0.1/x86_64-w64-mingw32/bin/SDL2.dll $BUILDFOLDER/win64_sdl - fi - cp $HOME/nocompat_readme.html $BUILDFOLDER/nocompat/README.html -fi - -echo "--- QC builds ---" -rm -rf $QCCBUILDFOLDER 2>&1 -mkdir -p $QCCBUILDFOLDER -if [ -e "$BUILDFOLDER/linux_x86/fteqw-gl32" ] -then - echo "Making fteextensions.qc" - mkdir -p ~/.fte/fte - echo "pr_dumpplatform -o fteextensions" > ~/.fte/fte/minusargsaresilly.cfg - echo "pr_dumpplatform -o csqcsysdefs -Tcs" >> ~/.fte/fte/minusargsaresilly.cfg - echo "pr_dumpplatform -o menusysdefs -Tmenu" >> ~/.fte/fte/minusargsaresilly.cfg - $BUILDFOLDER/linux_x86/fteqw-gl32 -basedir ~/.fte -nohome -quake +set snd_device none -nosound +set vid_renderer sv +exec minusargsaresilly.cfg +quit >> /dev/null - mv ~/.fte/fte/src/fteextensions.qc $QCCBUILDFOLDER - mv ~/.fte/fte/src/csqcsysdefs.qc $QCCBUILDFOLDER - mv ~/.fte/fte/src/menusysdefs.qc $QCCBUILDFOLDER -else - echo "Skipping FTE Extensions, no Linux gl32 build located" -fi - - -if [ -e $BUILDFOLDER/linux_x86/fteqcc32 ]; then - echo "Making csaddon + qcmenu" - mkdir -p $BUILDFOLDER/csaddon/ - cd $SVNROOT/quakec - cd csaddon/src - $BUILDFOLDER/linux_x86/fteqcc32 -srcfile csaddon.src > $BUILDLOGFOLDER/csaddon.txt - mv ../csaddon.dat $BUILDFOLDER/csaddon/ - - cd ../../menusys - $BUILDFOLDER/linux_x86/fteqcc32 -srcfile menu.src > $BUILDLOGFOLDER/menu.txt - rm fteqcc.log - zip -q -9 -o -r $BUILDFOLDER/csaddon/menusys_src.zip . - mv ../menu.dat $BUILDFOLDER/csaddon/ -else - echo "Skiping csaddon + qcmenu, no compiler build" -fi - -cd $SVNROOT/engine/ -svn info > $BUILDFOLDER/version.txt - -if [ "$BUILD_LINUXx86" != "n" ]; then - cp $BUILDFOLDER/linux_x86/fteqcc32 $QCCBUILDFOLDER/linux32-fteqcc -fi -if [ "$BUILD_LINUXx64" != "n" ]; then - cp $BUILDFOLDER/linux_amd64/fteqcc64 $QCCBUILDFOLDER/linux64-fteqcc -fi -if [ "$BUILD_LINUXx32" != "n" ]; then - cp $BUILDFOLDER/linux_x32/fteqccx32 $QCCBUILDFOLDER/linuxx32-fteqcc -fi -if [ "$BUILD_LINUXarmhf" != "n" ]; then - cp $BUILDFOLDER/linux_armhf/fteqccarmhf $QCCBUILDFOLDER/linuxarmhf-fteqcc -fi -if [ "$BUILD_WINDOWS" != "n" ]; then - cp $BUILDFOLDER/win32/fteqcc.exe $QCCBUILDFOLDER/win32-fteqcc.exe - cp $BUILDFOLDER/win32/fteqccgui.exe $QCCBUILDFOLDER/win32-fteqccgui.exe - cp $BUILDFOLDER/win64/fteqcc64.exe $QCCBUILDFOLDER/win64-fteqcc.exe - cp $BUILDFOLDER/win64/fteqccgui64.exe $QCCBUILDFOLDER/win64-fteqccgui.exe -fi -#cp $BUILDFOLDER/morphos/fteqcc $QCCBUILDFOLDER/morphos-fteqcc -#cp $BUILDFOLDER/macosx_tiger/fteqcc $QCCBUILDFOLDER/macosx_tiger-fteqcc -cp $BUILDFOLDER/version.txt $QCCBUILDFOLDER/version.txt - -if [ "$BUILD_NACL" != "n" ]; then - mkdir -p $BUILDFOLDER/nacl - NACL=$BUILDFOLDER/nacl/fteqw.nmf - echo "{ \"program\":{" > $NACL - if [ -e "$BUILDFOLDER/nacl_amd64/fteqw-x86_64.nexe" ]; then - mv $BUILDFOLDER/nacl_amd64/fteqw-x86_64.nexe $BUILDFOLDER/nacl/fteqw-x86_64.nexe - echo " \"x86-64\":{\"url\":\"fteqw-x86_64.nexe\"}," >> $NACL - fi - if [ -e "$BUILDFOLDER/nacl_x86/fteqw-x86_32.nexe" ]; then - mv $BUILDFOLDER/nacl_x86/fteqw-x86_32.nexe $BUILDFOLDER/nacl/fteqw-x86_32.nexe - echo " \"x86-32\":{\"url\":\"fteqw-x86_32.nexe\"}," >> $NACL - fi - if [ -e "$BUILDFOLDER/nacl_arm/fteqw-arm.nexe" ]; then - mv $BUILDFOLDER/nacl_arm/fteqw-arm.nexe $BUILDFOLDER/nacl/fteqw-arm.nexe - echo " \"arm\":{\"url\":\"fteqw-arm.nexe\"}" >> $NACL - fi - $NACL_SDK_ROOT/toolchain/linux_pnacl/bin/pnacl-finalize -o $BUILDFOLDER/nacl/fteqw.pexe $BUILDFOLDER/nacl_portable/fteqw.pexe - echo " \"portable\":{\"pnacl-translate\":{\"url\":\"fteqw.pexe\"}}" >> $NACL - echo "} }" >> $NACL - rm -rf "$BUILDFOLDER/nacl_amd64" - rm -rf "$BUILDFOLDER/nacl_x86" - rm -rf "$BUILDFOLDER/nacl_arm" - rm -rf "$BUILDFOLDER/nacl_portable" -fi - -if [ "$BUILD_WINDOWS" != "n" ]; then - echo Archiving output - SVNVER=$(svnversion $SVNROOT) - cd $BUILDFOLDER/ - zip -q -9 $ARCHIVEFOLDER/win_fteqw_$SVNVER.zip win32/fteglqw.exe win32/fteqwsv.exe win32/fteqccgui.exe win32/debug/fteglqw.exe win64/fteqw.exe win64/debug/fteglqw.exe - - - cd $BUILDFOLDER/win32/ - zip -q -j -9 $BUILDFOLDER/fteqw_for_windows.zip fteglqw.exe fteqwsv.exe fteqccgui.exe fteplug_qi_x86.dll fteplug_xmpp_x86.dll fteplug_irc_x86.dll fteplug_ezhud_x86.dll - cd $HOME/3rdparty_win32/ - zip -q -9 $BUILDFOLDER/fteqw_for_windows.zip ogg.dll vorbis.dll vorbisfile.dll freetype6.dll zlib1.dll - mkdir -p $BASE/tmp/fte - cd $BASE/tmp/ - cp $BUILDFOLDER/csaddon/menu.dat fte - zip -q -9 $BUILDFOLDER/fteqw_for_windows.zip fte/menu.dat - - #~/afterquake/updatemini.sh -fi - -echo "All done" - -END=$(date +%s) -DIFF=$(( $END - $START )) -MINS=$(( $DIFF / 60 )) -echo "Total Compile Time: $MINS minutes" >> $BUILDLOGFOLDER/buildlog.txt -echo "Total Compile Time: $MINS minutes" - -cd $HOME -#./errorlog.sh -#cd $HOME -#rm .bitchxrc -#cp ./fteqw/.bitchxrc ./ -#./BitchX -a irc.quakenet.org -A -c "#fte" -n A_Gorilla +#!/bin/bash +START=$(date +%s) + +SVNROOT=$(cd "$(dirname "$(readlink "$BASH_SOURCE")")" && pwd) +FTECONFIG=$SVNROOT/build.cfg + +HOME=`echo ~` +BASE=$SVNROOT/.. +#set this if you want non-default branding, for customised builds. +#export BRANDING=wastes + +#defaults, if we're not set up properly. +#should be overriden in build.cfg +BUILDFOLDER=$HOME/htdocs +BUILDLOGFOLDER=$BUILDFOLDER/build_logs +SVNROOT=$BASE/fteqw-code +BUILD_LINUXx86=y +BUILD_LINUXx64=y +BUILD_WINDOWS=y +BUILD_ANDROID=y +BUILD_WEB=y +PLUGINS_LINUXx86="qi ezhud xmpp irc" +PLUGINS_LINUXx64="qi ezhud xmpp irc" +PLUGINS_LINUXx32="qi ezhud xmpp irc" +PLUGINS_WINDOWS="avplug ode qi ezhud xmpp irc" +THREADS="-j 4" + +########### NaCL stuff +NACL_SDK_ROOT=/opt/nacl_sdk/pepper_31/ + +if [ -e $FTECONFIG ]; then + . $FTECONFIG +else + echo "WARNING: $FTECONFIG does not exist yet." +fi + +export NACL_SDK_ROOT + +########### Emscripten / Web Stuff +export EMSDK=$EMSCRIPTENROOT +#export WEB_PREJS="--pre-js $HOME/prejs.js" + +########### Android Stuff. so messy... +#This is some android password that you should keep private. You should keep the keystore file private too, of course. Frankly, that part is more important than this small random number. +KEYPASSFILE=$BASE/.fte_keypass +if [ ! -e $KEYPASSFILE ]; then + dd if=/dev/urandom count=9 bs=1 2>/dev/null | base64 > $KEYPASSFILE + chmod 400 $KEYPASSFILE +fi +KEYPASS=`cat $KEYPASSFILE` +export JAVA_HOME=/usr +if [ ! -z "$ANDROIDROOT" ]; then + export ANDROID_HOME=$ANDROIDROOT +fi +if [ ! -z "$ANDROIDNDKROOT" ]; then + export ANDROID_NDK_ROOT=$ANDROIDNDKROOT +else + export ANDROID_NDK_ROOT=$ANDROID_HOME/ndk-bundle +fi +export KEYTOOLARGS="-keypass $KEYPASS -storepass $KEYPASS -dname \"CN=fteqw.com, OU=ID, O=FTE, L=Unknown, S=Unknown, C=GB\"" +export JARSIGNARGS="-storepass $KEYPASS" + +########### Various Output etc Paths +QCCBUILDFOLDER=$BUILDFOLDER/fteqcc +SVNFOLDER=$SVNROOT/engine/release +ARCHIVEFOLDER=$BUILDFOLDER/archive +SVNDBGFOLDER=$SVNROOT/engine/debug +WARNINGLEVEL="-w" +FILELOCK=$BASE/.fte_buildlock + +#./ccache-alias.sh + +exec 9>$FILELOCK +if ! flock -n 9 ; then + echo "Build script is already running!"; + exit 1 +fi + +mkdir -p $BUILDLOGFOLDER +if [ ! -d $SVNROOT ]; then + #just in case... + svn checkout https://svn.code.sf.net/p/fteqw/code/trunk $SVNROOT +fi + +cd $SVNROOT/ + +echo "SVN Update" +svn update + +cd engine + +date > $BUILDLOGFOLDER/buildlog.txt +echo "Starting build" >> $BUILDLOGFOLDER/buildlog.txt + +function build { + BUILDSTART=$(date +%s) + NAME=$1 + DEST=$2 + shift; shift + make clean >> /dev/null + echo -n "Making $NAME... " + date > $BUILDLOGFOLDER/$DEST.txt + echo make $THREADS $* >> $BUILDLOGFOLDER/$DEST.txt 2>&1 + make $THREADS $* >> $BUILDLOGFOLDER/$DEST.txt 2>&1 + if [ $? -eq 0 ]; then + BUILDEND=$(date +%s) + BUILDTIME=$(( $BUILDEND - $BUILDSTART )) + echo "$BUILDTIME seconds" + echo "$NAME done, took $BUILDTIME seconds" >> $BUILDLOGFOLDER/buildlog.txt + rm -rf $BUILDFOLDER/$DEST >> /dev/null 2>&1 + mkdir $BUILDFOLDER/$DEST 2>> /dev/null + mkdir $BUILDFOLDER/$DEST/debug 2>> /dev/null + cp $SVNFOLDER/* $BUILDFOLDER/$DEST >> /dev/null 2>> /dev/null + cp $SVNDBGFOLDER/* $BUILDFOLDER/$DEST/debug >> /dev/null 2>> /dev/null + rm -rf $BUILDFOLDER/$DEST/*.a >> /dev/null 2>&1 + rm -rf $BUILDFOLDER/$DEST/debug/*.a >> /dev/null 2>&1 + rmdir $BUILDFOLDER/$DEST/debug 2>> /dev/null + else + echo "$NAME failed" >> $BUILDLOGFOLDER/buildlog.txt + echo "failed" + fi +} + +function build_fteqcc { + echo "--- no code ---" +} + +echo "--- Engine builds ---" +#the -fno-finite-math-only is to avoid a glibc dependancy +if [ "$BUILD_LINUXx86" != "n" ]; then + NATIVE_PLUGINS="$PLUGINS_LINUXx86" build "Linux 32-bit" linux_x86 FTE_TARGET=linux32 CPUOPTIMIZATIONS=-fno-finite-math-only qcc-rel rel dbg vk-rel plugins-rel plugins-dbg +fi +if [ "$BUILD_LINUXx64" != "n" ]; then + NATIVE_PLUGINS="$PLUGINS_LINUXx64" build "Linux 64-bit" linux_amd64 FTE_TARGET=linux64 LDFLAGS="-Llibs/64" CPUOPTIMIZATIONS=-fno-finite-math-only qcc-rel rel dbg vk-rel plugins-rel plugins-dbg +fi +if [ "$BUILD_LINUXx32" != "n" ]; then +# CFLAGS="-DNO_JPEG" + NATIVE_PLUGINS="$PLUGINS_LINUXx32" build "Linux x32" linux_x32 FTE_TARGET=linuxx32 CPUOPTIMIZATIONS=-fno-finite-math-only qcc-rel rel dbg plugins-rel plugins-dbg +fi +if [ "$BUILD_LINUXarmhf" != "n" ]; then + #debian/ubuntu's armhf targets armv7. we instead target armv6, because that means we work on rpi too (but still with hard-float). It should be compatible although we likely need more ops. + NATIVE_PLUGINS="$PLUGINS_LINUXarmhf" build "Linux ARMhf" linux_armhf FTE_TARGET=linuxarmhf CPUOPTIMIZATIONS=-fno-finite-math-only rel dbg qcc-rel plugins-rel plugins-dbg +fi +if [ "$BUILD_CYGWIN" != "n" ]; then + NATIVE_PLUGINS="qi ezhud" build "Cygwin" cygwin qcc-rel rel dbg plugins-rel plugins-dbg +fi +if [ "$BUILD_WINDOWS" != "n" ]; then + NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows 32-bit" win32 FTE_TARGET=win32 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel NATIVE_PLUGINS="$PLUGINS_WINDOWS" + NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows 64-bit" win64 FTE_TARGET=win64 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel +fi +if [ "$BUILD_MSVC" != "n" ]; then + NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows MSVC 32-bit" msvc FTE_TARGET=vc BITS=32 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel + NATIVE_PLUGINS="$PLUGINS_WINDOWS" build "Windows MSVC 64-bit" msvc FTE_TARGET=vc BITS=64 CFLAGS="$WARNINGLEVEL" sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel +fi +export NATIVE_PLUGINS="qi ezhud xmpp irc" +if [ "$BUILD_ANDROID" != "n" ]; then + build "Android" android droid-rel +fi +if [ "$BUILD_WINDOWS" != "n" ]; then + build "NPFTE" npfte npfte-rel +fi +if [ "$BUILD_DOS" == "y" ]; then + #no networking makes dedicated servers useless. and only a crappy sw renderer is implemented right now. + #the qcc might be useful to someone though! + build "DOS" dos m-rel qcc-rel +fi +if [ "$BUILD_WEB" != "n" ]; then + source $EMSDK/emsdk_env.sh >> /dev/null + build "Emscripten" web FTE_TARGET=web gl-rel CC=emcc +fi +if [ "$BUILD_LINUX" != "n" ] && [ "$BUILD_SDL" != "n" ] && [ "$(uname -m)" != "x86_64" ]; then + build "Linux 32-bit (SDL)" linux_x86_sdl FTE_TARGET=SDL BITS=32 LTO=1 +fi +if [ "$BUILD_LINUX" != "n" ] && [ "$BUILD_SDL" != "n" ] && [ "$(uname -m)" == "x86_64" ]; then + build "Linux 64-bit (SDL)" linux_amd64_sdl FTE_TARGET=SDL BITS=64 LDFLAGS="-Llibs/64" LTO=1 +fi +if [ "$BUILD_WINDOWS" != "n" ] && [ "$BUILD_SDL" != "n" ]; then + build "Windows 32-bit (SDL)" win32_sdl FTE_TARGET=win32_SDL gl-rel mingl-rel + build "Windows 64-bit (SDL)" win64_sdl FTE_TARGET=win64_SDL LDFLAGS="-L./libs/mingw64-libs/" gl-rel mingl-rel + CFLAGS="$WARNINGLEVEL -DNOLEGACY -DOMIT_QCC" build "Windows 32-bit nocompat" nocompat FTE_TARGET=win32 LTO=1 NOCOMPAT=1 BOTLIB_CFLAGS="" BOTLIB_OBJS="" gl-rel m-rel -k +fi +if [ "$BUILD_NACL" != "n" ]; then + #non-pnacl is supported ONLY in chrome's store crap, but pnacl works anywhere. +# build "Native Client 64-bit" nacl_amd64 FTE_TARGET=nacl NARCH=x86_64 gl-rel +# build "Native Client 32-bit" nacl_x86 FTE_TARGET=nacl NARCH=x86_32 gl-rel +#internal compiler error build "Native Client ARM" nacl_arm FTE_TARGET=nacl NARCH=arm gl-rel + build "Native Client Portable" nacl_portable FTE_TARGET=nacl NARCH=pnacl gl-rel +fi +####build "MorphOS" morphos CFLAGS="-I$BASE/morphos/os-include/ -I$BASE/morphos/lib/ -L$BASE/morphos/lib/ -I$BASE/zlib/zlib-1.2.5 -L$BASE/zlib/zlib-1.2.5 -I./libs $WARNINGLEVEL" gl-rel mingl-rel sv-rel qcc-rel +if [ "$BUILD_MAC" != "n" ]; then + #build "MacOSX" macosx_tiger CFLAGS="-I$BASE/mac/x86/include/ -L$BASE/mac/x86/lib -I./libs" FTE_TARGET=macosx_x86 sv-rel gl-rel mingl-rel qcc-rel + #FIXME: figure out how to do universal binaries or whatever they're called + build "MacOSX 32-bit" osx32 CC=o32-clang CXX=o32-clang++ FTE_TARGET=osx_x86 BITS=32 sv-rel gl-rel mingl-rel qcc-rel + build "MacOSX 64-bit" osx64 CC=o64-clang CXX=o64-clang++ FTE_TARGET=osx_x86_64 BITS=64 sv-rel gl-rel mingl-rel qcc-rel +fi + +#third party stuff / misc crap +if [ "$BUILD_WEB" != "n" ]; then + cp $BASE/3rdparty/web/* $BUILDFOLDER/web/ +fi +if [ "$BUILD_WINDOWS" != "n" ]; then + cp $BASE/3rdparty/win32/3rdparty.zip $BUILDFOLDER/win32/3rdparty.zip + cp $BASE/3rdparty/win64/3rdparty.zip $BUILDFOLDER/win64/3rdparty.zip + if [ "$BUILD_SDL" != "n" ]; then + cp $SVNROOT/engine/libs/SDL2-2.0.1/i686-w64-mingw32/bin/SDL2.dll $BUILDFOLDER/win32_sdl + cp $SVNROOT/engine/libs/SDL2-2.0.1/x86_64-w64-mingw32/bin/SDL2.dll $BUILDFOLDER/win64_sdl + fi + cp $HOME/nocompat_readme.html $BUILDFOLDER/nocompat/README.html +fi + +echo "--- QC builds ---" +rm -rf $QCCBUILDFOLDER 2>&1 +mkdir -p $QCCBUILDFOLDER +if [ -e "$BUILDFOLDER/linux_x86/fteqw-gl32" ] +then + echo "Making fteextensions.qc" + mkdir -p ~/.fte/fte + echo "pr_dumpplatform -o fteextensions" > ~/.fte/fte/minusargsaresilly.cfg + echo "pr_dumpplatform -o csqcsysdefs -Tcs" >> ~/.fte/fte/minusargsaresilly.cfg + echo "pr_dumpplatform -o menusysdefs -Tmenu" >> ~/.fte/fte/minusargsaresilly.cfg + $BUILDFOLDER/linux_x86/fteqw-gl32 -basedir ~/.fte -nohome -quake +set snd_device none -nosound +set vid_renderer sv +exec minusargsaresilly.cfg +quit >> /dev/null + mv ~/.fte/fte/src/fteextensions.qc $QCCBUILDFOLDER + mv ~/.fte/fte/src/csqcsysdefs.qc $QCCBUILDFOLDER + mv ~/.fte/fte/src/menusysdefs.qc $QCCBUILDFOLDER +else + echo "Skipping FTE Extensions, no Linux gl32 build located" +fi + + +if [ -e $BUILDFOLDER/linux_x86/fteqcc32 ]; then + echo "Making csaddon + qcmenu" + mkdir -p $BUILDFOLDER/csaddon/ + cd $SVNROOT/quakec + cd csaddon/src + $BUILDFOLDER/linux_x86/fteqcc32 -srcfile csaddon.src > $BUILDLOGFOLDER/csaddon.txt + mv ../csaddon.dat $BUILDFOLDER/csaddon/ + + cd ../../menusys + $BUILDFOLDER/linux_x86/fteqcc32 -srcfile menu.src > $BUILDLOGFOLDER/menu.txt + rm fteqcc.log + zip -q -9 -o -r $BUILDFOLDER/csaddon/menusys_src.zip . + mv ../menu.dat $BUILDFOLDER/csaddon/ +else + echo "Skiping csaddon + qcmenu, no compiler build" +fi + +cd $SVNROOT/engine/ +svn info > $BUILDFOLDER/version.txt + +if [ "$BUILD_LINUXx86" != "n" ]; then + cp $BUILDFOLDER/linux_x86/fteqcc32 $QCCBUILDFOLDER/linux32-fteqcc +fi +if [ "$BUILD_LINUXx64" != "n" ]; then + cp $BUILDFOLDER/linux_amd64/fteqcc64 $QCCBUILDFOLDER/linux64-fteqcc +fi +if [ "$BUILD_LINUXx32" != "n" ]; then + cp $BUILDFOLDER/linux_x32/fteqccx32 $QCCBUILDFOLDER/linuxx32-fteqcc +fi +if [ "$BUILD_LINUXarmhf" != "n" ]; then + cp $BUILDFOLDER/linux_armhf/fteqccarmhf $QCCBUILDFOLDER/linuxarmhf-fteqcc +fi +if [ "$BUILD_WINDOWS" != "n" ]; then + cp $BUILDFOLDER/win32/fteqcc.exe $QCCBUILDFOLDER/win32-fteqcc.exe + cp $BUILDFOLDER/win32/fteqccgui.exe $QCCBUILDFOLDER/win32-fteqccgui.exe + cp $BUILDFOLDER/win64/fteqcc64.exe $QCCBUILDFOLDER/win64-fteqcc.exe + cp $BUILDFOLDER/win64/fteqccgui64.exe $QCCBUILDFOLDER/win64-fteqccgui.exe +fi +#cp $BUILDFOLDER/morphos/fteqcc $QCCBUILDFOLDER/morphos-fteqcc +#cp $BUILDFOLDER/macosx_tiger/fteqcc $QCCBUILDFOLDER/macosx_tiger-fteqcc +cp $BUILDFOLDER/version.txt $QCCBUILDFOLDER/version.txt + +if [ "$BUILD_NACL" != "n" ]; then + mkdir -p $BUILDFOLDER/nacl + NACL=$BUILDFOLDER/nacl/fteqw.nmf + echo "{ \"program\":{" > $NACL + if [ -e "$BUILDFOLDER/nacl_amd64/fteqw-x86_64.nexe" ]; then + mv $BUILDFOLDER/nacl_amd64/fteqw-x86_64.nexe $BUILDFOLDER/nacl/fteqw-x86_64.nexe + echo " \"x86-64\":{\"url\":\"fteqw-x86_64.nexe\"}," >> $NACL + fi + if [ -e "$BUILDFOLDER/nacl_x86/fteqw-x86_32.nexe" ]; then + mv $BUILDFOLDER/nacl_x86/fteqw-x86_32.nexe $BUILDFOLDER/nacl/fteqw-x86_32.nexe + echo " \"x86-32\":{\"url\":\"fteqw-x86_32.nexe\"}," >> $NACL + fi + if [ -e "$BUILDFOLDER/nacl_arm/fteqw-arm.nexe" ]; then + mv $BUILDFOLDER/nacl_arm/fteqw-arm.nexe $BUILDFOLDER/nacl/fteqw-arm.nexe + echo " \"arm\":{\"url\":\"fteqw-arm.nexe\"}" >> $NACL + fi + $NACL_SDK_ROOT/toolchain/linux_pnacl/bin/pnacl-finalize -o $BUILDFOLDER/nacl/fteqw.pexe $BUILDFOLDER/nacl_portable/fteqw.pexe + echo " \"portable\":{\"pnacl-translate\":{\"url\":\"fteqw.pexe\"}}" >> $NACL + echo "} }" >> $NACL + rm -rf "$BUILDFOLDER/nacl_amd64" + rm -rf "$BUILDFOLDER/nacl_x86" + rm -rf "$BUILDFOLDER/nacl_arm" + rm -rf "$BUILDFOLDER/nacl_portable" +fi + +if [ "$BUILD_WINDOWS" != "n" ]; then + echo Archiving output + SVNVER=$(svnversion $SVNROOT) + cd $BUILDFOLDER/ + zip -q -9 $ARCHIVEFOLDER/win_fteqw_$SVNVER.zip win32/fteglqw.exe win32/fteqwsv.exe win32/fteqccgui.exe win32/debug/fteglqw.exe win64/fteqw.exe win64/debug/fteglqw.exe + + + cd $BUILDFOLDER/win32/ + zip -q -j -9 $BUILDFOLDER/fteqw_for_windows.zip fteglqw.exe fteqwsv.exe fteqccgui.exe fteplug_qi_x86.dll fteplug_xmpp_x86.dll fteplug_irc_x86.dll fteplug_ezhud_x86.dll + cd $HOME/3rdparty_win32/ + zip -q -9 $BUILDFOLDER/fteqw_for_windows.zip ogg.dll vorbis.dll vorbisfile.dll freetype6.dll zlib1.dll + mkdir -p $BASE/tmp/fte + cd $BASE/tmp/ + cp $BUILDFOLDER/csaddon/menu.dat fte + zip -q -9 $BUILDFOLDER/fteqw_for_windows.zip fte/menu.dat + + #~/afterquake/updatemini.sh +fi + +echo "All done" + +END=$(date +%s) +DIFF=$(( $END - $START )) +MINS=$(( $DIFF / 60 )) +echo "Total Compile Time: $MINS minutes" >> $BUILDLOGFOLDER/buildlog.txt +echo "Total Compile Time: $MINS minutes" + +cd $HOME +#./errorlog.sh +#cd $HOME +#rm .bitchxrc +#cp ./fteqw/.bitchxrc ./ +#./BitchX -a irc.quakenet.org -A -c "#fte" -n A_Gorilla diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index 48e2f3d4..a8bae4d3 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -4235,7 +4235,7 @@ void CL_LinkPacketEntities (void) { if (trailef == P_INVALID || pe->ParticleTrail (old_origin, ent->origin, trailef, ent->keynum, ent->axis, &(le->trailstate))) if (model->traildefaultindex >= 0) - pe->ParticleTrailIndex(old_origin, ent->origin, trailidx, 0, &(le->trailstate)); + pe->ParticleTrailIndex(old_origin, ent->origin, P_INVALID, trailidx, 0, &(le->trailstate)); //dlights are not so customisable. if (r_rocketlight.value && (modelflags & MF_ROCKET) && !(state->lightpflags & (PFLAGS_FULLDYNAMIC|PFLAGS_CORONA))) diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 11cf59b0..27ffc39a 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -1540,7 +1540,7 @@ qboolean CLQ2_SendCmd (sizebuf_t *buf) i = cls.netchan.outgoing_sequence & UPDATE_MASK; cmd = &cl.outframes[i].cmd[seat]; *cmd = independantphysics[seat]; - + cmd->lightlevel = (lightlev>255)?255:lightlev; cl.outframes[i].senttime = realtime; diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 2e3e80e9..e1523d48 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -8083,10 +8083,8 @@ void CLNQ_ParseServerMessage (void) break; case svcfitz_skybox: - { - extern cvar_t r_skyboxname; - Cvar_Set(&r_skyboxname, MSG_ReadString()); - } + Q_strncpyz(cl.skyname, MSG_ReadString(), sizeof(cl.skyname)); + R_SetSky(cl.skyname); break; case svcfitz_bf: Cmd_ExecuteString("bf", RESTRICT_SERVER); diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index 0cd5c407..3a41b307 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -830,7 +830,7 @@ void CL_PredictEntityMovement(entity_state_t *estate, float age) { VectorClear(startstate.velocity); startstate.onground = false; - startstate.jump_held = false; + startstate.jump_held = false; CL_EntStateToPlayerState(&startstate, estate); CL_EntStateToPlayerCommand(&cmd, estate, age); diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index f9d6d242..9ea5e601 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -63,7 +63,7 @@ void RSpeedShow(void) RSpNames[RSPEED_STENCILSHADOWS] = "Stencil Shadows"; RSpNames[RSPEED_FULLBRIGHTS] = "World fullbrights"; - RSpNames[RSPEED_SETUP] = "Setup"; + RSpNames[RSPEED_SETUP] = "Setup/Acquire"; RSpNames[RSPEED_SUBMIT] = "submit/finish"; RSpNames[RSPEED_PRESENT] = "present"; @@ -296,9 +296,10 @@ typedef struct { unsigned int flags; conchar_t *string; + conchar_t *cursorchar; //pointer into string size_t stringbytes; + size_t charcount; char titleimage[MAX_QPATH]; - unsigned int charcount; float time_start; // for slow victory printing float time_off; int erase_lines; @@ -379,6 +380,7 @@ for a few moments */ void SCR_CenterPrint (int pnum, char *str, qboolean skipgamecode) { + size_t i; cprint_t *p; if (!str) { @@ -411,6 +413,7 @@ void SCR_CenterPrint (int pnum, char *str, qboolean skipgamecode) p = &scr_centerprint[pnum]; p->flags = 0; p->titleimage[0] = 0; + p->cursorchar = NULL; if (*str != '/') { @@ -435,6 +438,8 @@ void SCR_CenterPrint (int pnum, char *str, qboolean skipgamecode) p->flags |= CPRINT_PERSIST | CPRINT_BACKGROUND; p->flags &= ~CPRINT_TALIGN; } + else if (str[1] == 'C') + p->flags |= CPRINT_CURSOR; //this can be a little jarring if there's no links, so this forces consistent behaviour. else if (str[1] == 'W') //wait between each char p->flags ^= CPRINT_TYPEWRITER; else if (str[1] == 'S') //Stay @@ -526,6 +531,15 @@ void SCR_CenterPrint (int pnum, char *str, qboolean skipgamecode) } } + if (!(p->flags & CPRINT_CURSOR)) + { //autodetect links + for (i = 0; i < p->charcount; i++) + { + if (p->string[i] == CON_LINKSTART) + p->flags |= CPRINT_CURSOR; + } + } + p->time_off = scr_centertime.value; p->time_start = cl.time; } @@ -565,6 +579,55 @@ void VARGS Stats_Message(char *msg, ...) p->time_start = cl.time; } +static char *SCR_CopyCenterPrint(cprint_t *p) //reads the link under the mouse cursor. non-links are ignored. +{ + size_t maxlen, outlen; + char *result; + + conchar_t *start = p->cursorchar, *end; + + if (!start) //cursor isn't over anything. + return NULL; + + //scan backwards to find any link enclosure + for(end = start-1; end >= p->string; end--) + { + if (*end == CON_LINKSTART) + { + //found one + start = end; + break; + } + if (*end == CON_LINKEND) + { + //some other link ended here. don't use its start. + break; + } + } + //scan forwards to find the end of the selected link + if (start < p->string+p->charcount && *start == CON_LINKSTART) + { + for(end = start; end < p->string + p->charcount; end++) + { + if (*end == CON_LINKEND) + { + end++; + break; + } + } + } + else// if (onlyiflink) + return NULL; + + maxlen = 1024*1024; + result = Z_Malloc(maxlen+1); + + outlen = COM_DeFunString(start, end, result, maxlen, false, false) - result; + + result[outlen++] = 0; + return result; +} + #define MAX_CPRINT_LINES 512 void SCR_DrawCenterString (vrect_t *rect, cprint_t *p, struct font_s *font) { @@ -576,12 +639,12 @@ void SCR_DrawCenterString (vrect_t *rect, cprint_t *p, struct font_s *font) int bottom; int remaining; shader_t *pic; + int ch; conchar_t *line_start[MAX_CPRINT_LINES]; conchar_t *line_end[MAX_CPRINT_LINES]; int linecount; - // the finale prints the characters one at a time if (p->flags & CPRINT_TYPEWRITER) remaining = scr_printspeed.value * (cl.time - p->time_start); @@ -646,24 +709,26 @@ void SCR_DrawCenterString (vrect_t *rect, cprint_t *p, struct font_s *font) Font_BeginString(font, rect->x+rect->width, rect->y+rect->height, &right, &bottom); linecount = Font_LineBreaks(p->string, p->string + p->charcount, right - left, MAX_CPRINT_LINES, line_start, line_end); + ch = Font_CharHeight(); + if (p->flags & CPRINT_TALIGN) y = top; else if (p->flags & CPRINT_BALIGN) - y = bottom - Font_CharHeight()*linecount; + y = bottom - ch*linecount; else if (p->flags & CPRINT_OBITUARTY) //'obituary' messages appear at the bottom of the screen - y = (bottom-top - Font_CharHeight()*linecount) * 0.65 + top; + y = (bottom-top - ch*linecount) * 0.65 + top; else { if (linecount <= 5) { //small messages appear above and away from the crosshair - y = (bottom-top - Font_CharHeight()*linecount) * 0.35 + top; + y = (bottom-top - ch*linecount) * 0.35 + top; } else { //longer messages are fully centered - y = (bottom-top - Font_CharHeight()*linecount) * 0.5 + top; + y = (bottom-top - ch*linecount) * 0.5 + top; } } @@ -683,7 +748,7 @@ void SCR_DrawCenterString (vrect_t *rect, cprint_t *p, struct font_s *font) Font_BeginString(font, rect->x, y, &left, &top); } - for (l = 0; l < linecount; l++, y += Font_CharHeight()) + for (l = 0; l < linecount; l++, y += ch) { if (y >= bottom) break; @@ -694,6 +759,11 @@ void SCR_DrawCenterString (vrect_t *rect, cprint_t *p, struct font_s *font) else x = left + (right - left - Font_LineWidth(line_start[l], line_end[l]))/2; + if (mousecursor_y >= y && mousecursor_y < y+ch) + { + p->cursorchar = Font_CharAt(mousecursor_x - x, line_start[l], line_end[l]); + } + remaining -= line_end[l]-line_start[l]; if (remaining <= 0) { @@ -703,24 +773,102 @@ void SCR_DrawCenterString (vrect_t *rect, cprint_t *p, struct font_s *font) } Font_LineDraw(x, y, line_start[l], line_end[l]); } + Font_EndString(font); } +qboolean Key_Centerprint(int key, int unicode, unsigned int devid) +{ + int pnum; + cprint_t *p; + char *link; + + if (key == K_MOUSE1) + { + //figure out which player has the cursor + for (pnum = 0; pnum < cl.splitclients; pnum++) + { + p = &scr_centerprint[pnum]; + if (cl.playerview[pnum].gamerectknown == cls.framecount) + { + link = SCR_CopyCenterPrint(p); + if (link) + { + + if (link[0] == '^' && link[1] == '[') + { + //looks like it might be a link! + char *end = NULL; + char *info; + for (info = link + 2; *info; ) + { + if (info[0] == '^' && info[1] == ']') + break; //end of tag, with no actual info, apparently + if (*info == '\\') + break; + else if (info[0] == '^' && info[1] == '^') + info+=2; + else + info++; + } + for(end = info; *end; ) + { + if (end[0] == '^' && end[1] == ']') + { + //okay, its a valid link that they clicked + *end = 0; + +#ifdef PLUGINS + if (!Plug_ConsoleLink(link+2, info, "")) +#endif +#ifdef CSQC_DAT + if (!CSQC_ConsoleLink(link+2, info)) +#endif + Key_DefaultLinkClicked(NULL, link+2, info); + + break; + } + if (end[0] == '^' && end[1] == '^') + end+=2; + else + end++; + } + } + } + } + } + return true; //handled + } + else if (key == K_MOUSE2) + { + for (pnum = 0; pnum < cl.splitclients; pnum++) + { + p = &scr_centerprint[pnum]; + p->flags &= ~CPRINT_CURSOR; + } + return true; + } + return false; +} + void SCR_CheckDrawCenterString (void) { int pnum; cprint_t *p; + Key_Dest_Remove(kdm_centerprint); + for (pnum = 0; pnum < cl.splitclients; pnum++) { p = &scr_centerprint[pnum]; + p->cursorchar = NULL; if (p->time_off <= 0 && !(p->flags & CPRINT_PERSIST)) continue; //'/P' prefix doesn't time out p->time_off -= host_frametime; - if (Key_Dest_Has(~kdm_game)) //don't let progs guis/centerprints interfere with the game menu + if (Key_Dest_Has(~(kdm_game|kdm_centerprint))) //don't let progs guis/centerprints interfere with the game menu continue; //should probably allow the console with a scissor region or something. #ifdef QUAKEHUD @@ -729,7 +877,11 @@ void SCR_CheckDrawCenterString (void) #endif if (cl.playerview[pnum].gamerectknown == cls.framecount) + { SCR_DrawCenterString(&cl.playerview[pnum].gamerect, p, font_default); + if (p->flags & CPRINT_CURSOR) + Key_Dest_Add(kdm_centerprint); + } } } diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index 9c9dc5ec..79382ef2 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -770,7 +770,7 @@ beam_t *CL_AddBeam (enum beamtype_e tent, int ent, vec3_t start, vec3_t end) //f { // TODO: add support for those finnicky colored railtrails... if (P_ParticleTrail(start, end, rtqw_railtrail, -ent, NULL, NULL)) - P_ParticleTrailIndex(start, end, 208, 8, NULL); + P_ParticleTrailIndex(start, end, P_INVALID, 208, 8, NULL); return NULL; } break; @@ -1573,7 +1573,7 @@ void CL_ParseTEnt (void) pos2[2] = MSG_ReadCoord (); if (P_ParticleTrail(pos, pos2, rtqw_railtrail, 0, NULL, NULL)) - P_ParticleTrailIndex(pos, pos2, 208, 8, NULL); + P_ParticleTrailIndex(pos, pos2, P_INVALID, 208, 8, NULL); break; case TEH2_STREAM_LIGHTNING_SMALL: @@ -1717,7 +1717,7 @@ void CL_ParseTEnt (void) MSG_ReadCoord (); if (P_ParticleTrail(pos, pos2, P_FindParticleType("te_nexbeam"), 0, NULL, NULL)) - P_ParticleTrailIndex(pos, pos2, 15, 0, NULL); + P_ParticleTrailIndex(pos, pos2, P_INVALID, 15, 0, NULL); break; case TEDP_SMOKE: @@ -2467,11 +2467,11 @@ void CLQ2_ParseSteam(void) signed int id = MSG_ReadShort(); /*qbyte count =*/ MSG_ReadByte(); MSG_ReadPos(pos); - MSG_ReadPos(dir); + MSG_ReadDir(dir); /*colour =*/ MSG_ReadByte(); /*magnitude =*/ MSG_ReadShort(); - if (id == -1) + if (id != -1) /*duration =*/ MSG_ReadLong(); else /*duration = 0;*/ @@ -2500,172 +2500,14 @@ void Q2S_StartSound(vec3_t origin, int entnum, int entchannel, sfx_t *sfx, float { S_StartSound(entnum, entchannel, sfx, origin, NULL, fvol, attenuation, -delay, 0, 0); } -void CLQ2_ParseTEnt (void) -{ - beam_t *b; - int type; - int pt; +static qboolean CLQ2_ParseTEnt_RemoveMe(q2particleeffects_t type) +{ //FIXME: this function needs to die, once we're sure its no longer needed. vec3_t pos, pos2, dir; explosion_t *ex; int cnt; int color; int r; - int ent; -// int magnitude; - type = MSG_ReadByte (); - - if (type <= Q2TE_MAX) - { - pt = pt_q2[type]; - if (pt == P_INVALID && q2efnames[type]) - { - Con_Printf("Q2TE legacy code: te %i\n", type); - goto fixme; - } - } - else - pt = P_INVALID; - switch (type) - { - case Q2TE_GUNSHOT: //grey tall thing with smoke+sparks - case Q2TE_BLOOD: //red tall thing - case Q2TE_SPARKS: //orange tall thing (with not many particles) - case Q2TE_BLASTER: //regular blaster - case Q2TE_SHOTGUN: //gunshot with less particles - case Q2TE_SCREEN_SPARKS://green+grey tall - case Q2TE_SHIELD_SPARKS://blue+grey tall - case Q2TE_BULLET_SPARKS://orange+grey tall+smoke - case Q2TE_GREENBLOOD: //yellow... - case Q2TE_BLASTER2: //green version of te_blaster - case Q2TE_MOREBLOOD: //te_blood*2 - case Q2TE_HEATBEAM_SPARKS://white outwards puffs - case Q2TE_HEATBEAM_STEAM://orange outwards puffs - case Q2TE_ELECTRIC_SPARKS://blue tall - case Q2TE_FLECHETTE: //grey version of te_blaster - MSG_ReadPos (pos); - MSG_ReadDir (dir); - P_RunParticleEffectType(pos, dir, 1, pt); - break; - case Q2TE_BFG_LASER: - MSG_ReadPos (pos); - MSG_ReadPos (pos2); - CL_Laser(pos, pos2, 0xd0d1d2d3); - break; - case Q2TE_RAILTRAIL: //blue spiral, grey particles - case Q2TE_BUBBLETRAIL: //grey sparse trail, slow riser -// case Q2TE_BFG_LASER: //green laser - case Q2TE_DEBUGTRAIL: //long lived blue trail - case Q2TE_BUBBLETRAIL2: //grey rising trail - case Q2TE_BLUEHYPERBLASTER: //TE_BLASTER without model+light - MSG_ReadPos (pos); - MSG_ReadPos (pos2); - P_ParticleTrail(pos, pos2, pt, 0, NULL, NULL); - break; - case Q2TE_EXPLOSION1: //column - case Q2TE_EXPLOSION2: //splits - case Q2TE_ROCKET_EXPLOSION://top blob/column - case Q2TE_GRENADE_EXPLOSION://indistinguishable from TE_EXPLOSION2 - case Q2TE_ROCKET_EXPLOSION_WATER://rocket but with different sound - case Q2TE_GRENADE_EXPLOSION_WATER://different sound - case Q2TE_BFG_EXPLOSION://green light+sprite - case Q2TE_BFG_BIGEXPLOSION://green+white fast particles - case Q2TE_BOSSTPORT://splitting+merging+upwards particles. - case Q2TE_PLASMA_EXPLOSION://looks like rocket explosion to me - case Q2TE_PLAIN_EXPLOSION://looks like rocket explosion to me - case Q2TE_CHAINFIST_SMOKE://small smoke - case Q2TE_TRACKER_EXPLOSION://black light, slow particles - case Q2TE_TELEPORT_EFFECT://q1-style teleport - case Q2TE_DBALL_GOAL://q1-style teleport - case Q2TE_NUKEBLAST://dome expansion (blue/white particles) - case Q2TE_WIDOWSPLASH://dome (orange+gravity) - case Q2TE_EXPLOSION1_BIG://buggy model - case Q2TE_EXPLOSION1_NP://looks like a rocket explosion to me - MSG_ReadPos (pos); - P_RunParticleEffectType(pos, NULL, 1, pt); - break; - case Q2TE_SPLASH: - cnt = MSG_ReadByte (); - MSG_ReadPos (pos); - MSG_ReadDir (dir); - r = MSG_ReadByte () + Q2SPLASH_UNKNOWN; - if (r > Q2SPLASH_MAX) - r = Q2SPLASH_UNKNOWN; - pt = pt_q2[r]; - P_RunParticleEffectType(pos, NULL, 1, pt); - break; - - case Q2TE_PARASITE_ATTACK: - case Q2TE_MEDIC_CABLE_ATTACK: - CL_ParseBeam (BT_Q2PARASITE); - break; - case Q2TE_HEATBEAM: - b = CL_ParseBeam (BT_Q2HEATBEAM); //2, 7, -3 - if (b) - { - b->bflags |= STREAM_ATTACHED; - VectorSet(b->offset, 2, 7, -3); - } - break; - case Q2TE_MONSTER_HEATBEAM: - b = CL_ParseBeam (BT_Q2HEATBEAM); - if (b) - b->bflags |= STREAM_ATTACHED; - break; - case Q2TE_GRAPPLE_CABLE: - CL_ParseBeamOffset (BT_Q2GRAPPLE); - break; - - case Q2TE_LIGHTNING: - ent = MSGCL_ReadEntity (); - /*toent =*/ MSGCL_ReadEntity (); //ident only. - pos[0] = MSG_ReadCoord (); - pos[1] = MSG_ReadCoord (); - pos[2] = MSG_ReadCoord (); - pos2[0] = MSG_ReadCoord (); - pos2[1] = MSG_ReadCoord (); - pos2[2] = MSG_ReadCoord (); - CL_AddBeam(BT_Q2LIGHTNING, ent, pos, pos2); - break; - - case Q2TE_LASER_SPARKS: - cnt = MSG_ReadByte (); - MSG_ReadPos (pos); - MSG_ReadDir (dir); - color = MSG_ReadByte (); - P_RunParticleEffectPalette("q2part.TEQ2_LASER_SPARKS", pos, dir, color, cnt); - break; - -/* - case Q2TE_LASER_SPARKS: - case Q2TE_WELDING_SPARKS: - case Q2TE_TUNNEL_SPARKS: - break; - - //Q2TE_RAILTRAIL2, ? - //Q2TE_FLAME, ? - - case Q2TE_FLASHLIGHT: - break; - case Q2TE_FORCEWALL: - break; - - case Q2TE_WIDOWBEAMOUT: - break; -*/ - case Q2TE_STEAM: - CLQ2_ParseSteam(); - break; - - - default: -// Con_Printf("CLQ2_ParseTEnt: bad/non-implemented type %i\n", type); - goto fixme; -// Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type); -// break; - } - return; -fixme: Con_DPrintf("Q2TE legacy code: te %i\n", type); switch(type) { @@ -2817,7 +2659,7 @@ fixme: MSG_ReadPos (pos); MSG_ReadPos (pos2); if (P_ParticleTrail(pos, pos2, pt_q2[Q2TE_RAILTRAIL], 0, NULL, NULL)) - P_ParticleTrailIndex(pos, pos2, 0x74, 8, NULL); + P_ParticleTrailIndex(pos, pos2, P_INVALID, 0x74, 8, NULL); Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("weapons/railgf1a.wav"), 1, ATTN_NORM, 0); break; @@ -3025,7 +2867,7 @@ fixme: MSG_ReadPos (pos); MSG_ReadPos (pos2); if (P_ParticleTrail(pos, pos2, pt_q2[Q2TE_BUBBLETRAIL], 0, NULL, NULL)) - P_ParticleTrailIndex(pos, pos2, 4, 8, NULL); + P_ParticleTrailIndex(pos, pos2, P_INVALID, 4, 8, NULL); break; case Q2TE_PARASITE_ATTACK: @@ -3198,7 +3040,7 @@ fixme: MSG_ReadPos (pos); MSG_ReadPos (pos2); if (P_ParticleTrail(pos, pos2, P_FindParticleType("te_debugtrail"), 0, NULL, NULL)) - P_ParticleTrailIndex(pos, pos2, 116, 8, NULL); + P_ParticleTrailIndex(pos, pos2, P_INVALID, 116, 8, NULL); break; case Q2TE_PLAIN_EXPLOSION: @@ -3304,23 +3146,19 @@ fixme: if (P_RunParticleEffectType(pos, dir, 4, ptqw_blood)) P_RunParticleEffect(pos, dir, 0xe8, 250); break; -/* + case Q2TE_CHAINFIST_SMOKE: dir[0]=0; dir[1]=0; dir[2]=1; - MSG_ReadPos(&net_message, pos); - CL_ParticleSmokeEffect (pos, dir, 0, 20, 20); + MSG_ReadPos(pos); + P_RunParticleEffectTypeString(pos, NULL, 1, "TEQ2_CHAINFIST_SMOKE"); break; - case Q2TE_ELECTRIC_SPARKS: - MSG_ReadPos (&net_message, pos); - MSG_ReadDir (&net_message, dir); -// CL_ParticleEffect (pos, dir, 109, 40); - CL_ParticleEffect (pos, dir, 0x75, 40); - //FIXME : replace or remove this sound - S_StartSound (pos, 0, 0, cl_sfx_lashit, 1, ATTN_NORM, 0); + MSG_ReadPos (pos); + MSG_ReadDir (dir); + P_RunParticleEffect(pos, dir, 0x75, 40); + Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("weapons/lashit.wav"), 1, ATTN_NORM, 0); break; -*/ case Q2TE_TRACKER_EXPLOSION: MSG_ReadPos (pos); @@ -3429,7 +3267,7 @@ fixme: MSG_ReadPos (pos2); P_ParticleTrail(pos, pos2, P_FindParticleType("q2part.TR_BLASTERTRAIL2"), 0, NULL, NULL); break; - case CRTE_STAIN: +/* case CRTE_STAIN: Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type); case CRTE_FIRE: Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type); @@ -3437,9 +3275,178 @@ fixme: Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type); case CRTE_SMOKE: Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type); - +*/ default: - Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type); + return false; + } + return true; +} + +void CLQ2_ParseTEnt (void) +{ + beam_t *b; + q2particleeffects_t type; + int pt; + vec3_t pos, pos2, dir; + int cnt; + int color; + int r; + int ent; +// int magnitude; + + type = MSG_ReadByte (); + + if (type <= Q2TE_MAX) + { + pt = pt_q2[type]; + if (pt == P_INVALID && q2efnames[type]) + { + Con_Printf("Q2TE legacy code: te %i\n", type); + if (CLQ2_ParseTEnt_RemoveMe(type)) + return; + } + } + else + pt = P_INVALID; + switch (type) + { + case Q2TE_GUNSHOT: //grey tall thing with smoke+sparks + case Q2TE_BLOOD: //red tall thing + case Q2TE_SPARKS: //orange tall thing (with not many particles) + case Q2TE_BLASTER: //regular blaster + case Q2TE_SHOTGUN: //gunshot with less particles + case Q2TE_SCREEN_SPARKS://green+grey tall + case Q2TE_SHIELD_SPARKS://blue+grey tall + case Q2TE_BULLET_SPARKS://orange+grey tall+smoke + case Q2TE_GREENBLOOD: //yellow... + case Q2TE_BLASTER2: //green version of te_blaster + case Q2TE_MOREBLOOD: //te_blood*2 + case Q2TE_HEATBEAM_SPARKS://white outwards puffs + case Q2TE_HEATBEAM_STEAM://orange outwards puffs + case Q2TE_ELECTRIC_SPARKS://blue tall + case Q2TE_FLECHETTE: //grey version of te_blaster + MSG_ReadPos (pos); + MSG_ReadDir (dir); + P_RunParticleEffectType(pos, dir, 1, pt); + break; + case Q2TE_BFG_LASER: + MSG_ReadPos (pos); + MSG_ReadPos (pos2); + CL_Laser(pos, pos2, 0xd0d1d2d3); + break; + case Q2TE_RAILTRAIL: //blue spiral, grey particles + case Q2TE_BUBBLETRAIL: //grey sparse trail, slow riser +// case Q2TE_BFG_LASER: //green laser + case Q2TE_DEBUGTRAIL: //long lived blue trail + case Q2TE_BUBBLETRAIL2: //grey rising trail + case Q2TE_BLUEHYPERBLASTER: //TE_BLASTER without model+light + MSG_ReadPos (pos); + MSG_ReadPos (pos2); + P_ParticleTrail(pos, pos2, pt, 0, NULL, NULL); + break; + case Q2TE_EXPLOSION1: //column + case Q2TE_EXPLOSION2: //splits + case Q2TE_ROCKET_EXPLOSION://top blob/column + case Q2TE_GRENADE_EXPLOSION://indistinguishable from TE_EXPLOSION2 + case Q2TE_ROCKET_EXPLOSION_WATER://rocket but with different sound + case Q2TE_GRENADE_EXPLOSION_WATER://different sound + case Q2TE_BFG_EXPLOSION://green light+sprite + case Q2TE_BFG_BIGEXPLOSION://green+white fast particles + case Q2TE_BOSSTPORT://splitting+merging+upwards particles. + case Q2TE_PLASMA_EXPLOSION://looks like rocket explosion to me + case Q2TE_PLAIN_EXPLOSION://looks like rocket explosion to me + case Q2TE_CHAINFIST_SMOKE://small smoke + case Q2TE_TRACKER_EXPLOSION://black light, slow particles + case Q2TE_TELEPORT_EFFECT://q1-style teleport + case Q2TE_DBALL_GOAL://q1-style teleport + case Q2TE_NUKEBLAST://dome expansion (blue/white particles) + case Q2TE_WIDOWSPLASH://dome (orange+gravity) + case Q2TE_EXPLOSION1_BIG://buggy model + case Q2TE_EXPLOSION1_NP://looks like a rocket explosion to me + MSG_ReadPos (pos); + P_RunParticleEffectType(pos, NULL, 1, pt); + break; + case Q2TE_SPLASH: + cnt = MSG_ReadByte (); + MSG_ReadPos (pos); + MSG_ReadDir (dir); + r = MSG_ReadByte () + Q2SPLASH_UNKNOWN; + if (r > Q2SPLASH_MAX) + r = Q2SPLASH_UNKNOWN; + pt = pt_q2[r]; + P_RunParticleEffectType(pos, NULL, 1, pt); + break; + + case Q2TE_PARASITE_ATTACK: + case Q2TE_MEDIC_CABLE_ATTACK: + CL_ParseBeam (BT_Q2PARASITE); + break; + case Q2TE_HEATBEAM: + b = CL_ParseBeam (BT_Q2HEATBEAM); //2, 7, -3 + if (b) + { + b->bflags |= STREAM_ATTACHED; + VectorSet(b->offset, 2, 7, -3); + } + break; + case Q2TE_MONSTER_HEATBEAM: + b = CL_ParseBeam (BT_Q2HEATBEAM); + if (b) + b->bflags |= STREAM_ATTACHED; + break; + case Q2TE_GRAPPLE_CABLE: + CL_ParseBeamOffset (BT_Q2GRAPPLE); + break; + + case Q2TE_LIGHTNING: + ent = MSGCL_ReadEntity (); + /*toent =*/ MSGCL_ReadEntity (); //ident only. + pos[0] = MSG_ReadCoord (); + pos[1] = MSG_ReadCoord (); + pos[2] = MSG_ReadCoord (); + pos2[0] = MSG_ReadCoord (); + pos2[1] = MSG_ReadCoord (); + pos2[2] = MSG_ReadCoord (); + CL_AddBeam(BT_Q2LIGHTNING, ent, pos, pos2); + break; + + case Q2TE_LASER_SPARKS: + case Q2TE_WELDING_SPARKS: + case Q2TE_TUNNEL_SPARKS: + cnt = MSG_ReadByte (); + MSG_ReadPos (pos); + MSG_ReadDir (dir); + color = MSG_ReadByte (); + P_RunParticleEffectPalette(va("q2part.%s", q2efnames[type]), pos, dir, color, cnt); + break; + + case Q2TE_STEAM: + CLQ2_ParseSteam(); + break; + + case Q2TE_FORCEWALL: + MSG_ReadPos (pos); + MSG_ReadDir (pos2); + color = MSG_ReadByte (); + P_ParticleTrailIndex(pos, pos2, pt, color, 0, NULL); + break; + + case Q2TE_RAILTRAIL2: + case Q2TE_FLAME: + case Q2TE_FLASHLIGHT: + case Q2TE_WIDOWBEAMOUT: + +#ifdef __GNUC__ + case (Q2TE_FLECHETTE+1) ... Q2PT_MAX: +// case (Q2TE_MAX+1) ... Q2PT_MAX: +// default: +#else + default: +#endif +// Con_Printf("CLQ2_ParseTEnt: bad/non-implemented type %i\n", type); + if (!CLQ2_ParseTEnt_RemoveMe(type)) + Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type); + break; } } #endif diff --git a/engine/client/clq2_ents.c b/engine/client/clq2_ents.c index b712f364..2dd4395d 100644 --- a/engine/client/clq2_ents.c +++ b/engine/client/clq2_ents.c @@ -759,7 +759,7 @@ void CLQ2_ParseDelta (entity_state_t *from, entity_state_t *to, int number, int to->effects = MSG_ReadShort(); if ( (bits & (Q2U_RENDERFX8|Q2U_RENDERFX16)) == (Q2U_RENDERFX8|Q2U_RENDERFX16) ) - to->u.q2.renderfx = MSG_ReadLong(); + to->u.q2.renderfx = MSG_ReadLong() & 0x0007ffff; //only the standard ones actually supported by vanilla q2. else if (bits & Q2U_RENDERFX8) to->u.q2.renderfx = MSG_ReadByte(); else if (bits & Q2U_RENDERFX16) @@ -1975,7 +1975,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_ROCKET], ent.keynum, NULL, ¢->trailstate)) if (P_ParticleTrail(cent->lerp_origin, ent.origin, rt_rocket, ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0xdc, 4, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 0xdc, 4, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 200, 0.2, 0.1, 0.05); } } @@ -1988,7 +1988,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_BLASTERTRAIL2], ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0xd0, 1, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 0xd0, 1, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 200, 0, 0.2, 0); } } @@ -1996,7 +1996,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_BLASTERTRAIL], ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0xe0, 1, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 0xe0, 1, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 200, 0.2, 0.2, 0); } } @@ -2013,13 +2013,13 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_GIB], ent.keynum, NULL, ¢->trailstate)) if (P_ParticleTrail(cent->lerp_origin, ent.origin, rt_blood, ent.keynum, NULL, ¢->trailstate)) - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0xe8, 8, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 0xe8, 8, ¢->trailstate); } else if (effects & Q2EF_GRENADE) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_GRENADE], ent.keynum, NULL, ¢->trailstate)) if (P_ParticleTrail(cent->lerp_origin, ent.origin, rt_grenade, ent.keynum, NULL, ¢->trailstate)) - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 4, 8, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 4, 8, ¢->trailstate); } else if (effects & Q2EF_FLIES) { @@ -2050,7 +2050,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_FLAG1], ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 242, 1, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 242, 1, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 225, 0.2, 0.05, 0.05); } } @@ -2058,7 +2058,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_FLAG2], ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 115, 1, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 115, 1, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 225, 0.05, 0.05, 0.2); } } @@ -2068,7 +2068,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_TAGTRAIL], ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 220, 1, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 220, 1, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 225, 0.2, 0.2, 0.0); } } @@ -2093,7 +2093,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_TRACKER], ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0, 1, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 0, 1, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 200, -0.2, -0.2, -0.2); } } @@ -2103,14 +2103,14 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) else if (effects & Q2EF_GREENGIB) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_GREENGIB], ent.keynum, NULL, ¢->trailstate)) - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 219, 8, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 219, 8, ¢->trailstate); } // RAFAEL else if (effects & Q2EF_IONRIPPER) { if (P_ParticleTrail(cent->lerp_origin, ent.origin, pt_q2[Q2RT_IONRIPPER], ent.keynum, NULL, ¢->trailstate)) { - P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 228, 4, ¢->trailstate); + P_ParticleTrailIndex(cent->lerp_origin, ent.origin, P_INVALID, 228, 4, ¢->trailstate); V_AddLight (ent.keynum, ent.origin, 100, 0.2, 0.1, 0.1); } } diff --git a/engine/client/image.c b/engine/client/image.c index 03afb9e6..26675d47 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -4135,6 +4135,12 @@ static qboolean Image_GenMip0(struct pendingtextureinfo *mips, unsigned int flag case PTI_BGRA8: mips->encoding = PTI_BGRX8; break; + case PTI_RGBA8_SRGB: + mips->encoding = PTI_RGBX8_SRGB; + break; + case PTI_BGRA8_SRGB: + mips->encoding = PTI_BGRX8_SRGB; + break; case PTI_RGBA16F: case PTI_RGBA32F: case PTI_ARGB4444: @@ -4153,6 +4159,8 @@ static qboolean Image_GenMip0(struct pendingtextureinfo *mips, unsigned int flag case PTI_RGB565: case PTI_RGBX8: case PTI_BGRX8: + case PTI_RGBX8_SRGB: + case PTI_BGRX8_SRGB: case PTI_S3RGB1: break; //already no alpha in these formats case PTI_DEPTH16: @@ -4276,6 +4284,7 @@ static qboolean Image_LoadRawTexture(texid_t tex, unsigned int flags, void *rawd tex->width = imgwidth; tex->height = imgheight; + //d3d9 needs to reconfigure samplers depending on whether the data is srgb or not. tex->flags &= ~IF_SRGB; switch(mips->encoding) { @@ -4285,6 +4294,8 @@ static qboolean Image_LoadRawTexture(texid_t tex, unsigned int flags, void *rawd case PTI_BGRX8_SRGB: tex->flags |= IF_SRGB; break; + default: + break; } if (flags & IF_NOWORKER) diff --git a/engine/client/keys.c b/engine/client/keys.c index 5bd8a318..60a2f07a 100644 --- a/engine/client/keys.c +++ b/engine/client/keys.c @@ -891,6 +891,18 @@ void Key_DefaultLinkClicked(console_t *con, char *text, char *info) Cbuf_AddText(va("\ncmd %s\n", c), RESTRICT_LOCAL); return; } + c = Info_ValueForKey(info, "say"); + if (*c && !strchr(c, ';') && !strchr(c, '\n')) + { + Cbuf_AddText(va("\nsay %s\n", c), RESTRICT_LOCAL); + return; + } + c = Info_ValueForKey(info, "echo"); + if (*c) + { + Con_Printf("%s\n", c); + return; + } c = Info_ValueForKey(info, "dir"); if (*c && !strchr(c, ';') && !strchr(c, '\n')) { @@ -2215,8 +2227,8 @@ void Key_Init (void) key_linepos = 0; key_dest_mask = kdm_game; - key_dest_absolutemouse = kdm_console | kdm_editor | kdm_cwindows | kdm_emenu; - + key_dest_absolutemouse = kdm_centerprint | kdm_console | kdm_editor | kdm_cwindows | kdm_emenu; + // // init ascii characters in console mode // @@ -2625,6 +2637,10 @@ void Key_Event (unsigned int devid, int key, unsigned int unicode, qboolean down return; } + if (Key_Dest_Has(kdm_centerprint)) + if (Key_Centerprint(key, unicode, devid)) + return; + //anything else is a key binding. /*don't auto-repeat binds as it breaks too many scripts*/ diff --git a/engine/client/keys.h b/engine/client/keys.h index a5f84643..4fde7075 100644 --- a/engine/client/keys.h +++ b/engine/client/keys.h @@ -252,12 +252,13 @@ K_MAX typedef enum //highest has priority { kdm_game = 1u<<0, //should always be set - kdm_message = 1u<<1, - kdm_gmenu = 1u<<2, //menu.dat - kdm_emenu = 1u<<3, //engine's menus - kdm_editor = 1u<<4, - kdm_console = 1u<<5, - kdm_cwindows = 1u<<6, + kdm_centerprint = 1u<<1, //enabled when there's a centerprint menu with clickable things. + kdm_message = 1u<<2, + kdm_gmenu = 1u<<3, //menu.dat + kdm_emenu = 1u<<4, //engine's menus + kdm_editor = 1u<<5, + kdm_console = 1u<<6, + kdm_cwindows = 1u<<7, } keydestmask_t; //unsigned int Key_Dest_Get(void); //returns highest priority destination @@ -299,8 +300,10 @@ void IN_WriteButtons(vfsfile_t *f, qboolean all); void Key_WriteBindings (struct vfsfile_s *f); void Key_SetBinding (int keynum, int modifier, char *binding, int cmdlevel); void Key_ClearStates (void); +qboolean Key_Centerprint(int key, int unicode, unsigned int devid); void Key_Unbindall_f (void); //aka: Key_Shutdown void Key_ConsoleReplace(const char *instext); +void Key_DefaultLinkClicked(console_t *con, char *text, char *info); struct console_s; qboolean Key_GetConsoleSelectionBox(struct console_s *con, int *sx, int *sy, int *ex, int *ey); diff --git a/engine/client/merged.h b/engine/client/merged.h index 109bbf84..ed475bc1 100644 --- a/engine/client/merged.h +++ b/engine/client/merged.h @@ -141,6 +141,7 @@ void R_DrawTextField(int x, int y, int w, int h, const char *text, unsigned int #define CPRINT_OBITUARTY (1<<16) //O (show at 2/3rds from top) #define CPRINT_PERSIST (1<<17) //P (doesn't time out) #define CPRINT_TYPEWRITER (1<<18) // (char at a time) +#define CPRINT_CURSOR (1<<19) //C (use a mouse cursor, also enabled by the presence of a (auto) link) #endif diff --git a/engine/client/p_classic.c b/engine/client/p_classic.c index 5d59a375..245fa05a 100644 --- a/engine/client/p_classic.c +++ b/engine/client/p_classic.c @@ -257,7 +257,7 @@ static void PClassic_RunParticleEffect4 (vec3_t org, float radius, int color, in } //this function is used as a fallback in case a trail effect is unknown. -static void PClassic_ParticleTrailIndex (vec3_t start, vec3_t end, int color, int crnd, trailstate_t **tsk) +static void PClassic_ParticleTrailIndex (vec3_t start, vec3_t end, int type, int color, int crnd, trailstate_t **tsk) { } diff --git a/engine/client/p_null.c b/engine/client/p_null.c index b9bafd6d..b18573a6 100644 --- a/engine/client/p_null.c +++ b/engine/client/p_null.c @@ -22,7 +22,7 @@ static void PNULL_RunParticleEffect3 (vec3_t org, vec3_t box, int color, int eff static void PNULL_RunParticleEffect4 (vec3_t org, float radius, int color, int effect, int count){} static void PNULL_RunParticleEffectPalette (const char *nameprefix, vec3_t org, vec3_t dir, int color, int count){} -static void PNULL_ParticleTrailIndex (vec3_t start, vec3_t end, int color, int crnd, trailstate_t **tsk){} +static void PNULL_ParticleTrailIndex (vec3_t start, vec3_t end, int type, int color, int crnd, trailstate_t **tsk){} static qboolean PNULL_InitParticles (void) { diff --git a/engine/client/p_script.c b/engine/client/p_script.c index 5db280bf..e4f548ef 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -5987,13 +5987,15 @@ static int PScript_ParticleTrail (vec3_t startpos, vec3_t end, int type, int dlk return 0; } -static void PScript_ParticleTrailIndex (vec3_t start, vec3_t end, int color, int crnd, trailstate_t **tsk) +static void PScript_ParticleTrailIndex (vec3_t start, vec3_t end, int type, int color, int crnd, trailstate_t **tsk) { - if (PART_VALID(pe_defaulttrail)) + if (type == P_INVALID) + type = pe_defaulttrail; + if (PART_VALID(type)) { - part_type[pe_defaulttrail].colorindex = color; - part_type[pe_defaulttrail].colorrand = crnd; - P_ParticleTrail(start, end, pe_defaulttrail, 0, NULL, tsk); + part_type[type].colorindex = color; + part_type[type].colorrand = crnd; + P_ParticleTrail(start, end, type, 0, NULL, tsk); } } diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index 172180f6..c169a675 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -4704,7 +4704,7 @@ void CSQC_EntStateToCSQC(unsigned int flags, float lerptime, entity_state_t *src { if (model->particletrail == P_INVALID || pe->ParticleTrail (ent->v->origin, src->origin, model->particletrail, src->number, NULL, &(le->trailstate))) if (model->traildefaultindex >= 0) - pe->ParticleTrailIndex(ent->v->origin, src->origin, model->traildefaultindex, 0, &(le->trailstate)); + pe->ParticleTrailIndex(ent->v->origin, src->origin, P_INVALID, model->traildefaultindex, 0, &(le->trailstate)); } } diff --git a/engine/client/r_2d.c b/engine/client/r_2d.c index 6c6f20f4..f4002600 100644 --- a/engine/client/r_2d.c +++ b/engine/client/r_2d.c @@ -183,6 +183,8 @@ void R2D_Init(void) extern cvar_t gl_specular_fallback, gl_specular_fallbackexp, gl_texturemode; conback = NULL; + Cvar_ForceCallback(&gl_texturemode); + draw_mesh.istrifan = true; draw_mesh.numvertexes = 4; draw_mesh.numindexes = 6; @@ -377,7 +379,6 @@ void R2D_Init(void) Cvar_ForceCallback(&gl_conback); Cvar_ForceCallback(&vid_conautoscale); Cvar_ForceCallback(&gl_font); - Cvar_ForceCallback(&gl_texturemode); Cvar_ForceCallback(&crosshair); Cvar_ForceCallback(&crosshaircolor); diff --git a/engine/client/r_partset.c b/engine/client/r_partset.c index 7c3670d5..a87c2609 100644 --- a/engine/client/r_partset.c +++ b/engine/client/r_partset.c @@ -3442,21 +3442,6 @@ char *particle_set_q2part = "scalefactor 0.8\n" "}\n" -"r_part TEQ2_LASER_SPARKS\n" -"{\n" -"texture \"classicparticle\"\n" -"tcoords 0 0 16 16 32\n" -"count 1\n" -"scale 1\n" -"alpha 1\n" -"die 0.3 0.8\n" -"randomvel 20\n" -"orgadd 0 7\n" -"spawnorg 4\n" -"gravity 40\n" -"scalefactor 0.8\n" -"}\n" - "r_part te_splashsparks\n" "{\n" "texture \"classicparticle\"\n" @@ -3567,7 +3552,56 @@ char *particle_set_q2part = "colorindex 0xe8\n" "}\n" - +"r_part teq2_laser_sparks\n" +"{\n" +"texture \"classicparticle\"\n" +"tcoords 0 0 16 16 32\n" +"count 1\n" +"scale 1\n" +"alpha 1\n" +"die 0.3 0.8\n" +"randomvel 20\n" +"orgadd 0 7\n" +"spawnorg 4\n" +"gravity 40\n" +"scalefactor 0.8\n" +"}\n" +"r_part teq2_welding_sparks\n" +"{ //identical to teq2_laser_sparks, except for the +form that adds in some extra mesh+lighting effect.\n" +"texture \"classicparticle\"\n" +"tcoords 0 0 16 16 32\n" +"count 1\n" +"scale 1\n" +"alpha 1\n" +"die 0.3 0.8\n" +"randomvel 20\n" +"orgadd 0 7\n" +"spawnorg 4\n" +"gravity 40\n" +"scalefactor 0.8\n" +"}\n" +"r_part +teq2_welding_sparks\n" +"{\n" +"count 0 0 1\n" +"model \"models/objects/flash/tris.md2\" framestart=0 frameend=2 framerate=10 alpha=-1 fullbright\n" +"lightradius 100 175\n" +"lightradiusfade 400\n" +"lightrgb 1 1 0.3\n" +"}\n" +"r_part teq2_tunnel_sparks\n" +"{ //this is apparently identical to teq2_laser_sparks... either way the protocol provides a palette colour (particle system provides a customised variation)\n" +"texture \"classicparticle\"\n" +"tcoords 0 0 16 16 32\n" +"count 1\n" +"scale 1\n" +"alpha 1\n" +"die 0.3 0.8\n" +"randomvel 20\n" +"orgadd 0 7\n" +"spawnorg 4\n" +"gravity 40\n" +"scalefactor 0.8\n" +"}\n" "r_part teq2_shield_sparks\n" "{\n" "texture \"classicparticle\"\n" @@ -3682,11 +3716,68 @@ char *particle_set_q2part = "scalefactor 0.8\n" "colorindex 232 7\n" "}\n" +"r_part teq2_moreblood\n" +"{ //teq2_blood, but with count 250 instead of 60.\n" +"texture \"classicparticle\"\n" +"tcoords 0 0 16 16 32\n" +"count 250\n" +"scale 1\n" +"alpha 1\n" +"die 0.3 0.8\n" +"randomvel 20\n" +"orgadd 0 31\n" +"spawnorg 4\n" +"gravity 40\n" +"scalefactor 0.8\n" +"colorindex 232 7\n" +"}\n" +"r_part teq2_greenblood\n" +"{\n" +"texture \"classicparticle\"\n" +"tcoords 0 0 16 16 32\n" +"count 30\n" +"scale 1\n" +"alpha 1\n" +"die 0.3 0.8\n" +"randomvel 20\n" +"orgadd 0 31\n" +"spawnorg 4\n" +"gravity 40\n" +"scalefactor 0.8\n" +"colorindex 0xdf 7\n" +"}\n" + +"r_part teq2_electric_sparks\n" +"{\n" +"texture \"classicparticle\"\n" +"tcoords 0 0 16 16 32\n" +"count 40\n" +"scale 1\n" +"alpha 1\n" +"die 0.3 0.8\n" +"randomvel 20\n" +"orgadd 0 31\n" +"spawnorg 4\n" +"gravity 40\n" +"scalefactor 0.8\n" +"colorindex 0x75 7\n" +"sound \"weapons/lashit.wav\" 1 1 0 0\n" +"}\n" "r_part q2_blasterpuff\n" "{\n" "count 0 0 1\n" -"model \"models/objects/explode/tris.md2\" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow\n" +"model \"models/objects/explode/tris.md2\" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow skin=0\n" +"}\n" +"r_part q2_blaster2puff\n" +"{\n" +"count 0 0 1\n" +"model \"models/objects/explode/tris.md2\" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow skin=1\n" +"}\n" +"r_part q2_flechettepuff\n" +"{\n" +"count 0 0 1\n" +"model \"models/objects/explode/tris.md2\" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow skin=2\n" "}\n" "r_part teq2_blaster\n" "{\n" @@ -3725,13 +3816,35 @@ char *particle_set_q2part = "gravity 40\n" "scalefactor 0.8\n" "colorindex 0xd0 7\n" -"assoc q2_blasterpuff /*the model*/\n" +"assoc q2_blaster2puff /*the model*/\n" "lightradius 150\n" "lightradiusfade 400\n" "lightrgb 0.05 1.0 0.05\n" "lightshadows 1\n" "sound \"weapons/lashit.wav\" 1 1 0 0\n" "}\n" +"r_part teq2_flechette\n" +"{ //grey version.\n" +"texture \"classicparticle\"\n" +"tcoords 0 0 16 16 32\n" +"count 60\n" +"scale 1\n" +"alpha 1\n" +"die 0.3 0.8\n" +"randomvel 40\n" +"orgadd 0 15\n" +"veladd 30\n" +"spawnorg 4\n" +"gravity 40\n" +"scalefactor 0.8\n" +"colorindex 0x6f 7\n" +"assoc q2_flechettepuff /*the model*/\n" +"lightradius 150\n" +"lightradiusfade 400\n" +"lightrgb 0.19 0.41 0.75\n" +"lightshadows 1\n" +"sound \"weapons/lashit.wav\" 1 1 0 0\n" +"}\n" "r_part TR_BLASTERTRAIL\n" "{\n" "texture \"classicparticle\"\n" diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index c6526714..ae946777 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -2338,20 +2338,12 @@ void Surf_SetupFrame(void) } else if (!cl.worldmodel || cl.worldmodel->loadstate != MLS_LOADED || cl.worldmodel->fromgame == fg_doom3 ) { - r_viewleaf = NULL; - r_viewleaf2 = NULL; + r_viewcluster = -1; + r_viewcluster2 = -1; } #ifdef Q2BSPS else if (cl.worldmodel->fromgame == fg_quake2 || cl.worldmodel->fromgame == fg_quake3) { - static mleaf_t fakeleaf; - mleaf_t *leaf; - - //FIXME: do we still need this fakeleaf stuff? - r_viewleaf = &fakeleaf; - r_viewleaf->contents = Q1CONTENTS_EMPTY; - r_viewleaf2 = NULL; - leaf = Mod_PointInLeaf (cl.worldmodel, pvsorg); viewcontents = cl.worldmodel->funcs.PointContents(cl.worldmodel, NULL, pvsorg); r_viewcluster = r_viewcluster2 = leaf->cluster; @@ -2383,38 +2375,12 @@ void Surf_SetupFrame(void) #endif else { - r_viewleaf = Mod_PointInLeaf (cl.worldmodel, pvsorg); - - if (!r_viewleaf) + leaf = Mod_PointInLeaf (cl.worldmodel, pvsorg); + r_viewcluster = (leaf - cl.worldmodel->leafs)-1; + r_viewcluster2 = -1; + if (leaf) { - } - else if (r_viewleaf->contents == Q1CONTENTS_EMPTY) - { //look down a bit - VectorCopy (pvsorg, temp); - temp[2] -= 16; - leaf = Mod_PointInLeaf (cl.worldmodel, temp); - if (leaf->contents <= Q1CONTENTS_WATER && leaf->contents >= Q1CONTENTS_LAVA) - r_viewleaf2 = leaf; - else - r_viewleaf2 = NULL; - } - else if (r_viewleaf->contents <= Q1CONTENTS_WATER && r_viewleaf->contents >= Q1CONTENTS_LAVA) - { //in water, look up a bit. - - VectorCopy (pvsorg, temp); - temp[2] += 16; - leaf = Mod_PointInLeaf (cl.worldmodel, temp); - if (leaf->contents == Q1CONTENTS_EMPTY) - r_viewleaf2 = leaf; - else - r_viewleaf2 = NULL; - } - else - r_viewleaf2 = NULL; - - if (r_viewleaf) - { - switch(r_viewleaf->contents) + switch(leaf->contents) { case Q1CONTENTS_WATER: viewcontents |= FTECONTENTS_WATER; @@ -2435,6 +2401,24 @@ void Surf_SetupFrame(void) viewcontents |= FTECONTENTS_LADDER; break; } + + if (leaf->contents == Q1CONTENTS_EMPTY) + { //look down a bit + VectorCopy (pvsorg, temp); + temp[2] -= 16; + leaf = Mod_PointInLeaf (cl.worldmodel, temp); + if (leaf->contents <= Q1CONTENTS_WATER && leaf->contents >= Q1CONTENTS_LAVA) + r_viewcluster2 = (leaf - cl.worldmodel->leafs)-1; + } + else if (leaf->contents <= Q1CONTENTS_WATER && leaf->contents >= Q1CONTENTS_LAVA) + { //in water, look up a bit. + + VectorCopy (pvsorg, temp); + temp[2] += 16; + leaf = Mod_PointInLeaf (cl.worldmodel, temp); + if (leaf->contents == Q1CONTENTS_EMPTY) + r_viewcluster2 = (leaf - cl.worldmodel->leafs)-1; + } } } @@ -2617,7 +2601,6 @@ struct webostate_s { char dbgid[12]; model_t *wmodel; - mleaf_t *leaf[2]; int cluster[2]; pvsbuffer_t pvs; vboarray_t ebo; @@ -2859,30 +2842,23 @@ void R_GenWorldEBO(void *ctx, void *data, size_t a, size_t b) es->batches[i].idxbuffer = NULL; } + //maybe we should just use fatpvs instead, and wait for completion when outside? + if (es->cluster[1] != -1 && es->cluster[0] != es->cluster[1]) + { //view is near to a water boundary. this implies the water crosses the near clip plane. we need both leafs. + pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[0], &es->pvs, PVM_REPLACE); + pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[1], &es->pvs, PVM_MERGE); + } + else + pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[0], &es->pvs, PVM_FAST); + #if defined(Q2BSPS) || defined(Q3BSPS) if (es->wmodel->fromgame == fg_quake2 || es->wmodel->fromgame == fg_quake3) - { - if (es->cluster[1] != -1 && es->cluster[0] != es->cluster[1]) //view is near to a water boundary. this implies the water crosses the near clip plane. - { - pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[0], &es->pvs, PVM_REPLACE); - pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[1], &es->pvs, PVM_MERGE); - } - else - pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[0], &es->pvs, PVM_FAST); Surf_SimpleWorld_Q3BSP(es, pvs); - } else #endif #ifdef Q1BSPS if (es->wmodel->fromgame == fg_quake || es->wmodel->fromgame == fg_halflife) - { - //maybe we should just use fatpvs instead, and wait for completion when outside? - pvs = Q1BSP_LeafPVS (es->wmodel, es->leaf[0], &es->pvs, false); - if (es->leaf[1]) //view is near to a water boundary. this implies the water crosses the near clip plane. - pvs = Q1BSP_LeafPVS (es->wmodel, es->leaf[1], &es->pvs, true); - Surf_SimpleWorld_Q1BSP(es, pvs); - } else #endif { @@ -2899,11 +2875,11 @@ R_DrawWorld ============= */ +static pvsbuffer_t surf_frustumvis; void Surf_DrawWorld (void) { //surfvis vs entvis - the key difference is that surfvis is surfaces while entvis is volume. though surfvis should be frustum culled also for lighting. entvis doesn't care. qbyte *surfvis, *entvis; - static pvsbuffer_t frustumvis_; RSpeedLocals(); if (r_refdef.flags & RDF_NOWORLDMODEL) @@ -2948,7 +2924,7 @@ void Surf_DrawWorld (void) if (webostate->lightstylevalues[i] != d_lightstylevalue[i]) break; } - if (webostate && webostate->leaf[0] == r_viewleaf && webostate->leaf[1] == r_viewleaf2 && i == MAX_LIGHTSTYLES) + if (webostate && webostate->cluster[0] == r_viewcluster && webostate->cluster[1] == r_viewcluster2 && i == MAX_LIGHTSTYLES) { } else @@ -2971,8 +2947,8 @@ void Surf_DrawWorld (void) webogeneratingstate = true; webogenerating = BZ_Malloc(sizeof(*webogenerating) + sizeof(webogenerating->batches[0]) * (currentmodel->numbatches-1) + currentmodel->pvsbytes); webogenerating->wmodel = currentmodel; - webogenerating->leaf[0] = r_viewleaf; - webogenerating->leaf[1] = r_viewleaf2; + webogenerating->cluster[0] = r_viewcluster; + webogenerating->cluster[1] = r_viewcluster2; webogenerating->pvs.buffer = (qbyte*)(webogenerating+1) + sizeof(webogenerating->batches[0])*(currentmodel->numbatches-1); webogenerating->pvs.buffersize = currentmodel->pvsbytes; for (i = 0; i < MAX_LIGHTSTYLES; i++) @@ -3056,9 +3032,9 @@ void Surf_DrawWorld (void) #if defined(Q2BSPS) || defined(Q3BSPS) if (currentmodel->fromgame == fg_quake2 || currentmodel->fromgame == fg_quake3) { - if (frustumvis_.buffersize < currentmodel->pvsbytes) - frustumvis_.buffer = BZ_Realloc(frustumvis_.buffer, frustumvis_.buffersize=currentmodel->pvsbytes); - frustumvis = frustumvis_.buffer; + if (surf_frustumvis.buffersize < currentmodel->pvsbytes) + surf_frustumvis.buffer = BZ_Realloc(surf_frustumvis.buffer, surf_frustumvis.buffersize=currentmodel->pvsbytes); + frustumvis = surf_frustumvis.buffer; memset(frustumvis, 0, currentmodel->pvsbytes); if (!r_refdef.areabitsknown) @@ -3121,9 +3097,9 @@ void Surf_DrawWorld (void) if (!(r_novis.ival & 2)) VectorCopy (r_origin, modelorg); - if (frustumvis_.buffersize < currentmodel->pvsbytes) - frustumvis_.buffer = BZ_Realloc(frustumvis_.buffer, frustumvis_.buffersize=currentmodel->pvsbytes); - frustumvis = frustumvis_.buffer; + if (surf_frustumvis.buffersize < currentmodel->pvsbytes) + surf_frustumvis.buffer = BZ_Realloc(surf_frustumvis.buffer, surf_frustumvis.buffersize=currentmodel->pvsbytes); + frustumvis = surf_frustumvis.buffer; memset(frustumvis, 0, currentmodel->pvsbytes); if (r_refdef.useperspective) @@ -3200,6 +3176,9 @@ void Surf_DeInit(void) if (lightmap) BZ_Free(lightmap); + Z_Free(surf_frustumvis.buffer); + memset(&surf_frustumvis, 0, sizeof(surf_frustumvis)); + lightmap=NULL; numlightmaps=0; @@ -3655,8 +3634,6 @@ void Surf_BuildLightmaps (void) Surf_LightmapMode(); - r_oldviewleaf = NULL; - r_oldviewleaf2 = NULL; r_oldviewcluster = -1; r_oldviewcluster2 = -1; @@ -3700,11 +3677,10 @@ void Surf_NewMap (void) Surf_DeInit(); - r_viewleaf = NULL; - r_oldviewleaf = NULL; r_viewcluster = -1; r_oldviewcluster = 0; r_viewcluster2 = -1; + r_oldviewcluster2 = 0; if (cl.worldmodel) { @@ -3768,10 +3744,10 @@ void Surf_PreNewMap(void) #ifdef RTLIGHTS r_loadbumpmapping |= r_shadow_realtime_world.ival || r_shadow_realtime_dlight.ival; #endif - r_viewleaf = NULL; - r_oldviewleaf = NULL; - r_viewleaf2 = NULL; - r_oldviewleaf2 = NULL; + r_viewcluster = -1; + r_oldviewcluster = -1; + r_viewcluster2 = -1; + r_oldviewcluster2 = -1; } diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 8c4ea67d..ca15099c 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -49,10 +49,25 @@ void QDECL R_SkyBox_Changed (struct cvar_s *var, char *oldvalue) { if (qrenderer != QR_NONE && cl.worldmodel) { - if (*var->string) - R_SetSky(var->string); + R_SetSky(cl.skyname); + } +} +void R_ForceSky_f(void) +{ + if (Cmd_Argc() < 2) + { + extern cvar_t r_skyboxname; + if (*r_skyboxname.string) + Con_Printf("Current user skybox is %s\n", cl.skyname); + else if (*cl.skyname) + Con_Printf("Current per-map skybox is %s\n", cl.skyname); else - R_SetSky(cl.skyname); + Con_Printf("no skybox forced.\n", cl.skyname); + } + else + { + Q_strncpyz(cl.skyname, Cmd_Argv(1), sizeof(cl.skyname)); + R_SetSky(cl.skyname); } } @@ -233,6 +248,7 @@ cvar_t vid_conwidth = CVARF ("vid_conwidth", "0", //see R_RestartRenderer_f for the effective default 'if (newr.renderer == -1)'. cvar_t vid_renderer = CVARFD ("vid_renderer", "", CVAR_ARCHIVE | CVAR_RENDERERLATCH, "Specifies which backend is used. Values that might work are: sv (dedicated server), headless (null renderer), vk (vulkan), gl (opengl), egl (opengl es), d3d9 (direct3d 9), d3d11 (direct3d 11, with default hardware rendering), d3d11 warp (direct3d 11, with software rendering)."); +cvar_t vid_renderer_opts = CVARFD ("_vid_renderer_opts", "", CVAR_NOSET, "The possible video renderer apis, in \"value\" \"description\" pairs, for gamecode to read."); cvar_t vid_bpp = CVARFD ("vid_bpp", "0", CVAR_ARCHIVE | CVAR_RENDERERLATCH, "The number of colour bits to request from the renedering context"); @@ -251,12 +267,15 @@ cvar_t vid_fullscreen_alternative = CVARFD (NULL, "1", cvar_t vid_height = CVARFD ("vid_height", "0", CVAR_ARCHIVE | CVAR_RENDERERLATCH, "The screen height to attempt to use, in physical pixels. 0 means use desktop resolution."); cvar_t vid_multisample = CVARFD ("vid_multisample", "0", - CVAR_ARCHIVE | CVAR_RENDERERLATCH, "Set to 4 or so for multisample antialiasing (msaa)."); + CVAR_ARCHIVE, "The number of samples to use for Multisample AntiAliasing (aka: msaa). A value of 1 explicitly disables it."); cvar_t vid_refreshrate = CVARF ("vid_displayfrequency", "0", CVAR_ARCHIVE | CVAR_RENDERERLATCH); cvar_t vid_srgb = CVARFD ("vid_srgb", "0", CVAR_ARCHIVE, "0: Off. Colour blending will be wrong.\n1: Only the framebuffer should use sRGB colourspace, textures and colours will be assumed to be linear. This has the effect of brightening the screen.\n2: Use sRGB extensions/support to ensure that the sh"); cvar_t vid_wndalpha = CVARD ("vid_wndalpha", "1", "When running windowed, specifies the window's transparency level."); +#if defined(_WIN32) && defined(MULTITHREAD) +cvar_t vid_winthread = CVARFD ("vid_winthread", "", CVAR_ARCHIVE|CVAR_RENDERERLATCH, "When enabled, window messages will be handled by a separate thread. This allows the game to continue rendering when Microsoft Windows blocks while resizing etc."); +#endif //more readable defaults to match conwidth/conheight. cvar_t vid_width = CVARFD ("vid_width", "0", CVAR_ARCHIVE | CVAR_RENDERERLATCH, "The screen width to attempt to use, in physical pixels. 0 means use desktop resolution."); @@ -426,11 +445,15 @@ cvar_t gl_screenangle = CVAR("gl_screenangle", "0"); #endif #ifdef VKQUAKE -cvar_t vk_stagingbuffers = CVARD ("vk_stagingbuffers", "", "Configures which dynamic buffers are copied into gpu memory for rendering, instead of reading from shared memory. Empty for default settings.\nAccepted chars are u, e, v, 0."); -cvar_t vk_submissionthread = CVARD ("vk_submissionthread", "", "Execute submits+presents on a thread dedicated to executing them. This may be a significant speedup on certain drivers."); -cvar_t vk_debug = CVARD ("vk_debug", "0", "Register a debug handler to display driver/layer messages. 2 enables the standard validation layers."); -cvar_t vk_loadglsl = CVARD ("vk_loadglsl", "", "Enable direct loading of glsl, where supported by drivers. Do not use in combination with vk_debug 2 (vk_debug should be 1 if you want to see any glsl compile errors). Don't forget to do a vid_restart after."); -cvar_t vk_dualqueue = CVARD ("vk_dualqueue", "", "Attempt to use a separate queue for presentation. Blank for default."); +cvar_t vk_stagingbuffers = CVARD ("vk_stagingbuffers", "", "Configures which dynamic buffers are copied into gpu memory for rendering, instead of reading from shared memory. Empty for default settings.\nAccepted chars are u, e, v, 0."); +cvar_t vk_submissionthread = CVARD ("vk_submissionthread", "", "Execute submits+presents on a thread dedicated to executing them. This may be a significant speedup on certain drivers."); +cvar_t vk_debug = CVARD ("vk_debug", "0", "Register a debug handler to display driver/layer messages. 2 enables the standard validation layers."); +cvar_t vk_dualqueue = CVARD ("vk_dualqueue", "", "Attempt to use a separate queue for presentation. Blank for default."); +cvar_t vk_busywait = CVARD ("vk_busywait", "", "Force busy waiting until the GPU finishes doing its thing."); +cvar_t vk_nv_glsl_shader = CVARD ("vk_loadglsl", "", "Enable direct loading of glsl, where supported by drivers. Do not use in combination with vk_debug 2 (vk_debug should be 1 if you want to see any glsl compile errors). Don't forget to do a vid_restart after."); +cvar_t vk_nv_dedicated_allocation = CVARD ("vk_nv_dedicated_allocation", "", "Flag vulkan memory allocations as dedicated, where applicable."); +//cvar_t vk_khr_dedicated_allocation = CVARD ("vk_khr_dedicated_allocation", "", "Flag vulkan memory allocations as dedicated, where applicable."); +cvar_t vk_khr_push_descriptor = CVARD ("vk_khr_push_descriptor", "", "Enables better descriptor streaming."); #endif #if defined(D3DQUAKE) @@ -709,9 +732,33 @@ void Renderer_Init(void) //but register ALL vid_ commands. Cvar_Register (&gl_driver, GLRENDEREROPTIONS); Cvar_Register (&vid_vsync, VIDCOMMANDGROUP); + Cvar_Register (&vid_wndalpha, VIDCOMMANDGROUP); +#if defined(_WIN32) && defined(MULTITHREAD) + Cvar_Register (&vid_winthread, VIDCOMMANDGROUP); +#endif Cvar_Register (&_windowed_mouse, VIDCOMMANDGROUP); Cvar_Register (&vid_renderer, VIDCOMMANDGROUP); - Cvar_Register (&vid_wndalpha, VIDCOMMANDGROUP); + vid_renderer_opts.enginevalue = +#ifdef GLQUAKE + "gl \"OpenGL\" " +#endif +#ifdef VKQUAKE + "vk \"Vulkan\" " +#endif +#ifdef D3D8QUAKE +// "d3d8 \"Direct3D 8\" " +#endif +#ifdef D3D9QUAKE + "d3d9 \"Direct3D 9\" " +#endif +#ifdef D3D11QUAKE + "d3d11 \"Direct3D 11\" " +#endif +#ifdef SWQUAKE + "sw \"Software Rendering\" " +#endif + ""; + Cvar_Register (&vid_renderer_opts, VIDCOMMANDGROUP); #ifndef NACL if (COM_CheckParm("-plugin")) @@ -750,10 +797,12 @@ void Renderer_Init(void) Cvar_Register (&r_norefresh, GLRENDEREROPTIONS); Cvar_Register (&r_mirroralpha, GLRENDEREROPTIONS); - Cvar_Register (&r_skyboxname, GRAPHICALNICETIES); - Cbuf_AddText("alias sky r_skybox\n", RESTRICT_LOCAL); /*alternative name for users*/ Cvar_Register (&r_softwarebanding_cvar, GRAPHICALNICETIES); + Cvar_Register (&r_skyboxname, GRAPHICALNICETIES); + Cmd_AddCommand("sky", R_ForceSky_f); //QS compat + Cmd_AddCommand("loadsky", R_ForceSky_f);//DP compat + Cvar_Register(&r_dodgytgafiles, "Hacky bug workarounds"); Cvar_Register(&r_dodgypcxfiles, "Hacky bug workarounds"); Cvar_Register(&r_dodgymiptex, "Hacky bug workarounds"); @@ -915,11 +964,16 @@ void Renderer_Init(void) Cvar_Register (&r_forceprogramify, GLRENDEREROPTIONS); #ifdef VKQUAKE - Cvar_Register (&vk_stagingbuffers, VKRENDEREROPTIONS); - Cvar_Register (&vk_submissionthread, VKRENDEREROPTIONS); - Cvar_Register (&vk_debug, VKRENDEREROPTIONS); - Cvar_Register (&vk_loadglsl, VKRENDEREROPTIONS); - Cvar_Register (&vk_dualqueue, VKRENDEREROPTIONS); + Cvar_Register (&vk_stagingbuffers, VKRENDEREROPTIONS); + Cvar_Register (&vk_submissionthread, VKRENDEREROPTIONS); + Cvar_Register (&vk_debug, VKRENDEREROPTIONS); + Cvar_Register (&vk_dualqueue, VKRENDEREROPTIONS); + Cvar_Register (&vk_busywait, VKRENDEREROPTIONS); + + Cvar_Register (&vk_nv_glsl_shader, VKRENDEREROPTIONS); + Cvar_Register (&vk_nv_dedicated_allocation, VKRENDEREROPTIONS); +// Cvar_Register (&vk_khr_dedicated_allocation,VKRENDEREROPTIONS); + Cvar_Register (&vk_khr_push_descriptor, VKRENDEREROPTIONS); #endif // misc @@ -1966,9 +2020,14 @@ mspriteframe_t *R_GetSpriteFrame (entity_t *currententity) } else if (psprite->frames[frame].type == SPR_ANGLED) { + float f = DotProduct(vpn,currententity->axis[0]); + float r = DotProduct(vright,currententity->axis[0]); + int dir = (atan2(r, f)+1.125*M_PI)*(4/M_PI); + pspritegroup = (mspritegroup_t *)psprite->frames[frame].frameptr; // pspriteframe = pspritegroup->frames[(int)((r_refdef.viewangles[1]-currententity->angles[1])/360*pspritegroup->numframes + 0.5-4)%pspritegroup->numframes]; - pspriteframe = pspritegroup->frames[(int)((r_refdef.viewangles[1]-currententity->angles[1])/360*8 + 0.5-4)&7]; + //int dir = (int)((r_refdef.viewangles[1]-currententity->angles[1])/360*8 + 8 + 0.5-4)&7; + pspriteframe = pspritegroup->frames[dir&7]; } else { @@ -2125,8 +2184,8 @@ texture_t *R_TextureAnimation_Q2 (texture_t *base) unsigned int r_viewcontents; -mleaf_t *r_viewleaf, *r_oldviewleaf; -mleaf_t *r_viewleaf2, *r_oldviewleaf2; +//mleaf_t *r_viewleaf, *r_oldviewleaf; +//mleaf_t *r_viewleaf2, *r_oldviewleaf2; int r_viewcluster, r_viewcluster2, r_oldviewcluster, r_oldviewcluster2; int r_visframecount; mleaf_t *r_vischain; // linked list of visible leafs @@ -2357,23 +2416,23 @@ qbyte *R_MarkLeaves_Q1 (qboolean getvisonly) { vis = cvis[portal] = r_refdef.forcedvis; - r_oldviewleaf = NULL; - r_oldviewleaf2 = NULL; + r_oldviewcluster = -1; + r_oldviewcluster2 = -1; } else { if (!portal) { - if (((r_oldviewleaf == r_viewleaf && r_oldviewleaf2 == r_viewleaf2) && !r_novis.ival) || r_novis.ival & 2) + if (((r_oldviewcluster == r_viewcluster && r_oldviewcluster2 == r_viewcluster2) && !r_novis.ival) || r_novis.ival & 2) return cvis[portal]; - r_oldviewleaf = r_viewleaf; - r_oldviewleaf2 = r_viewleaf2; + r_oldviewcluster = r_viewcluster; + r_oldviewcluster2 = r_viewcluster2; } else { - r_oldviewleaf = NULL; - r_oldviewleaf2 = NULL; + r_oldviewcluster = -1; + r_oldviewcluster2 = -1; } if (r_novis.ival) @@ -2381,14 +2440,18 @@ qbyte *R_MarkLeaves_Q1 (qboolean getvisonly) vis = cvis[portal] = curframevis[portal].buffer; memset (curframevis[portal].buffer, 0xff, curframevis[portal].buffersize); - r_oldviewleaf = NULL; - r_oldviewleaf2 = NULL; + r_oldviewcluster = -1; + r_oldviewcluster2 = -1; } else { - vis = cvis[portal] = Q1BSP_LeafPVS (cl.worldmodel, r_viewleaf, &curframevis[portal], false); - if (r_viewleaf2 && r_viewleaf2 != r_viewleaf) - vis = cvis[portal] = Q1BSP_LeafPVS (cl.worldmodel, r_viewleaf, &curframevis[portal], true); + if (r_viewcluster2 != -1 && r_viewcluster2 != r_viewcluster) + { + vis = cvis[portal] = cl.worldmodel->funcs.ClusterPVS(cl.worldmodel, r_viewcluster, &curframevis[portal], PVM_REPLACE); + vis = cvis[portal] = cl.worldmodel->funcs.ClusterPVS(cl.worldmodel, r_viewcluster2, &curframevis[portal], PVM_MERGE); + } + else + vis = cvis[portal] = cl.worldmodel->funcs.ClusterPVS(cl.worldmodel, r_viewcluster, &curframevis[portal], PVM_FAST); } } @@ -2396,7 +2459,7 @@ qbyte *R_MarkLeaves_Q1 (qboolean getvisonly) if (getvisonly) return vis; - else if (r_viewleaf && r_viewleaf->contents == Q1CONTENTS_SOLID) + else if (r_viewcluster == -1) { //to improve spectating, when the camera is in a wall, we ignore any sky leafs. //this prevents seeing the upwards-facing sky surfaces within the sky volumes. diff --git a/engine/client/screen.h b/engine/client/screen.h index c046e783..f7d0d380 100644 --- a/engine/client/screen.h +++ b/engine/client/screen.h @@ -176,6 +176,7 @@ int Font_LineBreaks(conchar_t *start, conchar_t *end, int maxpixelwidth, int max int Font_LineWidth(conchar_t *start, conchar_t *end); float Font_LineScaleWidth(conchar_t *start, conchar_t *end); void Font_LineDraw(int x, int y, conchar_t *start, conchar_t *end); +conchar_t *Font_CharAt(int x, conchar_t *start, conchar_t *end); extern struct font_s *font_default; extern struct font_s *font_console; extern struct font_s *font_tiny; diff --git a/engine/client/snd_directx.c b/engine/client/snd_directx.c index a84f3ca9..79442438 100644 --- a/engine/client/snd_directx.c +++ b/engine/client/snd_directx.c @@ -316,15 +316,8 @@ typedef struct { GUID SubFormat; } QWAVEFORMATEX; -const static GUID QKSDATAFORMAT_SUBTYPE_PCM = {0x00000001,0x0000,0x0010, - {0x80, - 0x00, - 0x00, - 0xaa, - 0x00, - 0x38, - 0x9b, - 0x71}}; +const static GUID QKSDATAFORMAT_SUBTYPE_PCM = {0x00000001,0x0000,0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; +const static GUID QKSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003,0x0000,0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; #ifdef _IKsPropertySet_ const static GUID CLSID_EAXDIRECTSOUND = {0x4ff53b81, 0x1ce0, 0x11d3, @@ -539,7 +532,7 @@ static unsigned int DSOUND_GetDMAPos(soundcardinfo_t *sc) s = mmtime - dh->mmstarttime; - s >>= (sc->sn.samplebits/8) - 1; + s /= (sc->sn.samplebits/8); s %= (sc->sn.samples); @@ -664,6 +657,13 @@ static int DSOUND_InitCard_Internal (soundcardinfo_t *sc, char *cardname) sc->sn.numchannels = 1; } + if (sc->sn.samplebits == 32) + { //FTE does not support 32bit int audio, rather we interpret samplebits 32 as floats. + format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + format.Format.cbSize = 22; + memcpy(&format.SubFormat, &QKSDATAFORMAT_SUBTYPE_IEEE_FLOAT, sizeof(GUID)); + } + format.Format.nChannels = sc->sn.numchannels; format.Format.wBitsPerSample = sc->sn.samplebits; format.Format.nSamplesPerSec = sc->sn.speed; diff --git a/engine/client/snd_dma.c b/engine/client/snd_dma.c index 4ee35522..1b34f5d9 100644 --- a/engine/client/snd_dma.c +++ b/engine/client/snd_dma.c @@ -2046,6 +2046,8 @@ void S_DoRestart (qboolean onlyifneeded) void S_Restart_f (void) { + S_EnumerateDevices(); + S_DoRestart(false); } diff --git a/engine/client/snd_win.c b/engine/client/snd_win.c index e4dd42a7..a10d8616 100644 --- a/engine/client/snd_win.c +++ b/engine/client/snd_win.c @@ -242,6 +242,11 @@ int WAV_InitCard (soundcardinfo_t *sc, int cardnum) if (sc->sn.speed > 48000) // limit waveout to 48000 until that buffer issue gets solved sc->sn.speed = 48000; + if (sc->sn.samplebits > 16) + sc->sn.samplebits = 16; + else + sc->sn.samplebits = 8; + memset (&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = sc->sn.numchannels; diff --git a/engine/client/snd_xaudio.c b/engine/client/snd_xaudio.c index d92b71b8..cd69f78e 100644 --- a/engine/client/snd_xaudio.c +++ b/engine/client/snd_xaudio.c @@ -130,19 +130,27 @@ static qboolean QDECL XAUDIO_InitCard(soundcardinfo_t *sc, const char *cardname) int dev = 0; #endif xaud_t *xa = Z_Malloc(sizeof(*xa)); - WAVEFORMATEX wfmt; + WAVEFORMATEXTENSIBLE wfmt; + const static GUID QKSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003,0x0000,0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; xa->cb.lpVtbl = &cbvtbl; sc->sn.numchannels = 2; - wfmt.wFormatTag = WAVE_FORMAT_PCM; - wfmt.nChannels = sc->sn.numchannels; - wfmt.nSamplesPerSec = sc->sn.speed; - wfmt.wBitsPerSample = sc->sn.samplebits; - wfmt.nBlockAlign = wfmt.nChannels * (wfmt.wBitsPerSample / 8); - wfmt.nAvgBytesPerSec = wfmt.nSamplesPerSec * wfmt.nBlockAlign; - wfmt.cbSize = 0; + memset(&wfmt, 0, sizeof(wfmt)); + wfmt.Format.wFormatTag = WAVE_FORMAT_PCM; + wfmt.Format.nChannels = sc->sn.numchannels; + wfmt.Format.nSamplesPerSec = sc->sn.speed; + wfmt.Format.wBitsPerSample = sc->sn.samplebits; + wfmt.Format.nBlockAlign = wfmt.Format.nChannels * (wfmt.Format.wBitsPerSample / 8); + wfmt.Format.nAvgBytesPerSec = wfmt.Format.nSamplesPerSec * wfmt.Format.nBlockAlign; + wfmt.Format.cbSize = 0; + if (wfmt.Format.wBitsPerSample == 32) + { + wfmt.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wfmt.Format.cbSize = 22; + memcpy(&wfmt.SubFormat, &QKSDATAFORMAT_SUBTYPE_IEEE_FLOAT, sizeof(wfmt.SubFormat)); + } sc->inactive_sound = true; xa->buffercount = xa->bufferavail = 3; //submit this many straight up @@ -198,7 +206,7 @@ static qboolean QDECL XAUDIO_InitCard(soundcardinfo_t *sc, const char *cardname) sd[0].Flags = 0; sd[0].pOutputVoice = (IXAudio2Voice*)xa->master; - if (SUCCEEDED(IXAudio2_CreateSourceVoice(xa->ixa, &xa->source, &wfmt, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &xa->cb, &vs, NULL))) + if (SUCCEEDED(IXAudio2_CreateSourceVoice(xa->ixa, &xa->source, &wfmt.Format, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &xa->cb, &vs, NULL))) { sc->handle = xa; sc->GetDMAPos = XAUDIO_GetDMAPos; diff --git a/engine/client/sound.h b/engine/client/sound.h index 6cd2fc46..5ac7c576 100644 --- a/engine/client/sound.h +++ b/engine/client/sound.h @@ -87,7 +87,7 @@ typedef struct int samples; // mono samples in buffer (individual, non grouped) // int submission_chunk; // don't mix less than this # int samplepos; // in mono samples - int samplebits; + int samplebits; //FIXME: replace with a format enum (with separate framebytes field for lazyness). int speed; // this many frames per second unsigned char *buffer; // pointer to mixed pcm buffer (not directly used by mixer) } dma_t; diff --git a/engine/common/common.c b/engine/common/common.c index f4ca66b3..e60db0ea 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -1105,13 +1105,15 @@ int COM_EncodeSize(vec3_t mins, vec3_t maxs) solid = bound(0, (int)-mins[0], 255); solid |= bound(0, (int)-mins[2], 255)<<8; solid |= bound(0, (int)((maxs[2]+32768)), 65535)<<16; /*up can be negative*/; + if (solid == 0x80000000) + solid = 0; //point sized stuff should just be non-solid. you'll thank me for splitscreens. #else solid = bound(0, (int)-mins[0]/8, 31); solid |= bound(0, (int)-mins[2]/8, 31)<<5; solid |= bound(0, (int)((maxs[2]+32)/8), 63)<<10; /*up can be negative*/; -#endif if (solid == 4096) solid = 0; //point sized stuff should just be non-solid. you'll thank me for splitscreens. +#endif return solid; } diff --git a/engine/common/fs_dzip.c b/engine/common/fs_dzip.c index f3681387..f80724c1 100644 --- a/engine/common/fs_dzip.c +++ b/engine/common/fs_dzip.c @@ -33,6 +33,7 @@ the second part is some entropy differences that just allows zlib to work more e I've rewritten the archive/outer part to plug it in to fte more nicely the demo/inner part should mostly be the same as dzip, just with some minor tweaks to make it thread-safe (the 'dc' pointer stuff, in case that's ever an issue). +I have explicitly changed longs to ints, to ensure there's no issues with 64bit builds */ #include "quakedef.h" @@ -132,7 +133,6 @@ enum { }; //basic types -#define long int //gah! typedef unsigned int uInt; //gah! typedef qbyte uchar; @@ -140,7 +140,7 @@ typedef struct { uchar voz, pax; uchar ang0, ang1, ang2; uchar vel0, vel1, vel2; - long items; + int items; uchar uk10, uk11, invbit; uchar wpf, av, wpm; int health; @@ -174,9 +174,9 @@ typedef struct uchar copybaseline; int maxent, lastent, sble; int entlink[MAX_ENT]; - long dem_gametime; - long outlen; - long cam0, cam1, cam2; + int dem_gametime; + int outlen; + int cam0, cam1, cam2; uchar inblk[p_blocksize], outblk[p_blocksize], *inptr; cdata_t oldcd, newcd; ent_t base[MAX_ENT], oldent[MAX_ENT], newent[MAX_ENT]; @@ -192,18 +192,18 @@ static void Outfile_Write(decodectx_t *dc, void *outblk, size_t outlen) } } -static copy_msg(decodectx_t *dc, size_t bytes) +static void copy_msg(decodectx_t *dc, size_t bytes) { //just copy the data over memcpy(dc->outblk+dc->outlen, dc->inptr, bytes); dc->outlen += bytes; dc->inptr += bytes; } -static insert_msg (decodectx_t *dc, void *data, size_t bytes) +static void insert_msg (decodectx_t *dc, void *data, size_t bytes) { memcpy(dc->outblk+dc->outlen, data, bytes); dc->outlen += bytes; } -static discard_msg (decodectx_t *dc, size_t bytes) +static void discard_msg (decodectx_t *dc, size_t bytes) { dc->inptr += bytes; } @@ -236,7 +236,7 @@ static discard_msg (decodectx_t *dc, size_t bytes) #define GUI //because it disables v1 #define getshort(x) LittleShort(*(short*)(x)) -#define getlong(x) LittleLong(*(long*)(x)) +#define getlong(x) LittleLong(*(int*)(x)) #define getfloat(x) LittleFloat(*(float*)(x)) #define cnvlong(x) LittleLong(x) @@ -336,7 +336,7 @@ void demx_sound(decodectx_t *dc) void demx_longtime(decodectx_t *dc) { - long tmp = getlong(inptr+1); + int tmp = getlong(inptr+1); dem_gametime += tmp; tmp = cnvlong(dem_gametime); *inptr = DEM_time; @@ -347,7 +347,7 @@ void demx_longtime(decodectx_t *dc) void demx_time(decodectx_t *dc) { uchar buf[5]; - long tmp = getshort(inptr+1) & 0xffff; + int tmp = getshort(inptr+1) & 0xffff; #ifndef GUI if (dem_decode_type == TYPE_DEMV1) { demx_longtime(); return; } @@ -420,7 +420,7 @@ void create_clientdata_msg(decodectx_t *dc) uchar buf[32]; uchar *ptr = buf+3; int mask = newcd.invbit? 0 : 0x0200; - long tmp; + int tmp; buf[0] = DEM_clientdata; @@ -645,7 +645,7 @@ void demx_updateentity(decodectx_t *dc) int mask, i, entity; int baseval = 0, prev; ent_t n, o; - long tmp; + int tmp; #ifndef GUI if (dem_decode_type == TYPE_DEMV1) { demv1_updateentity(); return; } @@ -841,7 +841,7 @@ void dem_uncompress_init (decodectx_t *dc, int type) uInt dem_uncompress_block(decodectx_t *dc) { - long a1; + int a1; uchar cfields; #ifdef GUI int uemask = 0x30, cdmask = 0x40; @@ -971,7 +971,6 @@ uInt dem_uncompress (decodectx_t *dc, uInt maxsize) //pack mutex must be held for this function. qboolean FSDZ_ExtractFile(qbyte *out, size_t outsize, dzarchive_t *pack, mdzfile_t *src) { - qboolean dedemo = false; switch(src->ztype) { case TYPE_PAK: @@ -1024,7 +1023,6 @@ qboolean FSDZ_ExtractFile(qbyte *out, size_t outsize, dzarchive_t *pack, mdzfile unsigned char inbuffer[p_blocksize]; int ret; size_t inremaining = src->csize; - size_t decompressed = 0; decodectx_t *dc = NULL; z_stream strm = { @@ -1380,7 +1378,7 @@ searchpathfuncs_t *QDECL FSDZ_LoadArchive (vfsfile_t *file, const char *desc, co read = VFS_READ(packhandle, &header, sizeof(header)); if (read < sizeof(header) || header.id[0] != 'D' || header.id[1] != 'Z') { - Con_Printf("%s is not a dz - %c%c\n", desc); + Con_Printf("%s is not a dz - %c%c\n", desc, header.id[0], header.id[1]); return NULL; } if (header.major_ver > 2/* || (header.major_ver == 2 && header.minor_ver > 9)*/) diff --git a/engine/common/log.c b/engine/common/log.c index 7fcd0657..da02cc08 100644 --- a/engine/common/log.c +++ b/engine/common/log.c @@ -543,7 +543,7 @@ static void IPLog_Identify_f(void) else Con_Printf("%s: not connected, nor raw address\n", Cmd_Argv(0)); } -static qboolean IPLog_Dump(const char *fname) +static int IPLog_Dump(const char *fname) { size_t i; vfsfile_t *f; @@ -551,6 +551,9 @@ static qboolean IPLog_Dump(const char *fname) if (!*fname) fname = "iplog.txt"; + if (!iplog_num && !COM_FCheckExists(fname)) + return 2; //no entries, nothing to overwrite + f = FS_OpenVFS(fname, "wb", FS_PUBBASEGAMEONLY); if (!f) return false; @@ -590,11 +593,18 @@ static void IPLog_Dump_f(void) if (FS_NativePath(fname, FS_GAMEONLY, native, sizeof(native))) Q_strncpyz(native, fname, sizeof(native)); IPLog_Merge_File(fname); //merge from the existing file, so that we're hopefully more robust if multiple processes are poking the same file. - if (!IPLog_Dump(fname)) - Con_Printf("unable to write %s\n", fname); - else + switch (IPLog_Dump(fname)) { + case 0: + Con_Printf("unable to write %s\n", fname); + break; + default: + case 1: Con_Printf("wrote %s\n", native); + break; + case 2: + Con_Printf("nothing to write\n"); + break; } } static void IPLog_Merge_f(void) diff --git a/engine/common/particles.h b/engine/common/particles.h index 1edc4bb2..5fba17dc 100644 --- a/engine/common/particles.h +++ b/engine/common/particles.h @@ -159,8 +159,9 @@ typedef enum Q2PT_RESPAWN, Q2PT_PLAYER_TELEPORT, - Q2PT_FOOTSTEP + Q2PT_FOOTSTEP, + Q2PT_MAX } q2particleeffects_t; extern int pt_q2[]; #endif @@ -255,7 +256,7 @@ typedef struct { void (*RunParticleEffect4) (vec3_t org, float radius, int color, int effect, int count); void (*RunParticleEffectPalette) (const char *nameprefix, vec3_t org, vec3_t dir, int color, int count); - void (*ParticleTrailIndex) (vec3_t start, vec3_t end, int color, int crnd, trailstate_t **tsk); + void (*ParticleTrailIndex) (vec3_t start, vec3_t end, int type, int color, int crnd, trailstate_t **tsk); //P_INVALID is fine for the type here, you'll get a default trail. qboolean (*InitParticles) (void); void (*ShutdownParticles) (void); void (*DelinkTrailstate) (trailstate_t **tsk); diff --git a/engine/common/protocol.h b/engine/common/protocol.h index 90620163..e91b20c6 100644 --- a/engine/common/protocol.h +++ b/engine/common/protocol.h @@ -1147,13 +1147,14 @@ typedef struct usercmd_s qbyte lightlevel; //freestyle - float msec; - int buttons; - int weapon; - int servertime; - float fservertime; - float fclienttime; + float msec; //replace msec, but with more precision + int buttons; //replaces buttons, but with more bits. + int weapon; //q3 has a separate weapon field to supplement impulse. + int servertime; //q3 networks the time in order to calculate msecs + float fservertime;//used as part of nq msec calcs + float fclienttime;//not used? + //prydon cursor crap vec2_t cursor_screen; vec3_t cursor_start; vec3_t cursor_impact; @@ -1161,17 +1162,17 @@ typedef struct usercmd_s } usercmd_t; typedef struct q2usercmd_s -{ +{ //visible to gamecode so can't be changed (and the prediction code) qbyte msec; qbyte buttons; short angles[3]; short forwardmove, sidemove, upmove; qbyte impulse; - qbyte lightlevel; + qbyte lightlevel; } q2usercmd_t; typedef struct q1usercmd_s -{ +{ //as written to qwd demos so can't be changed. qbyte msec; vec3_t angles; short forwardmove, sidemove, upmove; diff --git a/engine/common/q1bsp.c b/engine/common/q1bsp.c index ba008e01..654c0695 100644 --- a/engine/common/q1bsp.c +++ b/engine/common/q1bsp.c @@ -1739,6 +1739,7 @@ Rendering functions (Client only) Server only functions */ #ifndef CLIENTONLY +static qbyte *Q1BSP_ClusterPVS (model_t *model, int cluster, pvsbuffer_t *buffer, pvsmerge_t merge); //does the recursive work of Q1BSP_FatPVS static void SV_Q1BSP_AddToFatPVS (model_t *mod, vec3_t org, mnode_t *node, pvsbuffer_t *pvsbuffer) @@ -1753,7 +1754,7 @@ static void SV_Q1BSP_AddToFatPVS (model_t *mod, vec3_t org, mnode_t *node, pvsbu { if (node->contents != Q1CONTENTS_SOLID) { - Q1BSP_LeafPVS (mod, (mleaf_t *)node, pvsbuffer, true); + Q1BSP_ClusterPVS(mod, ((mleaf_t *)node - mod->leafs)-1, pvsbuffer, PVM_MERGE); } return; } @@ -1935,25 +1936,12 @@ static qbyte *Q1BSP_DecompressVis (qbyte *in, model_t *model, qbyte *decompresse static pvsbuffer_t mod_novis; static pvsbuffer_t mod_tempvis; -qbyte *Q1BSP_LeafPVS (model_t *model, mleaf_t *leaf, pvsbuffer_t *buffer, qboolean merge) +void Q1BSP_Shutdown(void) { - if (leaf == model->leafs) - { - if (mod_novis.buffersize < model->pvsbytes) - { - mod_novis.buffer = BZ_Realloc(mod_novis.buffer, mod_novis.buffersize=model->pvsbytes); - memset(mod_novis.buffer, 0xff, mod_novis.buffersize); - } - return mod_novis.buffer; - } - - if (!buffer) - buffer = &mod_tempvis; - - if (buffer->buffersize < model->pvsbytes) - buffer->buffer = BZ_Realloc(buffer->buffer, buffer->buffersize=model->pvsbytes); - - return Q1BSP_DecompressVis (leaf->compressed_vis, model, buffer->buffer, buffer->buffersize, merge); + Z_Free(mod_novis.buffer); + memset(&mod_novis, 0, sizeof(mod_novis)); + Z_Free(mod_tempvis.buffer); + memset(&mod_tempvis, 0, sizeof(mod_tempvis)); } //pvs is 1-based. clusters are 0-based. otherwise, q1bsp has a 1:1 mapping. @@ -1990,20 +1978,34 @@ static qbyte *Q1BSP_ClusterPVS (model_t *model, int cluster, pvsbuffer_t *buffer return Q1BSP_DecompressVis (model->leafs[cluster].compressed_vis, model, buffer->buffer, buffer->buffersize, merge==PVM_MERGE); } -/*static qbyte *Q1BSP_ClusterPHS (model_t *model, int cluster, pvsbuffer_t *buffer) +/*static qbyte *Q1BSP_ClusterPHS (model_t *model, int cluster, pvsbuffer_t *buffer, pvsmerge_t merge) { if (cluster == -1 || !model->phs) - { //without any phs info, this turns into a broadcast. - if (mod_novis.buffersize < model->pvsbytes) + { + if (merge == PVM_FAST) { - mod_novis.buffer = BZ_Realloc(mod_novis.buffer, mod_novis.buffersize=model->pvsbytes); - memset(mod_novis.buffer, 0xff, mod_novis.buffersize); + if (mod_novis.buffersize < model->pvsbytes) + { + mod_novis.buffer = BZ_Realloc(mod_novis.buffer, mod_novis.buffersize=model->pvsbytes); + memset(mod_novis.buffer, 0xff, mod_novis.buffersize); + } + return mod_novis.buffer; } - return mod_novis.buffer; + if (buffer->buffersize < model->pvsbytes) + buffer->buffer = BZ_Realloc(buffer->buffer, buffer->buffersize=model->pvsbytes); + memset(buffer->buffer, 0xff, model->pvsbytes); + return buffer->buffer; } - cluster++; - return model->phs + cluster * model->pvsbytes; + if (merge == PVM_FAST) + return model->pvs + cluster * model->pvsbytes; + + if (!buffer) + buffer = &mod_tempvis; + if (buffer->buffersize < model->pvsbytes) + buffer->buffer = BZ_Realloc(buffer->buffer, buffer->buffersize=model->pvsbytes); + memcpy(buffer->buffer, model->pvs + cluster * model->pvsbytes, model->pvsbytes); + return buffer->buffer; }*/ //returns the leaf number, which is used as a bit index into the pvs. diff --git a/engine/common/q3common.c b/engine/common/q3common.c index a7621968..81b0bd4f 100644 --- a/engine/common/q3common.c +++ b/engine/common/q3common.c @@ -1708,14 +1708,7 @@ void MSG_Q3_ReadDeltaUsercmd(int key, const usercmd_t *from, usercmd_t *to) to->servertime = MSG_ReadBits(8) + from->servertime; else to->servertime = MSG_ReadBits(32); - - if ((unsigned int)(to->servertime - from->servertime) > 255) - { - Con_DPrintf("msecs clamped\n"); - to->msec = 255; - } - else - to->msec = to->servertime - from->servertime; + to->msec = 0; //first of a packet should always be an absolute value, which makes the old value awkward. if (!MSG_ReadBits(1)) { diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 44b21ecd..6bb55afe 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -1447,8 +1447,9 @@ void GLBE_Init(void) if (gl_config.glversion >= 3.0 && gl_config_nofixedfunc) { //docs say this line should be okay in gl3+. nvidia do not seem to agree. GL_STENCIL_BITS is depricated however. so for now, just assume. - //qglGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER_EXT, GL_STENCIL, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, &gl_stencilbits); - gl_stencilbits = 8; + qglGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER_EXT, GL_STENCIL, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, &gl_stencilbits); + if (qglGetError()) + gl_stencilbits = 8; } else qglGetIntegerv(GL_STENCIL_BITS, &gl_stencilbits); @@ -1484,9 +1485,17 @@ void GLBE_Init(void) if (r_shadow_realtime_dlight.ival || r_shadow_realtime_world.ival) { if (r_shadow_shadowmapping.ival) + { GLBE_RegisterLightShader(LSHADER_SMAP); + GLBE_RegisterLightShader(LSHADER_SMAP|LSHADER_CUBE); + GLBE_RegisterLightShader(LSHADER_SMAP|LSHADER_SPOT); + } else - GLBE_RegisterLightShader(0); + { + GLBE_RegisterLightShader(LSHADER_STANDARD); + GLBE_RegisterLightShader(LSHADER_STANDARD|LSHADER_CUBE); + GLBE_RegisterLightShader(LSHADER_STANDARD|LSHADER_SPOT); + } } #endif diff --git a/engine/gl/gl_bloom.c b/engine/gl/gl_bloom.c index 4af95d21..0897f4f3 100644 --- a/engine/gl/gl_bloom.c +++ b/engine/gl/gl_bloom.c @@ -220,11 +220,11 @@ void VK_R_BloomBlend (texid_t source, int x, int y, int w, int h) R2D_Flush(); #if 1 /*filter the screen into a downscaled image*/ - VKBE_RT_Gen(&vk_rt_filter, texwidth[0], texheight[0], false); + VKBE_RT_Gen(&vk_rt_filter, texwidth[0], texheight[0], false, RT_IMAGEFLAGS); VKBE_RT_Begin(&vk_rt_filter); vk.sourcecolour = source; R2D_ScalePic(0, 0, vid.width, vid.height, bloomfilter); - R2D_Flush(); + VKBE_RT_End(&vk_rt_filter); intex = &vk_rt_filter.q_colour; #else intex = source; @@ -251,29 +251,27 @@ void VK_R_BloomBlend (texid_t source, int x, int y, int w, int h) r_worldentity.glowmod[1] = 0; - VKBE_RT_Gen(&vk_rt_bloom[1][i], texwidth[i], texheight[i], false); + VKBE_RT_Gen(&vk_rt_bloom[1][i], texwidth[i], texheight[i], false, RT_IMAGEFLAGS); VKBE_RT_Begin(&vk_rt_bloom[1][i]); vk.sourcecolour = intex; BE_SelectEntity(&r_worldentity); R2D_ScalePic(0, 0, vid.width, vid.height, bloomblur); - R2D_Flush(); + VKBE_RT_End(&vk_rt_bloom[1][i]); r_worldentity.glowmod[0] = 0; r_worldentity.glowmod[1] = 1.0 / texheight[i]; - VKBE_RT_Gen(&vk_rt_bloom[0][i], texwidth[i], texheight[i], false); + VKBE_RT_Gen(&vk_rt_bloom[0][i], texwidth[i], texheight[i], false, RT_IMAGEFLAGS); VKBE_RT_Begin(&vk_rt_bloom[0][i]); vk.sourcecolour = &vk_rt_bloom[1][i].q_colour; BE_SelectEntity(&r_worldentity); R2D_ScalePic(0, 0, vid.width, vid.height, bloomblur); - R2D_Flush(); + VKBE_RT_End(&vk_rt_bloom[0][i]); intex = &vk_rt_bloom[0][i].q_colour; } r_worldentity.glowmod[0] = 0; r_worldentity.glowmod[1] = 0; - VKBE_RT_Begin(oldfbo); - //go back to the screen fbo /*combine them onto the screen*/ bloomfinal->defaulttextures->base = intex; @@ -288,10 +286,10 @@ void VK_R_BloomShutdown(void) int i; for (i = 0; i < MAXLEVELS; i++) { - VKBE_RT_Gen(&vk_rt_bloom[0][i], 0, 0, false); - VKBE_RT_Gen(&vk_rt_bloom[1][i], 0, 0, false); + VKBE_RT_Gen(&vk_rt_bloom[0][i], 0, 0, false, RT_IMAGEFLAGS); + VKBE_RT_Gen(&vk_rt_bloom[1][i], 0, 0, false, RT_IMAGEFLAGS); } - VKBE_RT_Gen(&vk_rt_filter, 0, 0, false); + VKBE_RT_Gen(&vk_rt_filter, 0, 0, false, RT_IMAGEFLAGS); R_InitBloomTextures(); } diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index 8857daf0..f0e0199b 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -66,12 +66,10 @@ void GLDraw_Init (void) if (gl_config.gles && gl_config.glversion < 3.0) r_softwarebanding = false; - if (!gl_config.gles) + if (gl_config.arb_framebuffer_srgb) { extern cvar_t vid_srgb; - GLint srgb; - qglGetIntegerv(GL_FRAMEBUFFER_SRGB_CAPABLE, &srgb); - vid.srgb = vid_srgb.ival>1 && srgb; + vid.srgb = vid_srgb.ival>1; if (vid.srgb) qglEnable(GL_FRAMEBUFFER_SRGB); } diff --git a/engine/gl/gl_font.c b/engine/gl/gl_font.c index 5c577e99..9e3eee95 100644 --- a/engine/gl/gl_font.c +++ b/engine/gl/gl_font.c @@ -1816,6 +1816,22 @@ void Font_LineDraw(int x, int y, conchar_t *start, conchar_t *end) } } +conchar_t *Font_CharAt(int x, conchar_t *start, conchar_t *end) +{ + int lx = 0, nx; + struct font_s *font = curfont; + unsigned int codeflags, codepoint; + conchar_t *nc; + for (; start < end; lx = nx, start = nc) + { + nc = Font_Decode(start, &codeflags, &codepoint); + nx = Font_CharEndCoord(font, lx, codeflags, codepoint); + if (x >= lx && x < nx) + return start; + } + return NULL; +} + /*Note: *all* strings after the current one will inherit the same colour, until one changes it explicitly correct usage of this function thus requires calling this with 1111 before Font_EndString*/ void Font_InvalidateColour(vec4_t newcolour) diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 460fe98c..46a3f68e 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -5847,6 +5847,7 @@ void Mod_LoadDoomSprite (model_t *mod) mspriteframe_t frame; size_t c; unsigned int *colpointers; + vec3_t t; mod->type = mod_dummy; @@ -5908,6 +5909,8 @@ void Mod_LoadDoomSprite (model_t *mod) } Z_Free(coldata); + ClearBounds(mod->mins, mod->maxs); + //do the actual loading. for (ofs = 4; ofs < *(int*)files; ofs+=strlen(files+ofs)+1) { @@ -5915,11 +5918,18 @@ void Mod_LoadDoomSprite (model_t *mod) header = (doomimage_t *)FS_LoadMallocFile(name, &fsize); - frame.up = +header->ypos; - frame.down = -header->height + header->ypos; + //the 5 is because doom likes drawing sprites slightly downwards, in the floor. + frame.up = header->ypos + 5; + frame.down = header->ypos-header->height + 5; frame.left = -header->xpos; frame.right = header->width - header->xpos; + t[0] = t[1] = max(abs(frame.left),abs(frame.right)); + t[2] = frame.up; + AddPointToBounds(t, mod->mins, mod->maxs); + t[0] *= -1; + t[1] *= -1; + t[2] = frame.down; if (header->width*header->height <= sizeof(image)) { diff --git a/engine/gl/gl_model.h b/engine/gl/gl_model.h index 46477bd3..134b982d 100644 --- a/engine/gl/gl_model.h +++ b/engine/gl/gl_model.h @@ -539,7 +539,6 @@ void Mod_ClipDecal(struct model_s *mod, vec3_t center, vec3_t normal, vec3_t tan void Q1BSP_MarkLights (dlight_t *light, int bit, mnode_t *node); void GLQ1BSP_LightPointValues(struct model_s *model, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir); qboolean Q1BSP_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, vec3_t p1, vec3_t p2, struct trace_s *trace); -qbyte *Q1BSP_LeafPVS (struct model_s *model, mleaf_t *leaf, pvsbuffer_t *buffer, qboolean merge); /* ============================================================================== diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index 1d7a634c..8d0e23a3 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -5810,7 +5810,7 @@ void Shader_DefaultBSPQ1(const char *shortname, shader_t *s, const void *args) "}\n" ); } - else if (*r_skyboxname.string) + else if (*r_skyboxname.string || *cl.skyname) { builtin = ( "{\n" diff --git a/engine/gl/gl_shadow.c b/engine/gl/gl_shadow.c index 53a1b9cd..6f886cfc 100644 --- a/engine/gl/gl_shadow.c +++ b/engine/gl/gl_shadow.c @@ -1480,7 +1480,8 @@ static struct shadowmesh_s *SHM_BuildShadowMesh(dlight_t *dl, unsigned char *lvi { int cluster = cl.worldmodel->funcs.ClusterForPoint(cl.worldmodel, dl->origin); - sh_shmesh->litleaves[cluster>>3] |= 1<<(cluster&7); + if (cluster >= 0) + sh_shmesh->litleaves[cluster>>3] |= 1<<(cluster&7); } break; } diff --git a/engine/gl/gl_vidcommon.c b/engine/gl/gl_vidcommon.c index a1ff3ba6..17dc20f9 100644 --- a/engine/gl/gl_vidcommon.c +++ b/engine/gl/gl_vidcommon.c @@ -1089,6 +1089,8 @@ void GL_CheckExtensions (void *(*getglfunction) (char *name)) qglFramebufferRenderbufferEXT = (void *)getglext("glFramebufferRenderbuffer"); qglCheckFramebufferStatusEXT = (void *)getglext("glCheckFramebufferStatus"); qglGetFramebufferAttachmentParameteriv = (void *)getglext("glGetFramebufferAttachmentParameteriv"); + + gl_config.arb_framebuffer_srgb = GL_CheckExtension("GL_ARB_framebuffer_sRGB"); } else if (GL_CheckExtension("GL_EXT_framebuffer_object")) { diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index f6ef04af..d4bdcdd2 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -118,11 +118,12 @@ extern cvar_t vid_conwidth, vid_conautoscale; extern cvar_t vid_width; extern cvar_t vid_height; extern cvar_t vid_wndalpha; +extern cvar_t vid_winthread; static qboolean VID_SetWindowedMode (rendererstate_t *info); //-1 on bpp or hz for default. static qboolean VID_SetFullDIBMode (rendererstate_t *info); //-1 on bpp or hz for default. -#ifdef MULTITHREADED +#ifdef MULTITHREAD #define WTHREAD //While the user is resizing a window, the entire thread that owns said window becomes frozen. in order to cope with window resizing, its easiest to just create a separate thread to be microsoft's plaything. our main game thread can then just keep rendering. hopefully that won't bug out on the present. #endif #ifdef WTHREAD @@ -1341,7 +1342,7 @@ static qboolean CreateMainWindow(rendererstate_t *info, qboolean withthread) qboolean stat; #ifdef WTHREAD - if (withthread) + if (withthread && vid_winthread.ival) { void *cond = Sys_CreateConditional(); Sys_LockConditional(cond); @@ -1715,6 +1716,7 @@ static void VID_UpdateWindowStatus (HWND hWnd) case MODE_VULKAN: if (vid.pixelwidth != window_width || vid.pixelheight != window_height) vk.neednewswapchain = true; + break; #endif default: vid.pixelwidth = window_width; @@ -2741,9 +2743,9 @@ void MainThreadWndProc(void *ctx, void *data, size_t msg, size_t ex) break; #ifdef HAVE_CDPLAYER - case MM_MCINOTIFY: - CDAudio_MessageHandler (mainwindow, uMsg, ctx, data); - break; + case MM_MCINOTIFY: + CDAudio_MessageHandler (mainwindow, msg, (WPARAM)ctx, (LPARAM)data); + break; #endif } } @@ -3071,7 +3073,7 @@ static LONG WINAPI GLMainWndProc ( #ifdef HAVE_CDPLAYER case MM_MCINOTIFY: #ifdef WTHREAD - COM_AddWork(WG_MAIN, MainThreadWndProc, wParam, lParam, uMsg, 0); + COM_AddWork(WG_MAIN, MainThreadWndProc, (void*)wParam, (void*)lParam, uMsg, 0); lRet = 0; #else lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); //FIXME: thread diff --git a/engine/gl/gl_warp.c b/engine/gl/gl_warp.c index c5189a57..b7fcfcda 100644 --- a/engine/gl/gl_warp.c +++ b/engine/gl/gl_warp.c @@ -46,10 +46,18 @@ static shader_t *skygridface; void R_SetSky(char *skyname) { + extern cvar_t r_skyboxname; + forcedskyshader = NULL; + + if (!qrenderer) + return; + + if (*r_skyboxname.string) //user's setting overrides. + skyname = r_skyboxname.string; + + Shader_NeedReload(false); if (*skyname) forcedskyshader = R_RegisterCustom(va("skybox_%s", skyname), SUF_NONE, Shader_DefaultSkybox, NULL); - else - forcedskyshader = NULL; skyboxface = R_RegisterShader("skyboxface", SUF_NONE, "{\n" diff --git a/engine/gl/glmod_doom.c b/engine/gl/glmod_doom.c index d36eb6ab..b58fadc5 100644 --- a/engine/gl/glmod_doom.c +++ b/engine/gl/glmod_doom.c @@ -150,6 +150,12 @@ typedef struct { unsigned short first; } dssector_t; +typedef struct { + struct msector_s *sector; + unsigned short segcount; + unsigned short first; +} mssector_t; + typedef struct { short x; short y; @@ -178,7 +184,7 @@ typedef struct { short tag; } dsector_t; -typedef struct { +typedef struct msector_s { int visframe; int floortex; int ceilingtex; @@ -224,7 +230,7 @@ typedef struct doommap_s plane_t *nodeplane; unsigned int numnodes; - dssector_t *ssector; //aka: leafs + mssector_t *ssector; //aka: leafs unsigned int numssectors; msector_t *sector; @@ -261,12 +267,11 @@ void Doom_SetModelFunc(model_t *mod); //physics /*walk the bsp tree*/ -int Doom_SectorNearPoint(doommap_t *dm, vec3_t p) +msector_t *Doom_SectorNearPoint(doommap_t *dm, vec3_t p) { ddoomnode_t *node; plane_t *plane; int num; - int seg; float d; num = dm->numnodes-1; while (1) @@ -274,11 +279,7 @@ int Doom_SectorNearPoint(doommap_t *dm, vec3_t p) if (num & NODE_IS_SSECTOR) { num -= NODE_IS_SSECTOR; - for (seg = dm->ssector[num].first; seg < dm->ssector[num].first + dm->ssector[num].segcount; seg++) - if (dm->seg[seg].linedef != 0xffff) - break; - - return dm->sidedef[dm->linedef[dm->seg[seg].linedef].sidedef[dm->seg[seg].direction]].sector; + return dm->ssector[num].sector; } node = dm->node + num; @@ -294,16 +295,16 @@ int Doom_SectorNearPoint(doommap_t *dm, vec3_t p) num = node->node1; } - return num; + return NULL; } int Doom_PointContents(model_t *model, vec3_t axis[3], vec3_t p) { doommap_t *dm = model->meshinfo; - int sec = Doom_SectorNearPoint(dm, p); - if (p[2] < dm->sector[sec].floorheight) + msector_t *sec = Doom_SectorNearPoint(dm, p); + if (p[2] < sec->floorheight) return FTECONTENTS_SOLID; - if (p[2] > dm->sector[sec].ceilingheight) + if (p[2] > sec->ceilingheight) return FTECONTENTS_SOLID; return FTECONTENTS_EMPTY; } @@ -315,26 +316,27 @@ use blockmap for walls */ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, vec3_t axis[3], vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, qboolean iscapsule, unsigned int contentstype, trace_t *trace) { -#if 0 + doommap_t *dm = model->meshinfo; +#if 1 #define TRACESTEP 16 unsigned short *linedefs; dlinedef_t *ld; int bmi, obmi; vec3_t delta; - int sec1 = Doom_SectorNearPoint(start); + msector_t *sec1 = Doom_SectorNearPoint(dm, start); vec3_t p1, pointonplane, ofs; float d1, d2, c1, c2, planedist; plane_t *lp; mdoomvertex_t *v1, *v2; int j; - float p2f; + float p1f, p2f; float clipfrac; #define DIST_EPSILON (0.03125) // Con_Printf("%i\n", sec1); - if (start[2] < dm->sector[sec1].floorheight-mins[2]) //whoops, started outside... ? + if (start[2] < sec1->floorheight-mins[2]) //whoops, started outside... ? { trace->fraction = 0; trace->allsolid = trace->startsolid = true; @@ -346,11 +348,11 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = 1; - trace->plane.dist = dm->sector[sec1].floorheight-mins[2]; + trace->plane.dist = sec1->floorheight-mins[2]; return false; } - if (start[2] > dm->sector[sec1].ceilingheight-maxs[2]) //whoops, started outside... ? + if (start[2] > sec1->ceilingheight-maxs[2]) //whoops, started outside... ? { trace->fraction = 0; trace->allsolid = trace->startsolid = true; @@ -360,7 +362,7 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = -1; - trace->plane.dist = -(dm->sector[sec1].ceilingheight-maxs[2]); + trace->plane.dist = -(sec1->ceilingheight-maxs[2]); return false; } @@ -375,6 +377,9 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, trace->endpos[1] = end[1]; trace->endpos[2] = end[2]; + VectorCopy(start, p1); + p1f = 0; + trace->fraction = 1; while(1) { @@ -383,7 +388,7 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, if (bmi >= 0 && bmi < dm->blockmap->rows*dm->blockmap->columns) if (bmi != obmi) { -#if 1 +#if 0 short dummy; linedefs = &dummy; for (dummy = 0; dummy < dm->numlinedefs; dummy++) @@ -436,29 +441,29 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, else c1 = (d1-DIST_EPSILON) / (d1 - d2); c2 = 1-c1; - pointonplane[0] = start[0]*c2 + p2[0]*c1; + pointonplane[0] = start[0]*c2 + end[0]*c1; /* if (pointonplane[0] > v1->xpos+DIST_EPSILON*2+hull->clip_maxs[0] && pointonplane[0] > v2->xpos+DIST_EPSILON*2+hull->clip_maxs[0]) continue; if (pointonplane[0] < v1->xpos-DIST_EPSILON*2+hull->clip_mins[0] && pointonplane[0] < v2->xpos-DIST_EPSILON*2+hull->clip_mins[0]) continue; -*/ pointonplane[1] = start[1]*c2 + p2[1]*c1; +*/ pointonplane[1] = start[1]*c2 + end[1]*c1; /* if (pointonplane[1] > v1->ypos+DIST_EPSILON*2+hull->clip_maxs[1] && pointonplane[1] > v2->ypos+DIST_EPSILON*2+hull->clip_maxs[1]) continue; if (pointonplane[1] < v1->ypos-DIST_EPSILON*2+hull->clip_mins[1] && pointonplane[1] < v2->ypos-DIST_EPSILON*2+hull->clip_mins[1]) continue; */ - pointonplane[2] = start[2]*c2 + p2[2]*c1; + pointonplane[2] = start[2]*c2 + end[2]*c1; Con_Printf("Started in wall\n"); j = dm->sidedef[ld->sidedef[d1 < planedist]].sector; //yup, we are in the thing - //prevent ourselves from entering the back-sector's floor/ceiling - if (pointonplane[2] < dm->sector[j].floorheight-hull->clip_mins[2]) //whoops, started outside... ? + //prevent ourselves from entering the back-sector's floor/ceiling at the point of impact + if (pointonplane[2] < dm->sector[j].floorheight-mins[2]) //whoops, started outside... ? { Con_Printf("Started in floor\n"); trace->allsolid = trace->startsolid = false; - trace->endpos[2] = dm->sector[j].floorheight-hull->clip_mins[2]; - trace->fraction = fabs(trace->endpos[2] - start[2]) / fabs(p2[2] - start[2]); + trace->endpos[2] = dm->sector[j].floorheight-mins[2]; + trace->fraction = fabs(trace->endpos[2] - start[2]) / fabs(end[2] - start[2]); trace->endpos[0] = start[0]+delta[0]*trace->fraction*p2f; trace->endpos[1] = start[1]+delta[1]*trace->fraction*p2f; // if (IS_NAN(trace->endpos[2])) @@ -466,22 +471,22 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = 1; - trace->plane.dist = dm->sector[j].floorheight-hull->clip_mins[2]; + trace->plane.dist = dm->sector[j].floorheight-mins[2]; continue; } - if (pointonplane[2] > dm->sector[j].ceilingheight-hull->clip_maxs[2]) //whoops, started outside... ? + if (pointonplane[2] > dm->sector[j].ceilingheight-maxs[2]) //whoops, started outside... ? { Con_Printf("Started in ceiling\n"); trace->allsolid = trace->startsolid = false; trace->endpos[0] = pointonplane[0]; trace->endpos[1] = pointonplane[1]; - trace->endpos[2] = dm->sector[j].ceilingheight-hull->clip_maxs[2]; - trace->fraction = fabs(trace->endpos[2] - start[2]) / fabs(p2[2] - start[2]); + trace->endpos[2] = dm->sector[j].ceilingheight-maxs[2]; + trace->fraction = fabs(trace->endpos[2] - start[2]) / fabs(end[2] - start[2]); trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = -1; - trace->plane.dist = -(dm->sector[j].ceilingheight-hull->clip_maxs[2]); + trace->plane.dist = -(dm->sector[j].ceilingheight-maxs[2]); continue; } } @@ -504,17 +509,17 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, else c1 = (d1-DIST_EPSILON) / (d1 - d2); c2 = 1-c1; - pointonplane[0] = start[0]*c2 + p2[0]*c1; - if (pointonplane[0] > v1->xpos+DIST_EPSILON*2+hull->clip_maxs[0] && pointonplane[0] > v2->xpos+DIST_EPSILON*2+hull->clip_maxs[0]) + pointonplane[0] = start[0]*c2 + end[0]*c1; + if (pointonplane[0] > v1->xpos+DIST_EPSILON*2+maxs[0] && pointonplane[0] > v2->xpos+DIST_EPSILON*2+maxs[0]) continue; - if (pointonplane[0] < v1->xpos-DIST_EPSILON*2+hull->clip_mins[0] && pointonplane[0] < v2->xpos-DIST_EPSILON*2+hull->clip_mins[0]) + if (pointonplane[0] < v1->xpos-DIST_EPSILON*2+mins[0] && pointonplane[0] < v2->xpos-DIST_EPSILON*2+mins[0]) continue; - pointonplane[1] = start[1]*c2 + p2[1]*c1; - if (pointonplane[1] > v1->ypos+DIST_EPSILON*2+hull->clip_maxs[1] && pointonplane[1] > v2->ypos+DIST_EPSILON*2+hull->clip_maxs[1]) + pointonplane[1] = start[1]*c2 + end[1]*c1; + if (pointonplane[1] > v1->ypos+DIST_EPSILON*2+maxs[1] && pointonplane[1] > v2->ypos+DIST_EPSILON*2+maxs[1]) continue; - if (pointonplane[1] < v1->ypos-DIST_EPSILON*2+hull->clip_mins[1] && pointonplane[1] < v2->ypos-DIST_EPSILON*2+hull->clip_mins[1]) + if (pointonplane[1] < v1->ypos-DIST_EPSILON*2+mins[1] && pointonplane[1] < v2->ypos-DIST_EPSILON*2+mins[1]) continue; - pointonplane[2] = start[2]*c2 + p2[2]*c1; + pointonplane[2] = start[2]*c2 + end[2]*c1; if (ld->flags & LINEDEF_IMPASSABLE || ld->sidedef[1] == 0xffff) //unconditionally unpassable. { //unconditionally clipped. @@ -528,10 +533,10 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, else sec2 = &dm->sector[dm->sidedef[ld->sidedef[0]].sector]; - if (pointonplane[2] < sec2->floorheight-hull->clip_mins[2]) + if (pointonplane[2] < sec2->floorheight-mins[2]) { //hit the floor first. - c1 = fabs(dm->sector[sec1].floorheight-hull->clip_mins[2] - start[2]); - c2 = fabs(p2[2] - start[2]); + c1 = fabs(sec1->floorheight-mins[2] - start[2]); + c2 = fabs(end[2] - start[2]); if (!c2) c1 = 1; else @@ -541,21 +546,21 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, // Con_Printf("Hit floor\n"); trace->fraction = c1; trace->allsolid = trace->startsolid = true; - trace->endpos[0] = start[0] + trace->fraction*(p2[0]-start[0]); - trace->endpos[1] = start[1] + trace->fraction*(p2[1]-start[1]); - trace->endpos[2] = start[2] + trace->fraction*(p2[2]-start[2]); + trace->endpos[0] = start[0] + trace->fraction*(end[0]-start[0]); + trace->endpos[1] = start[1] + trace->fraction*(end[1]-start[1]); + trace->endpos[2] = start[2] + trace->fraction*(end[2]-start[2]); trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = 1; - trace->plane.dist = dm->sector[sec1].floorheight-hull->clip_mins[2]; + trace->plane.dist = sec1->floorheight-mins[2]; } continue; } - if (pointonplane[2] > sec2->ceilingheight-hull->clip_maxs[2]) + if (pointonplane[2] > sec2->ceilingheight-maxs[2]) { //hit the floor first. - c1 = fabs((dm->sector[sec1].ceilingheight-hull->clip_maxs[2]) - start[2]); - c2 = fabs(p2[2] - start[2]); + c1 = fabs((sec1->ceilingheight-maxs[2]) - start[2]); + c2 = fabs(end[2] - start[2]); if (!c2) c1 = 1; else @@ -567,13 +572,13 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, // Con_Printf("Hit ceiling\n"); trace->fraction = c1; trace->allsolid = trace->startsolid = true; - trace->endpos[0] = start[0] + trace->fraction*(p2[0]-start[0]); - trace->endpos[1] = start[1] + trace->fraction*(p2[1]-start[1]); - trace->endpos[2] = start[2] + trace->fraction*(p2[2]-start[2]); + trace->endpos[0] = start[0] + trace->fraction*(end[0]-start[0]); + trace->endpos[1] = start[1] + trace->fraction*(end[1]-start[1]); + trace->endpos[2] = start[2] + trace->fraction*(end[2]-start[2]); trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = -1; - trace->plane.dist = -(dm->sector[sec1].ceilingheight-hull->clip_maxs[2]); + trace->plane.dist = -(sec1->ceilingheight-maxs[2]); } continue; } @@ -586,10 +591,10 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, if(sec2->ceilingheight == sec2->floorheight) sec2->ceilingheight += 64; - if (pointonplane[2] > sec2->floorheight-hull->clip_mins[2] && - pointonplane[2] < sec2->ceilingheight-hull->clip_maxs[2]) + if (pointonplane[2] > sec2->floorheight-mins[2] && + pointonplane[2] < sec2->ceilingheight-maxs[2]) { - Con_Printf("Two sided passed\n"); +// Con_Printf("Two sided passed\n"); continue; } @@ -639,14 +644,14 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, // VectorMA(start, p2f*trace->fraction, delta, p2); - if (p2[2] != start[2]) + if (end[2] != start[2]) { - if (sec1 == Doom_SectorNearPoint(p2)) //special test. + if (sec1 == Doom_SectorNearPoint(dm, trace->endpos)) //special test. { - if (p2[2] <= dm->sector[sec1].floorheight-hull->clip_mins[2]) //whoops, started outside... ? + if (end[2] <= sec1->floorheight-mins[2]) //whoops, started outside... ? { - p1f = fabs(dm->sector[sec1].floorheight-hull->clip_mins[2] - start[2]); - p2f = fabs(p2[2] - start[2]); + p1f = fabs(sec1->floorheight-mins[2] - start[2]); + p2f = fabs(end[2] - start[2]); if (!p2f) c1 = 1; else @@ -655,22 +660,22 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, { trace->fraction = c1; trace->allsolid = trace->startsolid = false; - trace->endpos[0] = start[0] + trace->fraction*(p2[0]-start[0]); - trace->endpos[1] = start[1] + trace->fraction*(p2[1]-start[1]); - trace->endpos[2] = start[2] + trace->fraction*(p2[2]-start[2]); + trace->endpos[0] = start[0] + trace->fraction*(end[0]-start[0]); + trace->endpos[1] = start[1] + trace->fraction*(end[1]-start[1]); + trace->endpos[2] = start[2] + trace->fraction*(end[2]-start[2]); trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = 1; - trace->plane.dist = dm->sector[sec1].floorheight-hull->clip_mins[2]; + trace->plane.dist = sec1->floorheight-mins[2]; } // if (IS_NAN(trace->endpos[2])) // Con_Printf("Nanny\n"); } - if (p2[2] >= dm->sector[sec1].ceilingheight-hull->clip_maxs[2]) //whoops, started outside... ? + if (end[2] >= sec1->ceilingheight-maxs[2]) //whoops, started outside... ? { - p1f = fabs(dm->sector[sec1].ceilingheight-hull->clip_maxs[2] - start[2]); - p2f = fabs(p2[2] - start[2]); + p1f = fabs(sec1->ceilingheight-maxs[2] - start[2]); + p2f = fabs(end[2] - start[2]); if (!p2f) c1 = 1; else @@ -679,13 +684,13 @@ qboolean Doom_Trace(model_t *model, int hulloverride, framestate_t *framestate, { trace->fraction = c1; trace->allsolid = trace->startsolid = false; - trace->endpos[0] = start[0] + trace->fraction*(p2[0]-start[0]); - trace->endpos[1] = start[1] + trace->fraction*(p2[1]-start[1]); - trace->endpos[2] = start[2] + trace->fraction*(p2[2]-start[2]); + trace->endpos[0] = start[0] + trace->fraction*(end[0]-start[0]); + trace->endpos[1] = start[1] + trace->fraction*(end[1]-start[1]); + trace->endpos[2] = start[2] + trace->fraction*(end[2]-start[2]); trace->plane.normal[0] = 0; trace->plane.normal[1] = 0; trace->plane.normal[2] = -1; - trace->plane.dist = -(dm->sector[sec1].ceilingheight-hull->clip_maxs[2]); + trace->plane.dist = -(sec1->ceilingheight-maxs[2]); } // if (IS_NAN(trace->endpos[2])) @@ -1438,8 +1443,6 @@ static void Triangulate_Sectors(doommap_t *dm, dsector_t *sectorl, qboolean glbs int seg, nsec; int i, sec=-1; - dm->sector = Z_Malloc(dm->numsectors * sizeof(*dm->sector)); - if (glbspinuse) { for (i = 0; i < dm->numssectors; i++) @@ -1832,7 +1835,7 @@ static void CleanWalls(doommap_t *dm, dsidedef_t *sidedefsl) void QuakifyThings(doommap_t *dm) { - int sector; + msector_t *sector; int spawnflags; char *name; int i; @@ -1850,6 +1853,7 @@ void QuakifyThings(doommap_t *dm) for (i = 0; i < dm->numthings; i++) { + float zbias = 24; switch(dm->thing[i].type) { case THING_PLAYER: //fixme: spit out a coop spawn too. @@ -1889,6 +1893,7 @@ void QuakifyThings(doommap_t *dm) default: name = va2(thingname, sizeof(thingname), "thing_%i", dm->thing[i].type); + zbias = 0; break; } @@ -1896,7 +1901,7 @@ void QuakifyThings(doommap_t *dm) point[1] = dm->thing[i].ypos; point[2] = 0; sector = Doom_SectorNearPoint(dm, point); - zpos = dm->sector[sector].floorheight + 24; //things have no z coord, so find the sector they're in + zpos = sector->floorheight + zbias; //things have no z coord, so find the sector they're in spawnflags = SPAWNFLAG_NOT_EASY | SPAWNFLAG_NOT_MEDIUM | SPAWNFLAG_NOT_HARD | SPAWNFLAG_NOT_DEATHMATCH; if (dm->thing[i].flags & THING_EASY) @@ -1991,16 +1996,29 @@ static void MoveWorld(doommap_t *dm) if (min[0]>=-4096 && max[0]<=4096) if (min[1]>=-4096 && max[1]<=4096) - return; //doesn't need adjusting, live with it. + adj[0] = adj[1] = 0; //doesn't need adjusting, live with it. if (max[0]-min[0]>=8192 || max[1]-min[1]>=8192) { Con_Printf(CON_WARNING "Warning: Map is too large for the network protocol\n"); - return; + adj[0] = adj[1] = 0; + } + else + { + adj[0] = (max[0]-4096)&~63; //don't harm the tiling. + adj[1] = (max[1]-4096)&~63; } - adj[0] = (max[0]-4096)&~63; //don't harm the tiling. - adj[1] = (max[1]-4096)&~63; + dm->model->mins[0] = min[0] - adj[0]; + dm->model->mins[1] = min[1] - adj[1]; + dm->model->mins[2] = -32768; + + dm->model->maxs[0] = max[0] - adj[0]; + dm->model->maxs[1] = max[1] - adj[1]; + dm->model->maxs[2] = 32767; + + if (!adj[0] && !adj[1]) + return; Con_Printf("Adjusting map (%i %i)\n", -adj[0], -adj[1]); @@ -2102,13 +2120,37 @@ static void Doom_LoadVerticies(doommap_t *dm, char *name) static void Doom_LoadSSectors(doommap_t *dm, char *name) { + dssector_t *in; size_t fsize; + unsigned int i; char tmp[MAX_QPATH]; - dm->ssector = (void *)FS_LoadMallocFile (va2(tmp, sizeof(tmp), "%s.gl_ssect", name), &fsize); - if (!dm->ssector) - dm->ssector = (void *)FS_LoadMallocFile (va2(tmp, sizeof(tmp), "%s.ssectors", name), &fsize); + in = (void *)FS_LoadMallocFile (va2(tmp, sizeof(tmp), "%s.gl_ssect", name), &fsize); + if (!in) + in = (void *)FS_LoadMallocFile (va2(tmp, sizeof(tmp), "%s.ssectors", name), &fsize); //FIXME: "gNd3" means that it's glbsp version 3. - dm->numssectors = fsize/sizeof(*dm->ssector); + dm->numssectors = fsize/sizeof(*in); + + dm->ssector = Z_Malloc(dm->numssectors * sizeof(*dm->ssector)); + for (i = 0; i < dm->numssectors; i++) + { + dm->ssector[i].segcount = in[i].segcount; + dm->ssector[i].first = in[i].first; + } + Z_Free(in); +} +static void Doom_CalcSubsectorSectors(doommap_t *dm) +{ //kinda shitty + unsigned int num, seg; + for (num = 0; num < dm->numssectors; num++) + { + dm->ssector[num].sector = &dm->sector[dm->sidedef[dm->linedef[dm->seg[dm->ssector[num].first].linedef].sidedef[dm->seg[dm->ssector[num].first].direction]].sector]; + for (seg = dm->ssector[num].first+1; seg < dm->ssector[num].first + dm->ssector[num].segcount; seg++) + if (dm->seg[seg].linedef != 0xffff) + { + dm->ssector[num].sector = &dm->sector[dm->sidedef[dm->linedef[dm->seg[seg].linedef].sidedef[dm->seg[seg].direction]].sector]; + break; + } + } } static void Doom_LoadSSegs(doommap_t *dm, char *name) @@ -2210,6 +2252,7 @@ qboolean QDECL Mod_LoadDoomLevel(model_t *mod, void *buffer, size_t fsize) } sectorl = (void *)FS_LoadMallocFile (va2(tmp,sizeof(tmp),"%s.sectors", name), &fsize); dm->numsectors = fsize/sizeof(*sectorl); + dm->sector = Z_Malloc(dm->numsectors * sizeof(*dm->sector)); #ifndef SERVERONLY dm->numtextures=0; @@ -2229,7 +2272,7 @@ qboolean QDECL Mod_LoadDoomLevel(model_t *mod, void *buffer, size_t fsize) sidedefsl = (void *)FS_LoadMallocFile (va2(tmp,sizeof(tmp),"%s.sidedefs", name), &fsize); dm->numsidedefs = fsize/sizeof(*sidedefsl); dm->blockmap = (void *)FS_LoadMallocFile (va2(tmp,sizeof(tmp),"%s.blockmap", name), &fsize); -// blockmaps = fsize; + #ifndef SERVERONLY Doom_LoadTextureInfos(); #endif @@ -2262,9 +2305,12 @@ qboolean QDECL Mod_LoadDoomLevel(model_t *mod, void *buffer, size_t fsize) mod->fromgame = fg_doom; mod->type = mod_brush; mod->nodes = (void*)0x1; + mod->numclusters = dm->numsectors; CleanWalls(dm, sidedefsl); + Doom_CalcSubsectorSectors(dm); + Triangulate_Sectors(dm, sectorl, !!gl_nodes); QuakifyThings(dm); @@ -2273,11 +2319,11 @@ qboolean QDECL Mod_LoadDoomLevel(model_t *mod, void *buffer, size_t fsize) return true; } -void Doom_LightPointValues(model_t *model, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir) +static void Doom_LightPointValues(model_t *model, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir) { doommap_t *dm = model->meshinfo; msector_t *sec; - sec = dm->sector + Doom_SectorNearPoint(dm, point); + sec = Doom_SectorNearPoint(dm, point); res_dir[0] = 0; res_dir[1] = 1; @@ -2291,31 +2337,41 @@ void Doom_LightPointValues(model_t *model, vec3_t point, vec3_t res_diffuse, vec } //return pvs bits for point -unsigned int Doom_FatPVS(struct model_s *model, vec3_t org, pvsbuffer_t *pvsbuffer, qboolean merge) +static unsigned int Doom_FatPVS(struct model_s *model, vec3_t org, pvsbuffer_t *pvsbuffer, qboolean merge) { //FIXME: use REJECT lump. return 0; } //check if an ent is within the given pvs -qboolean Doom_EdictInFatPVS(struct model_s *model, struct pvscache_s *edict, qbyte *pvsbuffer) +static qboolean Doom_EdictInFatPVS(struct model_s *model, struct pvscache_s *edict, qbyte *pvsbuffer) { //FIXME: use REJECT lump. return true; } +static int Doom_ClusterForPoint(struct model_s *model, vec3_t point) +{ + doommap_t *dm = model->meshinfo; + return Doom_SectorNearPoint(dm, point) - dm->sector; +} +static qbyte *Doom_ClusterPVS(struct model_s *model, int cluster, pvsbuffer_t *pvsbuffer, pvsmerge_t merge) +{ //FIXME: use REJECT lump. + return NULL; +} + //generate useful info for correct functioning of Doom_EdictInFatPVS. -void Doom_FindTouchedLeafs(struct model_s *model, struct pvscache_s *ent, vec3_t cullmins, vec3_t cullmaxs) +static void Doom_FindTouchedLeafs(struct model_s *model, struct pvscache_s *ent, vec3_t cullmins, vec3_t cullmaxs) { //work out the sectors this ent is in for easy pvs. } //requires lightmaps - not supported. -void Doom_StainNode(struct mnode_s *node, float *parms) +static void Doom_StainNode(struct mnode_s *node, float *parms) { } //requires lightmaps - not supported. -void Doom_MarkLights(struct dlight_s *light, int bit, struct mnode_s *node) +static void Doom_MarkLights(struct dlight_s *light, int bit, struct mnode_s *node) { } @@ -2327,6 +2383,8 @@ void Doom_SetModelFunc(model_t *mod) mod->funcs.FatPVS = Doom_FatPVS; mod->funcs.EdictInFatPVS = Doom_EdictInFatPVS; mod->funcs.FindTouchedLeafs = Doom_FindTouchedLeafs; + mod->funcs.ClusterForPoint = Doom_ClusterForPoint; + mod->funcs.ClusterPVS = Doom_ClusterPVS; mod->funcs.LightPointValues = Doom_LightPointValues; mod->funcs.StainNode = Doom_StainNode; @@ -2334,8 +2392,8 @@ void Doom_SetModelFunc(model_t *mod) // mod->funcs.LeafPVS) (struct model_s *model, int num, qbyte *buffer, unsigned int buffersize); - mod->funcs.NativeTrace = Doom_Trace; - mod->funcs.PointContents = Doom_PointContents; + mod->funcs.NativeTrace = Doom_Trace; + mod->funcs.PointContents = Doom_PointContents; //Doom_SetCollisionFuncs(mod); } diff --git a/engine/gl/glquake.h b/engine/gl/glquake.h index 5ac098ec..476d2f53 100644 --- a/engine/gl/glquake.h +++ b/engine/gl/glquake.h @@ -226,11 +226,12 @@ typedef struct { qboolean geometryshaders; + qboolean ext_framebuffer_objects; + qboolean arb_framebuffer_srgb; // qboolean arb_fragment_program; qboolean arb_shader_objects; qboolean arb_shadow; qboolean arb_depth_texture; - qboolean ext_framebuffer_objects; qboolean ext_stencil_wrap; qboolean ext_packed_depth_stencil; qboolean arb_depth_clamp; @@ -300,8 +301,6 @@ extern vec3_t r_origin; // extern refdef_t r_refdef; extern unsigned int r_viewcontents; -extern mleaf_t *r_viewleaf, *r_oldviewleaf; -extern mleaf_t *r_viewleaf2, *r_oldviewleaf2; extern int r_viewcluster, r_viewcluster2, r_oldviewcluster, r_oldviewcluster2; //q2 extern texture_t *r_notexture_mip; extern int d_lightstylevalue[256]; // 8.8 fraction of base light value diff --git a/engine/gl/glsupp.h b/engine/gl/glsupp.h index 218efe0d..fd541532 100644 --- a/engine/gl/glsupp.h +++ b/engine/gl/glsupp.h @@ -610,7 +610,9 @@ typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei #define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 #define GL_FRAMEBUFFER_SRGB 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE 0x8DBA +#endif +#ifndef GL_FRAMEBUFFER_SRGB_CAPABLE_EXT +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA #endif #ifndef GL_EXT_texture_sRGB @@ -754,7 +756,9 @@ typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); #endif #ifndef GL_ARB_framebuffer_object +#define GL_DRAW_FRAMEBUFFER_ARB 0x8CA9 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_ARB 0x8210 #endif #ifndef GL_VERSION_3_0 diff --git a/engine/gl/r_bishaders.h b/engine/gl/r_bishaders.h index 10837d31..2a1021cb 100644 --- a/engine/gl/r_bishaders.h +++ b/engine/gl/r_bishaders.h @@ -543,431 +543,637 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND #endif #ifdef VKQUAKE {QR_VULKAN, -1, "altwater", -"\xFF\x53\x50\x56\x01\x00\x00\x00\x0C\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x2C\x00\x00\x00\xCD\x00\x00\x00\xFC\x00\x00\x00" -"\x60\x12\x00\x00\x5C\x13\x00\x00\xB0\x21\x00\x00\x01\x00\x66\x31\x72\x5F\x67\x6C\x73\x6C\x5F\x74\x75\x72\x62\x73\x63\x61\x6C\x65" -"\x00\x3F\x80\x00\x00\x01\x01\x66\x31\x67\x6C\x5F\x6D\x61\x78\x64\x69\x73\x74\x00\x46\x00\x00\x00\x01\x02\x66\x31\x67\x6C\x5F\x6D" -"\x69\x6E\x64\x69\x73\x74\x00\x40\x80\x00\x00\x01\x03\x42\x31\x72\x65\x66\x6C\x65\x63\x74\x00\x00\x00\x00\x00\x01\x04\x46\x31\x73" -"\x74\x72\x65\x6E\x67\x74\x68\x00\x3D\xCC\xCC\xCD\x01\x05\x46\x31\x66\x72\x65\x73\x6E\x65\x6C\x00\x40\xA0\x00\x00\x01\x06\x46\x31" -"\x74\x78\x73\x63\x61\x6C\x65\x00\x3E\x4C\xCC\xCD\x01\x07\x42\x31\x72\x69\x70\x70\x6C\x65\x6D\x61\x70\x00\x00\x00\x00\x00\x01\x08" -"\x46\x33\x74\x69\x6E\x74\x00\x3F\x33\x33\x33\x3F\x4C\xCC\xCD\x3F\x33\x33\x33\x01\x0B\x42\x31\x64\x65\x70\x74\x68\x00\x00\x00\x00" -"\x00\x01\x0C\x46\x33\x66\x6F\x67\x74\x69\x6E\x74\x00\x3E\x4C\xCC\xCD\x3E\x99\x99\x9A\x3E\x4C\xCC\xCD\x6E\x69\x66\x03\x02\x23\x07" -"\x00\x00\x01\x00\x01\x00\x08\x00\x6C\x00\x00\x00\x00\x00\x00\x00\x11\x00\x02\x00\x01\x00\x00\x00\x0B\x00\x06\x00\x01\x00\x00\x00" -"\x47\x4C\x53\x4C\x2E\x73\x74\x64\x2E\x34\x35\x30\x00\x00\x00\x00\x0E\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0F\x00\x11\x00" -"\x00\x00\x00\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00\x27\x00\x00\x00\x44\x00\x00\x00\x46\x00\x00\x00\x49\x00\x00\x00" -"\x4C\x00\x00\x00\x4D\x00\x00\x00\x4F\x00\x00\x00\x58\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x6A\x00\x00\x00\x6B\x00\x00\x00" -"\x03\x00\x03\x00\x02\x00\x00\x00\xC2\x01\x00\x00\x05\x00\x04\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00\x05\x00\x06\x00" -"\x09\x00\x00\x00\x66\x74\x65\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x28\x00\x00\x00\x05\x00\x05\x00\x0D\x00\x00\x00\x61\x72\x67\x5F" -"\x74\x69\x6E\x74\x00\x00\x00\x00\x05\x00\x05\x00\x12\x00\x00\x00\x61\x72\x67\x5F\x66\x6F\x67\x74\x69\x6E\x74\x00\x05\x00\x04\x00" -"\x18\x00\x00\x00\x70\x72\x6F\x6A\x00\x00\x00\x00\x05\x00\x05\x00\x1E\x00\x00\x00\x65\x6E\x74\x69\x74\x79\x62\x6C\x6F\x63\x6B\x00" -"\x06\x00\x07\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x76\x69\x65\x77\x70\x72\x6F\x6A\x00\x06\x00\x05\x00" -"\x1E\x00\x00\x00\x01\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x00\x06\x00\x06\x00\x1E\x00\x00\x00\x02\x00\x00\x00\x6D\x5F\x6D\x6F" -"\x64\x65\x6C\x69\x6E\x76\x00\x00\x06\x00\x06\x00\x1E\x00\x00\x00\x03\x00\x00\x00\x65\x5F\x65\x79\x65\x70\x6F\x73\x00\x00\x00\x00" -"\x06\x00\x05\x00\x1E\x00\x00\x00\x04\x00\x00\x00\x65\x5F\x74\x69\x6D\x65\x00\x00\x06\x00\x07\x00\x1E\x00\x00\x00\x05\x00\x00\x00" -"\x65\x5F\x6C\x69\x67\x68\x74\x5F\x61\x6D\x62\x69\x65\x6E\x74\x00\x06\x00\x05\x00\x1E\x00\x00\x00\x06\x00\x00\x00\x65\x70\x61\x64" -"\x31\x00\x00\x00\x06\x00\x06\x00\x1E\x00\x00\x00\x07\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x64\x69\x72\x00\x06\x00\x05\x00" -"\x1E\x00\x00\x00\x08\x00\x00\x00\x65\x70\x61\x64\x32\x00\x00\x00\x06\x00\x06\x00\x1E\x00\x00\x00\x09\x00\x00\x00\x65\x5F\x6C\x69" -"\x67\x68\x74\x5F\x6D\x75\x6C\x00\x06\x00\x05\x00\x1E\x00\x00\x00\x0A\x00\x00\x00\x65\x70\x61\x64\x33\x00\x00\x00\x06\x00\x06\x00" -"\x1E\x00\x00\x00\x0B\x00\x00\x00\x65\x5F\x6C\x6D\x73\x63\x61\x6C\x65\x73\x00\x00\x06\x00\x07\x00\x1E\x00\x00\x00\x0C\x00\x00\x00" -"\x65\x5F\x75\x70\x70\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x1E\x00\x00\x00\x0D\x00\x00\x00\x65\x70\x61\x64" -"\x34\x00\x00\x00\x06\x00\x07\x00\x1E\x00\x00\x00\x0E\x00\x00\x00\x65\x5F\x6C\x6F\x77\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00" -"\x06\x00\x05\x00\x1E\x00\x00\x00\x0F\x00\x00\x00\x65\x70\x61\x64\x35\x00\x00\x00\x06\x00\x06\x00\x1E\x00\x00\x00\x10\x00\x00\x00" -"\x65\x5F\x67\x6C\x6F\x77\x6D\x6F\x64\x00\x00\x00\x06\x00\x05\x00\x1E\x00\x00\x00\x11\x00\x00\x00\x65\x70\x61\x64\x36\x00\x00\x00" -"\x06\x00\x07\x00\x1E\x00\x00\x00\x12\x00\x00\x00\x65\x5F\x63\x6F\x6C\x6F\x75\x72\x69\x64\x65\x6E\x74\x00\x00\x00\x06\x00\x07\x00" -"\x1E\x00\x00\x00\x13\x00\x00\x00\x77\x5F\x66\x6F\x67\x63\x6F\x6C\x6F\x75\x72\x73\x00\x00\x00\x00\x06\x00\x07\x00\x1E\x00\x00\x00" -"\x14\x00\x00\x00\x77\x5F\x66\x6F\x67\x64\x65\x6E\x73\x69\x74\x79\x00\x00\x00\x00\x06\x00\x07\x00\x1E\x00\x00\x00\x15\x00\x00\x00" -"\x77\x5F\x66\x6F\x67\x64\x65\x70\x74\x68\x62\x69\x61\x73\x00\x00\x06\x00\x05\x00\x1E\x00\x00\x00\x16\x00\x00\x00\x65\x70\x61\x64" -"\x37\x00\x00\x00\x05\x00\x03\x00\x20\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x27\x00\x00\x00\x76\x5F\x70\x6F\x73\x69\x74\x69" -"\x6F\x6E\x00\x00\x05\x00\x03\x00\x44\x00\x00\x00\x74\x63\x00\x00\x05\x00\x05\x00\x46\x00\x00\x00\x76\x5F\x74\x65\x78\x63\x6F\x6F" -"\x72\x64\x00\x00\x05\x00\x03\x00\x49\x00\x00\x00\x74\x66\x00\x00\x05\x00\x04\x00\x4C\x00\x00\x00\x6E\x6F\x72\x6D\x00\x00\x00\x00" -"\x05\x00\x05\x00\x4D\x00\x00\x00\x76\x5F\x6E\x6F\x72\x6D\x61\x6C\x00\x00\x00\x00\x05\x00\x03\x00\x4F\x00\x00\x00\x65\x79\x65\x00" -"\x05\x00\x06\x00\x56\x00\x00\x00\x67\x6C\x5F\x50\x65\x72\x56\x65\x72\x74\x65\x78\x00\x00\x00\x00\x06\x00\x06\x00\x56\x00\x00\x00" -"\x00\x00\x00\x00\x67\x6C\x5F\x50\x6F\x73\x69\x74\x69\x6F\x6E\x00\x05\x00\x03\x00\x58\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00" -"\x64\x00\x00\x00\x6C\x69\x67\x68\x74\x62\x6C\x6F\x63\x6B\x00\x00\x06\x00\x07\x00\x64\x00\x00\x00\x00\x00\x00\x00\x6C\x5F\x63\x75" -"\x62\x65\x6D\x61\x74\x72\x69\x78\x00\x00\x00\x00\x06\x00\x07\x00\x64\x00\x00\x00\x01\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x70" -"\x6F\x73\x69\x74\x69\x6F\x6E\x00\x06\x00\x05\x00\x64\x00\x00\x00\x02\x00\x00\x00\x6C\x70\x61\x64\x31\x00\x00\x00\x06\x00\x07\x00" -"\x64\x00\x00\x00\x03\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x64\x00\x00\x00" -"\x04\x00\x00\x00\x6C\x70\x61\x64\x32\x00\x00\x00\x06\x00\x08\x00\x64\x00\x00\x00\x05\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63" -"\x6F\x6C\x6F\x75\x72\x73\x63\x61\x6C\x65\x00\x00\x06\x00\x07\x00\x64\x00\x00\x00\x06\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x72" -"\x61\x64\x69\x75\x73\x00\x00\x00\x06\x00\x07\x00\x64\x00\x00\x00\x07\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x70" -"\x72\x6F\x6A\x00\x06\x00\x08\x00\x64\x00\x00\x00\x08\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x73\x63\x61\x6C\x65" -"\x00\x00\x00\x00\x06\x00\x05\x00\x64\x00\x00\x00\x09\x00\x00\x00\x6C\x70\x61\x64\x33\x00\x00\x00\x05\x00\x03\x00\x66\x00\x00\x00" -"\x00\x00\x00\x00\x05\x00\x05\x00\x68\x00\x00\x00\x76\x5F\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x00\x05\x00\x05\x00\x69\x00\x00\x00" -"\x76\x5F\x6C\x6D\x63\x6F\x6F\x72\x64\x00\x00\x00\x05\x00\x05\x00\x6A\x00\x00\x00\x76\x5F\x73\x76\x65\x63\x74\x6F\x72\x00\x00\x00" -"\x05\x00\x05\x00\x6B\x00\x00\x00\x76\x5F\x74\x76\x65\x63\x74\x6F\x72\x00\x00\x00\x47\x00\x04\x00\x0E\x00\x00\x00\x01\x00\x00\x00" -"\x08\x01\x00\x00\x47\x00\x04\x00\x0F\x00\x00\x00\x01\x00\x00\x00\x09\x01\x00\x00\x47\x00\x04\x00\x10\x00\x00\x00\x01\x00\x00\x00" -"\x0A\x01\x00\x00\x47\x00\x04\x00\x13\x00\x00\x00\x01\x00\x00\x00\x0C\x01\x00\x00\x47\x00\x04\x00\x14\x00\x00\x00\x01\x00\x00\x00" -"\x0D\x01\x00\x00\x47\x00\x04\x00\x15\x00\x00\x00\x01\x00\x00\x00\x0E\x01\x00\x00\x47\x00\x04\x00\x1C\x00\x00\x00\x06\x00\x00\x00" -"\x10\x00\x00\x00\x48\x00\x04\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x00\x00\x00\x00" -"\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00" -"\x1E\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00" -"\x48\x00\x05\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x1E\x00\x00\x00\x02\x00\x00\x00" -"\x05\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00" -"\x02\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\xC0\x00\x00\x00" -"\x48\x00\x05\x00\x1E\x00\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00\xCC\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x05\x00\x00\x00" -"\x23\x00\x00\x00\xD0\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\xDC\x00\x00\x00\x48\x00\x05\x00" -"\x1E\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\xE0\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00" -"\xEC\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00\xF0\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00" -"\x0A\x00\x00\x00\x23\x00\x00\x00\xFC\x00\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x0B\x00\x00\x00\x23\x00\x00\x00\x00\x01\x00\x00" -"\x48\x00\x05\x00\x1E\x00\x00\x00\x0C\x00\x00\x00\x23\x00\x00\x00\x40\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x0D\x00\x00\x00" -"\x23\x00\x00\x00\x4C\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x0E\x00\x00\x00\x23\x00\x00\x00\x50\x01\x00\x00\x48\x00\x05\x00" -"\x1E\x00\x00\x00\x0F\x00\x00\x00\x23\x00\x00\x00\x5C\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x10\x00\x00\x00\x23\x00\x00\x00" -"\x60\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x11\x00\x00\x00\x23\x00\x00\x00\x6C\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00" -"\x12\x00\x00\x00\x23\x00\x00\x00\x70\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x13\x00\x00\x00\x23\x00\x00\x00\x80\x01\x00\x00" -"\x48\x00\x05\x00\x1E\x00\x00\x00\x14\x00\x00\x00\x23\x00\x00\x00\x90\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x15\x00\x00\x00" -"\x23\x00\x00\x00\x94\x01\x00\x00\x48\x00\x05\x00\x1E\x00\x00\x00\x16\x00\x00\x00\x23\x00\x00\x00\x98\x01\x00\x00\x47\x00\x03\x00" -"\x1E\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x20\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x20\x00\x00\x00" -"\x21\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x27\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x44\x00\x00\x00" -"\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x46\x00\x00\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00\x49\x00\x00\x00" -"\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00\x4C\x00\x00\x00\x1E\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x4D\x00\x00\x00" -"\x1E\x00\x00\x00\x04\x00\x00\x00\x47\x00\x04\x00\x4F\x00\x00\x00\x1E\x00\x00\x00\x03\x00\x00\x00\x48\x00\x05\x00\x56\x00\x00\x00" -"\x00\x00\x00\x00\x0B\x00\x00\x00\x00\x00\x00\x00\x47\x00\x03\x00\x56\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x5B\x00\x00\x00" -"\x01\x00\x00\x00\x00\x01\x00\x00\x47\x00\x04\x00\x5C\x00\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00\x47\x00\x04\x00\x5D\x00\x00\x00" -"\x01\x00\x00\x00\x02\x01\x00\x00\x47\x00\x04\x00\x5E\x00\x00\x00\x01\x00\x00\x00\x03\x01\x00\x00\x47\x00\x04\x00\x5F\x00\x00\x00" -"\x01\x00\x00\x00\x04\x01\x00\x00\x47\x00\x04\x00\x60\x00\x00\x00\x01\x00\x00\x00\x05\x01\x00\x00\x47\x00\x04\x00\x61\x00\x00\x00" -"\x01\x00\x00\x00\x06\x01\x00\x00\x47\x00\x04\x00\x62\x00\x00\x00\x01\x00\x00\x00\x07\x01\x00\x00\x47\x00\x04\x00\x63\x00\x00\x00" -"\x01\x00\x00\x00\x0B\x01\x00\x00\x48\x00\x04\x00\x64\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00" -"\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00" -"\x48\x00\x05\x00\x64\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00\x02\x00\x00\x00" -"\x23\x00\x00\x00\x4C\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\x50\x00\x00\x00\x48\x00\x05\x00" -"\x64\x00\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00\x5C\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00" -"\x60\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\x6C\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00" -"\x07\x00\x00\x00\x23\x00\x00\x00\x70\x00\x00\x00\x48\x00\x05\x00\x64\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00" -"\x48\x00\x05\x00\x64\x00\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00\x88\x00\x00\x00\x47\x00\x03\x00\x64\x00\x00\x00\x02\x00\x00\x00" -"\x47\x00\x04\x00\x66\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x66\x00\x00\x00\x21\x00\x00\x00\x01\x00\x00\x00" -"\x47\x00\x04\x00\x68\x00\x00\x00\x1E\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x69\x00\x00\x00\x1E\x00\x00\x00\x03\x00\x00\x00" -"\x47\x00\x04\x00\x6A\x00\x00\x00\x1E\x00\x00\x00\x05\x00\x00\x00\x47\x00\x04\x00\x6B\x00\x00\x00\x1E\x00\x00\x00\x06\x00\x00\x00" -"\x13\x00\x02\x00\x02\x00\x00\x00\x21\x00\x03\x00\x03\x00\x00\x00\x02\x00\x00\x00\x16\x00\x03\x00\x06\x00\x00\x00\x20\x00\x00\x00" -"\x17\x00\x04\x00\x07\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x21\x00\x03\x00\x08\x00\x00\x00\x07\x00\x00\x00\x17\x00\x04\x00" -"\x0B\x00\x00\x00\x06\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x0C\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x3B\x00\x04\x00" -"\x0C\x00\x00\x00\x0D\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x0E\x00\x00\x00\x00\x00\x84\x43\x32\x00\x04\x00" -"\x06\x00\x00\x00\x0F\x00\x00\x00\x00\x80\x84\x43\x32\x00\x04\x00\x06\x00\x00\x00\x10\x00\x00\x00\x00\x00\x85\x43\x3B\x00\x04\x00" -"\x0C\x00\x00\x00\x12\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x13\x00\x00\x00\x00\x00\x86\x43\x32\x00\x04\x00" -"\x06\x00\x00\x00\x14\x00\x00\x00\x00\x80\x86\x43\x32\x00\x04\x00\x06\x00\x00\x00\x15\x00\x00\x00\x00\x00\x87\x43\x20\x00\x04\x00" -"\x17\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x18\x00\x04\x00\x19\x00\x00\x00\x07\x00\x00\x00\x04\x00\x00\x00\x15\x00\x04\x00" -"\x1A\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x1A\x00\x00\x00\x1B\x00\x00\x00\x04\x00\x00\x00\x1C\x00\x04\x00" -"\x1C\x00\x00\x00\x07\x00\x00\x00\x1B\x00\x00\x00\x17\x00\x04\x00\x1D\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x1E\x00\x19\x00" -"\x1E\x00\x00\x00\x19\x00\x00\x00\x19\x00\x00\x00\x19\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00" -"\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x1C\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00" -"\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x1D\x00\x00\x00" -"\x20\x00\x04\x00\x1F\x00\x00\x00\x02\x00\x00\x00\x1E\x00\x00\x00\x3B\x00\x04\x00\x1F\x00\x00\x00\x20\x00\x00\x00\x02\x00\x00\x00" -"\x15\x00\x04\x00\x21\x00\x00\x00\x20\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x04\x00\x21\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00" -"\x20\x00\x04\x00\x23\x00\x00\x00\x02\x00\x00\x00\x19\x00\x00\x00\x20\x00\x04\x00\x26\x00\x00\x00\x01\x00\x00\x00\x0B\x00\x00\x00" -"\x3B\x00\x04\x00\x26\x00\x00\x00\x27\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x29\x00\x00\x00\x00\x00\x80\x3F" -"\x2B\x00\x04\x00\x06\x00\x00\x00\x2F\x00\x00\x00\x00\x00\x80\xBF\x2B\x00\x04\x00\x1A\x00\x00\x00\x30\x00\x00\x00\x01\x00\x00\x00" -"\x20\x00\x04\x00\x31\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x2B\x00\x04\x00\x1A\x00\x00\x00\x36\x00\x00\x00\x02\x00\x00\x00" -"\x2B\x00\x04\x00\x1A\x00\x00\x00\x39\x00\x00\x00\x03\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x3D\x00\x00\x00\x00\x00\x00\x40" -"\x20\x00\x04\x00\x43\x00\x00\x00\x03\x00\x00\x00\x1D\x00\x00\x00\x3B\x00\x04\x00\x43\x00\x00\x00\x44\x00\x00\x00\x03\x00\x00\x00" -"\x20\x00\x04\x00\x45\x00\x00\x00\x01\x00\x00\x00\x1D\x00\x00\x00\x3B\x00\x04\x00\x45\x00\x00\x00\x46\x00\x00\x00\x01\x00\x00\x00" -"\x20\x00\x04\x00\x48\x00\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x48\x00\x00\x00\x49\x00\x00\x00\x03\x00\x00\x00" -"\x20\x00\x04\x00\x4B\x00\x00\x00\x03\x00\x00\x00\x0B\x00\x00\x00\x3B\x00\x04\x00\x4B\x00\x00\x00\x4C\x00\x00\x00\x03\x00\x00\x00" -"\x3B\x00\x04\x00\x26\x00\x00\x00\x4D\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00\x4B\x00\x00\x00\x4F\x00\x00\x00\x03\x00\x00\x00" -"\x2B\x00\x04\x00\x21\x00\x00\x00\x50\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x51\x00\x00\x00\x02\x00\x00\x00\x0B\x00\x00\x00" -"\x1E\x00\x03\x00\x56\x00\x00\x00\x07\x00\x00\x00\x20\x00\x04\x00\x57\x00\x00\x00\x03\x00\x00\x00\x56\x00\x00\x00\x3B\x00\x04\x00" -"\x57\x00\x00\x00\x58\x00\x00\x00\x03\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x5B\x00\x00\x00\x00\x00\x80\x43\x32\x00\x04\x00" -"\x06\x00\x00\x00\x5C\x00\x00\x00\x00\x80\x80\x43\x32\x00\x04\x00\x06\x00\x00\x00\x5D\x00\x00\x00\x00\x00\x81\x43\x32\x00\x04\x00" -"\x21\x00\x00\x00\x5E\x00\x00\x00\x03\x01\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x5F\x00\x00\x00\x00\x00\x82\x43\x32\x00\x04\x00" -"\x06\x00\x00\x00\x60\x00\x00\x00\x00\x80\x82\x43\x32\x00\x04\x00\x06\x00\x00\x00\x61\x00\x00\x00\x00\x00\x83\x43\x32\x00\x04\x00" -"\x21\x00\x00\x00\x62\x00\x00\x00\x07\x01\x00\x00\x32\x00\x04\x00\x21\x00\x00\x00\x63\x00\x00\x00\x0B\x01\x00\x00\x1E\x00\x0C\x00" -"\x64\x00\x00\x00\x19\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00" -"\x07\x00\x00\x00\x1D\x00\x00\x00\x1D\x00\x00\x00\x20\x00\x04\x00\x65\x00\x00\x00\x02\x00\x00\x00\x64\x00\x00\x00\x3B\x00\x04\x00" -"\x65\x00\x00\x00\x66\x00\x00\x00\x02\x00\x00\x00\x20\x00\x04\x00\x67\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" -"\x67\x00\x00\x00\x68\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00\x45\x00\x00\x00\x69\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00" -"\x26\x00\x00\x00\x6A\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00\x26\x00\x00\x00\x6B\x00\x00\x00\x01\x00\x00\x00\x36\x00\x05\x00" -"\x02\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\xF8\x00\x02\x00\x05\x00\x00\x00\x50\x00\x06\x00\x0B\x00\x00\x00" -"\x11\x00\x00\x00\x0E\x00\x00\x00\x0F\x00\x00\x00\x10\x00\x00\x00\x3E\x00\x03\x00\x0D\x00\x00\x00\x11\x00\x00\x00\x50\x00\x06\x00" -"\x0B\x00\x00\x00\x16\x00\x00\x00\x13\x00\x00\x00\x14\x00\x00\x00\x15\x00\x00\x00\x3E\x00\x03\x00\x12\x00\x00\x00\x16\x00\x00\x00" -"\x3D\x00\x04\x00\x1D\x00\x00\x00\x47\x00\x00\x00\x46\x00\x00\x00\x3E\x00\x03\x00\x44\x00\x00\x00\x47\x00\x00\x00\x39\x00\x04\x00" -"\x07\x00\x00\x00\x4A\x00\x00\x00\x09\x00\x00\x00\x3E\x00\x03\x00\x49\x00\x00\x00\x4A\x00\x00\x00\x3D\x00\x04\x00\x0B\x00\x00\x00" -"\x4E\x00\x00\x00\x4D\x00\x00\x00\x3E\x00\x03\x00\x4C\x00\x00\x00\x4E\x00\x00\x00\x41\x00\x05\x00\x51\x00\x00\x00\x52\x00\x00\x00" -"\x20\x00\x00\x00\x50\x00\x00\x00\x3D\x00\x04\x00\x0B\x00\x00\x00\x53\x00\x00\x00\x52\x00\x00\x00\x3D\x00\x04\x00\x0B\x00\x00\x00" -"\x54\x00\x00\x00\x27\x00\x00\x00\x83\x00\x05\x00\x0B\x00\x00\x00\x55\x00\x00\x00\x53\x00\x00\x00\x54\x00\x00\x00\x3E\x00\x03\x00" -"\x4F\x00\x00\x00\x55\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x59\x00\x00\x00\x49\x00\x00\x00\x41\x00\x05\x00\x48\x00\x00\x00" -"\x5A\x00\x00\x00\x58\x00\x00\x00\x22\x00\x00\x00\x3E\x00\x03\x00\x5A\x00\x00\x00\x59\x00\x00\x00\xFD\x00\x01\x00\x38\x00\x01\x00" -"\x36\x00\x05\x00\x07\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\xF8\x00\x02\x00\x0A\x00\x00\x00\x3B\x00\x04\x00" -"\x17\x00\x00\x00\x18\x00\x00\x00\x07\x00\x00\x00\x41\x00\x05\x00\x23\x00\x00\x00\x24\x00\x00\x00\x20\x00\x00\x00\x22\x00\x00\x00" -"\x3D\x00\x04\x00\x19\x00\x00\x00\x25\x00\x00\x00\x24\x00\x00\x00\x3D\x00\x04\x00\x0B\x00\x00\x00\x28\x00\x00\x00\x27\x00\x00\x00" -"\x51\x00\x05\x00\x06\x00\x00\x00\x2A\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x2B\x00\x00\x00" -"\x28\x00\x00\x00\x01\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x2C\x00\x00\x00\x28\x00\x00\x00\x02\x00\x00\x00\x50\x00\x07\x00" -"\x07\x00\x00\x00\x2D\x00\x00\x00\x2A\x00\x00\x00\x2B\x00\x00\x00\x2C\x00\x00\x00\x29\x00\x00\x00\x91\x00\x05\x00\x07\x00\x00\x00" -"\x2E\x00\x00\x00\x25\x00\x00\x00\x2D\x00\x00\x00\x3E\x00\x03\x00\x18\x00\x00\x00\x2E\x00\x00\x00\x41\x00\x05\x00\x31\x00\x00\x00" -"\x32\x00\x00\x00\x18\x00\x00\x00\x30\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x33\x00\x00\x00\x32\x00\x00\x00\x85\x00\x05\x00" -"\x06\x00\x00\x00\x34\x00\x00\x00\x33\x00\x00\x00\x2F\x00\x00\x00\x41\x00\x05\x00\x31\x00\x00\x00\x35\x00\x00\x00\x18\x00\x00\x00" -"\x30\x00\x00\x00\x3E\x00\x03\x00\x35\x00\x00\x00\x34\x00\x00\x00\x41\x00\x05\x00\x31\x00\x00\x00\x37\x00\x00\x00\x18\x00\x00\x00" -"\x36\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x38\x00\x00\x00\x37\x00\x00\x00\x41\x00\x05\x00\x31\x00\x00\x00\x3A\x00\x00\x00" -"\x18\x00\x00\x00\x39\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x3B\x00\x00\x00\x3A\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00" -"\x3C\x00\x00\x00\x38\x00\x00\x00\x3B\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\x3E\x00\x00\x00\x3C\x00\x00\x00\x3D\x00\x00\x00" -"\x41\x00\x05\x00\x31\x00\x00\x00\x3F\x00\x00\x00\x18\x00\x00\x00\x36\x00\x00\x00\x3E\x00\x03\x00\x3F\x00\x00\x00\x3E\x00\x00\x00" -"\x3D\x00\x04\x00\x07\x00\x00\x00\x40\x00\x00\x00\x18\x00\x00\x00\xFE\x00\x02\x00\x40\x00\x00\x00\x38\x00\x01\x00\x03\x02\x23\x07" -"\x00\x00\x01\x00\x01\x00\x08\x00\x1D\x01\x00\x00\x00\x00\x00\x00\x11\x00\x02\x00\x01\x00\x00\x00\x0B\x00\x06\x00\x01\x00\x00\x00" -"\x47\x4C\x53\x4C\x2E\x73\x74\x64\x2E\x34\x35\x30\x00\x00\x00\x00\x0E\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0F\x00\x0B\x00" -"\x04\x00\x00\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00\x19\x00\x00\x00\x29\x00\x00\x00\x38\x00\x00\x00\x90\x00\x00\x00" -"\xA1\x00\x00\x00\x14\x01\x00\x00\x10\x00\x03\x00\x04\x00\x00\x00\x07\x00\x00\x00\x03\x00\x03\x00\x02\x00\x00\x00\xC2\x01\x00\x00" -"\x05\x00\x04\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00\x05\x00\x05\x00\x09\x00\x00\x00\x61\x72\x67\x5F\x74\x69\x6E\x74" -"\x00\x00\x00\x00\x05\x00\x05\x00\x0E\x00\x00\x00\x61\x72\x67\x5F\x66\x6F\x67\x74\x69\x6E\x74\x00\x05\x00\x03\x00\x15\x00\x00\x00" -"\x73\x74\x63\x00\x05\x00\x03\x00\x19\x00\x00\x00\x74\x66\x00\x00\x05\x00\x04\x00\x29\x00\x00\x00\x6E\x6F\x72\x6D\x00\x00\x00\x00" -"\x05\x00\x03\x00\x36\x00\x00\x00\x6E\x74\x63\x00\x05\x00\x03\x00\x38\x00\x00\x00\x74\x63\x00\x00\x05\x00\x05\x00\x41\x00\x00\x00" -"\x65\x6E\x74\x69\x74\x79\x62\x6C\x6F\x63\x6B\x00\x06\x00\x07\x00\x41\x00\x00\x00\x00\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x76" -"\x69\x65\x77\x70\x72\x6F\x6A\x00\x06\x00\x05\x00\x41\x00\x00\x00\x01\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x00\x06\x00\x06\x00" -"\x41\x00\x00\x00\x02\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x69\x6E\x76\x00\x00\x06\x00\x06\x00\x41\x00\x00\x00\x03\x00\x00\x00" -"\x65\x5F\x65\x79\x65\x70\x6F\x73\x00\x00\x00\x00\x06\x00\x05\x00\x41\x00\x00\x00\x04\x00\x00\x00\x65\x5F\x74\x69\x6D\x65\x00\x00" -"\x06\x00\x07\x00\x41\x00\x00\x00\x05\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x61\x6D\x62\x69\x65\x6E\x74\x00\x06\x00\x05\x00" -"\x41\x00\x00\x00\x06\x00\x00\x00\x65\x70\x61\x64\x31\x00\x00\x00\x06\x00\x06\x00\x41\x00\x00\x00\x07\x00\x00\x00\x65\x5F\x6C\x69" -"\x67\x68\x74\x5F\x64\x69\x72\x00\x06\x00\x05\x00\x41\x00\x00\x00\x08\x00\x00\x00\x65\x70\x61\x64\x32\x00\x00\x00\x06\x00\x06\x00" -"\x41\x00\x00\x00\x09\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x6D\x75\x6C\x00\x06\x00\x05\x00\x41\x00\x00\x00\x0A\x00\x00\x00" -"\x65\x70\x61\x64\x33\x00\x00\x00\x06\x00\x06\x00\x41\x00\x00\x00\x0B\x00\x00\x00\x65\x5F\x6C\x6D\x73\x63\x61\x6C\x65\x73\x00\x00" -"\x06\x00\x07\x00\x41\x00\x00\x00\x0C\x00\x00\x00\x65\x5F\x75\x70\x70\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00" -"\x41\x00\x00\x00\x0D\x00\x00\x00\x65\x70\x61\x64\x34\x00\x00\x00\x06\x00\x07\x00\x41\x00\x00\x00\x0E\x00\x00\x00\x65\x5F\x6C\x6F" -"\x77\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x41\x00\x00\x00\x0F\x00\x00\x00\x65\x70\x61\x64\x35\x00\x00\x00" -"\x06\x00\x06\x00\x41\x00\x00\x00\x10\x00\x00\x00\x65\x5F\x67\x6C\x6F\x77\x6D\x6F\x64\x00\x00\x00\x06\x00\x05\x00\x41\x00\x00\x00" -"\x11\x00\x00\x00\x65\x70\x61\x64\x36\x00\x00\x00\x06\x00\x07\x00\x41\x00\x00\x00\x12\x00\x00\x00\x65\x5F\x63\x6F\x6C\x6F\x75\x72" -"\x69\x64\x65\x6E\x74\x00\x00\x00\x06\x00\x07\x00\x41\x00\x00\x00\x13\x00\x00\x00\x77\x5F\x66\x6F\x67\x63\x6F\x6C\x6F\x75\x72\x73" -"\x00\x00\x00\x00\x06\x00\x07\x00\x41\x00\x00\x00\x14\x00\x00\x00\x77\x5F\x66\x6F\x67\x64\x65\x6E\x73\x69\x74\x79\x00\x00\x00\x00" -"\x06\x00\x07\x00\x41\x00\x00\x00\x15\x00\x00\x00\x77\x5F\x66\x6F\x67\x64\x65\x70\x74\x68\x62\x69\x61\x73\x00\x00\x06\x00\x05\x00" -"\x41\x00\x00\x00\x16\x00\x00\x00\x65\x70\x61\x64\x37\x00\x00\x00\x05\x00\x03\x00\x43\x00\x00\x00\x00\x00\x00\x00\x05\x00\x03\x00" -"\x5B\x00\x00\x00\x6E\x00\x00\x00\x05\x00\x05\x00\x5F\x00\x00\x00\x73\x5F\x6E\x6F\x72\x6D\x61\x6C\x6D\x61\x70\x00\x05\x00\x04\x00" -"\x84\x00\x00\x00\x73\x5F\x74\x32\x00\x00\x00\x00\x05\x00\x04\x00\x8D\x00\x00\x00\x66\x72\x65\x73\x00\x00\x00\x00\x05\x00\x03\x00" -"\x90\x00\x00\x00\x65\x79\x65\x00\x05\x00\x03\x00\x9C\x00\x00\x00\x66\x61\x72\x00\x05\x00\x04\x00\x9E\x00\x00\x00\x6E\x65\x61\x72" -"\x00\x00\x00\x00\x05\x00\x04\x00\xA0\x00\x00\x00\x73\x64\x65\x70\x74\x68\x00\x00\x05\x00\x06\x00\xA1\x00\x00\x00\x67\x6C\x5F\x46" -"\x72\x61\x67\x43\x6F\x6F\x72\x64\x00\x00\x00\x00\x05\x00\x04\x00\xB5\x00\x00\x00\x67\x64\x65\x70\x74\x68\x00\x00\x05\x00\x04\x00" -"\xB6\x00\x00\x00\x73\x5F\x74\x33\x00\x00\x00\x00\x05\x00\x04\x00\xCC\x00\x00\x00\x64\x65\x70\x74\x68\x00\x00\x00\x05\x00\x04\x00" -"\xDF\x00\x00\x00\x72\x65\x66\x72\x00\x00\x00\x00\x05\x00\x04\x00\xE0\x00\x00\x00\x73\x5F\x74\x30\x00\x00\x00\x00\x05\x00\x04\x00" -"\xFD\x00\x00\x00\x72\x65\x66\x6C\x00\x00\x00\x00\x05\x00\x04\x00\xFE\x00\x00\x00\x73\x5F\x74\x31\x00\x00\x00\x00\x05\x00\x05\x00" -"\x09\x01\x00\x00\x73\x5F\x64\x69\x66\x66\x75\x73\x65\x00\x00\x00\x05\x00\x05\x00\x14\x01\x00\x00\x6F\x75\x74\x63\x6F\x6C\x6F\x75" -"\x72\x00\x00\x00\x05\x00\x05\x00\x1A\x01\x00\x00\x6C\x69\x67\x68\x74\x62\x6C\x6F\x63\x6B\x00\x00\x06\x00\x07\x00\x1A\x01\x00\x00" -"\x00\x00\x00\x00\x6C\x5F\x63\x75\x62\x65\x6D\x61\x74\x72\x69\x78\x00\x00\x00\x00\x06\x00\x07\x00\x1A\x01\x00\x00\x01\x00\x00\x00" -"\x6C\x5F\x6C\x69\x67\x68\x74\x70\x6F\x73\x69\x74\x69\x6F\x6E\x00\x06\x00\x05\x00\x1A\x01\x00\x00\x02\x00\x00\x00\x6C\x70\x61\x64" -"\x31\x00\x00\x00\x06\x00\x07\x00\x1A\x01\x00\x00\x03\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00" -"\x06\x00\x05\x00\x1A\x01\x00\x00\x04\x00\x00\x00\x6C\x70\x61\x64\x32\x00\x00\x00\x06\x00\x08\x00\x1A\x01\x00\x00\x05\x00\x00\x00" -"\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x73\x63\x61\x6C\x65\x00\x00\x06\x00\x07\x00\x1A\x01\x00\x00\x06\x00\x00\x00" -"\x6C\x5F\x6C\x69\x67\x68\x74\x72\x61\x64\x69\x75\x73\x00\x00\x00\x06\x00\x07\x00\x1A\x01\x00\x00\x07\x00\x00\x00\x6C\x5F\x73\x68" -"\x61\x64\x6F\x77\x6D\x61\x70\x70\x72\x6F\x6A\x00\x06\x00\x08\x00\x1A\x01\x00\x00\x08\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77" -"\x6D\x61\x70\x73\x63\x61\x6C\x65\x00\x00\x00\x00\x06\x00\x05\x00\x1A\x01\x00\x00\x09\x00\x00\x00\x6C\x70\x61\x64\x33\x00\x00\x00" -"\x05\x00\x03\x00\x1C\x01\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x0A\x00\x00\x00\x01\x00\x00\x00\x08\x01\x00\x00\x47\x00\x04\x00" -"\x0B\x00\x00\x00\x01\x00\x00\x00\x09\x01\x00\x00\x47\x00\x04\x00\x0C\x00\x00\x00\x01\x00\x00\x00\x0A\x01\x00\x00\x47\x00\x04\x00" -"\x0F\x00\x00\x00\x01\x00\x00\x00\x0C\x01\x00\x00\x47\x00\x04\x00\x10\x00\x00\x00\x01\x00\x00\x00\x0D\x01\x00\x00\x47\x00\x04\x00" -"\x11\x00\x00\x00\x01\x00\x00\x00\x0E\x01\x00\x00\x47\x00\x04\x00\x19\x00\x00\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00" -"\x29\x00\x00\x00\x1E\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x38\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00" -"\x40\x00\x00\x00\x06\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x41\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00" -"\x41\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00" -"\x10\x00\x00\x00\x48\x00\x04\x00\x41\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x01\x00\x00\x00" -"\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00" -"\x41\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00" -"\x48\x00\x05\x00\x41\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x03\x00\x00\x00" -"\x23\x00\x00\x00\xC0\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00\xCC\x00\x00\x00\x48\x00\x05\x00" -"\x41\x00\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00\xD0\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00" -"\xDC\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\xE0\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00" -"\x08\x00\x00\x00\x23\x00\x00\x00\xEC\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00\xF0\x00\x00\x00" -"\x48\x00\x05\x00\x41\x00\x00\x00\x0A\x00\x00\x00\x23\x00\x00\x00\xFC\x00\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x0B\x00\x00\x00" -"\x23\x00\x00\x00\x00\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x0C\x00\x00\x00\x23\x00\x00\x00\x40\x01\x00\x00\x48\x00\x05\x00" -"\x41\x00\x00\x00\x0D\x00\x00\x00\x23\x00\x00\x00\x4C\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x0E\x00\x00\x00\x23\x00\x00\x00" -"\x50\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x0F\x00\x00\x00\x23\x00\x00\x00\x5C\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00" -"\x10\x00\x00\x00\x23\x00\x00\x00\x60\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x11\x00\x00\x00\x23\x00\x00\x00\x6C\x01\x00\x00" -"\x48\x00\x05\x00\x41\x00\x00\x00\x12\x00\x00\x00\x23\x00\x00\x00\x70\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x13\x00\x00\x00" -"\x23\x00\x00\x00\x80\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x14\x00\x00\x00\x23\x00\x00\x00\x90\x01\x00\x00\x48\x00\x05\x00" -"\x41\x00\x00\x00\x15\x00\x00\x00\x23\x00\x00\x00\x94\x01\x00\x00\x48\x00\x05\x00\x41\x00\x00\x00\x16\x00\x00\x00\x23\x00\x00\x00" -"\x98\x01\x00\x00\x47\x00\x03\x00\x41\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x43\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00" -"\x47\x00\x04\x00\x43\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x5F\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00" -"\x47\x00\x04\x00\x5F\x00\x00\x00\x21\x00\x00\x00\x03\x00\x00\x00\x47\x00\x04\x00\x61\x00\x00\x00\x01\x00\x00\x00\x06\x01\x00\x00" -"\x47\x00\x04\x00\x7E\x00\x00\x00\x01\x00\x00\x00\x07\x01\x00\x00\x47\x00\x04\x00\x84\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00" -"\x47\x00\x04\x00\x84\x00\x00\x00\x21\x00\x00\x00\x06\x00\x00\x00\x47\x00\x04\x00\x90\x00\x00\x00\x1E\x00\x00\x00\x03\x00\x00\x00" -"\x47\x00\x04\x00\x96\x00\x00\x00\x01\x00\x00\x00\x05\x01\x00\x00\x47\x00\x04\x00\x98\x00\x00\x00\x01\x00\x00\x00\x0B\x01\x00\x00" -"\x47\x00\x04\x00\x9D\x00\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00\x47\x00\x04\x00\x9F\x00\x00\x00\x01\x00\x00\x00\x02\x01\x00\x00" -"\x47\x00\x04\x00\xA1\x00\x00\x00\x0B\x00\x00\x00\x0F\x00\x00\x00\x47\x00\x04\x00\xB6\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00" -"\x47\x00\x04\x00\xB6\x00\x00\x00\x21\x00\x00\x00\x07\x00\x00\x00\x47\x00\x04\x00\xE0\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00" -"\x47\x00\x04\x00\xE0\x00\x00\x00\x21\x00\x00\x00\x04\x00\x00\x00\x47\x00\x04\x00\xE5\x00\x00\x00\x01\x00\x00\x00\x04\x01\x00\x00" -"\x47\x00\x04\x00\xE7\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x47\x00\x04\x00\xF9\x00\x00\x00\x01\x00\x00\x00\x03\x01\x00\x00" -"\x47\x00\x04\x00\xFE\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\xFE\x00\x00\x00\x21\x00\x00\x00\x05\x00\x00\x00" -"\x47\x00\x04\x00\x09\x01\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x09\x01\x00\x00\x21\x00\x00\x00\x02\x00\x00\x00" -"\x47\x00\x04\x00\x14\x01\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x48\x00\x04\x00\x1A\x01\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00" -"\x48\x00\x05\x00\x1A\x01\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00\x00\x00\x00\x00" -"\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00" -"\x1A\x01\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x4C\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00" -"\x50\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00\x5C\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00" -"\x05\x00\x00\x00\x23\x00\x00\x00\x60\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\x6C\x00\x00\x00" -"\x48\x00\x05\x00\x1A\x01\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\x70\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00\x08\x00\x00\x00" -"\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x1A\x01\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00\x88\x00\x00\x00\x47\x00\x03\x00" -"\x1A\x01\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x1C\x01\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x1C\x01\x00\x00" -"\x21\x00\x00\x00\x01\x00\x00\x00\x13\x00\x02\x00\x02\x00\x00\x00\x21\x00\x03\x00\x03\x00\x00\x00\x02\x00\x00\x00\x16\x00\x03\x00" -"\x06\x00\x00\x00\x20\x00\x00\x00\x17\x00\x04\x00\x07\x00\x00\x00\x06\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x08\x00\x00\x00" -"\x06\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x08\x00\x00\x00\x09\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00" -"\x0A\x00\x00\x00\x00\x00\x84\x43\x32\x00\x04\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x00\x80\x84\x43\x32\x00\x04\x00\x06\x00\x00\x00" -"\x0C\x00\x00\x00\x00\x00\x85\x43\x3B\x00\x04\x00\x08\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00" -"\x0F\x00\x00\x00\x00\x00\x86\x43\x32\x00\x04\x00\x06\x00\x00\x00\x10\x00\x00\x00\x00\x80\x86\x43\x32\x00\x04\x00\x06\x00\x00\x00" -"\x11\x00\x00\x00\x00\x00\x87\x43\x17\x00\x04\x00\x13\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x20\x00\x04\x00\x14\x00\x00\x00" -"\x07\x00\x00\x00\x13\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x16\x00\x00\x00\x00\x00\x80\x3F\x17\x00\x04\x00\x17\x00\x00\x00" -"\x06\x00\x00\x00\x04\x00\x00\x00\x20\x00\x04\x00\x18\x00\x00\x00\x01\x00\x00\x00\x17\x00\x00\x00\x3B\x00\x04\x00\x18\x00\x00\x00" -"\x19\x00\x00\x00\x01\x00\x00\x00\x15\x00\x04\x00\x1C\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x1C\x00\x00\x00" -"\x1D\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00" -"\x25\x00\x00\x00\x00\x00\x00\x3F\x2B\x00\x04\x00\x06\x00\x00\x00\x27\x00\x00\x00\x00\x00\xC0\x3F\x20\x00\x04\x00\x28\x00\x00\x00" -"\x01\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x28\x00\x00\x00\x29\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x04\x00\x1C\x00\x00\x00" -"\x2A\x00\x00\x00\x02\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x2E\x00\x00\x00\x00\x00\x87\x44\x2B\x00\x04\x00\x1C\x00\x00\x00" -"\x30\x00\x00\x00\x01\x00\x00\x00\x20\x00\x04\x00\x31\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x20\x00\x04\x00\x37\x00\x00\x00" -"\x01\x00\x00\x00\x13\x00\x00\x00\x3B\x00\x04\x00\x37\x00\x00\x00\x38\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x04\x00\x1C\x00\x00\x00" -"\x39\x00\x00\x00\x00\x00\x00\x00\x18\x00\x04\x00\x3E\x00\x00\x00\x17\x00\x00\x00\x04\x00\x00\x00\x2B\x00\x04\x00\x1C\x00\x00\x00" -"\x3F\x00\x00\x00\x04\x00\x00\x00\x1C\x00\x04\x00\x40\x00\x00\x00\x17\x00\x00\x00\x3F\x00\x00\x00\x1E\x00\x19\x00\x41\x00\x00\x00" -"\x3E\x00\x00\x00\x3E\x00\x00\x00\x3E\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00" -"\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x40\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00" -"\x07\x00\x00\x00\x06\x00\x00\x00\x17\x00\x00\x00\x17\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x13\x00\x00\x00\x20\x00\x04\x00" -"\x42\x00\x00\x00\x02\x00\x00\x00\x41\x00\x00\x00\x3B\x00\x04\x00\x42\x00\x00\x00\x43\x00\x00\x00\x02\x00\x00\x00\x15\x00\x04\x00" -"\x44\x00\x00\x00\x20\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x04\x00\x44\x00\x00\x00\x45\x00\x00\x00\x04\x00\x00\x00\x20\x00\x04\x00" -"\x46\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x4B\x00\x00\x00\x00\x00\x00\x3E\x20\x00\x04\x00" -"\x5A\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x19\x00\x09\x00\x5C\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" -"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x1B\x00\x03\x00\x5D\x00\x00\x00\x5C\x00\x00\x00\x20\x00\x04\x00" -"\x5E\x00\x00\x00\x00\x00\x00\x00\x5D\x00\x00\x00\x3B\x00\x04\x00\x5E\x00\x00\x00\x5F\x00\x00\x00\x00\x00\x00\x00\x32\x00\x04\x00" -"\x06\x00\x00\x00\x61\x00\x00\x00\x00\x00\x83\x43\x2B\x00\x04\x00\x06\x00\x00\x00\x66\x00\x00\x00\xCD\xCC\xCC\x3D\x2B\x00\x04\x00" -"\x06\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x72\x00\x00\x00\xF0\xA7\xC6\x3D\x2B\x00\x04\x00" -"\x06\x00\x00\x00\x7A\x00\x00\x00\x00\x00\x7C\x3F\x32\x00\x04\x00\x44\x00\x00\x00\x7E\x00\x00\x00\x07\x01\x00\x00\x2B\x00\x04\x00" -"\x44\x00\x00\x00\x7F\x00\x00\x00\x00\x00\x00\x00\x14\x00\x02\x00\x80\x00\x00\x00\x3B\x00\x04\x00\x5E\x00\x00\x00\x84\x00\x00\x00" -"\x00\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x89\x00\x00\x00\x00\x00\x40\x40\x3B\x00\x04\x00\x28\x00\x00\x00\x90\x00\x00\x00" -"\x01\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x96\x00\x00\x00\x00\x80\x82\x43\x32\x00\x04\x00\x44\x00\x00\x00\x98\x00\x00\x00" -"\x0B\x01\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x9D\x00\x00\x00\x00\x80\x80\x43\x32\x00\x04\x00\x06\x00\x00\x00\x9F\x00\x00\x00" -"\x00\x00\x81\x43\x3B\x00\x04\x00\x18\x00\x00\x00\xA1\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\xA4\x00\x00\x00" -"\x00\x00\x00\x40\x3B\x00\x04\x00\x5E\x00\x00\x00\xB6\x00\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\xD6\x00\x00\x00" -"\x00\x00\xC8\x42\x3B\x00\x04\x00\x5E\x00\x00\x00\xE0\x00\x00\x00\x00\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\xE5\x00\x00\x00" -"\x00\x00\x82\x43\x32\x00\x04\x00\x06\x00\x00\x00\xE7\x00\x00\x00\x00\x00\x80\x43\x2B\x00\x04\x00\x06\x00\x00\x00\xF4\x00\x00\x00" -"\x00\x00\x80\x45\x32\x00\x04\x00\x44\x00\x00\x00\xF9\x00\x00\x00\x03\x01\x00\x00\x3B\x00\x04\x00\x5E\x00\x00\x00\xFE\x00\x00\x00" -"\x00\x00\x00\x00\x3B\x00\x04\x00\x5E\x00\x00\x00\x09\x01\x00\x00\x00\x00\x00\x00\x20\x00\x04\x00\x13\x01\x00\x00\x03\x00\x00\x00" -"\x17\x00\x00\x00\x3B\x00\x04\x00\x13\x01\x00\x00\x14\x01\x00\x00\x03\x00\x00\x00\x1E\x00\x0C\x00\x1A\x01\x00\x00\x3E\x00\x00\x00" -"\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x17\x00\x00\x00\x13\x00\x00\x00" -"\x13\x00\x00\x00\x20\x00\x04\x00\x1B\x01\x00\x00\x02\x00\x00\x00\x1A\x01\x00\x00\x3B\x00\x04\x00\x1B\x01\x00\x00\x1C\x01\x00\x00" -"\x02\x00\x00\x00\x36\x00\x05\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\xF8\x00\x02\x00\x05\x00\x00\x00" -"\x3B\x00\x04\x00\x14\x00\x00\x00\x15\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x14\x00\x00\x00\x36\x00\x00\x00\x07\x00\x00\x00" -"\x3B\x00\x04\x00\x5A\x00\x00\x00\x5B\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x31\x00\x00\x00\x8D\x00\x00\x00\x07\x00\x00\x00" -"\x3B\x00\x04\x00\x31\x00\x00\x00\x9C\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x31\x00\x00\x00\x9E\x00\x00\x00\x07\x00\x00\x00" -"\x3B\x00\x04\x00\x31\x00\x00\x00\xA0\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x31\x00\x00\x00\xB5\x00\x00\x00\x07\x00\x00\x00" -"\x3B\x00\x04\x00\x31\x00\x00\x00\xCC\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x5A\x00\x00\x00\xDF\x00\x00\x00\x07\x00\x00\x00" -"\x3B\x00\x04\x00\x5A\x00\x00\x00\xFD\x00\x00\x00\x07\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\x0D\x00\x00\x00\x0A\x00\x00\x00" -"\x0B\x00\x00\x00\x0C\x00\x00\x00\x3E\x00\x03\x00\x09\x00\x00\x00\x0D\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\x12\x00\x00\x00" -"\x0F\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x3E\x00\x03\x00\x0E\x00\x00\x00\x12\x00\x00\x00\x3D\x00\x04\x00\x17\x00\x00\x00" -"\x1A\x00\x00\x00\x19\x00\x00\x00\x4F\x00\x07\x00\x13\x00\x00\x00\x1B\x00\x00\x00\x1A\x00\x00\x00\x1A\x00\x00\x00\x00\x00\x00\x00" -"\x01\x00\x00\x00\x41\x00\x05\x00\x1E\x00\x00\x00\x1F\x00\x00\x00\x19\x00\x00\x00\x1D\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" -"\x20\x00\x00\x00\x1F\x00\x00\x00\x50\x00\x05\x00\x13\x00\x00\x00\x21\x00\x00\x00\x20\x00\x00\x00\x20\x00\x00\x00\x88\x00\x05\x00" -"\x13\x00\x00\x00\x22\x00\x00\x00\x1B\x00\x00\x00\x21\x00\x00\x00\x50\x00\x05\x00\x13\x00\x00\x00\x23\x00\x00\x00\x16\x00\x00\x00" -"\x16\x00\x00\x00\x81\x00\x05\x00\x13\x00\x00\x00\x24\x00\x00\x00\x23\x00\x00\x00\x22\x00\x00\x00\x8E\x00\x05\x00\x13\x00\x00\x00" -"\x26\x00\x00\x00\x24\x00\x00\x00\x25\x00\x00\x00\x3E\x00\x03\x00\x15\x00\x00\x00\x26\x00\x00\x00\x41\x00\x05\x00\x1E\x00\x00\x00" -"\x2B\x00\x00\x00\x29\x00\x00\x00\x2A\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x2C\x00\x00\x00\x2B\x00\x00\x00\x85\x00\x05\x00" -"\x06\x00\x00\x00\x2D\x00\x00\x00\x27\x00\x00\x00\x2C\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\x2F\x00\x00\x00\x2D\x00\x00\x00" -"\x2E\x00\x00\x00\x41\x00\x05\x00\x31\x00\x00\x00\x32\x00\x00\x00\x15\x00\x00\x00\x30\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" -"\x33\x00\x00\x00\x32\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x34\x00\x00\x00\x33\x00\x00\x00\x2F\x00\x00\x00\x41\x00\x05\x00" -"\x31\x00\x00\x00\x35\x00\x00\x00\x15\x00\x00\x00\x30\x00\x00\x00\x3E\x00\x03\x00\x35\x00\x00\x00\x34\x00\x00\x00\x41\x00\x05\x00" -"\x1E\x00\x00\x00\x3A\x00\x00\x00\x38\x00\x00\x00\x39\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x3B\x00\x00\x00\x3A\x00\x00\x00" -"\x41\x00\x05\x00\x1E\x00\x00\x00\x3C\x00\x00\x00\x38\x00\x00\x00\x30\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x3D\x00\x00\x00" -"\x3C\x00\x00\x00\x41\x00\x05\x00\x46\x00\x00\x00\x47\x00\x00\x00\x43\x00\x00\x00\x45\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" -"\x48\x00\x00\x00\x47\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x49\x00\x00\x00\x3D\x00\x00\x00\x48\x00\x00\x00\x0C\x00\x06\x00" -"\x06\x00\x00\x00\x4A\x00\x00\x00\x01\x00\x00\x00\x0D\x00\x00\x00\x49\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x4C\x00\x00\x00" -"\x4A\x00\x00\x00\x4B\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x4D\x00\x00\x00\x3B\x00\x00\x00\x4C\x00\x00\x00\x41\x00\x05\x00" -"\x31\x00\x00\x00\x4E\x00\x00\x00\x36\x00\x00\x00\x39\x00\x00\x00\x3E\x00\x03\x00\x4E\x00\x00\x00\x4D\x00\x00\x00\x41\x00\x05\x00" -"\x1E\x00\x00\x00\x4F\x00\x00\x00\x38\x00\x00\x00\x30\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x50\x00\x00\x00\x4F\x00\x00\x00" -"\x41\x00\x05\x00\x1E\x00\x00\x00\x51\x00\x00\x00\x38\x00\x00\x00\x39\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x52\x00\x00\x00" -"\x51\x00\x00\x00\x41\x00\x05\x00\x46\x00\x00\x00\x53\x00\x00\x00\x43\x00\x00\x00\x45\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" -"\x54\x00\x00\x00\x53\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x55\x00\x00\x00\x52\x00\x00\x00\x54\x00\x00\x00\x0C\x00\x06\x00" -"\x06\x00\x00\x00\x56\x00\x00\x00\x01\x00\x00\x00\x0D\x00\x00\x00\x55\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x57\x00\x00\x00" -"\x56\x00\x00\x00\x4B\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x58\x00\x00\x00\x50\x00\x00\x00\x57\x00\x00\x00\x41\x00\x05\x00" -"\x31\x00\x00\x00\x59\x00\x00\x00\x36\x00\x00\x00\x30\x00\x00\x00\x3E\x00\x03\x00\x59\x00\x00\x00\x58\x00\x00\x00\x3D\x00\x04\x00" -"\x5D\x00\x00\x00\x60\x00\x00\x00\x5F\x00\x00\x00\x3D\x00\x04\x00\x13\x00\x00\x00\x62\x00\x00\x00\x38\x00\x00\x00\x8E\x00\x05\x00" -"\x13\x00\x00\x00\x63\x00\x00\x00\x62\x00\x00\x00\x61\x00\x00\x00\x41\x00\x05\x00\x46\x00\x00\x00\x64\x00\x00\x00\x43\x00\x00\x00" -"\x45\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x65\x00\x00\x00\x64\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x67\x00\x00\x00" -"\x65\x00\x00\x00\x66\x00\x00\x00\x50\x00\x05\x00\x13\x00\x00\x00\x69\x00\x00\x00\x67\x00\x00\x00\x68\x00\x00\x00\x81\x00\x05\x00" -"\x13\x00\x00\x00\x6A\x00\x00\x00\x63\x00\x00\x00\x69\x00\x00\x00\x57\x00\x05\x00\x17\x00\x00\x00\x6B\x00\x00\x00\x60\x00\x00\x00" -"\x6A\x00\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00\x6C\x00\x00\x00\x6B\x00\x00\x00\x6B\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" -"\x02\x00\x00\x00\x3E\x00\x03\x00\x5B\x00\x00\x00\x6C\x00\x00\x00\x3D\x00\x04\x00\x5D\x00\x00\x00\x6D\x00\x00\x00\x5F\x00\x00\x00" -"\x3D\x00\x04\x00\x13\x00\x00\x00\x6E\x00\x00\x00\x38\x00\x00\x00\x8E\x00\x05\x00\x13\x00\x00\x00\x6F\x00\x00\x00\x6E\x00\x00\x00" -"\x61\x00\x00\x00\x41\x00\x05\x00\x46\x00\x00\x00\x70\x00\x00\x00\x43\x00\x00\x00\x45\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" -"\x71\x00\x00\x00\x70\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x73\x00\x00\x00\x71\x00\x00\x00\x72\x00\x00\x00\x50\x00\x05\x00" -"\x13\x00\x00\x00\x74\x00\x00\x00\x68\x00\x00\x00\x73\x00\x00\x00\x83\x00\x05\x00\x13\x00\x00\x00\x75\x00\x00\x00\x6F\x00\x00\x00" -"\x74\x00\x00\x00\x57\x00\x05\x00\x17\x00\x00\x00\x76\x00\x00\x00\x6D\x00\x00\x00\x75\x00\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00" -"\x77\x00\x00\x00\x76\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00" -"\x78\x00\x00\x00\x5B\x00\x00\x00\x81\x00\x05\x00\x07\x00\x00\x00\x79\x00\x00\x00\x78\x00\x00\x00\x77\x00\x00\x00\x3E\x00\x03\x00" -"\x5B\x00\x00\x00\x79\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x7B\x00\x00\x00\x5B\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00" -"\x7C\x00\x00\x00\x7A\x00\x00\x00\x7A\x00\x00\x00\x7A\x00\x00\x00\x83\x00\x05\x00\x07\x00\x00\x00\x7D\x00\x00\x00\x7B\x00\x00\x00" -"\x7C\x00\x00\x00\x3E\x00\x03\x00\x5B\x00\x00\x00\x7D\x00\x00\x00\xAB\x00\x05\x00\x80\x00\x00\x00\x81\x00\x00\x00\x7E\x00\x00\x00" -"\x7F\x00\x00\x00\xF7\x00\x03\x00\x83\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x81\x00\x00\x00\x82\x00\x00\x00\x83\x00\x00\x00" -"\xF8\x00\x02\x00\x82\x00\x00\x00\x3D\x00\x04\x00\x5D\x00\x00\x00\x85\x00\x00\x00\x84\x00\x00\x00\x3D\x00\x04\x00\x13\x00\x00\x00" -"\x86\x00\x00\x00\x15\x00\x00\x00\x57\x00\x05\x00\x17\x00\x00\x00\x87\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x4F\x00\x08\x00" -"\x07\x00\x00\x00\x88\x00\x00\x00\x87\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x8E\x00\x05\x00" -"\x07\x00\x00\x00\x8A\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x8B\x00\x00\x00\x5B\x00\x00\x00" -"\x81\x00\x05\x00\x07\x00\x00\x00\x8C\x00\x00\x00\x8B\x00\x00\x00\x8A\x00\x00\x00\x3E\x00\x03\x00\x5B\x00\x00\x00\x8C\x00\x00\x00" -"\xF9\x00\x02\x00\x83\x00\x00\x00\xF8\x00\x02\x00\x83\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x8E\x00\x00\x00\x5B\x00\x00\x00" -"\x0C\x00\x06\x00\x07\x00\x00\x00\x8F\x00\x00\x00\x01\x00\x00\x00\x45\x00\x00\x00\x8E\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00" -"\x91\x00\x00\x00\x90\x00\x00\x00\x0C\x00\x06\x00\x07\x00\x00\x00\x92\x00\x00\x00\x01\x00\x00\x00\x45\x00\x00\x00\x91\x00\x00\x00" -"\x94\x00\x05\x00\x06\x00\x00\x00\x93\x00\x00\x00\x8F\x00\x00\x00\x92\x00\x00\x00\x0C\x00\x06\x00\x06\x00\x00\x00\x94\x00\x00\x00" -"\x01\x00\x00\x00\x04\x00\x00\x00\x93\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x95\x00\x00\x00\x16\x00\x00\x00\x94\x00\x00\x00" -"\x0C\x00\x07\x00\x06\x00\x00\x00\x97\x00\x00\x00\x01\x00\x00\x00\x1A\x00\x00\x00\x95\x00\x00\x00\x96\x00\x00\x00\x3E\x00\x03\x00" -"\x8D\x00\x00\x00\x97\x00\x00\x00\xAB\x00\x05\x00\x80\x00\x00\x00\x99\x00\x00\x00\x98\x00\x00\x00\x7F\x00\x00\x00\xF7\x00\x03\x00" -"\x9B\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x99\x00\x00\x00\x9A\x00\x00\x00\xDE\x00\x00\x00\xF8\x00\x02\x00\x9A\x00\x00\x00" -"\x3E\x00\x03\x00\x9C\x00\x00\x00\x9D\x00\x00\x00\x3E\x00\x03\x00\x9E\x00\x00\x00\x9F\x00\x00\x00\x41\x00\x05\x00\x1E\x00\x00\x00" -"\xA2\x00\x00\x00\xA1\x00\x00\x00\x2A\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xA3\x00\x00\x00\xA2\x00\x00\x00\x3E\x00\x03\x00" -"\xA0\x00\x00\x00\xA3\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xA5\x00\x00\x00\x9E\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00" -"\xA6\x00\x00\x00\xA4\x00\x00\x00\xA5\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xA7\x00\x00\x00\x9C\x00\x00\x00\x3D\x00\x04\x00" -"\x06\x00\x00\x00\xA8\x00\x00\x00\x9E\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\xA9\x00\x00\x00\xA7\x00\x00\x00\xA8\x00\x00\x00" -"\x3D\x00\x04\x00\x06\x00\x00\x00\xAA\x00\x00\x00\xA0\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xAB\x00\x00\x00\x9C\x00\x00\x00" -"\x3D\x00\x04\x00\x06\x00\x00\x00\xAC\x00\x00\x00\x9E\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\xAD\x00\x00\x00\xAB\x00\x00\x00" -"\xAC\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xAE\x00\x00\x00\xAA\x00\x00\x00\xAD\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00" -"\xAF\x00\x00\x00\xA9\x00\x00\x00\xAE\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\xB0\x00\x00\x00\xA6\x00\x00\x00\xAF\x00\x00\x00" -"\x3E\x00\x03\x00\xA0\x00\x00\x00\xB0\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xB1\x00\x00\x00\x9E\x00\x00\x00\x3D\x00\x04\x00" -"\x06\x00\x00\x00\xB2\x00\x00\x00\x9C\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xB3\x00\x00\x00\xA0\x00\x00\x00\x0C\x00\x08\x00" -"\x06\x00\x00\x00\xB4\x00\x00\x00\x01\x00\x00\x00\x2E\x00\x00\x00\xB1\x00\x00\x00\xB2\x00\x00\x00\xB3\x00\x00\x00\x3E\x00\x03\x00" -"\xA0\x00\x00\x00\xB4\x00\x00\x00\x3D\x00\x04\x00\x5D\x00\x00\x00\xB7\x00\x00\x00\xB6\x00\x00\x00\x3D\x00\x04\x00\x13\x00\x00\x00" -"\xB8\x00\x00\x00\x15\x00\x00\x00\x57\x00\x05\x00\x17\x00\x00\x00\xB9\x00\x00\x00\xB7\x00\x00\x00\xB8\x00\x00\x00\x51\x00\x05\x00" -"\x06\x00\x00\x00\xBA\x00\x00\x00\xB9\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xB5\x00\x00\x00\xBA\x00\x00\x00\x3D\x00\x04\x00" -"\x06\x00\x00\x00\xBB\x00\x00\x00\x9E\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xBC\x00\x00\x00\xA4\x00\x00\x00\xBB\x00\x00\x00" -"\x3D\x00\x04\x00\x06\x00\x00\x00\xBD\x00\x00\x00\x9C\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xBE\x00\x00\x00\x9E\x00\x00\x00" -"\x81\x00\x05\x00\x06\x00\x00\x00\xBF\x00\x00\x00\xBD\x00\x00\x00\xBE\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC0\x00\x00\x00" -"\xB5\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC1\x00\x00\x00\x9C\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC2\x00\x00\x00" -"\x9E\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\xC3\x00\x00\x00\xC1\x00\x00\x00\xC2\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00" -"\xC4\x00\x00\x00\xC0\x00\x00\x00\xC3\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\xC5\x00\x00\x00\xBF\x00\x00\x00\xC4\x00\x00\x00" -"\x88\x00\x05\x00\x06\x00\x00\x00\xC6\x00\x00\x00\xBC\x00\x00\x00\xC5\x00\x00\x00\x3E\x00\x03\x00\xB5\x00\x00\x00\xC6\x00\x00\x00" -"\x3D\x00\x04\x00\x06\x00\x00\x00\xC7\x00\x00\x00\xB5\x00\x00\x00\xBE\x00\x05\x00\x80\x00\x00\x00\xC8\x00\x00\x00\xC7\x00\x00\x00" -"\x25\x00\x00\x00\xF7\x00\x03\x00\xCA\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xC8\x00\x00\x00\xC9\x00\x00\x00\xCD\x00\x00\x00" -"\xF8\x00\x02\x00\xC9\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xCB\x00\x00\x00\xA0\x00\x00\x00\x3E\x00\x03\x00\xB5\x00\x00\x00" -"\xCB\x00\x00\x00\x3E\x00\x03\x00\xCC\x00\x00\x00\x68\x00\x00\x00\xF9\x00\x02\x00\xCA\x00\x00\x00\xF8\x00\x02\x00\xCD\x00\x00\x00" -"\x3D\x00\x04\x00\x06\x00\x00\x00\xCE\x00\x00\x00\x9E\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xCF\x00\x00\x00\x9C\x00\x00\x00" -"\x3D\x00\x04\x00\x06\x00\x00\x00\xD0\x00\x00\x00\xB5\x00\x00\x00\x0C\x00\x08\x00\x06\x00\x00\x00\xD1\x00\x00\x00\x01\x00\x00\x00" -"\x2E\x00\x00\x00\xCE\x00\x00\x00\xCF\x00\x00\x00\xD0\x00\x00\x00\x3E\x00\x03\x00\xB5\x00\x00\x00\xD1\x00\x00\x00\x3D\x00\x04\x00" -"\x06\x00\x00\x00\xD2\x00\x00\x00\xB5\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xD3\x00\x00\x00\xA0\x00\x00\x00\x83\x00\x05\x00" -"\x06\x00\x00\x00\xD4\x00\x00\x00\xD2\x00\x00\x00\xD3\x00\x00\x00\x3E\x00\x03\x00\xCC\x00\x00\x00\xD4\x00\x00\x00\xF9\x00\x02\x00" -"\xCA\x00\x00\x00\xF8\x00\x02\x00\xCA\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xD5\x00\x00\x00\xCC\x00\x00\x00\xB8\x00\x05\x00" -"\x80\x00\x00\x00\xD7\x00\x00\x00\xD5\x00\x00\x00\xD6\x00\x00\x00\xF7\x00\x03\x00\xD9\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00" -"\xD7\x00\x00\x00\xD8\x00\x00\x00\xD9\x00\x00\x00\xF8\x00\x02\x00\xD8\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xDA\x00\x00\x00" -"\xCC\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\xDB\x00\x00\x00\xDA\x00\x00\x00\xD6\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00" -"\xDC\x00\x00\x00\x5B\x00\x00\x00\x8E\x00\x05\x00\x07\x00\x00\x00\xDD\x00\x00\x00\xDC\x00\x00\x00\xDB\x00\x00\x00\x3E\x00\x03\x00" -"\x5B\x00\x00\x00\xDD\x00\x00\x00\xF9\x00\x02\x00\xD9\x00\x00\x00\xF8\x00\x02\x00\xD9\x00\x00\x00\xF9\x00\x02\x00\x9B\x00\x00\x00" -"\xF8\x00\x02\x00\xDE\x00\x00\x00\x3E\x00\x03\x00\xCC\x00\x00\x00\x16\x00\x00\x00\xF9\x00\x02\x00\x9B\x00\x00\x00\xF8\x00\x02\x00" -"\x9B\x00\x00\x00\x3D\x00\x04\x00\x5D\x00\x00\x00\xE1\x00\x00\x00\xE0\x00\x00\x00\x3D\x00\x04\x00\x13\x00\x00\x00\xE2\x00\x00\x00" -"\x15\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\xE3\x00\x00\x00\x5B\x00\x00\x00\x4F\x00\x07\x00\x13\x00\x00\x00\xE4\x00\x00\x00" -"\xE3\x00\x00\x00\xE3\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x8E\x00\x05\x00\x13\x00\x00\x00\xE6\x00\x00\x00\xE4\x00\x00\x00" -"\xE5\x00\x00\x00\x8E\x00\x05\x00\x13\x00\x00\x00\xE8\x00\x00\x00\xE6\x00\x00\x00\xE7\x00\x00\x00\x81\x00\x05\x00\x13\x00\x00\x00" -"\xE9\x00\x00\x00\xE2\x00\x00\x00\xE8\x00\x00\x00\x57\x00\x05\x00\x17\x00\x00\x00\xEA\x00\x00\x00\xE1\x00\x00\x00\xE9\x00\x00\x00" -"\x4F\x00\x08\x00\x07\x00\x00\x00\xEB\x00\x00\x00\xEA\x00\x00\x00\xEA\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00" -"\x3D\x00\x04\x00\x07\x00\x00\x00\xEC\x00\x00\x00\x09\x00\x00\x00\x85\x00\x05\x00\x07\x00\x00\x00\xED\x00\x00\x00\xEB\x00\x00\x00" -"\xEC\x00\x00\x00\x3E\x00\x03\x00\xDF\x00\x00\x00\xED\x00\x00\x00\xAB\x00\x05\x00\x80\x00\x00\x00\xEE\x00\x00\x00\x98\x00\x00\x00" -"\x7F\x00\x00\x00\xF7\x00\x03\x00\xF0\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xEE\x00\x00\x00\xEF\x00\x00\x00\xF0\x00\x00\x00" -"\xF8\x00\x02\x00\xEF\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\xF1\x00\x00\x00\xDF\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00" -"\xF2\x00\x00\x00\x0E\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xF3\x00\x00\x00\xCC\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00" -"\xF5\x00\x00\x00\xF3\x00\x00\x00\xF4\x00\x00\x00\x0C\x00\x07\x00\x06\x00\x00\x00\xF6\x00\x00\x00\x01\x00\x00\x00\x25\x00\x00\x00" -"\xF5\x00\x00\x00\x16\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\xF7\x00\x00\x00\xF6\x00\x00\x00\xF6\x00\x00\x00\xF6\x00\x00\x00" -"\x0C\x00\x08\x00\x07\x00\x00\x00\xF8\x00\x00\x00\x01\x00\x00\x00\x2E\x00\x00\x00\xF1\x00\x00\x00\xF2\x00\x00\x00\xF7\x00\x00\x00" -"\x3E\x00\x03\x00\xDF\x00\x00\x00\xF8\x00\x00\x00\xF9\x00\x02\x00\xF0\x00\x00\x00\xF8\x00\x02\x00\xF0\x00\x00\x00\xAB\x00\x05\x00" -"\x80\x00\x00\x00\xFA\x00\x00\x00\xF9\x00\x00\x00\x7F\x00\x00\x00\xF7\x00\x03\x00\xFC\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00" -"\xFA\x00\x00\x00\xFB\x00\x00\x00\x08\x01\x00\x00\xF8\x00\x02\x00\xFB\x00\x00\x00\x3D\x00\x04\x00\x5D\x00\x00\x00\xFF\x00\x00\x00" -"\xFE\x00\x00\x00\x3D\x00\x04\x00\x13\x00\x00\x00\x00\x01\x00\x00\x15\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x01\x01\x00\x00" -"\x5B\x00\x00\x00\x4F\x00\x07\x00\x13\x00\x00\x00\x02\x01\x00\x00\x01\x01\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" -"\x8E\x00\x05\x00\x13\x00\x00\x00\x03\x01\x00\x00\x02\x01\x00\x00\xE5\x00\x00\x00\x8E\x00\x05\x00\x13\x00\x00\x00\x04\x01\x00\x00" -"\x03\x01\x00\x00\xE7\x00\x00\x00\x83\x00\x05\x00\x13\x00\x00\x00\x05\x01\x00\x00\x00\x01\x00\x00\x04\x01\x00\x00\x57\x00\x05\x00" -"\x17\x00\x00\x00\x06\x01\x00\x00\xFF\x00\x00\x00\x05\x01\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00\x07\x01\x00\x00\x06\x01\x00\x00" -"\x06\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x3E\x00\x03\x00\xFD\x00\x00\x00\x07\x01\x00\x00\xF9\x00\x02\x00" -"\xFC\x00\x00\x00\xF8\x00\x02\x00\x08\x01\x00\x00\x3D\x00\x04\x00\x5D\x00\x00\x00\x0A\x01\x00\x00\x09\x01\x00\x00\x3D\x00\x04\x00" -"\x13\x00\x00\x00\x0B\x01\x00\x00\x36\x00\x00\x00\x57\x00\x05\x00\x17\x00\x00\x00\x0C\x01\x00\x00\x0A\x01\x00\x00\x0B\x01\x00\x00" -"\x4F\x00\x08\x00\x07\x00\x00\x00\x0D\x01\x00\x00\x0C\x01\x00\x00\x0C\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00" -"\x3E\x00\x03\x00\xFD\x00\x00\x00\x0D\x01\x00\x00\xF9\x00\x02\x00\xFC\x00\x00\x00\xF8\x00\x02\x00\xFC\x00\x00\x00\x3D\x00\x04\x00" -"\x07\x00\x00\x00\x0E\x01\x00\x00\xDF\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x0F\x01\x00\x00\xFD\x00\x00\x00\x3D\x00\x04\x00" -"\x06\x00\x00\x00\x10\x01\x00\x00\x8D\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\x11\x01\x00\x00\x10\x01\x00\x00\x10\x01\x00\x00" -"\x10\x01\x00\x00\x0C\x00\x08\x00\x07\x00\x00\x00\x12\x01\x00\x00\x01\x00\x00\x00\x2E\x00\x00\x00\x0E\x01\x00\x00\x0F\x01\x00\x00" -"\x11\x01\x00\x00\x3E\x00\x03\x00\xDF\x00\x00\x00\x12\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x15\x01\x00\x00\xDF\x00\x00\x00" -"\x51\x00\x05\x00\x06\x00\x00\x00\x16\x01\x00\x00\x15\x01\x00\x00\x00\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x17\x01\x00\x00" -"\x15\x01\x00\x00\x01\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x18\x01\x00\x00\x15\x01\x00\x00\x02\x00\x00\x00\x50\x00\x07\x00" -"\x17\x00\x00\x00\x19\x01\x00\x00\x16\x01\x00\x00\x17\x01\x00\x00\x18\x01\x00\x00\x16\x00\x00\x00\x3E\x00\x03\x00\x14\x01\x00\x00" -"\x19\x01\x00\x00\xFD\x00\x01\x00\x38\x00\x01\x00"}, +"\xFF\x53\x50\x56\x01\x00\x00\x00\x0C\x00\x00\x00\x04\x00\x00\x00\x20\x00\x00\x00\x2C\x00\x00\x00\x91\x01\x00\x00\xC0\x01\x00\x00" +"\x10\x14\x00\x00\xD0\x15\x00\x00\x0C\x39\x00\x00\x01\x00\x62\x31\x72\x5F\x66\x6F\x67\x5F\x65\x78\x70\x32\x00\x00\x00\x00\x00\x01" +"\x01\x66\x31\x72\x5F\x67\x6C\x73\x6C\x5F\x74\x75\x72\x62\x73\x63\x61\x6C\x65\x5F\x72\x65\x66\x6C\x65\x63\x74\x00\x3F\x80\x00\x00" +"\x01\x02\x66\x31\x72\x5F\x67\x6C\x73\x6C\x5F\x74\x75\x72\x62\x73\x63\x61\x6C\x65\x5F\x72\x65\x66\x72\x61\x63\x74\x00\x3F\x80\x00" +"\x00\x01\x03\x66\x31\x67\x6C\x5F\x6D\x61\x78\x64\x69\x73\x74\x00\x46\x00\x00\x00\x01\x04\x66\x31\x67\x6C\x5F\x6D\x69\x6E\x64\x69" +"\x73\x74\x00\x40\x80\x00\x00\x01\x05\x42\x31\x72\x65\x66\x6C\x65\x63\x74\x00\x00\x00\x00\x00\x01\x06\x46\x31\x73\x74\x72\x65\x6E" +"\x67\x74\x68\x5F\x72\x65\x66\x6C\x00\x3D\xCC\xCC\xCD\x01\x07\x46\x31\x73\x74\x72\x65\x6E\x67\x74\x68\x5F\x72\x65\x66\x72\x00\x3D" +"\xCC\xCC\xCD\x01\x08\x46\x31\x66\x72\x65\x73\x6E\x65\x6C\x5F\x65\x78\x70\x00\x40\xA0\x00\x00\x01\x09\x46\x31\x66\x72\x65\x73\x6E" +"\x65\x6C\x5F\x72\x61\x6E\x67\x65\x00\x3F\x80\x00\x00\x01\x0A\x46\x31\x66\x72\x65\x73\x6E\x65\x6C\x5F\x6D\x69\x6E\x00\x3F\x80\x00" +"\x00\x01\x0B\x46\x31\x74\x78\x73\x63\x61\x6C\x65\x31\x00\x3E\x4C\xCC\xCD\x01\x0C\x46\x31\x74\x78\x73\x63\x61\x6C\x65\x32\x00\x3E" +"\x4C\xCC\xCD\x01\x0D\x42\x31\x72\x69\x70\x70\x6C\x65\x6D\x61\x70\x00\x00\x00\x00\x00\x01\x0E\x46\x33\x74\x69\x6E\x74\x5F\x72\x65" +"\x66\x72\x00\x3F\x33\x33\x33\x3F\x4C\xCC\xCD\x3F\x33\x33\x33\x01\x11\x46\x33\x74\x69\x6E\x74\x5F\x72\x65\x66\x6C\x00\x3F\x33\x33" +"\x33\x3F\x4C\xCC\xCD\x3F\x33\x33\x33\x01\x14\x42\x31\x64\x65\x70\x74\x68\x00\x00\x00\x00\x00\x01\x15\x46\x31\x61\x6C\x70\x68\x61" +"\x00\x00\x00\x00\x00\x01\x16\x46\x33\x66\x6F\x67\x74\x69\x6E\x74\x00\x3E\x4C\xCC\xCD\x3E\x99\x99\x9A\x3E\x4C\xCC\xCD\x70\x74\x68" +"\x03\x02\x23\x07\x00\x00\x01\x00\x01\x00\x08\x00\x79\x00\x00\x00\x00\x00\x00\x00\x11\x00\x02\x00\x01\x00\x00\x00\x0B\x00\x06\x00" +"\x01\x00\x00\x00\x47\x4C\x53\x4C\x2E\x73\x74\x64\x2E\x34\x35\x30\x00\x00\x00\x00\x0E\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00" +"\x0F\x00\x11\x00\x00\x00\x00\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00\x2C\x00\x00\x00\x49\x00\x00\x00\x4B\x00\x00\x00" +"\x4E\x00\x00\x00\x51\x00\x00\x00\x52\x00\x00\x00\x54\x00\x00\x00\x5D\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00" +"\x78\x00\x00\x00\x03\x00\x03\x00\x02\x00\x00\x00\xC2\x01\x00\x00\x05\x00\x04\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00" +"\x05\x00\x06\x00\x09\x00\x00\x00\x66\x74\x65\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x28\x00\x00\x00\x05\x00\x06\x00\x0D\x00\x00\x00" +"\x61\x72\x67\x5F\x74\x69\x6E\x74\x5F\x72\x65\x66\x72\x00\x00\x00\x05\x00\x06\x00\x12\x00\x00\x00\x61\x72\x67\x5F\x74\x69\x6E\x74" +"\x5F\x72\x65\x66\x6C\x00\x00\x00\x05\x00\x05\x00\x17\x00\x00\x00\x61\x72\x67\x5F\x66\x6F\x67\x74\x69\x6E\x74\x00\x05\x00\x04\x00" +"\x1D\x00\x00\x00\x70\x72\x6F\x6A\x00\x00\x00\x00\x05\x00\x05\x00\x23\x00\x00\x00\x65\x6E\x74\x69\x74\x79\x62\x6C\x6F\x63\x6B\x00" +"\x06\x00\x07\x00\x23\x00\x00\x00\x00\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x76\x69\x65\x77\x70\x72\x6F\x6A\x00\x06\x00\x05\x00" +"\x23\x00\x00\x00\x01\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x00\x06\x00\x06\x00\x23\x00\x00\x00\x02\x00\x00\x00\x6D\x5F\x6D\x6F" +"\x64\x65\x6C\x69\x6E\x76\x00\x00\x06\x00\x06\x00\x23\x00\x00\x00\x03\x00\x00\x00\x65\x5F\x65\x79\x65\x70\x6F\x73\x00\x00\x00\x00" +"\x06\x00\x05\x00\x23\x00\x00\x00\x04\x00\x00\x00\x65\x5F\x74\x69\x6D\x65\x00\x00\x06\x00\x07\x00\x23\x00\x00\x00\x05\x00\x00\x00" +"\x65\x5F\x6C\x69\x67\x68\x74\x5F\x61\x6D\x62\x69\x65\x6E\x74\x00\x06\x00\x05\x00\x23\x00\x00\x00\x06\x00\x00\x00\x65\x70\x61\x64" +"\x31\x00\x00\x00\x06\x00\x06\x00\x23\x00\x00\x00\x07\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x64\x69\x72\x00\x06\x00\x05\x00" +"\x23\x00\x00\x00\x08\x00\x00\x00\x65\x70\x61\x64\x32\x00\x00\x00\x06\x00\x06\x00\x23\x00\x00\x00\x09\x00\x00\x00\x65\x5F\x6C\x69" +"\x67\x68\x74\x5F\x6D\x75\x6C\x00\x06\x00\x05\x00\x23\x00\x00\x00\x0A\x00\x00\x00\x65\x70\x61\x64\x33\x00\x00\x00\x06\x00\x06\x00" +"\x23\x00\x00\x00\x0B\x00\x00\x00\x65\x5F\x6C\x6D\x73\x63\x61\x6C\x65\x73\x00\x00\x06\x00\x07\x00\x23\x00\x00\x00\x0C\x00\x00\x00" +"\x65\x5F\x75\x70\x70\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x23\x00\x00\x00\x0D\x00\x00\x00\x65\x70\x61\x64" +"\x34\x00\x00\x00\x06\x00\x07\x00\x23\x00\x00\x00\x0E\x00\x00\x00\x65\x5F\x6C\x6F\x77\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00" +"\x06\x00\x05\x00\x23\x00\x00\x00\x0F\x00\x00\x00\x65\x70\x61\x64\x35\x00\x00\x00\x06\x00\x06\x00\x23\x00\x00\x00\x10\x00\x00\x00" +"\x65\x5F\x67\x6C\x6F\x77\x6D\x6F\x64\x00\x00\x00\x06\x00\x05\x00\x23\x00\x00\x00\x11\x00\x00\x00\x65\x70\x61\x64\x36\x00\x00\x00" +"\x06\x00\x07\x00\x23\x00\x00\x00\x12\x00\x00\x00\x65\x5F\x63\x6F\x6C\x6F\x75\x72\x69\x64\x65\x6E\x74\x00\x00\x00\x06\x00\x07\x00" +"\x23\x00\x00\x00\x13\x00\x00\x00\x77\x5F\x66\x6F\x67\x63\x6F\x6C\x6F\x75\x72\x73\x00\x00\x00\x00\x06\x00\x07\x00\x23\x00\x00\x00" +"\x14\x00\x00\x00\x77\x5F\x66\x6F\x67\x64\x65\x6E\x73\x69\x74\x79\x00\x00\x00\x00\x06\x00\x07\x00\x23\x00\x00\x00\x15\x00\x00\x00" +"\x77\x5F\x66\x6F\x67\x64\x65\x70\x74\x68\x62\x69\x61\x73\x00\x00\x06\x00\x05\x00\x23\x00\x00\x00\x16\x00\x00\x00\x65\x70\x61\x64" +"\x37\x00\x00\x00\x05\x00\x03\x00\x25\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x2C\x00\x00\x00\x76\x5F\x70\x6F\x73\x69\x74\x69" +"\x6F\x6E\x00\x00\x05\x00\x03\x00\x49\x00\x00\x00\x74\x63\x00\x00\x05\x00\x05\x00\x4B\x00\x00\x00\x76\x5F\x74\x65\x78\x63\x6F\x6F" +"\x72\x64\x00\x00\x05\x00\x03\x00\x4E\x00\x00\x00\x74\x66\x00\x00\x05\x00\x04\x00\x51\x00\x00\x00\x6E\x6F\x72\x6D\x00\x00\x00\x00" +"\x05\x00\x05\x00\x52\x00\x00\x00\x76\x5F\x6E\x6F\x72\x6D\x61\x6C\x00\x00\x00\x00\x05\x00\x03\x00\x54\x00\x00\x00\x65\x79\x65\x00" +"\x05\x00\x06\x00\x5B\x00\x00\x00\x67\x6C\x5F\x50\x65\x72\x56\x65\x72\x74\x65\x78\x00\x00\x00\x00\x06\x00\x06\x00\x5B\x00\x00\x00" +"\x00\x00\x00\x00\x67\x6C\x5F\x50\x6F\x73\x69\x74\x69\x6F\x6E\x00\x05\x00\x03\x00\x5D\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00" +"\x71\x00\x00\x00\x6C\x69\x67\x68\x74\x62\x6C\x6F\x63\x6B\x00\x00\x06\x00\x07\x00\x71\x00\x00\x00\x00\x00\x00\x00\x6C\x5F\x63\x75" +"\x62\x65\x6D\x61\x74\x72\x69\x78\x00\x00\x00\x00\x06\x00\x07\x00\x71\x00\x00\x00\x01\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x70" +"\x6F\x73\x69\x74\x69\x6F\x6E\x00\x06\x00\x05\x00\x71\x00\x00\x00\x02\x00\x00\x00\x6C\x70\x61\x64\x31\x00\x00\x00\x06\x00\x07\x00" +"\x71\x00\x00\x00\x03\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x71\x00\x00\x00" +"\x04\x00\x00\x00\x6C\x70\x61\x64\x32\x00\x00\x00\x06\x00\x08\x00\x71\x00\x00\x00\x05\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63" +"\x6F\x6C\x6F\x75\x72\x73\x63\x61\x6C\x65\x00\x00\x06\x00\x07\x00\x71\x00\x00\x00\x06\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x72" +"\x61\x64\x69\x75\x73\x00\x00\x00\x06\x00\x07\x00\x71\x00\x00\x00\x07\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x70" +"\x72\x6F\x6A\x00\x06\x00\x08\x00\x71\x00\x00\x00\x08\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x73\x63\x61\x6C\x65" +"\x00\x00\x00\x00\x06\x00\x05\x00\x71\x00\x00\x00\x09\x00\x00\x00\x6C\x70\x61\x64\x33\x00\x00\x00\x05\x00\x03\x00\x73\x00\x00\x00" +"\x00\x00\x00\x00\x05\x00\x05\x00\x75\x00\x00\x00\x76\x5F\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x00\x05\x00\x05\x00\x76\x00\x00\x00" +"\x76\x5F\x6C\x6D\x63\x6F\x6F\x72\x64\x00\x00\x00\x05\x00\x05\x00\x77\x00\x00\x00\x76\x5F\x73\x76\x65\x63\x74\x6F\x72\x00\x00\x00" +"\x05\x00\x05\x00\x78\x00\x00\x00\x76\x5F\x74\x76\x65\x63\x74\x6F\x72\x00\x00\x00\x47\x00\x04\x00\x0E\x00\x00\x00\x01\x00\x00\x00" +"\x0E\x01\x00\x00\x47\x00\x04\x00\x0F\x00\x00\x00\x01\x00\x00\x00\x0F\x01\x00\x00\x47\x00\x04\x00\x10\x00\x00\x00\x01\x00\x00\x00" +"\x10\x01\x00\x00\x47\x00\x04\x00\x13\x00\x00\x00\x01\x00\x00\x00\x11\x01\x00\x00\x47\x00\x04\x00\x14\x00\x00\x00\x01\x00\x00\x00" +"\x12\x01\x00\x00\x47\x00\x04\x00\x15\x00\x00\x00\x01\x00\x00\x00\x13\x01\x00\x00\x47\x00\x04\x00\x18\x00\x00\x00\x01\x00\x00\x00" +"\x16\x01\x00\x00\x47\x00\x04\x00\x19\x00\x00\x00\x01\x00\x00\x00\x17\x01\x00\x00\x47\x00\x04\x00\x1A\x00\x00\x00\x01\x00\x00\x00" +"\x18\x01\x00\x00\x47\x00\x04\x00\x21\x00\x00\x00\x06\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x23\x00\x00\x00\x00\x00\x00\x00" +"\x05\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00" +"\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x23\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00" +"\x23\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00" +"\x10\x00\x00\x00\x48\x00\x04\x00\x23\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x02\x00\x00\x00" +"\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00" +"\x23\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\xC0\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00" +"\xCC\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00\xD0\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00" +"\x06\x00\x00\x00\x23\x00\x00\x00\xDC\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\xE0\x00\x00\x00" +"\x48\x00\x05\x00\x23\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00\xEC\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x09\x00\x00\x00" +"\x23\x00\x00\x00\xF0\x00\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x0A\x00\x00\x00\x23\x00\x00\x00\xFC\x00\x00\x00\x48\x00\x05\x00" +"\x23\x00\x00\x00\x0B\x00\x00\x00\x23\x00\x00\x00\x00\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x0C\x00\x00\x00\x23\x00\x00\x00" +"\x40\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x0D\x00\x00\x00\x23\x00\x00\x00\x4C\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00" +"\x0E\x00\x00\x00\x23\x00\x00\x00\x50\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x0F\x00\x00\x00\x23\x00\x00\x00\x5C\x01\x00\x00" +"\x48\x00\x05\x00\x23\x00\x00\x00\x10\x00\x00\x00\x23\x00\x00\x00\x60\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x11\x00\x00\x00" +"\x23\x00\x00\x00\x6C\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x12\x00\x00\x00\x23\x00\x00\x00\x70\x01\x00\x00\x48\x00\x05\x00" +"\x23\x00\x00\x00\x13\x00\x00\x00\x23\x00\x00\x00\x80\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x14\x00\x00\x00\x23\x00\x00\x00" +"\x90\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00\x15\x00\x00\x00\x23\x00\x00\x00\x94\x01\x00\x00\x48\x00\x05\x00\x23\x00\x00\x00" +"\x16\x00\x00\x00\x23\x00\x00\x00\x98\x01\x00\x00\x47\x00\x03\x00\x23\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x25\x00\x00\x00" +"\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x25\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x2C\x00\x00\x00" +"\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x49\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x4B\x00\x00\x00" +"\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00\x4E\x00\x00\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00\x51\x00\x00\x00" +"\x1E\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x52\x00\x00\x00\x1E\x00\x00\x00\x04\x00\x00\x00\x47\x00\x04\x00\x54\x00\x00\x00" +"\x1E\x00\x00\x00\x03\x00\x00\x00\x48\x00\x05\x00\x5B\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x00\x00\x00\x00\x47\x00\x03\x00" +"\x5B\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x60\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x47\x00\x04\x00\x61\x00\x00\x00" +"\x01\x00\x00\x00\x01\x01\x00\x00\x47\x00\x04\x00\x62\x00\x00\x00\x01\x00\x00\x00\x02\x01\x00\x00\x47\x00\x04\x00\x63\x00\x00\x00" +"\x01\x00\x00\x00\x03\x01\x00\x00\x47\x00\x04\x00\x64\x00\x00\x00\x01\x00\x00\x00\x04\x01\x00\x00\x47\x00\x04\x00\x65\x00\x00\x00" +"\x01\x00\x00\x00\x05\x01\x00\x00\x47\x00\x04\x00\x66\x00\x00\x00\x01\x00\x00\x00\x06\x01\x00\x00\x47\x00\x04\x00\x67\x00\x00\x00" +"\x01\x00\x00\x00\x07\x01\x00\x00\x47\x00\x04\x00\x68\x00\x00\x00\x01\x00\x00\x00\x08\x01\x00\x00\x47\x00\x04\x00\x69\x00\x00\x00" +"\x01\x00\x00\x00\x09\x01\x00\x00\x47\x00\x04\x00\x6A\x00\x00\x00\x01\x00\x00\x00\x0A\x01\x00\x00\x47\x00\x04\x00\x6B\x00\x00\x00" +"\x01\x00\x00\x00\x0B\x01\x00\x00\x47\x00\x04\x00\x6C\x00\x00\x00\x01\x00\x00\x00\x0C\x01\x00\x00\x47\x00\x04\x00\x6D\x00\x00\x00" +"\x01\x00\x00\x00\x0D\x01\x00\x00\x47\x00\x04\x00\x6E\x00\x00\x00\x01\x00\x00\x00\x14\x01\x00\x00\x47\x00\x04\x00\x6F\x00\x00\x00" +"\x01\x00\x00\x00\x15\x01\x00\x00\x47\x00\x04\x00\x70\x00\x00\x00\x01\x00\x00\x00\x15\x00\x00\x00\x48\x00\x04\x00\x71\x00\x00\x00" +"\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00" +"\x71\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00" +"\x40\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x4C\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00" +"\x03\x00\x00\x00\x23\x00\x00\x00\x50\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00\x5C\x00\x00\x00" +"\x48\x00\x05\x00\x71\x00\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00\x60\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00\x06\x00\x00\x00" +"\x23\x00\x00\x00\x6C\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\x70\x00\x00\x00\x48\x00\x05\x00" +"\x71\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x71\x00\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00" +"\x88\x00\x00\x00\x47\x00\x03\x00\x71\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x73\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00" +"\x47\x00\x04\x00\x73\x00\x00\x00\x21\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00\x75\x00\x00\x00\x1E\x00\x00\x00\x02\x00\x00\x00" +"\x47\x00\x04\x00\x76\x00\x00\x00\x1E\x00\x00\x00\x03\x00\x00\x00\x47\x00\x04\x00\x77\x00\x00\x00\x1E\x00\x00\x00\x05\x00\x00\x00" +"\x47\x00\x04\x00\x78\x00\x00\x00\x1E\x00\x00\x00\x06\x00\x00\x00\x13\x00\x02\x00\x02\x00\x00\x00\x21\x00\x03\x00\x03\x00\x00\x00" +"\x02\x00\x00\x00\x16\x00\x03\x00\x06\x00\x00\x00\x20\x00\x00\x00\x17\x00\x04\x00\x07\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00" +"\x21\x00\x03\x00\x08\x00\x00\x00\x07\x00\x00\x00\x17\x00\x04\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00" +"\x0C\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x3B\x00\x04\x00\x0C\x00\x00\x00\x0D\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00" +"\x06\x00\x00\x00\x0E\x00\x00\x00\x00\x00\x87\x43\x32\x00\x04\x00\x06\x00\x00\x00\x0F\x00\x00\x00\x00\x80\x87\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x10\x00\x00\x00\x00\x00\x88\x43\x3B\x00\x04\x00\x0C\x00\x00\x00\x12\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00" +"\x06\x00\x00\x00\x13\x00\x00\x00\x00\x80\x88\x43\x32\x00\x04\x00\x06\x00\x00\x00\x14\x00\x00\x00\x00\x00\x89\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x15\x00\x00\x00\x00\x80\x89\x43\x3B\x00\x04\x00\x0C\x00\x00\x00\x17\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00" +"\x06\x00\x00\x00\x18\x00\x00\x00\x00\x00\x8B\x43\x32\x00\x04\x00\x06\x00\x00\x00\x19\x00\x00\x00\x00\x80\x8B\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x1A\x00\x00\x00\x00\x00\x8C\x43\x20\x00\x04\x00\x1C\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x18\x00\x04\x00" +"\x1E\x00\x00\x00\x07\x00\x00\x00\x04\x00\x00\x00\x15\x00\x04\x00\x1F\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00" +"\x1F\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x1C\x00\x04\x00\x21\x00\x00\x00\x07\x00\x00\x00\x20\x00\x00\x00\x17\x00\x04\x00" +"\x22\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x1E\x00\x19\x00\x23\x00\x00\x00\x1E\x00\x00\x00\x1E\x00\x00\x00\x1E\x00\x00\x00" +"\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00" +"\x21\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00" +"\x07\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x22\x00\x00\x00\x20\x00\x04\x00\x24\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00" +"\x3B\x00\x04\x00\x24\x00\x00\x00\x25\x00\x00\x00\x02\x00\x00\x00\x15\x00\x04\x00\x26\x00\x00\x00\x20\x00\x00\x00\x01\x00\x00\x00" +"\x2B\x00\x04\x00\x26\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x20\x00\x04\x00\x28\x00\x00\x00\x02\x00\x00\x00\x1E\x00\x00\x00" +"\x20\x00\x04\x00\x2B\x00\x00\x00\x01\x00\x00\x00\x0B\x00\x00\x00\x3B\x00\x04\x00\x2B\x00\x00\x00\x2C\x00\x00\x00\x01\x00\x00\x00" +"\x2B\x00\x04\x00\x06\x00\x00\x00\x2E\x00\x00\x00\x00\x00\x80\x3F\x2B\x00\x04\x00\x06\x00\x00\x00\x34\x00\x00\x00\x00\x00\x80\xBF" +"\x2B\x00\x04\x00\x1F\x00\x00\x00\x35\x00\x00\x00\x01\x00\x00\x00\x20\x00\x04\x00\x36\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00" +"\x2B\x00\x04\x00\x1F\x00\x00\x00\x3B\x00\x00\x00\x02\x00\x00\x00\x2B\x00\x04\x00\x1F\x00\x00\x00\x3E\x00\x00\x00\x03\x00\x00\x00" +"\x2B\x00\x04\x00\x06\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x40\x20\x00\x04\x00\x48\x00\x00\x00\x03\x00\x00\x00\x22\x00\x00\x00" +"\x3B\x00\x04\x00\x48\x00\x00\x00\x49\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x4A\x00\x00\x00\x01\x00\x00\x00\x22\x00\x00\x00" +"\x3B\x00\x04\x00\x4A\x00\x00\x00\x4B\x00\x00\x00\x01\x00\x00\x00\x20\x00\x04\x00\x4D\x00\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00" +"\x3B\x00\x04\x00\x4D\x00\x00\x00\x4E\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x50\x00\x00\x00\x03\x00\x00\x00\x0B\x00\x00\x00" +"\x3B\x00\x04\x00\x50\x00\x00\x00\x51\x00\x00\x00\x03\x00\x00\x00\x3B\x00\x04\x00\x2B\x00\x00\x00\x52\x00\x00\x00\x01\x00\x00\x00" +"\x3B\x00\x04\x00\x50\x00\x00\x00\x54\x00\x00\x00\x03\x00\x00\x00\x2B\x00\x04\x00\x26\x00\x00\x00\x55\x00\x00\x00\x03\x00\x00\x00" +"\x20\x00\x04\x00\x56\x00\x00\x00\x02\x00\x00\x00\x0B\x00\x00\x00\x1E\x00\x03\x00\x5B\x00\x00\x00\x07\x00\x00\x00\x20\x00\x04\x00" +"\x5C\x00\x00\x00\x03\x00\x00\x00\x5B\x00\x00\x00\x3B\x00\x04\x00\x5C\x00\x00\x00\x5D\x00\x00\x00\x03\x00\x00\x00\x32\x00\x04\x00" +"\x26\x00\x00\x00\x60\x00\x00\x00\x00\x01\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x61\x00\x00\x00\x00\x80\x80\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x62\x00\x00\x00\x00\x00\x81\x43\x32\x00\x04\x00\x06\x00\x00\x00\x63\x00\x00\x00\x00\x80\x81\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x64\x00\x00\x00\x00\x00\x82\x43\x32\x00\x04\x00\x26\x00\x00\x00\x65\x00\x00\x00\x05\x01\x00\x00\x32\x00\x04\x00" +"\x06\x00\x00\x00\x66\x00\x00\x00\x00\x00\x83\x43\x32\x00\x04\x00\x06\x00\x00\x00\x67\x00\x00\x00\x00\x80\x83\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x68\x00\x00\x00\x00\x00\x84\x43\x32\x00\x04\x00\x06\x00\x00\x00\x69\x00\x00\x00\x00\x80\x84\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x6A\x00\x00\x00\x00\x00\x85\x43\x32\x00\x04\x00\x06\x00\x00\x00\x6B\x00\x00\x00\x00\x80\x85\x43\x32\x00\x04\x00" +"\x06\x00\x00\x00\x6C\x00\x00\x00\x00\x00\x86\x43\x32\x00\x04\x00\x26\x00\x00\x00\x6D\x00\x00\x00\x0D\x01\x00\x00\x32\x00\x04\x00" +"\x26\x00\x00\x00\x6E\x00\x00\x00\x14\x01\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x6F\x00\x00\x00\x00\x80\x8A\x43\x32\x00\x04\x00" +"\x26\x00\x00\x00\x70\x00\x00\x00\x15\x00\x00\x00\x1E\x00\x0C\x00\x71\x00\x00\x00\x1E\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00" +"\x0B\x00\x00\x00\x06\x00\x00\x00\x0B\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x22\x00\x00\x00\x22\x00\x00\x00\x20\x00\x04\x00" +"\x72\x00\x00\x00\x02\x00\x00\x00\x71\x00\x00\x00\x3B\x00\x04\x00\x72\x00\x00\x00\x73\x00\x00\x00\x02\x00\x00\x00\x20\x00\x04\x00" +"\x74\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x74\x00\x00\x00\x75\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00" +"\x4A\x00\x00\x00\x76\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00\x2B\x00\x00\x00\x77\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00" +"\x2B\x00\x00\x00\x78\x00\x00\x00\x01\x00\x00\x00\x36\x00\x05\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00" +"\xF8\x00\x02\x00\x05\x00\x00\x00\x50\x00\x06\x00\x0B\x00\x00\x00\x11\x00\x00\x00\x0E\x00\x00\x00\x0F\x00\x00\x00\x10\x00\x00\x00" +"\x3E\x00\x03\x00\x0D\x00\x00\x00\x11\x00\x00\x00\x50\x00\x06\x00\x0B\x00\x00\x00\x16\x00\x00\x00\x13\x00\x00\x00\x14\x00\x00\x00" +"\x15\x00\x00\x00\x3E\x00\x03\x00\x12\x00\x00\x00\x16\x00\x00\x00\x50\x00\x06\x00\x0B\x00\x00\x00\x1B\x00\x00\x00\x18\x00\x00\x00" +"\x19\x00\x00\x00\x1A\x00\x00\x00\x3E\x00\x03\x00\x17\x00\x00\x00\x1B\x00\x00\x00\x3D\x00\x04\x00\x22\x00\x00\x00\x4C\x00\x00\x00" +"\x4B\x00\x00\x00\x3E\x00\x03\x00\x49\x00\x00\x00\x4C\x00\x00\x00\x39\x00\x04\x00\x07\x00\x00\x00\x4F\x00\x00\x00\x09\x00\x00\x00" +"\x3E\x00\x03\x00\x4E\x00\x00\x00\x4F\x00\x00\x00\x3D\x00\x04\x00\x0B\x00\x00\x00\x53\x00\x00\x00\x52\x00\x00\x00\x3E\x00\x03\x00" +"\x51\x00\x00\x00\x53\x00\x00\x00\x41\x00\x05\x00\x56\x00\x00\x00\x57\x00\x00\x00\x25\x00\x00\x00\x55\x00\x00\x00\x3D\x00\x04\x00" +"\x0B\x00\x00\x00\x58\x00\x00\x00\x57\x00\x00\x00\x3D\x00\x04\x00\x0B\x00\x00\x00\x59\x00\x00\x00\x2C\x00\x00\x00\x83\x00\x05\x00" +"\x0B\x00\x00\x00\x5A\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00\x3E\x00\x03\x00\x54\x00\x00\x00\x5A\x00\x00\x00\x3D\x00\x04\x00" +"\x07\x00\x00\x00\x5E\x00\x00\x00\x4E\x00\x00\x00\x41\x00\x05\x00\x4D\x00\x00\x00\x5F\x00\x00\x00\x5D\x00\x00\x00\x27\x00\x00\x00" +"\x3E\x00\x03\x00\x5F\x00\x00\x00\x5E\x00\x00\x00\xFD\x00\x01\x00\x38\x00\x01\x00\x36\x00\x05\x00\x07\x00\x00\x00\x09\x00\x00\x00" +"\x00\x00\x00\x00\x08\x00\x00\x00\xF8\x00\x02\x00\x0A\x00\x00\x00\x3B\x00\x04\x00\x1C\x00\x00\x00\x1D\x00\x00\x00\x07\x00\x00\x00" +"\x41\x00\x05\x00\x28\x00\x00\x00\x29\x00\x00\x00\x25\x00\x00\x00\x27\x00\x00\x00\x3D\x00\x04\x00\x1E\x00\x00\x00\x2A\x00\x00\x00" +"\x29\x00\x00\x00\x3D\x00\x04\x00\x0B\x00\x00\x00\x2D\x00\x00\x00\x2C\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x2F\x00\x00\x00" +"\x2D\x00\x00\x00\x00\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x30\x00\x00\x00\x2D\x00\x00\x00\x01\x00\x00\x00\x51\x00\x05\x00" +"\x06\x00\x00\x00\x31\x00\x00\x00\x2D\x00\x00\x00\x02\x00\x00\x00\x50\x00\x07\x00\x07\x00\x00\x00\x32\x00\x00\x00\x2F\x00\x00\x00" +"\x30\x00\x00\x00\x31\x00\x00\x00\x2E\x00\x00\x00\x91\x00\x05\x00\x07\x00\x00\x00\x33\x00\x00\x00\x2A\x00\x00\x00\x32\x00\x00\x00" +"\x3E\x00\x03\x00\x1D\x00\x00\x00\x33\x00\x00\x00\x41\x00\x05\x00\x36\x00\x00\x00\x37\x00\x00\x00\x1D\x00\x00\x00\x35\x00\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\x38\x00\x00\x00\x37\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x39\x00\x00\x00\x38\x00\x00\x00" +"\x34\x00\x00\x00\x41\x00\x05\x00\x36\x00\x00\x00\x3A\x00\x00\x00\x1D\x00\x00\x00\x35\x00\x00\x00\x3E\x00\x03\x00\x3A\x00\x00\x00" +"\x39\x00\x00\x00\x41\x00\x05\x00\x36\x00\x00\x00\x3C\x00\x00\x00\x1D\x00\x00\x00\x3B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x3D\x00\x00\x00\x3C\x00\x00\x00\x41\x00\x05\x00\x36\x00\x00\x00\x3F\x00\x00\x00\x1D\x00\x00\x00\x3E\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\x40\x00\x00\x00\x3F\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x41\x00\x00\x00\x3D\x00\x00\x00\x40\x00\x00\x00" +"\x88\x00\x05\x00\x06\x00\x00\x00\x43\x00\x00\x00\x41\x00\x00\x00\x42\x00\x00\x00\x41\x00\x05\x00\x36\x00\x00\x00\x44\x00\x00\x00" +"\x1D\x00\x00\x00\x3B\x00\x00\x00\x3E\x00\x03\x00\x44\x00\x00\x00\x43\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x45\x00\x00\x00" +"\x1D\x00\x00\x00\xFE\x00\x02\x00\x45\x00\x00\x00\x38\x00\x01\x00\x03\x02\x23\x07\x00\x00\x01\x00\x01\x00\x08\x00\x2F\x02\x00\x00" +"\x00\x00\x00\x00\x11\x00\x02\x00\x01\x00\x00\x00\x0B\x00\x06\x00\x01\x00\x00\x00\x47\x4C\x53\x4C\x2E\x73\x74\x64\x2E\x34\x35\x30" +"\x00\x00\x00\x00\x0E\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0F\x00\x0B\x00\x04\x00\x00\x00\x04\x00\x00\x00\x6D\x61\x69\x6E" +"\x00\x00\x00\x00\x45\x00\x00\x00\x18\x01\x00\x00\x25\x01\x00\x00\x32\x01\x00\x00\x80\x01\x00\x00\x26\x02\x00\x00\x10\x00\x03\x00" +"\x04\x00\x00\x00\x07\x00\x00\x00\x03\x00\x03\x00\x02\x00\x00\x00\xC2\x01\x00\x00\x05\x00\x04\x00\x04\x00\x00\x00\x6D\x61\x69\x6E" +"\x00\x00\x00\x00\x05\x00\x05\x00\x0B\x00\x00\x00\x66\x6F\x67\x33\x28\x76\x66\x33\x3B\x00\x00\x00\x05\x00\x06\x00\x0A\x00\x00\x00" +"\x72\x65\x67\x75\x6C\x61\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x05\x00\x07\x00\x0E\x00\x00\x00\x66\x6F\x67\x33\x61\x64\x64\x69" +"\x74\x69\x76\x65\x28\x76\x66\x33\x3B\x00\x00\x00\x05\x00\x06\x00\x0D\x00\x00\x00\x72\x65\x67\x75\x6C\x61\x72\x63\x6F\x6C\x6F\x75" +"\x72\x00\x00\x00\x05\x00\x05\x00\x14\x00\x00\x00\x66\x6F\x67\x34\x28\x76\x66\x34\x3B\x00\x00\x00\x05\x00\x06\x00\x13\x00\x00\x00" +"\x72\x65\x67\x75\x6C\x61\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x05\x00\x07\x00\x17\x00\x00\x00\x66\x6F\x67\x34\x61\x64\x64\x69" +"\x74\x69\x76\x65\x28\x76\x66\x34\x3B\x00\x00\x00\x05\x00\x06\x00\x16\x00\x00\x00\x72\x65\x67\x75\x6C\x61\x72\x63\x6F\x6C\x6F\x75" +"\x72\x00\x00\x00\x05\x00\x06\x00\x1A\x00\x00\x00\x66\x6F\x67\x34\x62\x6C\x65\x6E\x64\x28\x76\x66\x34\x3B\x00\x00\x05\x00\x06\x00" +"\x19\x00\x00\x00\x72\x65\x67\x75\x6C\x61\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x05\x00\x06\x00\x1D\x00\x00\x00\x61\x72\x67\x5F" +"\x74\x69\x6E\x74\x5F\x72\x65\x66\x72\x00\x00\x00\x05\x00\x06\x00\x22\x00\x00\x00\x61\x72\x67\x5F\x74\x69\x6E\x74\x5F\x72\x65\x66" +"\x6C\x00\x00\x00\x05\x00\x05\x00\x27\x00\x00\x00\x61\x72\x67\x5F\x66\x6F\x67\x74\x69\x6E\x74\x00\x05\x00\x03\x00\x37\x00\x00\x00" +"\x7A\x00\x00\x00\x05\x00\x05\x00\x3D\x00\x00\x00\x65\x6E\x74\x69\x74\x79\x62\x6C\x6F\x63\x6B\x00\x06\x00\x07\x00\x3D\x00\x00\x00" +"\x00\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x76\x69\x65\x77\x70\x72\x6F\x6A\x00\x06\x00\x05\x00\x3D\x00\x00\x00\x01\x00\x00\x00" +"\x6D\x5F\x6D\x6F\x64\x65\x6C\x00\x06\x00\x06\x00\x3D\x00\x00\x00\x02\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x69\x6E\x76\x00\x00" +"\x06\x00\x06\x00\x3D\x00\x00\x00\x03\x00\x00\x00\x65\x5F\x65\x79\x65\x70\x6F\x73\x00\x00\x00\x00\x06\x00\x05\x00\x3D\x00\x00\x00" +"\x04\x00\x00\x00\x65\x5F\x74\x69\x6D\x65\x00\x00\x06\x00\x07\x00\x3D\x00\x00\x00\x05\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F" +"\x61\x6D\x62\x69\x65\x6E\x74\x00\x06\x00\x05\x00\x3D\x00\x00\x00\x06\x00\x00\x00\x65\x70\x61\x64\x31\x00\x00\x00\x06\x00\x06\x00" +"\x3D\x00\x00\x00\x07\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x64\x69\x72\x00\x06\x00\x05\x00\x3D\x00\x00\x00\x08\x00\x00\x00" +"\x65\x70\x61\x64\x32\x00\x00\x00\x06\x00\x06\x00\x3D\x00\x00\x00\x09\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x6D\x75\x6C\x00" +"\x06\x00\x05\x00\x3D\x00\x00\x00\x0A\x00\x00\x00\x65\x70\x61\x64\x33\x00\x00\x00\x06\x00\x06\x00\x3D\x00\x00\x00\x0B\x00\x00\x00" +"\x65\x5F\x6C\x6D\x73\x63\x61\x6C\x65\x73\x00\x00\x06\x00\x07\x00\x3D\x00\x00\x00\x0C\x00\x00\x00\x65\x5F\x75\x70\x70\x65\x72\x63" +"\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x3D\x00\x00\x00\x0D\x00\x00\x00\x65\x70\x61\x64\x34\x00\x00\x00\x06\x00\x07\x00" +"\x3D\x00\x00\x00\x0E\x00\x00\x00\x65\x5F\x6C\x6F\x77\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x3D\x00\x00\x00" +"\x0F\x00\x00\x00\x65\x70\x61\x64\x35\x00\x00\x00\x06\x00\x06\x00\x3D\x00\x00\x00\x10\x00\x00\x00\x65\x5F\x67\x6C\x6F\x77\x6D\x6F" +"\x64\x00\x00\x00\x06\x00\x05\x00\x3D\x00\x00\x00\x11\x00\x00\x00\x65\x70\x61\x64\x36\x00\x00\x00\x06\x00\x07\x00\x3D\x00\x00\x00" +"\x12\x00\x00\x00\x65\x5F\x63\x6F\x6C\x6F\x75\x72\x69\x64\x65\x6E\x74\x00\x00\x00\x06\x00\x07\x00\x3D\x00\x00\x00\x13\x00\x00\x00" +"\x77\x5F\x66\x6F\x67\x63\x6F\x6C\x6F\x75\x72\x73\x00\x00\x00\x00\x06\x00\x07\x00\x3D\x00\x00\x00\x14\x00\x00\x00\x77\x5F\x66\x6F" +"\x67\x64\x65\x6E\x73\x69\x74\x79\x00\x00\x00\x00\x06\x00\x07\x00\x3D\x00\x00\x00\x15\x00\x00\x00\x77\x5F\x66\x6F\x67\x64\x65\x70" +"\x74\x68\x62\x69\x61\x73\x00\x00\x06\x00\x05\x00\x3D\x00\x00\x00\x16\x00\x00\x00\x65\x70\x61\x64\x37\x00\x00\x00\x05\x00\x03\x00" +"\x3F\x00\x00\x00\x00\x00\x00\x00\x05\x00\x06\x00\x45\x00\x00\x00\x67\x6C\x5F\x46\x72\x61\x67\x43\x6F\x6F\x72\x64\x00\x00\x00\x00" +"\x05\x00\x03\x00\x5D\x00\x00\x00\x66\x61\x63\x00\x05\x00\x03\x00\x7E\x00\x00\x00\x7A\x00\x00\x00\x05\x00\x03\x00\x92\x00\x00\x00" +"\x66\x61\x63\x00\x05\x00\x04\x00\xAB\x00\x00\x00\x70\x61\x72\x61\x6D\x00\x00\x00\x05\x00\x03\x00\xBE\x00\x00\x00\x7A\x00\x00\x00" +"\x05\x00\x03\x00\xD2\x00\x00\x00\x66\x61\x63\x00\x05\x00\x03\x00\xEE\x00\x00\x00\x7A\x00\x00\x00\x05\x00\x03\x00\x02\x01\x00\x00" +"\x66\x61\x63\x00\x05\x00\x03\x00\x17\x01\x00\x00\x73\x74\x63\x00\x05\x00\x03\x00\x18\x01\x00\x00\x74\x66\x00\x00\x05\x00\x04\x00" +"\x25\x01\x00\x00\x6E\x6F\x72\x6D\x00\x00\x00\x00\x05\x00\x03\x00\x30\x01\x00\x00\x6E\x74\x63\x00\x05\x00\x03\x00\x32\x01\x00\x00" +"\x74\x63\x00\x00\x05\x00\x03\x00\x4C\x01\x00\x00\x6E\x00\x00\x00\x05\x00\x05\x00\x50\x01\x00\x00\x73\x5F\x6E\x6F\x72\x6D\x61\x6C" +"\x6D\x61\x70\x00\x05\x00\x04\x00\x73\x01\x00\x00\x73\x5F\x74\x32\x00\x00\x00\x00\x05\x00\x04\x00\x7E\x01\x00\x00\x66\x72\x65\x73" +"\x00\x00\x00\x00\x05\x00\x03\x00\x80\x01\x00\x00\x65\x79\x65\x00\x05\x00\x03\x00\x90\x01\x00\x00\x66\x61\x72\x00\x05\x00\x04\x00" +"\x92\x01\x00\x00\x6E\x65\x61\x72\x00\x00\x00\x00\x05\x00\x04\x00\x94\x01\x00\x00\x73\x64\x65\x70\x74\x68\x00\x00\x05\x00\x04\x00" +"\xA8\x01\x00\x00\x67\x64\x65\x70\x74\x68\x00\x00\x05\x00\x04\x00\xA9\x01\x00\x00\x73\x5F\x74\x33\x00\x00\x00\x00\x05\x00\x04\x00" +"\xBF\x01\x00\x00\x64\x65\x70\x74\x68\x00\x00\x00\x05\x00\x04\x00\xD2\x01\x00\x00\x72\x65\x66\x72\x00\x00\x00\x00\x05\x00\x04\x00" +"\xD3\x01\x00\x00\x73\x5F\x74\x30\x00\x00\x00\x00\x05\x00\x04\x00\xF0\x01\x00\x00\x72\x65\x66\x6C\x00\x00\x00\x00\x05\x00\x04\x00" +"\xF1\x01\x00\x00\x73\x5F\x74\x31\x00\x00\x00\x00\x05\x00\x05\x00\x00\x02\x00\x00\x73\x5F\x64\x69\x66\x66\x75\x73\x65\x00\x00\x00" +"\x05\x00\x03\x00\x0E\x02\x00\x00\x74\x73\x00\x00\x05\x00\x04\x00\x12\x02\x00\x00\x73\x75\x72\x66\x00\x00\x00\x00\x05\x00\x04\x00" +"\x1C\x02\x00\x00\x70\x61\x72\x61\x6D\x00\x00\x00\x05\x00\x05\x00\x26\x02\x00\x00\x6F\x75\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00" +"\x05\x00\x05\x00\x2C\x02\x00\x00\x6C\x69\x67\x68\x74\x62\x6C\x6F\x63\x6B\x00\x00\x06\x00\x07\x00\x2C\x02\x00\x00\x00\x00\x00\x00" +"\x6C\x5F\x63\x75\x62\x65\x6D\x61\x74\x72\x69\x78\x00\x00\x00\x00\x06\x00\x07\x00\x2C\x02\x00\x00\x01\x00\x00\x00\x6C\x5F\x6C\x69" +"\x67\x68\x74\x70\x6F\x73\x69\x74\x69\x6F\x6E\x00\x06\x00\x05\x00\x2C\x02\x00\x00\x02\x00\x00\x00\x6C\x70\x61\x64\x31\x00\x00\x00" +"\x06\x00\x07\x00\x2C\x02\x00\x00\x03\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00" +"\x2C\x02\x00\x00\x04\x00\x00\x00\x6C\x70\x61\x64\x32\x00\x00\x00\x06\x00\x08\x00\x2C\x02\x00\x00\x05\x00\x00\x00\x6C\x5F\x6C\x69" +"\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x73\x63\x61\x6C\x65\x00\x00\x06\x00\x07\x00\x2C\x02\x00\x00\x06\x00\x00\x00\x6C\x5F\x6C\x69" +"\x67\x68\x74\x72\x61\x64\x69\x75\x73\x00\x00\x00\x06\x00\x07\x00\x2C\x02\x00\x00\x07\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77" +"\x6D\x61\x70\x70\x72\x6F\x6A\x00\x06\x00\x08\x00\x2C\x02\x00\x00\x08\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x73" +"\x63\x61\x6C\x65\x00\x00\x00\x00\x06\x00\x05\x00\x2C\x02\x00\x00\x09\x00\x00\x00\x6C\x70\x61\x64\x33\x00\x00\x00\x05\x00\x03\x00" +"\x2E\x02\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x0E\x01\x00\x00\x47\x00\x04\x00\x1F\x00\x00\x00" +"\x01\x00\x00\x00\x0F\x01\x00\x00\x47\x00\x04\x00\x20\x00\x00\x00\x01\x00\x00\x00\x10\x01\x00\x00\x47\x00\x04\x00\x23\x00\x00\x00" +"\x01\x00\x00\x00\x11\x01\x00\x00\x47\x00\x04\x00\x24\x00\x00\x00\x01\x00\x00\x00\x12\x01\x00\x00\x47\x00\x04\x00\x25\x00\x00\x00" +"\x01\x00\x00\x00\x13\x01\x00\x00\x47\x00\x04\x00\x28\x00\x00\x00\x01\x00\x00\x00\x16\x01\x00\x00\x47\x00\x04\x00\x29\x00\x00\x00" +"\x01\x00\x00\x00\x17\x01\x00\x00\x47\x00\x04\x00\x2A\x00\x00\x00\x01\x00\x00\x00\x18\x01\x00\x00\x47\x00\x04\x00\x2D\x00\x00\x00" +"\x01\x00\x00\x00\x15\x00\x00\x00\x47\x00\x04\x00\x3B\x00\x00\x00\x06\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x3D\x00\x00\x00" +"\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00" +"\x3D\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x3D\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00" +"\x48\x00\x05\x00\x3D\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x01\x00\x00\x00" +"\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x3D\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00" +"\x02\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00" +"\x48\x00\x05\x00\x3D\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\xC0\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x04\x00\x00\x00" +"\x23\x00\x00\x00\xCC\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00\xD0\x00\x00\x00\x48\x00\x05\x00" +"\x3D\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\xDC\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00" +"\xE0\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00\xEC\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00" +"\x09\x00\x00\x00\x23\x00\x00\x00\xF0\x00\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x0A\x00\x00\x00\x23\x00\x00\x00\xFC\x00\x00\x00" +"\x48\x00\x05\x00\x3D\x00\x00\x00\x0B\x00\x00\x00\x23\x00\x00\x00\x00\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x0C\x00\x00\x00" +"\x23\x00\x00\x00\x40\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x0D\x00\x00\x00\x23\x00\x00\x00\x4C\x01\x00\x00\x48\x00\x05\x00" +"\x3D\x00\x00\x00\x0E\x00\x00\x00\x23\x00\x00\x00\x50\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x0F\x00\x00\x00\x23\x00\x00\x00" +"\x5C\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x10\x00\x00\x00\x23\x00\x00\x00\x60\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00" +"\x11\x00\x00\x00\x23\x00\x00\x00\x6C\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x12\x00\x00\x00\x23\x00\x00\x00\x70\x01\x00\x00" +"\x48\x00\x05\x00\x3D\x00\x00\x00\x13\x00\x00\x00\x23\x00\x00\x00\x80\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x14\x00\x00\x00" +"\x23\x00\x00\x00\x90\x01\x00\x00\x48\x00\x05\x00\x3D\x00\x00\x00\x15\x00\x00\x00\x23\x00\x00\x00\x94\x01\x00\x00\x48\x00\x05\x00" +"\x3D\x00\x00\x00\x16\x00\x00\x00\x23\x00\x00\x00\x98\x01\x00\x00\x47\x00\x03\x00\x3D\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00" +"\x3F\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x3F\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00" +"\x45\x00\x00\x00\x0B\x00\x00\x00\x0F\x00\x00\x00\x47\x00\x04\x00\x56\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x47\x00\x04\x00" +"\x18\x01\x00\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00\x25\x01\x00\x00\x1E\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00" +"\x32\x01\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x50\x01\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00" +"\x50\x01\x00\x00\x21\x00\x00\x00\x03\x00\x00\x00\x47\x00\x04\x00\x52\x01\x00\x00\x01\x00\x00\x00\x0B\x01\x00\x00\x47\x00\x04\x00" +"\x5E\x01\x00\x00\x01\x00\x00\x00\x0C\x01\x00\x00\x47\x00\x04\x00\x6F\x01\x00\x00\x01\x00\x00\x00\x0D\x01\x00\x00\x47\x00\x04\x00" +"\x73\x01\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x73\x01\x00\x00\x21\x00\x00\x00\x06\x00\x00\x00\x47\x00\x04\x00" +"\x80\x01\x00\x00\x1E\x00\x00\x00\x03\x00\x00\x00\x47\x00\x04\x00\x86\x01\x00\x00\x01\x00\x00\x00\x08\x01\x00\x00\x47\x00\x04\x00" +"\x88\x01\x00\x00\x01\x00\x00\x00\x09\x01\x00\x00\x47\x00\x04\x00\x8A\x01\x00\x00\x01\x00\x00\x00\x0A\x01\x00\x00\x47\x00\x04\x00" +"\x8C\x01\x00\x00\x01\x00\x00\x00\x14\x01\x00\x00\x47\x00\x04\x00\x91\x01\x00\x00\x01\x00\x00\x00\x03\x01\x00\x00\x47\x00\x04\x00" +"\x93\x01\x00\x00\x01\x00\x00\x00\x04\x01\x00\x00\x47\x00\x04\x00\xA9\x01\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00" +"\xA9\x01\x00\x00\x21\x00\x00\x00\x07\x00\x00\x00\x47\x00\x04\x00\xD3\x01\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00" +"\xD3\x01\x00\x00\x21\x00\x00\x00\x04\x00\x00\x00\x47\x00\x04\x00\xD8\x01\x00\x00\x01\x00\x00\x00\x07\x01\x00\x00\x47\x00\x04\x00" +"\xDA\x01\x00\x00\x01\x00\x00\x00\x02\x01\x00\x00\x47\x00\x04\x00\xEC\x01\x00\x00\x01\x00\x00\x00\x05\x01\x00\x00\x47\x00\x04\x00" +"\xF1\x01\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\xF1\x01\x00\x00\x21\x00\x00\x00\x05\x00\x00\x00\x47\x00\x04\x00" +"\xF6\x01\x00\x00\x01\x00\x00\x00\x06\x01\x00\x00\x47\x00\x04\x00\xF8\x01\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00\x47\x00\x04\x00" +"\x00\x02\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x00\x02\x00\x00\x21\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00" +"\x0A\x02\x00\x00\x01\x00\x00\x00\x15\x01\x00\x00\x47\x00\x04\x00\x26\x02\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x48\x00\x04\x00" +"\x2C\x02\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00" +"\x48\x00\x05\x00\x2C\x02\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00\x01\x00\x00\x00" +"\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x4C\x00\x00\x00\x48\x00\x05\x00" +"\x2C\x02\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\x50\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00" +"\x5C\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00\x60\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00" +"\x06\x00\x00\x00\x23\x00\x00\x00\x6C\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\x70\x00\x00\x00" +"\x48\x00\x05\x00\x2C\x02\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x2C\x02\x00\x00\x09\x00\x00\x00" +"\x23\x00\x00\x00\x88\x00\x00\x00\x47\x00\x03\x00\x2C\x02\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x2E\x02\x00\x00\x22\x00\x00\x00" +"\x00\x00\x00\x00\x47\x00\x04\x00\x2E\x02\x00\x00\x21\x00\x00\x00\x01\x00\x00\x00\x13\x00\x02\x00\x02\x00\x00\x00\x21\x00\x03\x00" +"\x03\x00\x00\x00\x02\x00\x00\x00\x16\x00\x03\x00\x06\x00\x00\x00\x20\x00\x00\x00\x17\x00\x04\x00\x07\x00\x00\x00\x06\x00\x00\x00" +"\x03\x00\x00\x00\x20\x00\x04\x00\x08\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x21\x00\x04\x00\x09\x00\x00\x00\x07\x00\x00\x00" +"\x08\x00\x00\x00\x17\x00\x04\x00\x10\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x20\x00\x04\x00\x11\x00\x00\x00\x07\x00\x00\x00" +"\x10\x00\x00\x00\x21\x00\x04\x00\x12\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x20\x00\x04\x00\x1C\x00\x00\x00\x06\x00\x00\x00" +"\x07\x00\x00\x00\x3B\x00\x04\x00\x1C\x00\x00\x00\x1D\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x1E\x00\x00\x00" +"\x00\x00\x87\x43\x32\x00\x04\x00\x06\x00\x00\x00\x1F\x00\x00\x00\x00\x80\x87\x43\x32\x00\x04\x00\x06\x00\x00\x00\x20\x00\x00\x00" +"\x00\x00\x88\x43\x3B\x00\x04\x00\x1C\x00\x00\x00\x22\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x23\x00\x00\x00" +"\x00\x80\x88\x43\x32\x00\x04\x00\x06\x00\x00\x00\x24\x00\x00\x00\x00\x00\x89\x43\x32\x00\x04\x00\x06\x00\x00\x00\x25\x00\x00\x00" +"\x00\x80\x89\x43\x3B\x00\x04\x00\x1C\x00\x00\x00\x27\x00\x00\x00\x06\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x28\x00\x00\x00" +"\x00\x00\x8B\x43\x32\x00\x04\x00\x06\x00\x00\x00\x29\x00\x00\x00\x00\x80\x8B\x43\x32\x00\x04\x00\x06\x00\x00\x00\x2A\x00\x00\x00" +"\x00\x00\x8C\x43\x15\x00\x04\x00\x2C\x00\x00\x00\x20\x00\x00\x00\x01\x00\x00\x00\x32\x00\x04\x00\x2C\x00\x00\x00\x2D\x00\x00\x00" +"\x15\x00\x00\x00\x2B\x00\x04\x00\x2C\x00\x00\x00\x2E\x00\x00\x00\x00\x00\x00\x00\x14\x00\x02\x00\x2F\x00\x00\x00\x20\x00\x04\x00" +"\x36\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x18\x00\x04\x00\x38\x00\x00\x00\x10\x00\x00\x00\x04\x00\x00\x00\x15\x00\x04\x00" +"\x39\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x39\x00\x00\x00\x3A\x00\x00\x00\x04\x00\x00\x00\x1C\x00\x04\x00" +"\x3B\x00\x00\x00\x10\x00\x00\x00\x3A\x00\x00\x00\x17\x00\x04\x00\x3C\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x1E\x00\x19\x00" +"\x3D\x00\x00\x00\x38\x00\x00\x00\x38\x00\x00\x00\x38\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00" +"\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x3B\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00" +"\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x3C\x00\x00\x00" +"\x20\x00\x04\x00\x3E\x00\x00\x00\x02\x00\x00\x00\x3D\x00\x00\x00\x3B\x00\x04\x00\x3E\x00\x00\x00\x3F\x00\x00\x00\x02\x00\x00\x00" +"\x2B\x00\x04\x00\x2C\x00\x00\x00\x40\x00\x00\x00\x14\x00\x00\x00\x20\x00\x04\x00\x41\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00" +"\x20\x00\x04\x00\x44\x00\x00\x00\x01\x00\x00\x00\x10\x00\x00\x00\x3B\x00\x04\x00\x44\x00\x00\x00\x45\x00\x00\x00\x01\x00\x00\x00" +"\x2B\x00\x04\x00\x39\x00\x00\x00\x46\x00\x00\x00\x02\x00\x00\x00\x20\x00\x04\x00\x47\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00" +"\x2B\x00\x04\x00\x39\x00\x00\x00\x4B\x00\x00\x00\x03\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x4F\x00\x00\x00\x00\x00\x00\x00" +"\x2B\x00\x04\x00\x2C\x00\x00\x00\x51\x00\x00\x00\x15\x00\x00\x00\x32\x00\x04\x00\x2C\x00\x00\x00\x56\x00\x00\x00\x00\x01\x00\x00" +"\x2B\x00\x04\x00\x06\x00\x00\x00\x5F\x00\x00\x00\x3B\xAA\xB8\x3F\x2B\x00\x04\x00\x06\x00\x00\x00\x63\x00\x00\x00\x00\x00\x80\x3F" +"\x2B\x00\x04\x00\x2C\x00\x00\x00\x64\x00\x00\x00\x13\x00\x00\x00\x20\x00\x04\x00\x6E\x00\x00\x00\x02\x00\x00\x00\x10\x00\x00\x00" +"\x20\x00\x04\x00\x16\x01\x00\x00\x07\x00\x00\x00\x3C\x00\x00\x00\x3B\x00\x04\x00\x44\x00\x00\x00\x18\x01\x00\x00\x01\x00\x00\x00" +"\x2B\x00\x04\x00\x06\x00\x00\x00\x21\x01\x00\x00\x00\x00\x00\x3F\x2B\x00\x04\x00\x06\x00\x00\x00\x23\x01\x00\x00\x00\x00\xC0\x3F" +"\x20\x00\x04\x00\x24\x01\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x24\x01\x00\x00\x25\x01\x00\x00\x01\x00\x00\x00" +"\x2B\x00\x04\x00\x06\x00\x00\x00\x29\x01\x00\x00\x00\x00\x87\x44\x2B\x00\x04\x00\x39\x00\x00\x00\x2B\x01\x00\x00\x01\x00\x00\x00" +"\x20\x00\x04\x00\x31\x01\x00\x00\x01\x00\x00\x00\x3C\x00\x00\x00\x3B\x00\x04\x00\x31\x01\x00\x00\x32\x01\x00\x00\x01\x00\x00\x00" +"\x2B\x00\x04\x00\x39\x00\x00\x00\x33\x01\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x2C\x00\x00\x00\x38\x01\x00\x00\x04\x00\x00\x00" +"\x2B\x00\x04\x00\x06\x00\x00\x00\x3D\x01\x00\x00\x00\x00\x00\x3E\x19\x00\x09\x00\x4D\x01\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00" +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x1B\x00\x03\x00\x4E\x01\x00\x00\x4D\x01\x00\x00" +"\x20\x00\x04\x00\x4F\x01\x00\x00\x00\x00\x00\x00\x4E\x01\x00\x00\x3B\x00\x04\x00\x4F\x01\x00\x00\x50\x01\x00\x00\x00\x00\x00\x00" +"\x32\x00\x04\x00\x06\x00\x00\x00\x52\x01\x00\x00\x00\x80\x85\x43\x2B\x00\x04\x00\x06\x00\x00\x00\x57\x01\x00\x00\xCD\xCC\xCC\x3D" +"\x32\x00\x04\x00\x06\x00\x00\x00\x5E\x01\x00\x00\x00\x00\x86\x43\x2B\x00\x04\x00\x06\x00\x00\x00\x63\x01\x00\x00\xF0\xA7\xC6\x3D" +"\x2B\x00\x04\x00\x06\x00\x00\x00\x6B\x01\x00\x00\x00\x00\x7C\x3F\x32\x00\x04\x00\x2C\x00\x00\x00\x6F\x01\x00\x00\x0D\x01\x00\x00" +"\x3B\x00\x04\x00\x4F\x01\x00\x00\x73\x01\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x78\x01\x00\x00\x00\x00\x40\x40" +"\x3B\x00\x04\x00\x24\x01\x00\x00\x80\x01\x00\x00\x01\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x86\x01\x00\x00\x00\x00\x84\x43" +"\x32\x00\x04\x00\x06\x00\x00\x00\x88\x01\x00\x00\x00\x80\x84\x43\x32\x00\x04\x00\x06\x00\x00\x00\x8A\x01\x00\x00\x00\x00\x85\x43" +"\x32\x00\x04\x00\x2C\x00\x00\x00\x8C\x01\x00\x00\x14\x01\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x91\x01\x00\x00\x00\x80\x81\x43" +"\x32\x00\x04\x00\x06\x00\x00\x00\x93\x01\x00\x00\x00\x00\x82\x43\x2B\x00\x04\x00\x06\x00\x00\x00\x97\x01\x00\x00\x00\x00\x00\x40" +"\x3B\x00\x04\x00\x4F\x01\x00\x00\xA9\x01\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\xC9\x01\x00\x00\x00\x00\xC8\x42" +"\x3B\x00\x04\x00\x4F\x01\x00\x00\xD3\x01\x00\x00\x00\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\xD8\x01\x00\x00\x00\x80\x83\x43" +"\x32\x00\x04\x00\x06\x00\x00\x00\xDA\x01\x00\x00\x00\x00\x81\x43\x2B\x00\x04\x00\x06\x00\x00\x00\xE7\x01\x00\x00\x00\x00\x80\x45" +"\x32\x00\x04\x00\x2C\x00\x00\x00\xEC\x01\x00\x00\x05\x01\x00\x00\x3B\x00\x04\x00\x4F\x01\x00\x00\xF1\x01\x00\x00\x00\x00\x00\x00" +"\x32\x00\x04\x00\x06\x00\x00\x00\xF6\x01\x00\x00\x00\x00\x83\x43\x32\x00\x04\x00\x06\x00\x00\x00\xF8\x01\x00\x00\x00\x80\x80\x43" +"\x3B\x00\x04\x00\x4F\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00\x0A\x02\x00\x00\x00\x80\x8A\x43" +"\x20\x00\x04\x00\x25\x02\x00\x00\x03\x00\x00\x00\x10\x00\x00\x00\x3B\x00\x04\x00\x25\x02\x00\x00\x26\x02\x00\x00\x03\x00\x00\x00" +"\x1E\x00\x0C\x00\x2C\x02\x00\x00\x38\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00" +"\x06\x00\x00\x00\x10\x00\x00\x00\x3C\x00\x00\x00\x3C\x00\x00\x00\x20\x00\x04\x00\x2D\x02\x00\x00\x02\x00\x00\x00\x2C\x02\x00\x00" +"\x3B\x00\x04\x00\x2D\x02\x00\x00\x2E\x02\x00\x00\x02\x00\x00\x00\x36\x00\x05\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00" +"\x03\x00\x00\x00\xF8\x00\x02\x00\x05\x00\x00\x00\x3B\x00\x04\x00\x16\x01\x00\x00\x17\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" +"\x16\x01\x00\x00\x30\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x08\x00\x00\x00\x4C\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" +"\x36\x00\x00\x00\x7E\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00\x90\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" +"\x36\x00\x00\x00\x92\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00\x94\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" +"\x36\x00\x00\x00\xA8\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00\xBF\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" +"\x08\x00\x00\x00\xD2\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x08\x00\x00\x00\xF0\x01\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" +"\x11\x00\x00\x00\x0E\x02\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x11\x00\x00\x00\x12\x02\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00" +"\x11\x00\x00\x00\x1C\x02\x00\x00\x07\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\x21\x00\x00\x00\x1E\x00\x00\x00\x1F\x00\x00\x00" +"\x20\x00\x00\x00\x3E\x00\x03\x00\x1D\x00\x00\x00\x21\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\x26\x00\x00\x00\x23\x00\x00\x00" +"\x24\x00\x00\x00\x25\x00\x00\x00\x3E\x00\x03\x00\x22\x00\x00\x00\x26\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\x2B\x00\x00\x00" +"\x28\x00\x00\x00\x29\x00\x00\x00\x2A\x00\x00\x00\x3E\x00\x03\x00\x27\x00\x00\x00\x2B\x00\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00" +"\x19\x01\x00\x00\x18\x01\x00\x00\x4F\x00\x07\x00\x3C\x00\x00\x00\x1A\x01\x00\x00\x19\x01\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00" +"\x01\x00\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00\x1B\x01\x00\x00\x18\x01\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x1C\x01\x00\x00\x1B\x01\x00\x00\x50\x00\x05\x00\x3C\x00\x00\x00\x1D\x01\x00\x00\x1C\x01\x00\x00\x1C\x01\x00\x00\x88\x00\x05\x00" +"\x3C\x00\x00\x00\x1E\x01\x00\x00\x1A\x01\x00\x00\x1D\x01\x00\x00\x50\x00\x05\x00\x3C\x00\x00\x00\x1F\x01\x00\x00\x63\x00\x00\x00" +"\x63\x00\x00\x00\x81\x00\x05\x00\x3C\x00\x00\x00\x20\x01\x00\x00\x1F\x01\x00\x00\x1E\x01\x00\x00\x8E\x00\x05\x00\x3C\x00\x00\x00" +"\x22\x01\x00\x00\x20\x01\x00\x00\x21\x01\x00\x00\x3E\x00\x03\x00\x17\x01\x00\x00\x22\x01\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00" +"\x26\x01\x00\x00\x25\x01\x00\x00\x46\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x27\x01\x00\x00\x26\x01\x00\x00\x85\x00\x05\x00" +"\x06\x00\x00\x00\x28\x01\x00\x00\x23\x01\x00\x00\x27\x01\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\x2A\x01\x00\x00\x28\x01\x00\x00" +"\x29\x01\x00\x00\x41\x00\x05\x00\x36\x00\x00\x00\x2C\x01\x00\x00\x17\x01\x00\x00\x2B\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x2D\x01\x00\x00\x2C\x01\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x2E\x01\x00\x00\x2D\x01\x00\x00\x2A\x01\x00\x00\x41\x00\x05\x00" +"\x36\x00\x00\x00\x2F\x01\x00\x00\x17\x01\x00\x00\x2B\x01\x00\x00\x3E\x00\x03\x00\x2F\x01\x00\x00\x2E\x01\x00\x00\x41\x00\x05\x00" +"\x47\x00\x00\x00\x34\x01\x00\x00\x32\x01\x00\x00\x33\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x35\x01\x00\x00\x34\x01\x00\x00" +"\x41\x00\x05\x00\x47\x00\x00\x00\x36\x01\x00\x00\x32\x01\x00\x00\x2B\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x37\x01\x00\x00" +"\x36\x01\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\x39\x01\x00\x00\x3F\x00\x00\x00\x38\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x3A\x01\x00\x00\x39\x01\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x3B\x01\x00\x00\x37\x01\x00\x00\x3A\x01\x00\x00\x0C\x00\x06\x00" +"\x06\x00\x00\x00\x3C\x01\x00\x00\x01\x00\x00\x00\x0D\x00\x00\x00\x3B\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x3E\x01\x00\x00" +"\x3C\x01\x00\x00\x3D\x01\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x3F\x01\x00\x00\x35\x01\x00\x00\x3E\x01\x00\x00\x41\x00\x05\x00" +"\x36\x00\x00\x00\x40\x01\x00\x00\x30\x01\x00\x00\x33\x01\x00\x00\x3E\x00\x03\x00\x40\x01\x00\x00\x3F\x01\x00\x00\x41\x00\x05\x00" +"\x47\x00\x00\x00\x41\x01\x00\x00\x32\x01\x00\x00\x2B\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x42\x01\x00\x00\x41\x01\x00\x00" +"\x41\x00\x05\x00\x47\x00\x00\x00\x43\x01\x00\x00\x32\x01\x00\x00\x33\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x44\x01\x00\x00" +"\x43\x01\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\x45\x01\x00\x00\x3F\x00\x00\x00\x38\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x46\x01\x00\x00\x45\x01\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x47\x01\x00\x00\x44\x01\x00\x00\x46\x01\x00\x00\x0C\x00\x06\x00" +"\x06\x00\x00\x00\x48\x01\x00\x00\x01\x00\x00\x00\x0D\x00\x00\x00\x47\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x49\x01\x00\x00" +"\x48\x01\x00\x00\x3D\x01\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x4A\x01\x00\x00\x42\x01\x00\x00\x49\x01\x00\x00\x41\x00\x05\x00" +"\x36\x00\x00\x00\x4B\x01\x00\x00\x30\x01\x00\x00\x2B\x01\x00\x00\x3E\x00\x03\x00\x4B\x01\x00\x00\x4A\x01\x00\x00\x3D\x00\x04\x00" +"\x4E\x01\x00\x00\x51\x01\x00\x00\x50\x01\x00\x00\x3D\x00\x04\x00\x3C\x00\x00\x00\x53\x01\x00\x00\x32\x01\x00\x00\x8E\x00\x05\x00" +"\x3C\x00\x00\x00\x54\x01\x00\x00\x53\x01\x00\x00\x52\x01\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\x55\x01\x00\x00\x3F\x00\x00\x00" +"\x38\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x56\x01\x00\x00\x55\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x58\x01\x00\x00" +"\x56\x01\x00\x00\x57\x01\x00\x00\x50\x00\x05\x00\x3C\x00\x00\x00\x59\x01\x00\x00\x58\x01\x00\x00\x4F\x00\x00\x00\x81\x00\x05\x00" +"\x3C\x00\x00\x00\x5A\x01\x00\x00\x54\x01\x00\x00\x59\x01\x00\x00\x57\x00\x05\x00\x10\x00\x00\x00\x5B\x01\x00\x00\x51\x01\x00\x00" +"\x5A\x01\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00\x5C\x01\x00\x00\x5B\x01\x00\x00\x5B\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +"\x02\x00\x00\x00\x3E\x00\x03\x00\x4C\x01\x00\x00\x5C\x01\x00\x00\x3D\x00\x04\x00\x4E\x01\x00\x00\x5D\x01\x00\x00\x50\x01\x00\x00" +"\x3D\x00\x04\x00\x3C\x00\x00\x00\x5F\x01\x00\x00\x32\x01\x00\x00\x8E\x00\x05\x00\x3C\x00\x00\x00\x60\x01\x00\x00\x5F\x01\x00\x00" +"\x5E\x01\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\x61\x01\x00\x00\x3F\x00\x00\x00\x38\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x62\x01\x00\x00\x61\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x64\x01\x00\x00\x62\x01\x00\x00\x63\x01\x00\x00\x50\x00\x05\x00" +"\x3C\x00\x00\x00\x65\x01\x00\x00\x4F\x00\x00\x00\x64\x01\x00\x00\x83\x00\x05\x00\x3C\x00\x00\x00\x66\x01\x00\x00\x60\x01\x00\x00" +"\x65\x01\x00\x00\x57\x00\x05\x00\x10\x00\x00\x00\x67\x01\x00\x00\x5D\x01\x00\x00\x66\x01\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00" +"\x68\x01\x00\x00\x67\x01\x00\x00\x67\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00" +"\x69\x01\x00\x00\x4C\x01\x00\x00\x81\x00\x05\x00\x07\x00\x00\x00\x6A\x01\x00\x00\x69\x01\x00\x00\x68\x01\x00\x00\x3E\x00\x03\x00" +"\x4C\x01\x00\x00\x6A\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x6C\x01\x00\x00\x4C\x01\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00" +"\x6D\x01\x00\x00\x6B\x01\x00\x00\x6B\x01\x00\x00\x6B\x01\x00\x00\x83\x00\x05\x00\x07\x00\x00\x00\x6E\x01\x00\x00\x6C\x01\x00\x00" +"\x6D\x01\x00\x00\x3E\x00\x03\x00\x4C\x01\x00\x00\x6E\x01\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00\x70\x01\x00\x00\x6F\x01\x00\x00" +"\x2E\x00\x00\x00\xF7\x00\x03\x00\x72\x01\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x70\x01\x00\x00\x71\x01\x00\x00\x72\x01\x00\x00" +"\xF8\x00\x02\x00\x71\x01\x00\x00\x3D\x00\x04\x00\x4E\x01\x00\x00\x74\x01\x00\x00\x73\x01\x00\x00\x3D\x00\x04\x00\x3C\x00\x00\x00" +"\x75\x01\x00\x00\x17\x01\x00\x00\x57\x00\x05\x00\x10\x00\x00\x00\x76\x01\x00\x00\x74\x01\x00\x00\x75\x01\x00\x00\x4F\x00\x08\x00" +"\x07\x00\x00\x00\x77\x01\x00\x00\x76\x01\x00\x00\x76\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x8E\x00\x05\x00" +"\x07\x00\x00\x00\x79\x01\x00\x00\x77\x01\x00\x00\x78\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x7A\x01\x00\x00\x4C\x01\x00\x00" +"\x81\x00\x05\x00\x07\x00\x00\x00\x7B\x01\x00\x00\x7A\x01\x00\x00\x79\x01\x00\x00\x3E\x00\x03\x00\x4C\x01\x00\x00\x7B\x01\x00\x00" +"\xF9\x00\x02\x00\x72\x01\x00\x00\xF8\x00\x02\x00\x72\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x7C\x01\x00\x00\x4C\x01\x00\x00" +"\x0C\x00\x06\x00\x07\x00\x00\x00\x7D\x01\x00\x00\x01\x00\x00\x00\x45\x00\x00\x00\x7C\x01\x00\x00\x3E\x00\x03\x00\x4C\x01\x00\x00" +"\x7D\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x7F\x01\x00\x00\x4C\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x81\x01\x00\x00" +"\x80\x01\x00\x00\x0C\x00\x06\x00\x07\x00\x00\x00\x82\x01\x00\x00\x01\x00\x00\x00\x45\x00\x00\x00\x81\x01\x00\x00\x94\x00\x05\x00" +"\x06\x00\x00\x00\x83\x01\x00\x00\x7F\x01\x00\x00\x82\x01\x00\x00\x0C\x00\x06\x00\x06\x00\x00\x00\x84\x01\x00\x00\x01\x00\x00\x00" +"\x04\x00\x00\x00\x83\x01\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x85\x01\x00\x00\x63\x00\x00\x00\x84\x01\x00\x00\x0C\x00\x07\x00" +"\x06\x00\x00\x00\x87\x01\x00\x00\x01\x00\x00\x00\x1A\x00\x00\x00\x85\x01\x00\x00\x86\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00" +"\x89\x01\x00\x00\x87\x01\x00\x00\x88\x01\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x8B\x01\x00\x00\x89\x01\x00\x00\x8A\x01\x00\x00" +"\x3E\x00\x03\x00\x7E\x01\x00\x00\x8B\x01\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00\x8D\x01\x00\x00\x8C\x01\x00\x00\x2E\x00\x00\x00" +"\xF7\x00\x03\x00\x8F\x01\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x8D\x01\x00\x00\x8E\x01\x00\x00\xD1\x01\x00\x00\xF8\x00\x02\x00" +"\x8E\x01\x00\x00\x3E\x00\x03\x00\x90\x01\x00\x00\x91\x01\x00\x00\x3E\x00\x03\x00\x92\x01\x00\x00\x93\x01\x00\x00\x41\x00\x05\x00" +"\x47\x00\x00\x00\x95\x01\x00\x00\x45\x00\x00\x00\x46\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x96\x01\x00\x00\x95\x01\x00\x00" +"\x3E\x00\x03\x00\x94\x01\x00\x00\x96\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x98\x01\x00\x00\x92\x01\x00\x00\x85\x00\x05\x00" +"\x06\x00\x00\x00\x99\x01\x00\x00\x97\x01\x00\x00\x98\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x9A\x01\x00\x00\x90\x01\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\x9B\x01\x00\x00\x92\x01\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x9C\x01\x00\x00\x9A\x01\x00\x00" +"\x9B\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x9D\x01\x00\x00\x94\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x9E\x01\x00\x00" +"\x90\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x9F\x01\x00\x00\x92\x01\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\xA0\x01\x00\x00" +"\x9E\x01\x00\x00\x9F\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xA1\x01\x00\x00\x9D\x01\x00\x00\xA0\x01\x00\x00\x83\x00\x05\x00" +"\x06\x00\x00\x00\xA2\x01\x00\x00\x9C\x01\x00\x00\xA1\x01\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\xA3\x01\x00\x00\x99\x01\x00\x00" +"\xA2\x01\x00\x00\x3E\x00\x03\x00\x94\x01\x00\x00\xA3\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xA4\x01\x00\x00\x92\x01\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\xA5\x01\x00\x00\x90\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xA6\x01\x00\x00\x94\x01\x00\x00" +"\x0C\x00\x08\x00\x06\x00\x00\x00\xA7\x01\x00\x00\x01\x00\x00\x00\x2E\x00\x00\x00\xA4\x01\x00\x00\xA5\x01\x00\x00\xA6\x01\x00\x00" +"\x3E\x00\x03\x00\x94\x01\x00\x00\xA7\x01\x00\x00\x3D\x00\x04\x00\x4E\x01\x00\x00\xAA\x01\x00\x00\xA9\x01\x00\x00\x3D\x00\x04\x00" +"\x3C\x00\x00\x00\xAB\x01\x00\x00\x17\x01\x00\x00\x57\x00\x05\x00\x10\x00\x00\x00\xAC\x01\x00\x00\xAA\x01\x00\x00\xAB\x01\x00\x00" +"\x51\x00\x05\x00\x06\x00\x00\x00\xAD\x01\x00\x00\xAC\x01\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xA8\x01\x00\x00\xAD\x01\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\xAE\x01\x00\x00\x92\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xAF\x01\x00\x00\x97\x01\x00\x00" +"\xAE\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xB0\x01\x00\x00\x90\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xB1\x01\x00\x00" +"\x92\x01\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\xB2\x01\x00\x00\xB0\x01\x00\x00\xB1\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\xB3\x01\x00\x00\xA8\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xB4\x01\x00\x00\x90\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\xB5\x01\x00\x00\x92\x01\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\xB6\x01\x00\x00\xB4\x01\x00\x00\xB5\x01\x00\x00\x85\x00\x05\x00" +"\x06\x00\x00\x00\xB7\x01\x00\x00\xB3\x01\x00\x00\xB6\x01\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\xB8\x01\x00\x00\xB2\x01\x00\x00" +"\xB7\x01\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\xB9\x01\x00\x00\xAF\x01\x00\x00\xB8\x01\x00\x00\x3E\x00\x03\x00\xA8\x01\x00\x00" +"\xB9\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xBA\x01\x00\x00\xA8\x01\x00\x00\xBE\x00\x05\x00\x2F\x00\x00\x00\xBB\x01\x00\x00" +"\xBA\x01\x00\x00\x21\x01\x00\x00\xF7\x00\x03\x00\xBD\x01\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xBB\x01\x00\x00\xBC\x01\x00\x00" +"\xC0\x01\x00\x00\xF8\x00\x02\x00\xBC\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xBE\x01\x00\x00\x94\x01\x00\x00\x3E\x00\x03\x00" +"\xA8\x01\x00\x00\xBE\x01\x00\x00\x3E\x00\x03\x00\xBF\x01\x00\x00\x4F\x00\x00\x00\xF9\x00\x02\x00\xBD\x01\x00\x00\xF8\x00\x02\x00" +"\xC0\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC1\x01\x00\x00\x92\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC2\x01\x00\x00" +"\x90\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC3\x01\x00\x00\xA8\x01\x00\x00\x0C\x00\x08\x00\x06\x00\x00\x00\xC4\x01\x00\x00" +"\x01\x00\x00\x00\x2E\x00\x00\x00\xC1\x01\x00\x00\xC2\x01\x00\x00\xC3\x01\x00\x00\x3E\x00\x03\x00\xA8\x01\x00\x00\xC4\x01\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\xC5\x01\x00\x00\xA8\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC6\x01\x00\x00\x94\x01\x00\x00" +"\x83\x00\x05\x00\x06\x00\x00\x00\xC7\x01\x00\x00\xC5\x01\x00\x00\xC6\x01\x00\x00\x3E\x00\x03\x00\xBF\x01\x00\x00\xC7\x01\x00\x00" +"\xF9\x00\x02\x00\xBD\x01\x00\x00\xF8\x00\x02\x00\xBD\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC8\x01\x00\x00\xBF\x01\x00\x00" +"\xB8\x00\x05\x00\x2F\x00\x00\x00\xCA\x01\x00\x00\xC8\x01\x00\x00\xC9\x01\x00\x00\xF7\x00\x03\x00\xCC\x01\x00\x00\x00\x00\x00\x00" +"\xFA\x00\x04\x00\xCA\x01\x00\x00\xCB\x01\x00\x00\xCC\x01\x00\x00\xF8\x00\x02\x00\xCB\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\xCD\x01\x00\x00\xBF\x01\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\xCE\x01\x00\x00\xCD\x01\x00\x00\xC9\x01\x00\x00\x3D\x00\x04\x00" +"\x07\x00\x00\x00\xCF\x01\x00\x00\x4C\x01\x00\x00\x8E\x00\x05\x00\x07\x00\x00\x00\xD0\x01\x00\x00\xCF\x01\x00\x00\xCE\x01\x00\x00" +"\x3E\x00\x03\x00\x4C\x01\x00\x00\xD0\x01\x00\x00\xF9\x00\x02\x00\xCC\x01\x00\x00\xF8\x00\x02\x00\xCC\x01\x00\x00\xF9\x00\x02\x00" +"\x8F\x01\x00\x00\xF8\x00\x02\x00\xD1\x01\x00\x00\x3E\x00\x03\x00\xBF\x01\x00\x00\x63\x00\x00\x00\xF9\x00\x02\x00\x8F\x01\x00\x00" +"\xF8\x00\x02\x00\x8F\x01\x00\x00\x3D\x00\x04\x00\x4E\x01\x00\x00\xD4\x01\x00\x00\xD3\x01\x00\x00\x3D\x00\x04\x00\x3C\x00\x00\x00" +"\xD5\x01\x00\x00\x17\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\xD6\x01\x00\x00\x4C\x01\x00\x00\x4F\x00\x07\x00\x3C\x00\x00\x00" +"\xD7\x01\x00\x00\xD6\x01\x00\x00\xD6\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x8E\x00\x05\x00\x3C\x00\x00\x00\xD9\x01\x00\x00" +"\xD7\x01\x00\x00\xD8\x01\x00\x00\x8E\x00\x05\x00\x3C\x00\x00\x00\xDB\x01\x00\x00\xD9\x01\x00\x00\xDA\x01\x00\x00\x81\x00\x05\x00" +"\x3C\x00\x00\x00\xDC\x01\x00\x00\xD5\x01\x00\x00\xDB\x01\x00\x00\x57\x00\x05\x00\x10\x00\x00\x00\xDD\x01\x00\x00\xD4\x01\x00\x00" +"\xDC\x01\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00\xDE\x01\x00\x00\xDD\x01\x00\x00\xDD\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" +"\x02\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\xDF\x01\x00\x00\x1D\x00\x00\x00\x85\x00\x05\x00\x07\x00\x00\x00\xE0\x01\x00\x00" +"\xDE\x01\x00\x00\xDF\x01\x00\x00\x3E\x00\x03\x00\xD2\x01\x00\x00\xE0\x01\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00\xE1\x01\x00\x00" +"\x8C\x01\x00\x00\x2E\x00\x00\x00\xF7\x00\x03\x00\xE3\x01\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xE1\x01\x00\x00\xE2\x01\x00\x00" +"\xE3\x01\x00\x00\xF8\x00\x02\x00\xE2\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\xE4\x01\x00\x00\xD2\x01\x00\x00\x3D\x00\x04\x00" +"\x07\x00\x00\x00\xE5\x01\x00\x00\x27\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xE6\x01\x00\x00\xBF\x01\x00\x00\x88\x00\x05\x00" +"\x06\x00\x00\x00\xE8\x01\x00\x00\xE6\x01\x00\x00\xE7\x01\x00\x00\x0C\x00\x07\x00\x06\x00\x00\x00\xE9\x01\x00\x00\x01\x00\x00\x00" +"\x25\x00\x00\x00\xE8\x01\x00\x00\x63\x00\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\xEA\x01\x00\x00\xE9\x01\x00\x00\xE9\x01\x00\x00" +"\xE9\x01\x00\x00\x0C\x00\x08\x00\x07\x00\x00\x00\xEB\x01\x00\x00\x01\x00\x00\x00\x2E\x00\x00\x00\xE4\x01\x00\x00\xE5\x01\x00\x00" +"\xEA\x01\x00\x00\x3E\x00\x03\x00\xD2\x01\x00\x00\xEB\x01\x00\x00\xF9\x00\x02\x00\xE3\x01\x00\x00\xF8\x00\x02\x00\xE3\x01\x00\x00" +"\xAB\x00\x05\x00\x2F\x00\x00\x00\xED\x01\x00\x00\xEC\x01\x00\x00\x2E\x00\x00\x00\xF7\x00\x03\x00\xEF\x01\x00\x00\x00\x00\x00\x00" +"\xFA\x00\x04\x00\xED\x01\x00\x00\xEE\x01\x00\x00\xFF\x01\x00\x00\xF8\x00\x02\x00\xEE\x01\x00\x00\x3D\x00\x04\x00\x4E\x01\x00\x00" +"\xF2\x01\x00\x00\xF1\x01\x00\x00\x3D\x00\x04\x00\x3C\x00\x00\x00\xF3\x01\x00\x00\x17\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00" +"\xF4\x01\x00\x00\x4C\x01\x00\x00\x4F\x00\x07\x00\x3C\x00\x00\x00\xF5\x01\x00\x00\xF4\x01\x00\x00\xF4\x01\x00\x00\x00\x00\x00\x00" +"\x01\x00\x00\x00\x8E\x00\x05\x00\x3C\x00\x00\x00\xF7\x01\x00\x00\xF5\x01\x00\x00\xF6\x01\x00\x00\x8E\x00\x05\x00\x3C\x00\x00\x00" +"\xF9\x01\x00\x00\xF7\x01\x00\x00\xF8\x01\x00\x00\x83\x00\x05\x00\x3C\x00\x00\x00\xFA\x01\x00\x00\xF3\x01\x00\x00\xF9\x01\x00\x00" +"\x57\x00\x05\x00\x10\x00\x00\x00\xFB\x01\x00\x00\xF2\x01\x00\x00\xFA\x01\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00\xFC\x01\x00\x00" +"\xFB\x01\x00\x00\xFB\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\xFD\x01\x00\x00" +"\x22\x00\x00\x00\x85\x00\x05\x00\x07\x00\x00\x00\xFE\x01\x00\x00\xFC\x01\x00\x00\xFD\x01\x00\x00\x3E\x00\x03\x00\xF0\x01\x00\x00" +"\xFE\x01\x00\x00\xF9\x00\x02\x00\xEF\x01\x00\x00\xF8\x00\x02\x00\xFF\x01\x00\x00\x3D\x00\x04\x00\x4E\x01\x00\x00\x01\x02\x00\x00" +"\x00\x02\x00\x00\x3D\x00\x04\x00\x3C\x00\x00\x00\x02\x02\x00\x00\x30\x01\x00\x00\x57\x00\x05\x00\x10\x00\x00\x00\x03\x02\x00\x00" +"\x01\x02\x00\x00\x02\x02\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00\x04\x02\x00\x00\x03\x02\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00" +"\x01\x00\x00\x00\x02\x00\x00\x00\x3E\x00\x03\x00\xF0\x01\x00\x00\x04\x02\x00\x00\xF9\x00\x02\x00\xEF\x01\x00\x00\xF8\x00\x02\x00" +"\xEF\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x05\x02\x00\x00\xD2\x01\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x06\x02\x00\x00" +"\xF0\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x07\x02\x00\x00\x7E\x01\x00\x00\x50\x00\x06\x00\x07\x00\x00\x00\x08\x02\x00\x00" +"\x07\x02\x00\x00\x07\x02\x00\x00\x07\x02\x00\x00\x0C\x00\x08\x00\x07\x00\x00\x00\x09\x02\x00\x00\x01\x00\x00\x00\x2E\x00\x00\x00" +"\x05\x02\x00\x00\x06\x02\x00\x00\x08\x02\x00\x00\x3E\x00\x03\x00\xD2\x01\x00\x00\x09\x02\x00\x00\xB6\x00\x05\x00\x2F\x00\x00\x00" +"\x0B\x02\x00\x00\x0A\x02\x00\x00\x4F\x00\x00\x00\xF7\x00\x03\x00\x0D\x02\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x0B\x02\x00\x00" +"\x0C\x02\x00\x00\x0D\x02\x00\x00\xF8\x00\x02\x00\x0C\x02\x00\x00\x3D\x00\x04\x00\x4E\x01\x00\x00\x0F\x02\x00\x00\x00\x02\x00\x00" +"\x3D\x00\x04\x00\x3C\x00\x00\x00\x10\x02\x00\x00\x30\x01\x00\x00\x57\x00\x05\x00\x10\x00\x00\x00\x11\x02\x00\x00\x0F\x02\x00\x00" +"\x10\x02\x00\x00\x3E\x00\x03\x00\x0E\x02\x00\x00\x11\x02\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00\x13\x02\x00\x00\x0E\x02\x00\x00" +"\x4F\x00\x08\x00\x07\x00\x00\x00\x14\x02\x00\x00\x13\x02\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00" +"\x41\x00\x05\x00\x36\x00\x00\x00\x15\x02\x00\x00\x0E\x02\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x16\x02\x00\x00" +"\x15\x02\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x17\x02\x00\x00\x0A\x02\x00\x00\x16\x02\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00" +"\x18\x02\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x19\x02\x00\x00\x14\x02\x00\x00\x01\x00\x00\x00" +"\x51\x00\x05\x00\x06\x00\x00\x00\x1A\x02\x00\x00\x14\x02\x00\x00\x02\x00\x00\x00\x50\x00\x07\x00\x10\x00\x00\x00\x1B\x02\x00\x00" +"\x18\x02\x00\x00\x19\x02\x00\x00\x1A\x02\x00\x00\x17\x02\x00\x00\x3E\x00\x03\x00\x1C\x02\x00\x00\x1B\x02\x00\x00\x39\x00\x05\x00" +"\x10\x00\x00\x00\x1D\x02\x00\x00\x1A\x00\x00\x00\x1C\x02\x00\x00\x3E\x00\x03\x00\x12\x02\x00\x00\x1D\x02\x00\x00\x3D\x00\x04\x00" +"\x07\x00\x00\x00\x1E\x02\x00\x00\xD2\x01\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00\x1F\x02\x00\x00\x12\x02\x00\x00\x4F\x00\x08\x00" +"\x07\x00\x00\x00\x20\x02\x00\x00\x1F\x02\x00\x00\x1F\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x41\x00\x05\x00" +"\x36\x00\x00\x00\x21\x02\x00\x00\x12\x02\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x22\x02\x00\x00\x21\x02\x00\x00" +"\x50\x00\x06\x00\x07\x00\x00\x00\x23\x02\x00\x00\x22\x02\x00\x00\x22\x02\x00\x00\x22\x02\x00\x00\x0C\x00\x08\x00\x07\x00\x00\x00" +"\x24\x02\x00\x00\x01\x00\x00\x00\x2E\x00\x00\x00\x1E\x02\x00\x00\x20\x02\x00\x00\x23\x02\x00\x00\x3E\x00\x03\x00\xD2\x01\x00\x00" +"\x24\x02\x00\x00\xF9\x00\x02\x00\x0D\x02\x00\x00\xF8\x00\x02\x00\x0D\x02\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x27\x02\x00\x00" +"\xD2\x01\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x28\x02\x00\x00\x27\x02\x00\x00\x00\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00" +"\x29\x02\x00\x00\x27\x02\x00\x00\x01\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x2A\x02\x00\x00\x27\x02\x00\x00\x02\x00\x00\x00" +"\x50\x00\x07\x00\x10\x00\x00\x00\x2B\x02\x00\x00\x28\x02\x00\x00\x29\x02\x00\x00\x2A\x02\x00\x00\x63\x00\x00\x00\x3E\x00\x03\x00" +"\x26\x02\x00\x00\x2B\x02\x00\x00\xFD\x00\x01\x00\x38\x00\x01\x00\x36\x00\x05\x00\x07\x00\x00\x00\x0B\x00\x00\x00\x00\x00\x00\x00" +"\x09\x00\x00\x00\x37\x00\x03\x00\x08\x00\x00\x00\x0A\x00\x00\x00\xF8\x00\x02\x00\x0C\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00" +"\x37\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00\x5D\x00\x00\x00\x07\x00\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00" +"\x30\x00\x00\x00\x2D\x00\x00\x00\x2E\x00\x00\x00\xA8\x00\x04\x00\x2F\x00\x00\x00\x31\x00\x00\x00\x30\x00\x00\x00\xF7\x00\x03\x00" +"\x33\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x31\x00\x00\x00\x32\x00\x00\x00\x33\x00\x00\x00\xF8\x00\x02\x00\x32\x00\x00\x00" +"\x3D\x00\x04\x00\x07\x00\x00\x00\x34\x00\x00\x00\x0A\x00\x00\x00\xFE\x00\x02\x00\x34\x00\x00\x00\xF8\x00\x02\x00\x33\x00\x00\x00" +"\x41\x00\x05\x00\x41\x00\x00\x00\x42\x00\x00\x00\x3F\x00\x00\x00\x40\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x43\x00\x00\x00" +"\x42\x00\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00\x48\x00\x00\x00\x45\x00\x00\x00\x46\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x49\x00\x00\x00\x48\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x4A\x00\x00\x00\x43\x00\x00\x00\x49\x00\x00\x00\x41\x00\x05\x00" +"\x47\x00\x00\x00\x4C\x00\x00\x00\x45\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x4D\x00\x00\x00\x4C\x00\x00\x00" +"\x88\x00\x05\x00\x06\x00\x00\x00\x4E\x00\x00\x00\x4A\x00\x00\x00\x4D\x00\x00\x00\x3E\x00\x03\x00\x37\x00\x00\x00\x4E\x00\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\x50\x00\x00\x00\x37\x00\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\x52\x00\x00\x00\x3F\x00\x00\x00" +"\x51\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x53\x00\x00\x00\x52\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x54\x00\x00\x00" +"\x50\x00\x00\x00\x53\x00\x00\x00\x0C\x00\x07\x00\x06\x00\x00\x00\x55\x00\x00\x00\x01\x00\x00\x00\x28\x00\x00\x00\x4F\x00\x00\x00" +"\x54\x00\x00\x00\x3E\x00\x03\x00\x37\x00\x00\x00\x55\x00\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00\x57\x00\x00\x00\x56\x00\x00\x00" +"\x2E\x00\x00\x00\xF7\x00\x03\x00\x59\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x57\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00" +"\xF8\x00\x02\x00\x58\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x5A\x00\x00\x00\x37\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x5B\x00\x00\x00\x37\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x5C\x00\x00\x00\x5B\x00\x00\x00\x5A\x00\x00\x00\x3E\x00\x03\x00" +"\x37\x00\x00\x00\x5C\x00\x00\x00\xF9\x00\x02\x00\x59\x00\x00\x00\xF8\x00\x02\x00\x59\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x5E\x00\x00\x00\x37\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x60\x00\x00\x00\x5E\x00\x00\x00\x5F\x00\x00\x00\x7F\x00\x04\x00" +"\x06\x00\x00\x00\x61\x00\x00\x00\x60\x00\x00\x00\x0C\x00\x06\x00\x06\x00\x00\x00\x62\x00\x00\x00\x01\x00\x00\x00\x1D\x00\x00\x00" +"\x61\x00\x00\x00\x3E\x00\x03\x00\x5D\x00\x00\x00\x62\x00\x00\x00\x41\x00\x06\x00\x41\x00\x00\x00\x65\x00\x00\x00\x3F\x00\x00\x00" +"\x64\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x66\x00\x00\x00\x65\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00" +"\x67\x00\x00\x00\x63\x00\x00\x00\x66\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x68\x00\x00\x00\x5D\x00\x00\x00\x0C\x00\x08\x00" +"\x06\x00\x00\x00\x69\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x00\x00\x68\x00\x00\x00\x4F\x00\x00\x00\x63\x00\x00\x00\x41\x00\x06\x00" +"\x41\x00\x00\x00\x6A\x00\x00\x00\x3F\x00\x00\x00\x64\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x6B\x00\x00\x00" +"\x6A\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x6C\x00\x00\x00\x69\x00\x00\x00\x6B\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00" +"\x6D\x00\x00\x00\x67\x00\x00\x00\x6C\x00\x00\x00\x3E\x00\x03\x00\x5D\x00\x00\x00\x6D\x00\x00\x00\x41\x00\x05\x00\x6E\x00\x00\x00" +"\x6F\x00\x00\x00\x3F\x00\x00\x00\x64\x00\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00\x70\x00\x00\x00\x6F\x00\x00\x00\x4F\x00\x08\x00" +"\x07\x00\x00\x00\x71\x00\x00\x00\x70\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x3D\x00\x04\x00" +"\x07\x00\x00\x00\x72\x00\x00\x00\x0A\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x73\x00\x00\x00\x5D\x00\x00\x00\x50\x00\x06\x00" +"\x07\x00\x00\x00\x74\x00\x00\x00\x73\x00\x00\x00\x73\x00\x00\x00\x73\x00\x00\x00\x0C\x00\x08\x00\x07\x00\x00\x00\x75\x00\x00\x00" +"\x01\x00\x00\x00\x2E\x00\x00\x00\x71\x00\x00\x00\x72\x00\x00\x00\x74\x00\x00\x00\xFE\x00\x02\x00\x75\x00\x00\x00\x38\x00\x01\x00" +"\x36\x00\x05\x00\x07\x00\x00\x00\x0E\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x37\x00\x03\x00\x08\x00\x00\x00\x0D\x00\x00\x00" +"\xF8\x00\x02\x00\x0F\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00\x7E\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00" +"\x92\x00\x00\x00\x07\x00\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00\x78\x00\x00\x00\x2D\x00\x00\x00\x2E\x00\x00\x00\xA8\x00\x04\x00" +"\x2F\x00\x00\x00\x79\x00\x00\x00\x78\x00\x00\x00\xF7\x00\x03\x00\x7B\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x79\x00\x00\x00" +"\x7A\x00\x00\x00\x7B\x00\x00\x00\xF8\x00\x02\x00\x7A\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x7C\x00\x00\x00\x0D\x00\x00\x00" +"\xFE\x00\x02\x00\x7C\x00\x00\x00\xF8\x00\x02\x00\x7B\x00\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\x7F\x00\x00\x00\x3F\x00\x00\x00" +"\x40\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x80\x00\x00\x00\x7F\x00\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00\x81\x00\x00\x00" +"\x45\x00\x00\x00\x46\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x82\x00\x00\x00\x81\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00" +"\x83\x00\x00\x00\x80\x00\x00\x00\x82\x00\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00\x84\x00\x00\x00\x45\x00\x00\x00\x4B\x00\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\x85\x00\x00\x00\x84\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\x86\x00\x00\x00\x83\x00\x00\x00" +"\x85\x00\x00\x00\x3E\x00\x03\x00\x7E\x00\x00\x00\x86\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x87\x00\x00\x00\x7E\x00\x00\x00" +"\x41\x00\x05\x00\x41\x00\x00\x00\x88\x00\x00\x00\x3F\x00\x00\x00\x51\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x89\x00\x00\x00" +"\x88\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x8A\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x0C\x00\x07\x00\x06\x00\x00\x00" +"\x8B\x00\x00\x00\x01\x00\x00\x00\x28\x00\x00\x00\x4F\x00\x00\x00\x8A\x00\x00\x00\x3E\x00\x03\x00\x7E\x00\x00\x00\x8B\x00\x00\x00" +"\xAB\x00\x05\x00\x2F\x00\x00\x00\x8C\x00\x00\x00\x56\x00\x00\x00\x2E\x00\x00\x00\xF7\x00\x03\x00\x8E\x00\x00\x00\x00\x00\x00\x00" +"\xFA\x00\x04\x00\x8C\x00\x00\x00\x8D\x00\x00\x00\x8E\x00\x00\x00\xF8\x00\x02\x00\x8D\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x8F\x00\x00\x00\x7E\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x90\x00\x00\x00\x7E\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00" +"\x91\x00\x00\x00\x90\x00\x00\x00\x8F\x00\x00\x00\x3E\x00\x03\x00\x7E\x00\x00\x00\x91\x00\x00\x00\xF9\x00\x02\x00\x8E\x00\x00\x00" +"\xF8\x00\x02\x00\x8E\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x93\x00\x00\x00\x7E\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00" +"\x94\x00\x00\x00\x93\x00\x00\x00\x5F\x00\x00\x00\x7F\x00\x04\x00\x06\x00\x00\x00\x95\x00\x00\x00\x94\x00\x00\x00\x0C\x00\x06\x00" +"\x06\x00\x00\x00\x96\x00\x00\x00\x01\x00\x00\x00\x1D\x00\x00\x00\x95\x00\x00\x00\x3E\x00\x03\x00\x92\x00\x00\x00\x96\x00\x00\x00" +"\x41\x00\x06\x00\x41\x00\x00\x00\x97\x00\x00\x00\x3F\x00\x00\x00\x64\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\x98\x00\x00\x00\x97\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x99\x00\x00\x00\x63\x00\x00\x00\x98\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\x9A\x00\x00\x00\x92\x00\x00\x00\x0C\x00\x08\x00\x06\x00\x00\x00\x9B\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x00\x00" +"\x9A\x00\x00\x00\x4F\x00\x00\x00\x63\x00\x00\x00\x41\x00\x06\x00\x41\x00\x00\x00\x9C\x00\x00\x00\x3F\x00\x00\x00\x64\x00\x00\x00" +"\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x9D\x00\x00\x00\x9C\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x9E\x00\x00\x00" +"\x9B\x00\x00\x00\x9D\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x9F\x00\x00\x00\x99\x00\x00\x00\x9E\x00\x00\x00\x3E\x00\x03\x00" +"\x92\x00\x00\x00\x9F\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\xA0\x00\x00\x00\x0D\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\xA1\x00\x00\x00\x92\x00\x00\x00\x8E\x00\x05\x00\x07\x00\x00\x00\xA2\x00\x00\x00\xA0\x00\x00\x00\xA1\x00\x00\x00\xFE\x00\x02\x00" +"\xA2\x00\x00\x00\x38\x00\x01\x00\x36\x00\x05\x00\x10\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x37\x00\x03\x00" +"\x11\x00\x00\x00\x13\x00\x00\x00\xF8\x00\x02\x00\x15\x00\x00\x00\x3B\x00\x04\x00\x08\x00\x00\x00\xAB\x00\x00\x00\x07\x00\x00\x00" +"\xAB\x00\x05\x00\x2F\x00\x00\x00\xA5\x00\x00\x00\x2D\x00\x00\x00\x2E\x00\x00\x00\xA8\x00\x04\x00\x2F\x00\x00\x00\xA6\x00\x00\x00" +"\xA5\x00\x00\x00\xF7\x00\x03\x00\xA8\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xA6\x00\x00\x00\xA7\x00\x00\x00\xA8\x00\x00\x00" +"\xF8\x00\x02\x00\xA7\x00\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00\xA9\x00\x00\x00\x13\x00\x00\x00\xFE\x00\x02\x00\xA9\x00\x00\x00" +"\xF8\x00\x02\x00\xA8\x00\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00\xAC\x00\x00\x00\x13\x00\x00\x00\x4F\x00\x08\x00\x07\x00\x00\x00" +"\xAD\x00\x00\x00\xAC\x00\x00\x00\xAC\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x3E\x00\x03\x00\xAB\x00\x00\x00" +"\xAD\x00\x00\x00\x39\x00\x05\x00\x07\x00\x00\x00\xAE\x00\x00\x00\x0B\x00\x00\x00\xAB\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00" +"\xAF\x00\x00\x00\xAE\x00\x00\x00\x00\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\xB0\x00\x00\x00\xAE\x00\x00\x00\x01\x00\x00\x00" +"\x51\x00\x05\x00\x06\x00\x00\x00\xB1\x00\x00\x00\xAE\x00\x00\x00\x02\x00\x00\x00\x50\x00\x07\x00\x10\x00\x00\x00\xB2\x00\x00\x00" +"\xAF\x00\x00\x00\xB0\x00\x00\x00\xB1\x00\x00\x00\x63\x00\x00\x00\x41\x00\x05\x00\x36\x00\x00\x00\xB3\x00\x00\x00\x13\x00\x00\x00" +"\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xB4\x00\x00\x00\xB3\x00\x00\x00\x8E\x00\x05\x00\x10\x00\x00\x00\xB5\x00\x00\x00" +"\xB2\x00\x00\x00\xB4\x00\x00\x00\xFE\x00\x02\x00\xB5\x00\x00\x00\x38\x00\x01\x00\x36\x00\x05\x00\x10\x00\x00\x00\x17\x00\x00\x00" +"\x00\x00\x00\x00\x12\x00\x00\x00\x37\x00\x03\x00\x11\x00\x00\x00\x16\x00\x00\x00\xF8\x00\x02\x00\x18\x00\x00\x00\x3B\x00\x04\x00" +"\x36\x00\x00\x00\xBE\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00\xD2\x00\x00\x00\x07\x00\x00\x00\xAB\x00\x05\x00" +"\x2F\x00\x00\x00\xB8\x00\x00\x00\x2D\x00\x00\x00\x2E\x00\x00\x00\xA8\x00\x04\x00\x2F\x00\x00\x00\xB9\x00\x00\x00\xB8\x00\x00\x00" +"\xF7\x00\x03\x00\xBB\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xB9\x00\x00\x00\xBA\x00\x00\x00\xBB\x00\x00\x00\xF8\x00\x02\x00" +"\xBA\x00\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00\xBC\x00\x00\x00\x16\x00\x00\x00\xFE\x00\x02\x00\xBC\x00\x00\x00\xF8\x00\x02\x00" +"\xBB\x00\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\xBF\x00\x00\x00\x3F\x00\x00\x00\x40\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\xC0\x00\x00\x00\xBF\x00\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00\xC1\x00\x00\x00\x45\x00\x00\x00\x46\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\xC2\x00\x00\x00\xC1\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xC3\x00\x00\x00\xC0\x00\x00\x00\xC2\x00\x00\x00" +"\x41\x00\x05\x00\x47\x00\x00\x00\xC4\x00\x00\x00\x45\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC5\x00\x00\x00" +"\xC4\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\xC6\x00\x00\x00\xC3\x00\x00\x00\xC5\x00\x00\x00\x3E\x00\x03\x00\xBE\x00\x00\x00" +"\xC6\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC7\x00\x00\x00\xBE\x00\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\xC8\x00\x00\x00" +"\x3F\x00\x00\x00\x51\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xC9\x00\x00\x00\xC8\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00" +"\xCA\x00\x00\x00\xC7\x00\x00\x00\xC9\x00\x00\x00\x0C\x00\x07\x00\x06\x00\x00\x00\xCB\x00\x00\x00\x01\x00\x00\x00\x28\x00\x00\x00" +"\x4F\x00\x00\x00\xCA\x00\x00\x00\x3E\x00\x03\x00\xBE\x00\x00\x00\xCB\x00\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00\xCC\x00\x00\x00" +"\x56\x00\x00\x00\x2E\x00\x00\x00\xF7\x00\x03\x00\xCE\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xCC\x00\x00\x00\xCD\x00\x00\x00" +"\xCE\x00\x00\x00\xF8\x00\x02\x00\xCD\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xCF\x00\x00\x00\xBE\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\xD0\x00\x00\x00\xBE\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xD1\x00\x00\x00\xD0\x00\x00\x00\xCF\x00\x00\x00" +"\x3E\x00\x03\x00\xBE\x00\x00\x00\xD1\x00\x00\x00\xF9\x00\x02\x00\xCE\x00\x00\x00\xF8\x00\x02\x00\xCE\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\xD3\x00\x00\x00\xBE\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xD4\x00\x00\x00\xD3\x00\x00\x00\x5F\x00\x00\x00" +"\x7F\x00\x04\x00\x06\x00\x00\x00\xD5\x00\x00\x00\xD4\x00\x00\x00\x0C\x00\x06\x00\x06\x00\x00\x00\xD6\x00\x00\x00\x01\x00\x00\x00" +"\x1D\x00\x00\x00\xD5\x00\x00\x00\x3E\x00\x03\x00\xD2\x00\x00\x00\xD6\x00\x00\x00\x41\x00\x06\x00\x41\x00\x00\x00\xD7\x00\x00\x00" +"\x3F\x00\x00\x00\x64\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xD8\x00\x00\x00\xD7\x00\x00\x00\x83\x00\x05\x00" +"\x06\x00\x00\x00\xD9\x00\x00\x00\x63\x00\x00\x00\xD8\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xDA\x00\x00\x00\xD2\x00\x00\x00" +"\x0C\x00\x08\x00\x06\x00\x00\x00\xDB\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x00\x00\xDA\x00\x00\x00\x4F\x00\x00\x00\x63\x00\x00\x00" +"\x41\x00\x06\x00\x41\x00\x00\x00\xDC\x00\x00\x00\x3F\x00\x00\x00\x64\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\xDD\x00\x00\x00\xDC\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xDE\x00\x00\x00\xDB\x00\x00\x00\xDD\x00\x00\x00\x81\x00\x05\x00" +"\x06\x00\x00\x00\xDF\x00\x00\x00\xD9\x00\x00\x00\xDE\x00\x00\x00\x3E\x00\x03\x00\xD2\x00\x00\x00\xDF\x00\x00\x00\x3D\x00\x04\x00" +"\x10\x00\x00\x00\xE0\x00\x00\x00\x16\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xE1\x00\x00\x00\xD2\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\xE2\x00\x00\x00\xD2\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xE3\x00\x00\x00\xD2\x00\x00\x00\x50\x00\x07\x00" +"\x10\x00\x00\x00\xE4\x00\x00\x00\xE1\x00\x00\x00\xE2\x00\x00\x00\xE3\x00\x00\x00\x63\x00\x00\x00\x85\x00\x05\x00\x10\x00\x00\x00" +"\xE5\x00\x00\x00\xE0\x00\x00\x00\xE4\x00\x00\x00\xFE\x00\x02\x00\xE5\x00\x00\x00\x38\x00\x01\x00\x36\x00\x05\x00\x10\x00\x00\x00" +"\x1A\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x37\x00\x03\x00\x11\x00\x00\x00\x19\x00\x00\x00\xF8\x00\x02\x00\x1B\x00\x00\x00" +"\x3B\x00\x04\x00\x36\x00\x00\x00\xEE\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x36\x00\x00\x00\x02\x01\x00\x00\x07\x00\x00\x00" +"\xAB\x00\x05\x00\x2F\x00\x00\x00\xE8\x00\x00\x00\x2D\x00\x00\x00\x2E\x00\x00\x00\xA8\x00\x04\x00\x2F\x00\x00\x00\xE9\x00\x00\x00" +"\xE8\x00\x00\x00\xF7\x00\x03\x00\xEB\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xE9\x00\x00\x00\xEA\x00\x00\x00\xEB\x00\x00\x00" +"\xF8\x00\x02\x00\xEA\x00\x00\x00\x3D\x00\x04\x00\x10\x00\x00\x00\xEC\x00\x00\x00\x19\x00\x00\x00\xFE\x00\x02\x00\xEC\x00\x00\x00" +"\xF8\x00\x02\x00\xEB\x00\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00\xEF\x00\x00\x00\x3F\x00\x00\x00\x40\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\xF0\x00\x00\x00\xEF\x00\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00\xF1\x00\x00\x00\x45\x00\x00\x00\x46\x00\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\xF2\x00\x00\x00\xF1\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\xF3\x00\x00\x00\xF0\x00\x00\x00" +"\xF2\x00\x00\x00\x41\x00\x05\x00\x47\x00\x00\x00\xF4\x00\x00\x00\x45\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00" +"\xF5\x00\x00\x00\xF4\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00\xF6\x00\x00\x00\xF3\x00\x00\x00\xF5\x00\x00\x00\x3E\x00\x03\x00" +"\xEE\x00\x00\x00\xF6\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xF7\x00\x00\x00\xEE\x00\x00\x00\x41\x00\x05\x00\x41\x00\x00\x00" +"\xF8\x00\x00\x00\x3F\x00\x00\x00\x51\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xF9\x00\x00\x00\xF8\x00\x00\x00\x83\x00\x05\x00" +"\x06\x00\x00\x00\xFA\x00\x00\x00\xF7\x00\x00\x00\xF9\x00\x00\x00\x0C\x00\x07\x00\x06\x00\x00\x00\xFB\x00\x00\x00\x01\x00\x00\x00" +"\x28\x00\x00\x00\x4F\x00\x00\x00\xFA\x00\x00\x00\x3E\x00\x03\x00\xEE\x00\x00\x00\xFB\x00\x00\x00\xAB\x00\x05\x00\x2F\x00\x00\x00" +"\xFC\x00\x00\x00\x56\x00\x00\x00\x2E\x00\x00\x00\xF7\x00\x03\x00\xFE\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\xFC\x00\x00\x00" +"\xFD\x00\x00\x00\xFE\x00\x00\x00\xF8\x00\x02\x00\xFD\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\xFF\x00\x00\x00\xEE\x00\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\x00\x01\x00\x00\xEE\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x01\x01\x00\x00\x00\x01\x00\x00" +"\xFF\x00\x00\x00\x3E\x00\x03\x00\xEE\x00\x00\x00\x01\x01\x00\x00\xF9\x00\x02\x00\xFE\x00\x00\x00\xF8\x00\x02\x00\xFE\x00\x00\x00" +"\x3D\x00\x04\x00\x06\x00\x00\x00\x03\x01\x00\x00\xEE\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x04\x01\x00\x00\x03\x01\x00\x00" +"\x5F\x00\x00\x00\x7F\x00\x04\x00\x06\x00\x00\x00\x05\x01\x00\x00\x04\x01\x00\x00\x0C\x00\x06\x00\x06\x00\x00\x00\x06\x01\x00\x00" +"\x01\x00\x00\x00\x1D\x00\x00\x00\x05\x01\x00\x00\x3E\x00\x03\x00\x02\x01\x00\x00\x06\x01\x00\x00\x41\x00\x06\x00\x41\x00\x00\x00" +"\x07\x01\x00\x00\x3F\x00\x00\x00\x64\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x08\x01\x00\x00\x07\x01\x00\x00" +"\x83\x00\x05\x00\x06\x00\x00\x00\x09\x01\x00\x00\x63\x00\x00\x00\x08\x01\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x0A\x01\x00\x00" +"\x02\x01\x00\x00\x0C\x00\x08\x00\x06\x00\x00\x00\x0B\x01\x00\x00\x01\x00\x00\x00\x2B\x00\x00\x00\x0A\x01\x00\x00\x4F\x00\x00\x00" +"\x63\x00\x00\x00\x41\x00\x06\x00\x41\x00\x00\x00\x0C\x01\x00\x00\x3F\x00\x00\x00\x64\x00\x00\x00\x4B\x00\x00\x00\x3D\x00\x04\x00" +"\x06\x00\x00\x00\x0D\x01\x00\x00\x0C\x01\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x0E\x01\x00\x00\x0B\x01\x00\x00\x0D\x01\x00\x00" +"\x81\x00\x05\x00\x06\x00\x00\x00\x0F\x01\x00\x00\x09\x01\x00\x00\x0E\x01\x00\x00\x3E\x00\x03\x00\x02\x01\x00\x00\x0F\x01\x00\x00" +"\x3D\x00\x04\x00\x10\x00\x00\x00\x10\x01\x00\x00\x19\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x11\x01\x00\x00\x02\x01\x00\x00" +"\x50\x00\x07\x00\x10\x00\x00\x00\x12\x01\x00\x00\x63\x00\x00\x00\x63\x00\x00\x00\x63\x00\x00\x00\x11\x01\x00\x00\x85\x00\x05\x00" +"\x10\x00\x00\x00\x13\x01\x00\x00\x10\x01\x00\x00\x12\x01\x00\x00\xFE\x00\x02\x00\x13\x01\x00\x00\x38\x00\x01\x00"}, #endif #ifdef GLQUAKE {QR_OPENGL, 110, "bloom_blur", diff --git a/engine/partcfgs/q2part.cfg b/engine/partcfgs/q2part.cfg index 2b0b184b..84ed0c30 100644 --- a/engine/partcfgs/q2part.cfg +++ b/engine/partcfgs/q2part.cfg @@ -18,21 +18,6 @@ r_part pe_default scalefactor 0.8 } -r_part TEQ2_LASER_SPARKS -{ - texture "classicparticle" - tcoords 0 0 16 16 32 - count 1 - scale 1 - alpha 1 - die 0.3 0.8 - randomvel 20 - orgadd 0 7 - spawnorg 4 - gravity 40 - scalefactor 0.8 -} - r_part te_splashsparks { texture "classicparticle" @@ -143,7 +128,56 @@ r_part te_splashblood colorindex 0xe8 } - +r_part teq2_laser_sparks +{ + texture "classicparticle" + tcoords 0 0 16 16 32 + count 1 + scale 1 + alpha 1 + die 0.3 0.8 + randomvel 20 + orgadd 0 7 + spawnorg 4 + gravity 40 + scalefactor 0.8 +} +r_part teq2_welding_sparks +{ //identical to teq2_laser_sparks, except for the +form that adds in some extra mesh+lighting effect. + texture "classicparticle" + tcoords 0 0 16 16 32 + count 1 + scale 1 + alpha 1 + die 0.3 0.8 + randomvel 20 + orgadd 0 7 + spawnorg 4 + gravity 40 + scalefactor 0.8 +} +r_part +teq2_welding_sparks +{ + count 0 0 1 + model "models/objects/flash/tris.md2" framestart=0 frameend=2 framerate=10 alpha=-1 fullbright + lightradius 100 175 + lightradiusfade 400 + lightrgb 1 1 0.3 +} +r_part teq2_tunnel_sparks +{ //this is apparently identical to teq2_laser_sparks... either way the protocol provides a palette colour (particle system provides a customised variation) + texture "classicparticle" + tcoords 0 0 16 16 32 + count 1 + scale 1 + alpha 1 + die 0.3 0.8 + randomvel 20 + orgadd 0 7 + spawnorg 4 + gravity 40 + scalefactor 0.8 +} r_part teq2_shield_sparks { texture "classicparticle" @@ -258,11 +292,68 @@ r_part teq2_blood scalefactor 0.8 colorindex 232 7 } +r_part teq2_moreblood +{ //teq2_blood, but with count 250 instead of 60. + texture "classicparticle" + tcoords 0 0 16 16 32 + count 250 + scale 1 + alpha 1 + die 0.3 0.8 + randomvel 20 + orgadd 0 31 + spawnorg 4 + gravity 40 + scalefactor 0.8 + colorindex 232 7 +} +r_part teq2_greenblood +{ + texture "classicparticle" + tcoords 0 0 16 16 32 + count 30 + scale 1 + alpha 1 + die 0.3 0.8 + randomvel 20 + orgadd 0 31 + spawnorg 4 + gravity 40 + scalefactor 0.8 + colorindex 0xdf 7 +} + +r_part teq2_electric_sparks +{ + texture "classicparticle" + tcoords 0 0 16 16 32 + count 40 + scale 1 + alpha 1 + die 0.3 0.8 + randomvel 20 + orgadd 0 31 + spawnorg 4 + gravity 40 + scalefactor 0.8 + colorindex 0x75 7 + sound "weapons/lashit.wav" 1 1 0 0 +} r_part q2_blasterpuff { count 0 0 1 - model "models/objects/explode/tris.md2" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow + model "models/objects/explode/tris.md2" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow skin=0 +} +r_part q2_blaster2puff +{ + count 0 0 1 + model "models/objects/explode/tris.md2" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow skin=1 +} +r_part q2_flechettepuff +{ + count 0 0 1 + model "models/objects/explode/tris.md2" framestart=0 frameend=4 framerate=10 alpha=1 orient additive fullbright noshadow skin=2 } r_part teq2_blaster { @@ -301,13 +392,35 @@ r_part teq2_blaster2 gravity 40 scalefactor 0.8 colorindex 0xd0 7 - assoc q2_blasterpuff /*the model*/ + assoc q2_blaster2puff /*the model*/ lightradius 150 lightradiusfade 400 lightrgb 0.05 1.0 0.05 lightshadows 1 sound "weapons/lashit.wav" 1 1 0 0 } +r_part teq2_flechette +{ //grey version. + texture "classicparticle" + tcoords 0 0 16 16 32 + count 60 + scale 1 + alpha 1 + die 0.3 0.8 + randomvel 40 + orgadd 0 15 + veladd 30 + spawnorg 4 + gravity 40 + scalefactor 0.8 + colorindex 0x6f 7 + assoc q2_flechettepuff /*the model*/ + lightradius 150 + lightradiusfade 400 + lightrgb 0.19 0.41 0.75 + lightshadows 1 + sound "weapons/lashit.wav" 1 1 0 0 +} r_part TR_BLASTERTRAIL { texture "classicparticle" diff --git a/engine/qclib/qccmain.c b/engine/qclib/qccmain.c index dbce6611..95ca6059 100644 --- a/engine/qclib/qccmain.c +++ b/engine/qclib/qccmain.c @@ -282,7 +282,7 @@ optimisations_t optimisations[] = {&opt_locals_overlapping, "lo", 2, FLAG_KILLSDEBUGGERS, "locals_overlapping", "Store all locals in a single section of the pr_globals. Vastly reducing it. This effectivly does the job of overlaptemps.\nHowever, locals are no longer automatically initialised to 0 (and never were in the case of recursion, but at least then its the same type).\nIf locals appear uninitialised, fteqcc will disable this optimisation for the affected functions, you can optionally get a warning about these locals using: #pragma warning enable F302"}, {&opt_vectorcalls, "vc", 4, FLAG_KILLSDEBUGGERS, "vectorcalls", "Where a function is called with just a vector, this causes the function call to store three floats instead of one vector. This can save a good number of pr_globals where those vectors contain many duplicate coordinates but do not match entirly."}, {&opt_classfields, "cf", 2, FLAG_KILLSDEBUGGERS, "class_fields", "Strip class field names. This will harm debugging and can result in 'gibberish' names appearing in saved games. Has no effect on engines other than FTEQW, which will not recognise these anyway."}, -// {&opt_stripunusedfields, "uf", 4, 0, "strip_unused_fields","Strips any fields that have no references. This may result in extra warnings at load time, or disabling support for mapper-specified alpha in engines that do not provide that."}, +// {&opt_stripunusedfields, "uf", 4, 0, "strip_unused_fields","FIXME: needs relocs. Strips any fields that have no references. This may result in extra warnings at load time, or disabling support for mapper-specified alpha in engines that do not provide that."}, {NULL} }; diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index c004e055..293a8165 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -11536,7 +11536,7 @@ void PR_DumpPlatform_f(void) {"CSQC_Input_Frame", "__used void()", CS, "Called just before each time clientcommandframe is updated. You can edit the input_* globals in order to apply your own player inputs within csqc, which may allow you a convienient way to pass certain info to ssqc."}, {"CSQC_RendererRestarted", "void(string rendererdescription)", CS, "Called by the engine after the video was restarted. This serves to notify the CSQC that any render targets that it may have cached were purged, and will need to be regenerated."}, {"CSQC_ConsoleCommand", "float(string cmd)", CS, "Called if the user uses any console command registed via registercommand."}, - {"CSQC_ConsoleLink", "float(string text, string info)", CS, "Called if the user clicks a ^[text\\infokey\\infovalue^] link. Use infoget to read/check each supported key. Return true if you wish the engine to not attempt to handle the link itself."}, + {"CSQC_ConsoleLink", "float(string text, string info)", CS, "Called if the user clicks a ^[text\\infokey\\infovalue^] link. Use infoget to read/check each supported key. Return true if you wish the engine to not attempt to handle the link itself.\nWARNING: link text can potentially come from other players, so be careful about what you allow to be changed."}, {"CSQC_Ent_Update", "void(float isnew)", CS}, {"CSQC_Ent_Remove", "void()", CS}, {"CSQC_Event_Sound", "float(float entnum, float channel, string soundname, float vol, float attenuation, vector pos, float pitchmod, float flags"/*", float timeofs*/")", CS}, diff --git a/engine/server/savegame.c b/engine/server/savegame.c index 3b401c5a..fe9e8e19 100644 --- a/engine/server/savegame.c +++ b/engine/server/savegame.c @@ -1343,31 +1343,42 @@ void SV_AutoSave(void) return; if (sv.state != ss_active) return; - - //don't bother to autosave multiplayer games. - //this may be problematic with splitscreen, but coop rules tend to apply there anyway. - if (sv.allocated_client_slots != 1) + switch(svs.gametype) + { + default: //probably broken. don't ever try. return; - for (i = 0; i < sv.allocated_client_slots; i++) - { - if (svs.clients[i].state == cs_spawned) +#ifdef VM_LUA + case GT_LUA: +#endif + case GT_Q1QVM: + case GT_PROGS: + //don't bother to autosave multiplayer games. + //this may be problematic with splitscreen, but coop rules tend to apply there anyway. + if (sv.allocated_client_slots != 1) + return; + + for (i = 0; i < sv.allocated_client_slots; i++) { - if (svs.clients[i].edict->v->health <= 0) - return; //autosaves with a dead player are just cruel. + if (svs.clients[i].state == cs_spawned) + { + if (svs.clients[i].edict->v->health <= 0) + return; //autosaves with a dead player are just cruel. - if ((int)svs.clients[i].edict->v->flags & (FL_GODMODE | FL_NOTARGET)) - return; //autosaves to highlight cheaters is also just spiteful. + if ((int)svs.clients[i].edict->v->flags & (FL_GODMODE | FL_NOTARGET)) + return; //autosaves to highlight cheaters is also just spiteful. - if (svs.clients[i].edict->v->movetype != MOVETYPE_WALK) - return; //noclip|fly are cheaters, toss|bounce are bad at playing. etc. + if (svs.clients[i].edict->v->movetype != MOVETYPE_WALK) + return; //noclip|fly are cheaters, toss|bounce are bad at playing. etc. - if (!((int)svs.clients[i].edict->v->flags & FL_ONGROUND)) - return; //autosaves while people are jumping are awkward. + if (!((int)svs.clients[i].edict->v->flags & FL_ONGROUND)) + return; //autosaves while people are jumping are awkward. - if (svs.clients[i].edict->v->velocity[0] || svs.clients[i].edict->v->velocity[1] || svs.clients[i].edict->v->velocity[2]) - return; //people running around are likely to result in poor saves + if (svs.clients[i].edict->v->velocity[0] || svs.clients[i].edict->v->velocity[1] || svs.clients[i].edict->v->velocity[2]) + return; //people running around are likely to result in poor saves + } } + break; } autosavename = M_ChooseAutoSave(); diff --git a/engine/server/sv_ents.c b/engine/server/sv_ents.c index 2f34b8f1..c436bc8d 100644 --- a/engine/server/sv_ents.c +++ b/engine/server/sv_ents.c @@ -303,10 +303,10 @@ static qboolean SV_AddCSQCUpdate (client_t *client, edict_t *ent) #ifndef PEXT_CSQC return false; #else - if (!(client->csqcactive)) + if (!ent->xv->SendEntity) return false; - if (!ent->xv->SendEntity) + if (!(client->csqcactive)) return false; csqcent[csqcnuments++] = ent; @@ -3682,8 +3682,11 @@ void SV_Snapshot_BuildQ1(client_t *client, packet_entities_t *pack, pvscamera_t } else { - // ignore ents without visible models - if (!ent->xv->SendEntity && (!ent->v->modelindex || !*PR_GetString(svprogfuncs, ent->v->model)) && !((int)ent->xv->pflags & PFLAGS_FULLDYNAMIC) && ent->v->skin >= 0) + // many ents are not intended to be networked. + if (!(ent->xv->SendEntity && client->csqcactive) && //if SendEntity is set then its definitely important, even if not visible. + (!ent->v->modelindex || !*PR_GetString(svprogfuncs, ent->v->model)) && // also definitely valid if it has a model + !((int)ent->xv->pflags & PFLAGS_FULLDYNAMIC) && //needs to be networked if its giving off realtime lights, even when it has no model. + ent->v->skin >= 0) //ents with negative skins are networked too. eg ladder volumes. continue; if (cameras) //self doesn't get a pvs test, to cover teleporters diff --git a/engine/server/sv_phys.c b/engine/server/sv_phys.c index ad5d0b8c..fddce5fe 100644 --- a/engine/server/sv_phys.c +++ b/engine/server/sv_phys.c @@ -75,19 +75,19 @@ cvar_t pm_walljump = CVARF("pm_walljump", "", CVAR_SERVERINFO); #define cvargroup_serverphysics "server physics variables" void WPhys_Init(void) { - Cvar_Register (&sv_maxvelocity, cvargroup_serverphysics); - Cvar_Register (&sv_gravity, cvargroup_serverphysics); - Cvar_Register (&sv_stopspeed, cvargroup_serverphysics); - Cvar_Register (&sv_maxspeed, cvargroup_serverphysics); - Cvar_Register (&sv_spectatormaxspeed, cvargroup_serverphysics); - Cvar_Register (&sv_accelerate, cvargroup_serverphysics); - Cvar_Register (&sv_airaccelerate, cvargroup_serverphysics); - Cvar_Register (&sv_wateraccelerate, cvargroup_serverphysics); - Cvar_Register (&sv_friction, cvargroup_serverphysics); - Cvar_Register (&sv_waterfriction, cvargroup_serverphysics); - Cvar_Register (&sv_sound_watersplash, cvargroup_serverphysics); - Cvar_Register (&sv_sound_land, cvargroup_serverphysics); - Cvar_Register (&sv_stepheight, cvargroup_serverphysics); + Cvar_Register (&sv_maxvelocity, cvargroup_serverphysics); + Cvar_Register (&sv_gravity, cvargroup_serverphysics); + Cvar_Register (&sv_stopspeed, cvargroup_serverphysics); + Cvar_Register (&sv_maxspeed, cvargroup_serverphysics); + Cvar_Register (&sv_spectatormaxspeed, cvargroup_serverphysics); + Cvar_Register (&sv_accelerate, cvargroup_serverphysics); + Cvar_Register (&sv_airaccelerate, cvargroup_serverphysics); + Cvar_Register (&sv_wateraccelerate, cvargroup_serverphysics); + Cvar_Register (&sv_friction, cvargroup_serverphysics); + Cvar_Register (&sv_waterfriction, cvargroup_serverphysics); + Cvar_Register (&sv_sound_watersplash, cvargroup_serverphysics); + Cvar_Register (&sv_sound_land, cvargroup_serverphysics); + Cvar_Register (&sv_stepheight, cvargroup_serverphysics); Cvar_Register (&sv_gameplayfix_noairborncorpse, cvargroup_serverphysics); Cvar_Register (&sv_gameplayfix_multiplethinks, cvargroup_serverphysics); @@ -1365,7 +1365,7 @@ static void WPhys_Physics_Toss (world_t *w, wedict_t *ent) #pragma warningmsg("The following line might help boost framerates a lot in rmq, not sure if they violate expected behaviour in other mods though - check that they're safe.") VectorNegate(gravitydir, trace.plane.normal); } - if (trace.fraction == 1) + if (trace.fraction == 1 || !trace.ent) return; if (ED_ISFREE(ent)) return; diff --git a/engine/server/svq2_game.c b/engine/server/svq2_game.c index 9f9bfd44..bf23599d 100644 --- a/engine/server/svq2_game.c +++ b/engine/server/svq2_game.c @@ -691,6 +691,9 @@ static cvar_t *VARGS Q2Cvar_Get (const char *var_name, const char *value, int fl //q2 gamecode knows about these flags. anything else is probably a bug, or 3rd-party extension. flags &= (CVAR_NOSET|CVAR_SERVERINFO|CVAR_USERINFO|CVAR_ARCHIVE|CVAR_LATCH); + if (!strcmp(var_name, "gamedir")) + var_name = "fs_gamedir"; + var = Cvar_Get(var_name, value, flags, "Quake2 game variables"); if (!var) { diff --git a/engine/server/svq3_game.c b/engine/server/svq3_game.c index b6863fea..4aae4086 100644 --- a/engine/server/svq3_game.c +++ b/engine/server/svq3_game.c @@ -2906,7 +2906,6 @@ void SVQ3_ParseUsercmd(client_t *client, qboolean delta) // read delta sequenced usercmds from = &nullcmd; - from->servertime = client->lastcmd.servertime; for(i=0, to=commands; imaxspeed/127.0f; temp.forwardmove *= client->maxspeed/127.0f; temp.upmove *= client->maxspeed/127.0f; + temp.msec = bound(0, to->servertime - temp.servertime, 255); temp.buttons &= ~2; if (temp.buttons & 64) temp.buttons |= 2; SV_RunCmd(&temp, false); + client->lastcmd.servertime = to->servertime; } } if (svs.gametype != GT_QUAKE3) diff --git a/engine/server/world.c b/engine/server/world.c index b137e73a..fbc9827f 100644 --- a/engine/server/world.c +++ b/engine/server/world.c @@ -559,7 +559,9 @@ void QDECL World_LinkEdict (world_t *w, wedict_t *ent, qboolean touch_triggers) VectorAdd (ent->v->origin, ent->v->maxs, ent->v->absmax); } - if (ent->v->modelindex) + if (!ent->v->solid) + ent->solidsize = ES_SOLID_BSP; + else// if (1)///*ent->v->modelindex || */ent->v->model) { model_t *mod = w->Get_CModel(w, ent->v->modelindex); if (mod && mod->type == mod_brush) @@ -567,8 +569,6 @@ void QDECL World_LinkEdict (world_t *w, wedict_t *ent, qboolean touch_triggers) else ent->solidsize = COM_EncodeSize(ent->v->mins, ent->v->maxs); } - else - ent->solidsize = ES_SOLID_BSP; // // to make items easier to pick up and allow them to be grabbed off @@ -1167,7 +1167,7 @@ static trace_t World_ClipMoveToEntity (world_t *w, wedict_t *ent, vec3_t eorg, v } // did we clip the move? - if (trace.fraction < 1 || trace.startsolid) + if (trace.fraction < 1 || trace.startsolid || trace.allsolid) trace.ent = ent; return trace; diff --git a/engine/shaders/Makefile b/engine/shaders/Makefile index 60a61d10..f332190a 100644 --- a/engine/shaders/Makefile +++ b/engine/shaders/Makefile @@ -24,8 +24,8 @@ makevulkanblob: makevulkanblob.c vulkanblobs/%.fvb: vulkan/%.glsl makevulkanblob vulkan/sys/defs.h vulkan/sys/fog.h vulkan/sys/offsetmapping.h vulkan/sys/skeletal.h ./makevulkanblob $< $@ -vulkanblobs/%.fvb: glsl/%.glsl makevulkanblob vulkan/sys/defs.h vulkan/sys/fog.h vulkan/sys/offsetmapping.h vulkan/sys/skeletal.h - ./makevulkanblob $< $@ +#vulkanblobs/%.fvb: glsl/%.glsl makevulkanblob vulkan/sys/defs.h vulkan/sys/fog.h vulkan/sys/offsetmapping.h vulkan/sys/skeletal.h +# ./makevulkanblob $< $@ all: generatebuiltinsl $(ALLNAMES) diff --git a/engine/shaders/vulkan/altwater.glsl b/engine/shaders/vulkan/altwater.glsl index b6e82cb6..455ded4d 100644 --- a/engine/shaders/vulkan/altwater.glsl +++ b/engine/shaders/vulkan/altwater.glsl @@ -1,18 +1,28 @@ -!!cvarf r_glsl_turbscale=1 +!!permu FOG +!!cvarb r_fog_exp2=true +!!cvarf r_glsl_turbscale_reflect=1 +!!cvarf r_glsl_turbscale_refract=1 !!cvarf gl_maxdist=8192 !!cvarf gl_mindist=4 !!samps normalmap diffuse 4 !!argb reflect=0 //s_t1 is a reflection instead of diffusemap -!!argf strength=0.1 //0.1 = fairly gentle, 0.2 = big waves -!!argf fresnel=5.0 //water should be around 5 -!!argf txscale=0.2 //wave strength +!!argf strength_refl=0.1 //0.1 = fairly gentle, 0.2 = big waves +!!argf strength_refr=0.1 //0.1 = fairly gentle, 0.2 = big waves +!!argf fresnel_exp=5.0 //water should be around 5 +!!argf fresnel_range=1.0 +!!argf fresnel_min=1.0 +!!argf txscale1=0.2 //wave strength +!!argf txscale2=0.2 //wave strength !!argb ripplemap=0 //s_t2 contains a ripplemap -!!arg3f tint=0.7 0.8 0.7 //some colour value +!!arg3f tint_refr=0.7 0.8 0.7 //some colour value +!!arg3f tint_refl=0.7 0.8 0.7 //some colour value !!argb depth=0 //s_t3 is a depth image +!!argf alpha=0 //blend in the alpha channel !!arg3f fogtint=0.2 0.3 0.2 //tints as it gets deeper #include "sys/defs.h" +#include "sys/fog.h" layout(location=0) varying vec2 tc; layout(location=1) varying vec4 tf; @@ -49,15 +59,16 @@ void main (void) ntc.t = tc.t + sin(tc.s+e_time)*0.125; //generate the two wave patterns from the normalmap - n = (texture2D(s_normalmap, arg_txscale*tc + vec2(e_time*0.1, 0.0)).xyz); - n += (texture2D(s_normalmap, arg_txscale*tc - vec2(0, e_time*0.097)).xyz); + n = (texture2D(s_normalmap, arg_txscale1*tc + vec2(e_time*0.1, 0.0)).xyz); + n += (texture2D(s_normalmap, arg_txscale2*tc - vec2(0, e_time*0.097)).xyz); n -= 1.0 - 4.0/256.0; if (arg_ripplemap) n += texture2D(s_ripplemap, stc).rgb*3.0; + n = normalize(n); //the fresnel term decides how transparent the water should be - fres = pow(1.0-abs(dot(normalize(n), normalize(eye))), arg_fresnel); + fres = pow(1.0-abs(dot(n, normalize(eye))), arg_fresnel_exp) * arg_fresnel_range + arg_fresnel_min; if (arg_depth) { @@ -91,14 +102,14 @@ void main (void) //refraction image (and water fog, if possible) - refr = texture2D(s_refract, stc + n.st*arg_strength*cvar_r_glsl_turbscale).rgb * arg_tint; + refr = texture2D(s_refract, stc + n.st*arg_strength_refr*cvar_r_glsl_turbscale_refract).rgb * arg_tint_refr; if (arg_depth) refr = mix(refr, arg_fogtint, min(depth/4096.0, 1.0)); //reflection/diffuse -if (arg_reflect) - refl = texture2D(s_reflect, stc - n.st*arg_strength*cvar_r_glsl_turbscale).rgb; -else + if (arg_reflect) + refl = texture2D(s_reflect, stc - n.st*arg_strength_refl*cvar_r_glsl_turbscale_reflect).rgb * arg_tint_refl; + else refl = texture2D(s_diffuse, ntc).xyz; //FIXME: add specular tints @@ -106,6 +117,13 @@ else //interplate by fresnel refr = mix(refr, refl, fres); + if (arg_alpha != 0) + { + vec4 ts = texture2D(s_diffuse, ntc); + vec4 surf = fog4blend(vec4(ts.rgb, arg_alpha*ts.a)); + refr = mix(refr, surf.rgb, surf.a); + } + //done gl_FragColor = vec4(refr, 1.0); } diff --git a/engine/vk/vk_backend.c b/engine/vk/vk_backend.c index 311b6b4f..4b4e06fc 100644 --- a/engine/vk/vk_backend.c +++ b/engine/vk/vk_backend.c @@ -208,16 +208,9 @@ typedef struct float curtime; const entity_t *curentity; const dlight_t *curdlight; -// vec3_t curdlight_colours; shader_t *curshader; shader_t *depthonly; texnums_t *curtexnums; - int curvertdecl; -// unsigned int shaderbits; -// unsigned int curcull; -// float depthbias; -// float depthfactor; -// unsigned int lastpasscount; vbo_t *batchvbo; batch_t *curbatch; batch_t dummybatch; @@ -252,7 +245,6 @@ typedef struct //descriptor sets are: 0) entity+light 1) batch textures + pass textures VkDescriptorSet descriptorsets[1]; -// VkDescriptorPool texturedescpool[2]; //commandbuffer state, to avoid redundant state changes. VkPipeline activepipeline; @@ -456,6 +448,8 @@ static void VK_FinishProg(program_t *prog, const char *name) descSetLayoutCreateInfo.bindingCount = db-dbs; descSetLayoutCreateInfo.pBindings = dbs; + if (vk.khr_push_descriptor) + descSetLayoutCreateInfo.flags |= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR; VkAssert(vkCreateDescriptorSetLayout(vk.device, &descSetLayoutCreateInfo, NULL, &desclayout)); prog->desclayout = desclayout; } @@ -1142,10 +1136,9 @@ qboolean VK_LoadBlob(program_t *prog, void *blobdata, const char *name) prog->pipelines = NULL; //generated as needed, depending on blend states etc. return true; } -void VKBE_DeleteProg(program_t *prog) -{ +static void VKBE_ReallyDeleteProg(program_t *prog) +{ //nothing else is refering to this data any more, its safe to obliterate it. struct pipeline_s *pipe; - Z_Free(prog->cvardata); while(prog->pipelines) { pipe = prog->pipelines; @@ -1157,15 +1150,25 @@ void VKBE_DeleteProg(program_t *prog) } if (prog->layout) vkDestroyPipelineLayout(vk.device, prog->layout, vkallocationcb); - prog->layout = VK_NULL_HANDLE; if (prog->desclayout) vkDestroyDescriptorSetLayout(vk.device, prog->desclayout, vkallocationcb); - prog->desclayout = VK_NULL_HANDLE; if (prog->vert) vkDestroyShaderModule(vk.device, prog->vert, vkallocationcb); - prog->vert = VK_NULL_HANDLE; if (prog->frag) vkDestroyShaderModule(vk.device, prog->frag, vkallocationcb); +} + +void VKBE_DeleteProg(program_t *prog) +{ + //schedule the deletes when its safe to do so. + VK_AtFrameEnd(VKBE_ReallyDeleteProg, prog, sizeof(*prog)); + + //clear stuff out so that the caller doesn't get confused. + Z_Free(prog->cvardata); + prog->pipelines = NULL; + prog->layout = VK_NULL_HANDLE; + prog->desclayout = VK_NULL_HANDLE; + prog->vert = VK_NULL_HANDLE; prog->frag = VK_NULL_HANDLE; } @@ -1217,7 +1220,6 @@ void VKBE_Init(void) be_maxpasses = 1; memset(&shaderstate, 0, sizeof(shaderstate)); shaderstate.inited = true; - shaderstate.curvertdecl = -1; for (i = 0; i < MAXRLIGHTMAPS; i++) shaderstate.dummybatch.lightmap[i] = -1; @@ -1366,66 +1368,82 @@ static VkDescriptorSet VKBE_TempDescriptorSet(VkDescriptorSetLayout layout) } //creates a new dynamic buffer for us to use while streaming. because spoons. -static struct dynbuffer *VKBE_AllocNewBuffer(struct dynbuffer **link, enum dynbuf_e type) +static struct dynbuffer *VKBE_AllocNewBuffer(struct dynbuffer **link, enum dynbuf_e type, VkDeviceSize minsize) { - VkBufferUsageFlags ufl[] = {VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT}; + VkBufferUsageFlags ufl[] = {VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_BUFFER_USAGE_TRANSFER_SRC_BIT}; VkBufferCreateInfo bufinf = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO}; VkMemoryRequirements mem_reqs; VkMemoryAllocateInfo memAllocInfo = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO}; struct dynbuffer *n = Z_Malloc(sizeof(*n)); + qboolean usestaging = (vk_usedynamicstaging & (1u<size = (1u<<20); - bufinf.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - bufinf.queueFamilyIndexCount = 0; - bufinf.pQueueFamilyIndices = NULL; - - if (vk_usedynamicstaging & (1u<devicebuf); - bufinf.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - vkCreateBuffer(vk.device, &bufinf, vkallocationcb, &n->stagingbuf); + bufinf.flags = 0; + bufinf.size = n->size = (1u<<20); + bufinf.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + bufinf.queueFamilyIndexCount = 0; + bufinf.pQueueFamilyIndices = NULL; - vkGetBufferMemoryRequirements(vk.device, n->devicebuf, &mem_reqs); + while (bufinf.size < minsize) + bufinf.size *= 2; + + n->size = bufinf.size; + + if (type != DB_STAGING && usestaging) + { + //create two buffers, one staging/host buffer and one device buffer + bufinf.usage = ufl[type]|VK_BUFFER_USAGE_TRANSFER_DST_BIT; + vkCreateBuffer(vk.device, &bufinf, vkallocationcb, &n->devicebuf); + bufinf.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + vkCreateBuffer(vk.device, &bufinf, vkallocationcb, &n->stagingbuf); + + vkGetBufferMemoryRequirements(vk.device, n->devicebuf, &mem_reqs); + n->align = mem_reqs.alignment-1; + memAllocInfo.allocationSize = mem_reqs.size; + memAllocInfo.memoryTypeIndex = vk_find_memory_require(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VkAssert(vkAllocateMemory(vk.device, &memAllocInfo, vkallocationcb, &n->devicememory)); + VkAssert(vkBindBufferMemory(vk.device, n->devicebuf, n->devicememory, 0)); + + n->renderbuf = n->devicebuf; + } + else + { //single buffer. we'll write directly to the buffer. + bufinf.usage = ufl[type]; + vkCreateBuffer(vk.device, &bufinf, vkallocationcb, &n->stagingbuf); + + n->renderbuf = n->stagingbuf; + } + + //now allocate some host-visible memory for the buffer that we're going to map. + vkGetBufferMemoryRequirements(vk.device, n->stagingbuf, &mem_reqs); n->align = mem_reqs.alignment-1; memAllocInfo.allocationSize = mem_reqs.size; - memAllocInfo.memoryTypeIndex = vk_find_memory_require(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memAllocInfo.memoryTypeIndex = ~0; + // if (memAllocInfo.memoryTypeIndex == ~0) + // memAllocInfo.memoryTypeIndex = vk_find_memory_try(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + if (memAllocInfo.memoryTypeIndex == ~0 && n->renderbuf == n->stagingbuf) //probably won't get anything, but whatever. + memAllocInfo.memoryTypeIndex = vk_find_memory_try(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); if (memAllocInfo.memoryTypeIndex == ~0) - memAllocInfo.memoryTypeIndex = vk_find_memory_require(mem_reqs.memoryTypeBits, 0); //device will still be okay with this usage... - VkAssert(vkAllocateMemory(vk.device, &memAllocInfo, vkallocationcb, &n->devicememory)); - VkAssert(vkBindBufferMemory(vk.device, n->devicebuf, n->devicememory, 0)); + memAllocInfo.memoryTypeIndex = vk_find_memory_try(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); + if (memAllocInfo.memoryTypeIndex == ~0) + { //if we can't find any usable memory, force staging instead. + vkDestroyBuffer(vk.device, n->stagingbuf, vkallocationcb); + if (usestaging) + Sys_Error("Unable to allocate buffer memory"); + usestaging = true; + continue; + } + VkAssert(vkAllocateMemory(vk.device, &memAllocInfo, vkallocationcb, &n->stagingmemory)); + VkAssert(vkBindBufferMemory(vk.device, n->stagingbuf, n->stagingmemory, 0)); - n->renderbuf = n->devicebuf; + VkAssert(vkMapMemory(vk.device, n->stagingmemory, 0, n->size, 0, &n->ptr)); //persistent-mapped. + + n->stagingcoherent = !!(vk.memory_properties.memoryTypes[memAllocInfo.memoryTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + n->next = *link; + *link = n; + return n; } - else - { - bufinf.usage = ufl[type]; - vkCreateBuffer(vk.device, &bufinf, vkallocationcb, &n->stagingbuf); - - n->renderbuf = n->stagingbuf; - } - - vkGetBufferMemoryRequirements(vk.device, n->stagingbuf, &mem_reqs); - n->align = mem_reqs.alignment-1; - memAllocInfo.allocationSize = mem_reqs.size; - memAllocInfo.memoryTypeIndex = vk_find_memory_try(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - if (memAllocInfo.memoryTypeIndex == ~0) - memAllocInfo.memoryTypeIndex = vk_find_memory_try(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); -// if (memAllocInfo.memoryTypeIndex == ~0) -// memAllocInfo.memoryTypeIndex = vk_find_memory_try(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - if (memAllocInfo.memoryTypeIndex == ~0) - memAllocInfo.memoryTypeIndex = vk_find_memory_require(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); - if (memAllocInfo.memoryTypeIndex == ~0) - Sys_Error("Unable to allocate buffer memory"); - VkAssert(vkAllocateMemory(vk.device, &memAllocInfo, vkallocationcb, &n->stagingmemory)); - VkAssert(vkBindBufferMemory(vk.device, n->stagingbuf, n->stagingmemory, 0)); - - VkAssert(vkMapMemory(vk.device, n->stagingmemory, 0, n->size, 0, &n->ptr)); //persistent-mapped. - - n->next = *link; - *link = n; - return n; } static void *fte_restrict VKBE_AllocateBufferSpace(enum dynbuf_e type, size_t datasize, VkBuffer *buf, VkDeviceSize *offset) { //FIXME: ubos need alignment @@ -1434,11 +1452,14 @@ static void *fte_restrict VKBE_AllocateBufferSpace(enum dynbuf_e type, size_t da if (b->offset + datasize > b->size) { //flush the old one, just in case. - VkMappedMemoryRange range = {VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE}; - range.offset = b->flushed; - range.size = b->offset-b->flushed; - range.memory = b->stagingmemory; - vkFlushMappedMemoryRanges(vk.device, 1, &range); + if (!b->stagingcoherent) + { + VkMappedMemoryRange range = {VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE}; + range.offset = b->flushed; + range.size = b->offset-b->flushed; + range.memory = b->stagingmemory; + vkFlushMappedMemoryRanges(vk.device, 1, &range); + } if (b->devicebuf != VK_NULL_HANDLE) { @@ -1452,7 +1473,7 @@ static void *fte_restrict VKBE_AllocateBufferSpace(enum dynbuf_e type, size_t da } if (!b->next) - VKBE_AllocNewBuffer(&b->next, type); + VKBE_AllocNewBuffer(&b->next, type, datasize); b = vk.dynbuf[type] = b->next; b->offset = 0; b->flushed = 0; @@ -1462,7 +1483,7 @@ static void *fte_restrict VKBE_AllocateBufferSpace(enum dynbuf_e type, size_t da *offset = b->offset; ret = (qbyte*)b->ptr + b->offset; - b->offset += datasize; + b->offset += datasize; //FIXME: alignment return ret; } @@ -1474,18 +1495,21 @@ void VKBE_InitFramePools(struct vkframe *frame) for (i = 0; i < DB_MAX; i++) { frame->dynbufs[i] = NULL; - VKBE_AllocNewBuffer(&frame->dynbufs[i], i); + VKBE_AllocNewBuffer(&frame->dynbufs[i], i, 0); } - frame->descpools = VKBE_CreateDescriptorPool(); + frame->descpools = vk.khr_push_descriptor?NULL:VKBE_CreateDescriptorPool(); - { + frame->numcbufs = 0; + frame->maxcbufs = 0; + frame->cbufs = NULL; + /*{ VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO}; cbai.commandPool = vk.cmdpool; cbai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - cbai.commandBufferCount = 1; - VkAssert(vkAllocateCommandBuffers(vk.device, &cbai, &frame->cbuf)); - } + cbai.commandBufferCount = frame->maxcbufs; + VkAssert(vkAllocateCommandBuffers(vk.device, &cbai, frame->cbufs)); + }*/ { VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO}; @@ -1509,10 +1533,13 @@ void VKBE_FlushDynamicBuffers(void) if (d->flushed == d->offset) continue; - range.offset = d->flushed; - range.size = d->offset - d->flushed; - range.memory = d->stagingmemory; - vkFlushMappedMemoryRanges(vk.device, 1, &range); + if (!d->stagingcoherent) + { + range.offset = d->flushed; + range.size = d->offset - d->flushed; + range.memory = d->stagingmemory; + vkFlushMappedMemoryRanges(vk.device, 1, &range); + } if (d->devicebuf != VK_NULL_HANDLE) { @@ -1553,8 +1580,11 @@ void VKBE_RestartFrame(void) shaderstate.activepipeline = VK_NULL_HANDLE; vk.descpool = vk.frame->descpools; - vkResetDescriptorPool(vk.device, vk.descpool->pool, 0); - vk.descpool->availsets = vk.descpool->totalsets; + if (vk.descpool) + { + vkResetDescriptorPool(vk.device, vk.descpool->pool, 0); + vk.descpool->availsets = vk.descpool->totalsets; + } } void VKBE_ShutdownFramePools(struct vkframe *frame) @@ -1712,14 +1742,14 @@ static void T_Gen_CurrentRender(void) if (img->width != vid.fbpwidth || img->height != vid.fbpheight) { //FIXME: free the old image when its safe to do so. - *img = VK_CreateTexture2DArray(vid.fbpwidth, vid.fbpheight, 1, 1, PTI_BGRA8, PTI_2D); + *img = VK_CreateTexture2DArray(vid.fbpwidth, vid.fbpheight, 1, 1, PTI_BGRA8, PTI_2D, true); if (!img->sampler) VK_CreateSampler(shaderstate.tex_currentrender->flags, img); } - vkCmdEndRenderPass(vk.frame->cbuf); + vkCmdEndRenderPass(vk.rendertarg->cbuf); //submit now? @@ -1744,17 +1774,17 @@ static void T_Gen_CurrentRender(void) region.extent.height = vid.fbpheight; region.extent.depth = 1; - set_image_layout(vk.frame->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT); - set_image_layout(vk.frame->cbuf, img->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, 0, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT); - vkCmdCopyImage(vk.frame->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, img->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); - set_image_layout(vk.frame->cbuf, img->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_SHADER_READ_BIT); - set_image_layout(vk.frame->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT); + set_image_layout(vk.rendertarg->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT); + set_image_layout(vk.rendertarg->cbuf, img->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, 0, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT); + vkCmdCopyImage(vk.rendertarg->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, img->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + set_image_layout(vk.rendertarg->cbuf, img->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_SHADER_READ_BIT); + set_image_layout(vk.rendertarg->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT); } //submit now? //barrier? - vkCmdBeginRenderPass(vk.frame->cbuf, &vk.rendertarg->restartinfo, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(vk.rendertarg->cbuf, &vk.rendertarg->restartinfo, VK_SUBPASS_CONTENTS_INLINE); //fixme: viewport+scissor? } @@ -2760,7 +2790,9 @@ static void BE_CreatePipeline(program_t *p, unsigned int shaderflags, unsigned i rs.depthBiasEnable = VK_FALSE; ms.pSampleMask = NULL; - ms.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; + ms.rasterizationSamples = vk.multisamplebits; +// ms.sampleShadingEnable = VK_TRUE; //call the fragment shader multiple times, instead of just once per final pixel +// ms.minSampleShading = 0.25; ds.depthTestEnable = (blendflags&SBITS_MISC_NODEPTHTEST)?VK_FALSE:VK_TRUE; ds.depthWriteEnable = (blendflags&SBITS_MISC_DEPTHWRITE)?VK_TRUE:VK_FALSE; if (blendflags & SBITS_MISC_DEPTHEQUALONLY) @@ -2964,7 +2996,7 @@ static void BE_CreatePipeline(program_t *p, unsigned int shaderflags, unsigned i return; } - vkCmdBindPipeline(vk.frame->cbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, shaderstate.activepipeline=pipe->pipeline); + vkCmdBindPipeline(vk.rendertarg->cbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, shaderstate.activepipeline=pipe->pipeline); } static void BE_BindPipeline(program_t *p, unsigned int shaderflags, unsigned int blendflags, unsigned int permu) { @@ -2993,7 +3025,7 @@ static void BE_BindPipeline(program_t *p, unsigned int shaderflags, unsigned int { shaderstate.activepipeline = pipe->pipeline; if (shaderstate.activepipeline) - vkCmdBindPipeline(vk.frame->cbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, shaderstate.activepipeline); + vkCmdBindPipeline(vk.rendertarg->cbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, shaderstate.activepipeline); } return; } @@ -3062,7 +3094,7 @@ static qboolean BE_SetupMeshProgram(program_t *p, shaderpass_t *pass, unsigned i //most gpus will have a fairly low descriptor set limit of 4 (this is the minimum required) //that isn't enough for all our textures, so we need to make stuff up as required. { - VkDescriptorSet set = shaderstate.descriptorsets[0] = VKBE_TempDescriptorSet(p->desclayout); + VkDescriptorSet set = shaderstate.descriptorsets[0] = vk.khr_push_descriptor?VK_NULL_HANDLE:VKBE_TempDescriptorSet(p->desclayout); VkWriteDescriptorSet descs[MAX_TMUS], *desc = descs; VkDescriptorImageInfo imgs[MAX_TMUS], *img = imgs; unsigned int i; @@ -3144,9 +3176,13 @@ static qboolean BE_SetupMeshProgram(program_t *p, shaderpass_t *pass, unsigned i for (i = 0; i < p->numsamplers; i++) BE_SetupTextureDescriptor(SelectPassTexture(pass+i), r_blackimage, set, descs, desc++, img++); - vkUpdateDescriptorSets(vk.device, desc-descs, descs, 0, NULL); + if (!set) + vkCmdPushDescriptorSetKHR(vk.rendertarg->cbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, p->layout, 0, desc-descs, descs); + else + vkUpdateDescriptorSets(vk.device, desc-descs, descs, 0, NULL); } - vkCmdBindDescriptorSets(vk.frame->cbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, p->layout, 0, countof(shaderstate.descriptorsets), shaderstate.descriptorsets, 0, NULL); + if (!vk.khr_push_descriptor) + vkCmdBindDescriptorSets(vk.rendertarg->cbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, p->layout, 0, countof(shaderstate.descriptorsets), shaderstate.descriptorsets, 0, NULL); RQuantAdd(RQUANT_PRIMITIVEINDICIES, idxcount); RQuantAdd(RQUANT_DRAWS, 1); @@ -3239,7 +3275,7 @@ static void BE_DrawMeshChain_Internal(void) { m = shaderstate.meshlist[0]; - vkCmdBindIndexBuffer(vk.frame->cbuf, shaderstate.batchvbo->indicies.vk.buff, shaderstate.batchvbo->indicies.vk.offs, VK_INDEX_TYPE); + vkCmdBindIndexBuffer(vk.rendertarg->cbuf, shaderstate.batchvbo->indicies.vk.buff, shaderstate.batchvbo->indicies.vk.offs, VK_INDEX_TYPE); idxfirst = m->vbofirstelement; vertcount = m->vbofirstvert + m->numvertexes; @@ -3251,7 +3287,7 @@ static void BE_DrawMeshChain_Internal(void) vertcount = shaderstate.batchvbo->vertcount; idxcount = shaderstate.batchvbo->indexcount; - vkCmdBindIndexBuffer(vk.frame->cbuf, shaderstate.batchvbo->indicies.vk.buff, shaderstate.batchvbo->indicies.vk.offs, VK_INDEX_TYPE); + vkCmdBindIndexBuffer(vk.rendertarg->cbuf, shaderstate.batchvbo->indicies.vk.buff, shaderstate.batchvbo->indicies.vk.offs, VK_INDEX_TYPE); } else { @@ -3273,7 +3309,7 @@ static void BE_DrawMeshChain_Internal(void) map[i] = m->indexes[i]+m->vbofirstvert; map += m->numindexes; } - vkCmdBindIndexBuffer(vk.frame->cbuf, buf, offset, VK_INDEX_TYPE); + vkCmdBindIndexBuffer(vk.rendertarg->cbuf, buf, offset, VK_INDEX_TYPE); idxfirst = 0; } } @@ -3304,7 +3340,7 @@ static void BE_DrawMeshChain_Internal(void) map += m->numindexes; vertcount += m->numvertexes; } - vkCmdBindIndexBuffer(vk.frame->cbuf, buf, offset, VK_INDEX_TYPE); + vkCmdBindIndexBuffer(vk.rendertarg->cbuf, buf, offset, VK_INDEX_TYPE); idxfirst = 0; } @@ -3522,9 +3558,9 @@ static void BE_DrawMeshChain_Internal(void) } } - vkCmdBindVertexBuffers(vk.frame->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); + vkCmdBindVertexBuffers(vk.rendertarg->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); if (BE_SetupMeshProgram(altshader->prog, altshader->passes, altshader->flags, idxcount)) - vkCmdDrawIndexed(vk.frame->cbuf, idxcount, 1, idxfirst, 0, 0); + vkCmdDrawIndexed(vk.rendertarg->cbuf, idxcount, 1, idxfirst, 0, 0); } else if (1) { @@ -3559,9 +3595,9 @@ static void BE_DrawMeshChain_Internal(void) vertexbuffers[VK_BUFF_TDIR] = shaderstate.staticbuf; vertexoffsets[VK_BUFF_TDIR] = vertexoffsets[VK_BUFF_SDIR] + sizeof(vec3_t)*65536; - vkCmdBindVertexBuffers(vk.frame->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); + vkCmdBindVertexBuffers(vk.rendertarg->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); if (BE_SetupMeshProgram(p->prog, p, altshader->flags, idxcount)) - vkCmdDrawIndexed(vk.frame->cbuf, idxcount, 1, idxfirst, 0, 0); + vkCmdDrawIndexed(vk.rendertarg->cbuf, idxcount, 1, idxfirst, 0, 0); continue; } @@ -3609,19 +3645,19 @@ static void BE_DrawMeshChain_Internal(void) vertexbuffers[VK_BUFF_COL] = shaderstate.staticbuf; vertexoffsets[VK_BUFF_COL] = 0; - vkCmdBindVertexBuffers(vk.frame->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); + vkCmdBindVertexBuffers(vk.rendertarg->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); if (BE_SetupMeshProgram(shaderstate.programfixedemu[1], p, altshader->flags, idxcount)) { - vkCmdPushConstants(vk.frame->cbuf, shaderstate.programfixedemu[1]->layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(passcolour), passcolour); - vkCmdDrawIndexed(vk.frame->cbuf, idxcount, 1, idxfirst, 0, 0); + vkCmdPushConstants(vk.rendertarg->cbuf, shaderstate.programfixedemu[1]->layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(passcolour), passcolour); + vkCmdDrawIndexed(vk.rendertarg->cbuf, idxcount, 1, idxfirst, 0, 0); } } else { BE_GenerateColourMods(vertcount, p, &vertexbuffers[VK_BUFF_COL], &vertexoffsets[VK_BUFF_COL]); - vkCmdBindVertexBuffers(vk.frame->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); + vkCmdBindVertexBuffers(vk.rendertarg->cbuf, 0, VK_BUFF_MAX, vertexbuffers, vertexoffsets); if (BE_SetupMeshProgram(shaderstate.programfixedemu[0], p, altshader->flags, idxcount)) - vkCmdDrawIndexed(vk.frame->cbuf, idxcount, 1, idxfirst, 0, 0); + vkCmdDrawIndexed(vk.rendertarg->cbuf, idxcount, 1, idxfirst, 0, 0); } } } @@ -3929,15 +3965,16 @@ void VKBE_GenBrushModelVBO(model_t *mod) } } -/*Wipes a vbo*/ -void VKBE_ClearVBO(vbo_t *vbo) +struct vkbe_clearvbo { - //FIXME: may still be in use by an active commandbuffer. + struct vk_frameend fe; + vbo_t *vbo; +}; +static void VKBE_SafeClearVBO(void *vboptr) +{ + vbo_t *vbo = *(vbo_t**)vboptr; VkDeviceMemory *retarded; - if (vbo->indicies.vk.buff || vbo->coord.vk.buff) - vkDeviceWaitIdle(vk.device); //just in case - if (vbo->indicies.vk.buff) { vkDestroyBuffer(vk.device, vbo->indicies.vk.buff, vkallocationcb); @@ -3956,12 +3993,18 @@ void VKBE_ClearVBO(vbo_t *vbo) BZ_Free(vbo); } +/*Wipes a vbo*/ +void VKBE_ClearVBO(vbo_t *vbo) +{ + VK_AtFrameEnd(VKBE_SafeClearVBO, &vbo, sizeof(vbo)); +} void VK_UploadLightmap(lightmapinfo_t *lm) { extern cvar_t gl_lightmap_nearest; struct pendingtextureinfo mips; image_t *tex; + lm->modified = false; if (!TEXVALID(lm->lightmap_texture)) { @@ -3971,28 +4014,69 @@ void VK_UploadLightmap(lightmapinfo_t *lm) } tex = lm->lightmap_texture; - mips.extrafree = NULL; - mips.type = PTI_2D; - mips.mip[0].data = lm->lightmaps; - mips.mip[0].needfree = false; - mips.mip[0].width = lm->width; - mips.mip[0].height = lm->height; - switch(lightmap_fmt) - { - case TF_BGRA32: - mips.encoding = PTI_BGRX8; - break; - default: - Sys_Error("Unsupported encoding\n"); - break; - } - mips.mipcount = 1; - VK_LoadTextureMips(tex, &mips); - tex->status = TEX_LOADED; - tex->width = lm->width; - tex->height = lm->height; + if (0)//vk.frame && tex->vkimage) + { //the inline streaming path. + //the double-copy sucks but at least ensures that the dma copies stuff from THIS frame and not some of the next one too. + int *data; + VkBufferImageCopy bic; + VkBuffer buf; + //size_t x = 0, w = lm->width; + size_t x = lm->rectchange.l, w = lm->rectchange.r - lm->rectchange.l; + size_t y = lm->rectchange.t, h = lm->rectchange.b - lm->rectchange.t, i; - lm->lightmap_texture = tex; + data = VKBE_AllocateBufferSpace(DB_STAGING, w * h * 4, &buf, &bic.bufferOffset); + bic.bufferRowLength = w; + bic.bufferImageHeight = h; + bic.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + bic.imageSubresource.mipLevel = 0; + bic.imageSubresource.baseArrayLayer = 0; + bic.imageSubresource.layerCount = 1; + bic.imageOffset.x = x; + bic.imageOffset.y = y; + bic.imageOffset.z = 0; + bic.imageExtent.width = w; + bic.imageExtent.height = h; + bic.imageExtent.depth = 1; + + if (w == lm->width) //can just copy the lot in a single call. + memcpy(data, lm->lightmaps + 4*(y * lm->width), w*h*4); + else + { //there's unused data on each row, oh well. + for (i = 0; i < h; i++) + memcpy(data + i * w, lm->lightmaps + 4*((y+i) * lm->width + x), w*4); + } + vkCmdCopyBufferToImage(vk.rendertarg->cbuf, buf, tex->vkimage->image, tex->vkimage->layout, 1, &bic); + } + else + { //the slow out-of-frame generic path. + mips.extrafree = NULL; + mips.type = PTI_2D; + mips.mip[0].data = lm->lightmaps; + mips.mip[0].needfree = false; + mips.mip[0].width = lm->width; + mips.mip[0].height = lm->height; + switch(lightmap_fmt) + { + case TF_BGRA32: + mips.encoding = PTI_BGRX8; + break; + default: + Sys_Error("Unsupported encoding\n"); + break; + } + mips.mipcount = 1; + VK_LoadTextureMips(tex, &mips); + tex->status = TEX_LOADED; + tex->width = lm->width; + tex->height = lm->height; + } + + //invert the size so we're not always updating the entire thing. + lm->rectchange.l = lm->width; + lm->rectchange.t = lm->height; + lm->rectchange.r = 0; + lm->rectchange.b = 0; + lm->modified = false; } /*upload all lightmaps at the start to reduce lags*/ static void BE_UploadLightmaps(qboolean force) @@ -4364,7 +4448,7 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod) viewport.height = r_refdef.pxrect.height; viewport.minDepth = 0; viewport.maxDepth = ndr; - vkCmdSetViewport(vk.frame->cbuf, 0, 1, &viewport); + vkCmdSetViewport(vk.rendertarg->cbuf, 0, 1, &viewport); } } @@ -4443,7 +4527,6 @@ void VKBE_RT_Destroy(struct vk_rendertarg *targ) struct vkbe_rtpurge { - struct vk_fencework fw; VkFramebuffer framebuffer; vk_image_t colour; vk_image_t depth; @@ -4455,7 +4538,7 @@ static void VKBE_RT_Purge(void *ptr) VK_DestroyVkTexture(&ctx->depth); VK_DestroyVkTexture(&ctx->colour); } -void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qboolean clear) +void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qboolean clear, unsigned int flags) { //sooooo much work... VkImageCreateInfo colour_imginfo = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO}; @@ -4470,12 +4553,12 @@ void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qb targ->restartinfo.clearValueCount = 2; targ->depthcleared = true; //will be once its activated. - if (targ->width == width && targ->height == height) + if (targ->width == width && targ->height == height && targ->q_colour.flags == flags) return; //no work to do. if (targ->framebuffer) { //schedule the old one to be destroyed at the end of the current frame. DIE OLD ONE, DIE! - purge = VK_AtFrameEnd(VKBE_RT_Purge, sizeof(*purge)); + purge = VK_AtFrameEnd(VKBE_RT_Purge, NULL, sizeof(*purge)); purge->framebuffer = targ->framebuffer; purge->colour = targ->colour; purge->depth = targ->depth; @@ -4489,6 +4572,7 @@ void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qb targ->q_colour.status = TEX_LOADED; targ->q_colour.width = width; targ->q_colour.height = height; + targ->q_colour.flags = flags; targ->width = width; targ->height = height; @@ -4496,7 +4580,7 @@ void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qb if (width == 0 && height == 0) return; //destroyed - colour_imginfo.format = VK_FORMAT_R8G8B8A8_UNORM; + colour_imginfo.format = vk.backbufformat; colour_imginfo.flags = 0; colour_imginfo.imageType = VK_IMAGE_TYPE_2D; colour_imginfo.extent.width = width; @@ -4568,14 +4652,14 @@ void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qb { VkSamplerCreateInfo lmsampinfo = {VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; - lmsampinfo.minFilter = lmsampinfo.magFilter = VK_FILTER_LINEAR; + lmsampinfo.minFilter = lmsampinfo.magFilter = (flags&IF_NEAREST)?VK_FILTER_NEAREST:VK_FILTER_LINEAR; lmsampinfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; lmsampinfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; lmsampinfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; lmsampinfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; lmsampinfo.mipLodBias = 0.0; lmsampinfo.anisotropyEnable = VK_FALSE; - lmsampinfo.maxAnisotropy = 0; + lmsampinfo.maxAnisotropy = 1.0; lmsampinfo.compareOp = VK_COMPARE_OP_LESS_OR_EQUAL; lmsampinfo.minLod = 0; lmsampinfo.maxLod = 0; @@ -4589,15 +4673,16 @@ void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qb VkAssert(vkCreateSampler(vk.device, &lmsampinfo, NULL, &targ->depth.sampler)); } - targ->colour.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - targ->depth.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; + targ->colour.layout = VK_IMAGE_LAYOUT_UNDEFINED; + targ->mscolour.layout = VK_IMAGE_LAYOUT_UNDEFINED; + targ->depth.layout = VK_IMAGE_LAYOUT_UNDEFINED; { VkFramebufferCreateInfo fbinfo = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO}; - VkImageView attachments[2] = {targ->colour.view, targ->depth.view}; + VkImageView attachments[3] = {targ->colour.view, targ->depth.view, targ->mscolour.view}; fbinfo.flags = 0; fbinfo.renderPass = vk.renderpass[2]; - fbinfo.attachmentCount = countof(attachments); + fbinfo.attachmentCount = (vk.multisamplebits!=VK_SAMPLE_COUNT_1_BIT)?3:2; fbinfo.pAttachments = attachments; fbinfo.width = width; fbinfo.height = height; @@ -4618,7 +4703,6 @@ void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qb struct vkbe_rtpurge_cube { - struct vk_fencework fw; vk_image_t colour; vk_image_t depth; struct @@ -4663,7 +4747,7 @@ void VKBE_RT_Gen_Cube(struct vk_rendertarg_cube *targ, uint32_t size, qboolean c if (targ->size) { //schedule the old one to be destroyed at the end of the current frame. DIE OLD ONE, DIE! - purge = VK_AtFrameEnd(VKBE_RT_Purge_Cube, sizeof(*purge)); + purge = VK_AtFrameEnd(VKBE_RT_Purge_Cube, NULL, sizeof(*purge)); for (f = 0; f < 6; f++) { purge->face[f].framebuffer = targ->face[f].framebuffer; @@ -4741,7 +4825,7 @@ void VKBE_RT_Gen_Cube(struct vk_rendertarg_cube *targ, uint32_t size, qboolean c lmsampinfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; lmsampinfo.mipLodBias = 0.0; lmsampinfo.anisotropyEnable = VK_FALSE; - lmsampinfo.maxAnisotropy = 0; + lmsampinfo.maxAnisotropy = 1.0; lmsampinfo.compareOp = VK_COMPARE_OP_LESS_OR_EQUAL; lmsampinfo.minLod = 0; lmsampinfo.maxLod = 0; @@ -4842,9 +4926,6 @@ void VKBE_RT_Begin(struct vk_rendertarg *targ) if (vk.rendertarg == targ) return; - if (vk.rendertarg) - vkCmdEndRenderPass(vk.frame->cbuf); - r_refdef.pxrect.x = 0; r_refdef.pxrect.y = 0; r_refdef.pxrect.width = targ->width; @@ -4854,7 +4935,33 @@ void VKBE_RT_Begin(struct vk_rendertarg *targ) vid.fbpwidth = targ->width; vid.fbpheight = targ->height; - vkCmdBeginRenderPass(vk.frame->cbuf, &targ->restartinfo, VK_SUBPASS_CONTENTS_INLINE); +#if 0 + targ->cbuf = vk.rendertarg->cbuf; + if (vk.rendertarg) + vkCmdEndRenderPass(vk.rendertarg->cbuf); +#else + shaderstate.activepipeline = VK_NULL_HANDLE; + targ->cbuf = VK_AllocFrameCBuf(); + + { + VkCommandBufferBeginInfo begininf = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO}; + VkCommandBufferInheritanceInfo inh = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO}; + begininf.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + begininf.pInheritanceInfo = &inh; + inh.renderPass = VK_NULL_HANDLE; //unused + inh.subpass = 0; //unused + inh.framebuffer = VK_NULL_HANDLE; //unused + inh.occlusionQueryEnable = VK_FALSE; + inh.queryFlags = 0; + inh.pipelineStatistics = 0; + vkBeginCommandBuffer(targ->cbuf, &begininf); + } +#endif + + targ->prevtarg = vk.rendertarg; + vk.rendertarg = targ; + + vkCmdBeginRenderPass(vk.rendertarg->cbuf, &targ->restartinfo, VK_SUBPASS_CONTENTS_INLINE); //future reuse shouldn't clear stuff if (targ->restartinfo.clearValueCount) { @@ -4862,7 +4969,6 @@ void VKBE_RT_Begin(struct vk_rendertarg *targ) targ->restartinfo.renderPass = vk.renderpass[0]; targ->restartinfo.clearValueCount = 0; } - vk.rendertarg = targ; { VkRect2D wrekt; @@ -4873,25 +4979,52 @@ void VKBE_RT_Begin(struct vk_rendertarg *targ) viewport.height = r_refdef.pxrect.height; viewport.minDepth = 0; viewport.maxDepth = shaderstate.depthrange; - vkCmdSetViewport(vk.frame->cbuf, 0, 1, &viewport); + vkCmdSetViewport(vk.rendertarg->cbuf, 0, 1, &viewport); wrekt.offset.x = viewport.x; wrekt.offset.y = viewport.y; wrekt.extent.width = viewport.width; wrekt.extent.height = viewport.height; - vkCmdSetScissor(vk.frame->cbuf, 0, 1, &wrekt); + vkCmdSetScissor(vk.rendertarg->cbuf, 0, 1, &wrekt); } } +void VKBE_RT_End(struct vk_rendertarg *targ) +{ + if (R2D_Flush) + R2D_Flush(); + + vk.rendertarg = vk.rendertarg->prevtarg; + + vid.fbpwidth = vk.rendertarg->width; + vid.fbpheight = vk.rendertarg->height; + +#if 0 +#else + shaderstate.activepipeline = VK_NULL_HANDLE; + vkCmdEndRenderPass(targ->cbuf); + vkEndCommandBuffer(targ->cbuf); + + VK_Submit_Work(targ->cbuf, VK_NULL_HANDLE, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, NULL); + +// VK_Submit_Work(VkCommandBuffer cmdbuf, VkSemaphore semwait, VkPipelineStageFlags semwaitstagemask, VkSemaphore semsignal, VkFence fencesignal, struct vkframe *presentframe, struct vk_fencework *fencedwork) +#endif +} + static qboolean BE_GenerateRefraction(batch_t *batch, shader_t *bs) { + extern cvar_t r_refractreflect_scale; float oldil; int oldbem; struct vk_rendertarg *targ; //these flags require rendering some view as an fbo if (r_refdef.recurse) return false; + if (r_refdef.recurse == r_portalrecursion.ival || r_refdef.recurse == R_MAX_RECURSE) + return false; if (shaderstate.mode != BEM_STANDARD && shaderstate.mode != BEM_DEPTHDARK) return false; + if (vk.multisamplebits != VK_SAMPLE_COUNT_1_BIT) + return false; //multisample rendering can't deal with this. oldbem = shaderstate.mode; oldil = shaderstate.identitylighting; targ = vk.rendertarg; @@ -4903,11 +5036,12 @@ static qboolean BE_GenerateRefraction(batch_t *batch, shader_t *bs) r_refdef.vrect.x = 0; r_refdef.vrect.y = 0; - r_refdef.vrect.width = vid.fbvwidth/2; - r_refdef.vrect.height = vid.fbvheight/2; - VKBE_RT_Gen(&shaderstate.rt_reflection, vid.fbpwidth/2, vid.fbpheight/2, false); + r_refdef.vrect.width = max(1, vid.fbvwidth*r_refractreflect_scale.value); + r_refdef.vrect.height = max(1, vid.fbvheight*r_refractreflect_scale.value); + VKBE_RT_Gen(&shaderstate.rt_reflection, r_refdef.vrect.width, r_refdef.vrect.height, false, RT_IMAGEFLAGS); VKBE_RT_Begin(&shaderstate.rt_reflection); R_DrawPortal(batch, cl.worldmodel->batches, NULL, 1); + VKBE_RT_End(&shaderstate.rt_reflection); r_refdef.vrect = orect; r_refdef.pxrect = oprect; } @@ -4923,18 +5057,17 @@ static qboolean BE_GenerateRefraction(batch_t *batch, shader_t *bs) r_refdef.vrect.y = 0; r_refdef.vrect.width = vid.fbvwidth/2; r_refdef.vrect.height = vid.fbvheight/2; - VKBE_RT_Gen(&shaderstate.rt_refraction, vid.fbpwidth/2, vid.fbpheight/2, false); + VKBE_RT_Gen(&shaderstate.rt_refraction, r_refdef.vrect.width, r_refdef.vrect.height, false, RT_IMAGEFLAGS); VKBE_RT_Begin(&shaderstate.rt_refraction); R_DrawPortal(batch, cl.worldmodel->batches, NULL, ((bs->flags & SHADER_HASREFRACTDEPTH)?3:2)); //fixme + VKBE_RT_End(&shaderstate.rt_refraction); r_refdef.vrect = ovrect; r_refdef.pxrect = oprect; shaderstate.tex_refraction = &shaderstate.rt_refraction.q_colour; - VKBE_RT_Begin(targ); } else { - VKBE_RT_Begin(targ); R_DrawPortal(batch, cl.worldmodel->batches, NULL, 3); T_Gen_CurrentRender(); shaderstate.tex_refraction = shaderstate.tex_currentrender; @@ -4994,7 +5127,6 @@ static qboolean BE_GenerateRefraction(batch_t *batch, shader_t *bs) BE_RT_End(); } */ - VKBE_RT_Begin(targ); VKBE_SelectMode(oldbem); shaderstate.identitylighting = oldil; @@ -5557,7 +5689,7 @@ static void BE_SubmitMeshesPortals(batch_t **worldlist, batch_t *dynamiclist) rect.rect.extent.height = r_refdef.pxrect.height; rect.layerCount = 1; rect.baseArrayLayer = 0; - vkCmdClearAttachments(vk.frame->cbuf, 1, &clr, 1, &rect); + vkCmdClearAttachments(vk.rendertarg->cbuf, 1, &clr, 1, &rect); } VKBE_SelectMode(BEM_DEPTHONLY); VKBE_SubmitBatch(batch); @@ -5652,15 +5784,9 @@ struct vk_shadowbuffer *VKBE_GenerateShadowBuffer(vecV_t *verts, int numverts, i return buf; } } -struct vk_shadowbuffer_destroy -{ - struct vk_fencework fw; - struct vk_shadowbuffer buf; -}; static void VKBE_DestroyShadowBuffer_Delayed(void *ctx) { - struct vk_shadowbuffer_destroy *d = ctx; - struct vk_shadowbuffer *buf = &d->buf; + struct vk_shadowbuffer *buf = ctx; vkDestroyBuffer(vk.device, buf->vbuffer, vkallocationcb); vkDestroyBuffer(vk.device, buf->ibuffer, vkallocationcb); vkFreeMemory(vk.device, buf->vmemory, vkallocationcb); @@ -5670,8 +5796,7 @@ void VKBE_DestroyShadowBuffer(struct vk_shadowbuffer *buf) { if (buf && buf->isstatic) { - struct vk_shadowbuffer_destroy *ctx = VK_AtFrameEnd(VKBE_DestroyShadowBuffer_Delayed, sizeof(*ctx)); - ctx->buf = *buf; + struct vk_shadowbuffer_destroy *ctx = VK_AtFrameEnd(VKBE_DestroyShadowBuffer_Delayed, buf, sizeof(*buf)); Z_Free(buf); } } @@ -5694,10 +5819,10 @@ void VKBE_RenderShadowBuffer(struct vk_shadowbuffer *buf) "}\n" ); - vkCmdBindVertexBuffers(vk.frame->cbuf, 0, 1, &buf->vbuffer, &buf->voffset); - vkCmdBindIndexBuffer(vk.frame->cbuf, buf->ibuffer, buf->ioffset, VK_INDEX_TYPE); - if (BE_SetupMeshProgram(depthonlyshader->passes[0].prog, depthonlyshader->passes, 0, buf->numindicies)) - vkCmdDrawIndexed(vk.frame->cbuf, buf->numindicies, 1, 0, 0, 0); + vkCmdBindVertexBuffers(vk.rendertarg->cbuf, 0, 1, &buf->vbuffer, &buf->voffset); + vkCmdBindIndexBuffer(vk.rendertarg->cbuf, buf->ibuffer, buf->ioffset, VK_INDEX_TYPE); + if (BE_SetupMeshProgram(depthonlyshader->prog, depthonlyshader->passes, 0, buf->numindicies)) + vkCmdDrawIndexed(vk.rendertarg->cbuf, buf->numindicies, 1, 0, 0, 0); } @@ -5740,7 +5865,7 @@ qboolean VKBE_BeginShadowmap(qboolean isspot, uint32_t width, uint32_t height) // const qboolean altqueue = false; // if (!altqueue) -// vkCmdEndRenderPass(vk.frame->cbuf); + vkCmdEndRenderPass(vk.rendertarg->cbuf); if (shad->width != width || shad->height != height) { @@ -5851,7 +5976,7 @@ qboolean VKBE_BeginShadowmap(qboolean isspot, uint32_t width, uint32_t height) lmsampinfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; lmsampinfo.mipLodBias = 0.0; lmsampinfo.anisotropyEnable = VK_FALSE; - lmsampinfo.maxAnisotropy = 0; + lmsampinfo.maxAnisotropy = 1.0; lmsampinfo.compareEnable = VK_TRUE; lmsampinfo.compareOp = VK_COMPARE_OP_LESS_OR_EQUAL; lmsampinfo.minLod = 0; @@ -5889,7 +6014,7 @@ qboolean VKBE_BeginShadowmap(qboolean isspot, uint32_t width, uint32_t height) imgbarrier.subresourceRange.layerCount = 1; imgbarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; imgbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - vkCmdPipelineBarrier(vk.frame->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); + vkCmdPipelineBarrier(vk.rendertarg->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); } { @@ -5905,7 +6030,7 @@ qboolean VKBE_BeginShadowmap(qboolean isspot, uint32_t width, uint32_t height) rpass.renderArea.extent.height = height; rpass.clearValueCount = 1; rpass.pClearValues = &clearval; - vkCmdBeginRenderPass(vk.frame->cbuf, &rpass, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(vk.rendertarg->cbuf, &rpass, VK_SUBPASS_CONTENTS_INLINE); } //viewport+scissor will be done elsewhere @@ -5922,7 +6047,7 @@ void VKBE_DoneShadows(void) //we've rendered the shadowmap, but now we need to blit it to the screen //so set stuff back to the main view. FIXME: do these in batches to ease the load on tilers. - vkCmdEndRenderPass(vk.frame->cbuf); + vkCmdEndRenderPass(vk.rendertarg->cbuf); /*if (altqueue) { @@ -5955,7 +6080,7 @@ void VKBE_DoneShadows(void) } */ - vkCmdBeginRenderPass(vk.frame->cbuf, &vk.rendertarg->restartinfo, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(vk.rendertarg->cbuf, &vk.rendertarg->restartinfo, VK_SUBPASS_CONTENTS_INLINE); viewport.x = r_refdef.pxrect.x; viewport.y = r_refdef.pxrect.y;//r_refdef.pxrect.maxheight - (r_refdef.pxrect.y+r_refdef.pxrect.height); //silly GL... @@ -5963,7 +6088,7 @@ void VKBE_DoneShadows(void) viewport.height = r_refdef.pxrect.height; viewport.minDepth = 0; viewport.maxDepth = shaderstate.depthrange; - vkCmdSetViewport(vk.frame->cbuf, 0, 1, &viewport); + vkCmdSetViewport(vk.rendertarg->cbuf, 0, 1, &viewport); } @@ -6002,13 +6127,13 @@ void VKBE_BeginShadowmapFace(void) viewport.height = r_refdef.pxrect.height; viewport.minDepth = 0; viewport.maxDepth = 1; - vkCmdSetViewport(vk.frame->cbuf, 0, 1, &viewport); + vkCmdSetViewport(vk.rendertarg->cbuf, 0, 1, &viewport); wrekt.offset.x = viewport.x; wrekt.offset.y = viewport.y; wrekt.extent.width = viewport.width; wrekt.extent.height = viewport.height; - vkCmdSetScissor(vk.frame->cbuf, 0, 1, &wrekt); + vkCmdSetScissor(vk.rendertarg->cbuf, 0, 1, &wrekt); } #endif @@ -6168,7 +6293,7 @@ void VKBE_VBO_Destroy(vboarray_t *vearray, void *mem) if (!vearray->vk.buff) return; //not actually allocated... - fence = VK_AtFrameEnd(VKBE_DoneBufferStaging, sizeof(*fence)); + fence = VK_AtFrameEnd(VKBE_DoneBufferStaging, NULL, sizeof(*fence)); fence->buf = vearray->vk.buff; fence->mem = *retarded; @@ -6208,7 +6333,7 @@ void VKBE_Scissor(srect_t *rect) wrekt.extent.height = vid.fbpheight; } - vkCmdSetScissor(vk.frame->cbuf, 0, 1, &wrekt); + vkCmdSetScissor(vk.rendertarg->cbuf, 0, 1, &wrekt); } #endif diff --git a/engine/vk/vk_init.c b/engine/vk/vk_init.c index c3c22af6..08b8c8d4 100644 --- a/engine/vk/vk_init.c +++ b/engine/vk/vk_init.c @@ -8,9 +8,13 @@ extern qboolean vid_isfullscreen; extern cvar_t vk_submissionthread; extern cvar_t vk_debug; -extern cvar_t vk_loadglsl; extern cvar_t vk_dualqueue; -extern cvar_t vid_srgb, vid_vsync, vid_triplebuffer, r_stereo_method; +extern cvar_t vk_busywait; +extern cvar_t vk_nv_glsl_shader; +extern cvar_t vk_nv_dedicated_allocation; +extern cvar_t vk_khr_dedicated_allocation; +extern cvar_t vk_khr_push_descriptor; +extern cvar_t vid_srgb, vid_vsync, vid_triplebuffer, r_stereo_method, vid_multisample; void R2D_Console_Resize(void); const char *vklayerlist[] = @@ -155,29 +159,27 @@ static void VK_DestroySwapChain(void) Sys_WaitOnThread(vk.submitthread); vk.submitthread = NULL; } - if (vk.dopresent) - vk.dopresent(NULL); - while (vk.aquirenext < vk.aquirelast) - { - VkWarnAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX)); - vk.aquirenext++; - } while (vk.work) { Sys_LockConditional(vk.submitcondition); VK_Submit_DoWork(); Sys_UnlockConditional(vk.submitcondition); } + if (vk.dopresent) + vk.dopresent(NULL); if (vk.device) vkDeviceWaitIdle(vk.device); + /*while (vk.aquirenext < vk.aquirelast) + { + VkWarnAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX)); + vk.aquirenext++; + }*/ VK_FencedCheck(); while(vk.frameendjobs) { //we've fully synced the gpu now, we can clean up any resources that were pending but not assigned yet. - struct vk_fencework *job = vk.frameendjobs; + struct vk_frameend *job = vk.frameendjobs; vk.frameendjobs = job->next; - job->Passed(job); - if (job->fence || job->cbuf) - Con_Printf("job with junk\n"); + job->FrameEnded(job+1); Z_Free(job); } @@ -198,6 +200,7 @@ static void VK_DestroySwapChain(void) vkDestroyImageView(vk.device, vk.backbufs[i].colour.view, vkallocationcb); vk.backbufs[i].colour.view = VK_NULL_HANDLE; VK_DestroyVkTexture(&vk.backbufs[i].depth); + VK_DestroyVkTexture(&vk.backbufs[i].mscolour); } if (vk.dopresent) @@ -207,6 +210,8 @@ static void VK_DestroySwapChain(void) VkWarnAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX)); vk.aquirenext++; } + if (vk.device) + vkDeviceWaitIdle(vk.device); for (i = 0; i < ACQUIRELIMIT; i++) { if (vk.acquirefences[i]) @@ -221,8 +226,7 @@ static void VK_DestroySwapChain(void) VKBE_ShutdownFramePools(frame); - vkResetCommandBuffer(frame->cbuf, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); - vkFreeCommandBuffers(vk.device, vk.cmdpool, 1, &frame->cbuf); + vkFreeCommandBuffers(vk.device, vk.cmdpool, frame->maxcbufs, frame->cbufs); vkDestroyFence(vk.device, frame->finishedfence, vkallocationcb); Z_Free(frame); } @@ -252,13 +256,24 @@ static qboolean VK_CreateSwapChain(void) VkSwapchainKHR newvkswapchain; VkImage *images; VkDeviceMemory *memories; - VkImageView attachments[2]; + VkImageView attachments[3]; VkFramebufferCreateInfo fb_info = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO}; + VkSampleCountFlagBits oldms; vk.dopresent(NULL); //make sure they're all pushed through. - if (vk.headless) - { + + vid_vsync.modified = false; + vid_triplebuffer.modified = false; + vid_srgb.modified = false; + vk_submissionthread.modified = false; + vid_multisample.modified = false; + + vk.triplebuffer = vid_triplebuffer.ival; + vk.vsync = vid_vsync.ival; + + if (!vk.khr_swapchain) + { //headless if (vk.swapchain || vk.backbuf_count) VK_DestroySwapChain(); @@ -288,7 +303,9 @@ static qboolean VK_CreateSwapChain(void) { VkMemoryRequirements mem_reqs; VkMemoryAllocateInfo memAllocInfo = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO}; + VkDedicatedAllocationMemoryAllocateInfoNV nv_damai = {VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV}; VkImageCreateInfo ici = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO}; + VkDedicatedAllocationImageCreateInfoNV nv_daici = {VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV}; ici.flags = 0; ici.imageType = VK_IMAGE_TYPE_2D; @@ -306,6 +323,13 @@ static qboolean VK_CreateSwapChain(void) ici.pQueueFamilyIndices = NULL; ici.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + if (vk.nv_dedicated_allocation) + { //render targets should always have dedicated allocations, supposedly. and we're doing it anyway. + nv_daici.dedicatedAllocation = true; + nv_daici.pNext = ici.pNext; + ici.pNext = &nv_daici; + } + VkAssert(vkCreateImage(vk.device, &ici, vkallocationcb, &images[i])); vkGetImageMemoryRequirements(vk.device, images[i], &mem_reqs); @@ -319,12 +343,19 @@ static qboolean VK_CreateSwapChain(void) if (memAllocInfo.memoryTypeIndex == ~0) memAllocInfo.memoryTypeIndex = vk_find_memory_require(mem_reqs.memoryTypeBits, 0); + if (vk.nv_dedicated_allocation) + { //annoying, but hey. + nv_damai.pNext = memAllocInfo.pNext; + nv_damai.image = images[i]; + memAllocInfo.pNext = &nv_damai; + } + VkAssert(vkAllocateMemory(vk.device, &memAllocInfo, vkallocationcb, &memories[i])); VkAssert(vkBindImageMemory(vk.device, images[i], memories[i], 0)); } } else - { + { //using vulkan's presentation engine. VkAssert(vkGetPhysicalDeviceSurfaceFormatsKHR(vk.gpu, vk.surface, &fmtcount, NULL)); surffmts = malloc(sizeof(VkSurfaceFormatKHR)*fmtcount); VkAssert(vkGetPhysicalDeviceSurfaceFormatsKHR(vk.gpu, vk.surface, &fmtcount, surffmts)); @@ -462,6 +493,26 @@ static qboolean VK_CreateSwapChain(void) } } + oldms = vk.multisamplebits; + + vk.multisamplebits = VK_SAMPLE_COUNT_1_BIT; +#ifdef _DEBUG + if (vid_multisample.ival>1) + { + VkSampleCountFlags fl = vk.limits.framebufferColorSampleCounts & vk.limits.framebufferDepthSampleCounts; + Con_Printf("Warning: vulkan multisample does not work with rtlights or render targets etc etc\n"); + for (i = 1; i < 30; i++) + if ((fl & (1<sampler)); } +static void VK_DestroySampler(struct vk_frameend *w) +{ + VkSampler s = *(VkSampler*)w; + vkDestroySampler(vk.device, s, vkallocationcb); +} void VK_UpdateFiltering(image_t *imagelist, int filtermip[3], int filterpic[3], int mipcap[2], float anis) { uint32_t i; @@ -650,24 +800,38 @@ void VK_UpdateFiltering(image_t *imagelist, int filtermip[3], int filterpic[3], vk.filterpic[i] = filterpic[i]; for (i = 0; i < countof(vk.mipcap); i++) vk.mipcap[i] = mipcap[i]; - vk.max_anistophy = anis; + vk.max_anistophy = bound(1.0, anis, vk.max_anistophy_limit); - vkDeviceWaitIdle(vk.device); while(imagelist) { if (imagelist->vkimage) + { + if (imagelist->vkimage->sampler) + { //the sampler might still be in use, so clean it up at the end of the frame. + //all this to avoid syncing all the queues... + VK_AtFrameEnd(VK_DestroySampler, &imagelist->vkimage->sampler, sizeof(imagelist->vkimage->sampler)); + imagelist->vkimage->sampler = VK_NULL_HANDLE; + } VK_CreateSampler(imagelist->flags, imagelist->vkimage); + } imagelist = imagelist->next; } } -vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t layers, uint32_t mips, unsigned int encoding, unsigned int type) +vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t layers, uint32_t mips, unsigned int encoding, unsigned int type, qboolean rendertarget) { vk_image_t ret; +#ifdef USE_STAGING_BUFFERS qboolean staging = layers == 0; +#else + const qboolean staging = false; +#endif VkMemoryRequirements mem_reqs; VkMemoryAllocateInfo memAllocInfo = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO}; + VkDedicatedAllocationMemoryAllocateInfoNV nv_damai = {VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV}; + VkImageCreateInfo ici = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO}; + VkDedicatedAllocationImageCreateInfoNV nv_daici = {VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV}; VkFormat format; ret.width = width; @@ -742,7 +906,12 @@ vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t lay ici.queueFamilyIndexCount = 0; ici.pQueueFamilyIndices = NULL; ici.initialLayout = ret.layout; - + if (vk.nv_dedicated_allocation/* && (size > foo || rendertarget)*/) //FIXME: should only really be used for rendertargets or large images, other stuff should be merged. however, as we don't support any memory suballocations, we're going to just flag everything for now. + { + nv_daici.dedicatedAllocation = true; + nv_daici.pNext = ici.pNext; + ici.pNext = &nv_daici; + } VkAssert(vkCreateImage(vk.device, &ici, vkallocationcb, &ret.image)); vkGetImageMemoryRequirements(vk.device, ret.image, &mem_reqs); @@ -760,7 +929,12 @@ vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t lay if (memAllocInfo.memoryTypeIndex == ~0) memAllocInfo.memoryTypeIndex = vk_find_memory_require(mem_reqs.memoryTypeBits, 0); } - + if (nv_daici.dedicatedAllocation) + { + nv_damai.image = ret.image; + nv_damai.pNext = memAllocInfo.pNext; + memAllocInfo.pNext = &nv_damai; + } VkAssert(vkAllocateMemory(vk.device, &memAllocInfo, vkallocationcb, &ret.memory)); VkAssert(vkBindImageMemory(vk.device, ret.image, ret.memory, 0)); @@ -903,15 +1077,18 @@ void VK_FencedSync(void *work) //called to schedule the release of a resource that may be referenced by an active command buffer. //the command buffer in question may even have not yet been submitted yet. -void *VK_AtFrameEnd(void (*passed)(void *work), size_t worksize) +void *VK_AtFrameEnd(void (*frameended)(void *work), void *workdata, size_t worksize) { - struct vk_fencework *w = Z_Malloc(worksize?worksize:sizeof(*w)); + struct vk_frameend *w = Z_Malloc(sizeof(*w) + worksize); - w->Passed = passed; + w->FrameEnded = frameended; w->next = vk.frameendjobs; vk.frameendjobs = w; - return w; + if (workdata) + memcpy(w+1, workdata, worksize); + + return w+1; } #define USE_STAGING_BUFFERS @@ -1035,9 +1212,10 @@ qboolean VK_LoadTextureMips (texid_t tex, struct pendingtextureinfo *mips) tex->vkimage->encoding != mips->encoding || tex->vkimage->type != mips->type) { - vkDeviceWaitIdle(vk.device); //erk, we can't cope with a commandbuffer poking the texture while things happen - VK_FencedCheck(); - VK_DestroyVkTexture(tex->vkimage); + VK_AtFrameEnd(VK_DestroyVkTexture, tex->vkimage, sizeof(*tex->vkimage)); +// vkDeviceWaitIdle(vk.device); //erk, we can't cope with a commandbuffer poking the texture while things happen +// VK_FencedCheck(); +// VK_DestroyVkTexture(tex->vkimage); Z_Free(tex->vkimage); tex->vkimage = NULL; } @@ -1072,7 +1250,7 @@ qboolean VK_LoadTextureMips (texid_t tex, struct pendingtextureinfo *mips) } else { - target = VK_CreateTexture2DArray(mips->mip[0].width, mips->mip[0].height, layers, mips->mipcount/layers, mips->encoding, mips->type); + target = VK_CreateTexture2DArray(mips->mip[0].width, mips->mip[0].height, layers, mips->mipcount/layers, mips->encoding, mips->type, !!(tex->flags&IF_RENDERTARGET)); { //images have weird layout representations. @@ -1111,6 +1289,9 @@ qboolean VK_LoadTextureMips (texid_t tex, struct pendingtextureinfo *mips) bci.queueFamilyIndexCount = 0; bci.pQueueFamilyIndices = NULL; + //FIXME: nvidia's vkCreateBuffer ends up calling NtYieldExecution. + //which is basically a waste of time, and its hurting framerates. + //create+map the staging buffer VkAssert(vkCreateBuffer(vk.device, &bci, vkallocationcb, &fence->stagingbuffer)); vkGetBufferMemoryRequirements(vk.device, fence->stagingbuffer, &mem_reqs); @@ -1370,8 +1551,8 @@ void VK_Set2D(void) scissor[0].offset.y = r_refdef.pxrect.y; scissor[0].extent.width = r_refdef.pxrect.width; scissor[0].extent.height = r_refdef.pxrect.height; - vkCmdSetViewport(vk.frame->cbuf, 0, countof(vp), vp); - vkCmdSetScissor(vk.frame->cbuf, 0, countof(scissor), scissor); + vkCmdSetViewport(vk.rendertarg->cbuf, 0, countof(vp), vp); + vkCmdSetScissor(vk.rendertarg->cbuf, 0, countof(scissor), scissor); } VKBE_Set2D(true); @@ -1389,7 +1570,7 @@ static void VK_Shutdown_PostProc(void) { unsigned int i; for (i = 0; i < countof(postproc); i++) - VKBE_RT_Gen(&postproc[i], 0, 0, true); + VKBE_RT_Gen(&postproc[i], 0, 0, true, RT_IMAGEFLAGS); vk.scenepp_waterwarp = NULL; vk.scenepp_antialias = NULL; @@ -1852,6 +2033,9 @@ void VK_R_RenderView (void) r_refdef.flags |= RDF_BLOOM; } + if (vk.multisamplebits != VK_SAMPLE_COUNT_1_BIT) //these are unsupported right now. + r_refdef.flags &= ~(RDF_CUSTOMPOSTPROC|RDF_ANTIALIAS|RDF_BLOOM); + // // figure out the viewport // @@ -1881,6 +2065,8 @@ void VK_R_RenderView (void) if (renderscale != 1.0) { r_refdef.flags |= RDF_RENDERSCALE; + if (renderscale < 0) + renderscale *= -1; r_refdef.pxrect.width *= renderscale; r_refdef.pxrect.height *= renderscale; r_refdef.pxrect.maxheight = r_refdef.pxrect.height; @@ -1898,7 +2084,7 @@ void VK_R_RenderView (void) r_refdef.pxrect.x = 0; r_refdef.pxrect.y = 0; rt = &postproc[postproc_buf++%countof(postproc)]; - VKBE_RT_Gen(rt, r_refdef.pxrect.width, r_refdef.pxrect.height, false); + VKBE_RT_Gen(rt, r_refdef.pxrect.width, r_refdef.pxrect.height, false, (r_renderscale.value < 0)?RT_IMAGEFLAGS-IF_LINEAR+IF_NEAREST:RT_IMAGEFLAGS); } else rt = rtscreen; @@ -1908,10 +2094,11 @@ void VK_R_RenderView (void) } else { - VKBE_RT_Begin(rt); - VK_SetupViewPortProjection(false); + if (rt != rtscreen) + VKBE_RT_Begin(rt); + else { VkViewport vp[1]; VkRect2D scissor[1]; @@ -1925,8 +2112,8 @@ void VK_R_RenderView (void) scissor[0].offset.y = r_refdef.pxrect.y; scissor[0].extent.width = r_refdef.pxrect.width; scissor[0].extent.height = r_refdef.pxrect.height; - vkCmdSetViewport(vk.frame->cbuf, 0, countof(vp), vp); - vkCmdSetScissor(vk.frame->cbuf, 0, countof(scissor), scissor); + vkCmdSetViewport(vk.rendertarg->cbuf, 0, countof(vp), vp); + vkCmdSetScissor(vk.rendertarg->cbuf, 0, countof(scissor), scissor); } if (!vk.rendertarg->depthcleared) @@ -1943,7 +2130,7 @@ void VK_R_RenderView (void) rect.rect.extent.height = r_refdef.pxrect.height; rect.layerCount = 1; rect.baseArrayLayer = 0; - vkCmdClearAttachments(vk.frame->cbuf, 1, &clr, 1, &rect); + vkCmdClearAttachments(vk.rendertarg->cbuf, 1, &clr, 1, &rect); vk.rendertarg->depthcleared = true; } @@ -1962,6 +2149,9 @@ void VK_R_RenderView (void) vk.rendertarg->depthcleared = false; VK_Set2D (); + + if (rt != rtscreen) + VKBE_RT_End(rt); } if (r_refdef.flags & RDF_ALLPOSTPROC) @@ -1976,13 +2166,16 @@ void VK_R_RenderView (void) if (r_refdef.flags & RDF_ALLPOSTPROC) { rt = &postproc[postproc_buf++]; - VKBE_RT_Gen(rt, 320, 200, false); + VKBE_RT_Gen(rt, 320, 200, false, RT_IMAGEFLAGS); } else rt = rtscreen; - VKBE_RT_Begin(rt); + if (rt != rtscreen) + VKBE_RT_Begin(rt); R2D_Image(r_refdef.vrect.x, r_refdef.vrect.y, r_refdef.vrect.width, r_refdef.vrect.height, 0, 0, 1, 1, vk.scenepp_waterwarp); R2D_Flush(); + if (rt != rtscreen) + VKBE_RT_End(rt); } if (r_refdef.flags & RDF_CUSTOMPOSTPROC) { @@ -1991,13 +2184,16 @@ void VK_R_RenderView (void) if (r_refdef.flags & RDF_ALLPOSTPROC) { rt = &postproc[postproc_buf++]; - VKBE_RT_Gen(rt, 320, 200, false); + VKBE_RT_Gen(rt, 320, 200, false, RT_IMAGEFLAGS); } else rt = rtscreen; - VKBE_RT_Begin(rt); + if (rt != rtscreen) + VKBE_RT_Begin(rt); R2D_Image(r_refdef.vrect.x, r_refdef.vrect.y, r_refdef.vrect.width, r_refdef.vrect.height, 0, 1, 1, 0, custompostproc); R2D_Flush(); + if (rt != rtscreen) + VKBE_RT_End(rt); } if (r_refdef.flags & RDF_ANTIALIAS) { @@ -2007,18 +2203,20 @@ void VK_R_RenderView (void) if (r_refdef.flags & RDF_ALLPOSTPROC) { rt = &postproc[postproc_buf++]; - VKBE_RT_Gen(rt, 320, 200, false); + VKBE_RT_Gen(rt, 320, 200, false, RT_IMAGEFLAGS); } else rt = rtscreen; - VKBE_RT_Begin(rt); + if (rt != rtscreen) + VKBE_RT_Begin(rt); R2D_Image(r_refdef.vrect.x, r_refdef.vrect.y, r_refdef.vrect.width, r_refdef.vrect.height, 0, 1, 1, 0, vk.scenepp_antialias); R2D_ImageColours(1, 1, 1, 1); R2D_Flush(); + if (rt != rtscreen) + VKBE_RT_End(rt); } if (r_refdef.flags & RDF_BLOOM) { - VKBE_RT_Begin(rtscreen); VK_R_BloomBlend(&rt->q_colour, r_refdef.vrect.x, r_refdef.vrect.y, r_refdef.vrect.width, r_refdef.vrect.height); rt = rtscreen; } @@ -2036,19 +2234,15 @@ void VK_R_RenderView (void) ); vk.sourcecolour = &rt->q_colour; rt = rtscreen; - VKBE_RT_Begin(rt); R2D_Image(r_refdef.vrect.x, r_refdef.vrect.y, r_refdef.vrect.width, r_refdef.vrect.height, 0, 0, 1, 1, vk.scenepp_rescale); R2D_Flush(); } - vk.sourcecolour = r_nulltex; } typedef struct { - struct vk_fencework w; - uint32_t imageformat; uint32_t imagestride; uint32_t imagewidth; @@ -2087,7 +2281,7 @@ void VKVID_QueueGetRGBData (void (*gotrgbdata) (void *rgbdata, intptr_t bytest if (!vk.frame->backbuf->colour.width || !vk.frame->backbuf->colour.height) return; //erm, some kind of error? - capt = VK_AtFrameEnd(VKVID_CopiedRGBData, sizeof(*capt)); + capt = VK_AtFrameEnd(VKVID_CopiedRGBData, NULL, sizeof(*capt)); capt->gotrgbdata = gotrgbdata; capt->imageformat = TF_BGRA32; @@ -2109,7 +2303,7 @@ void VKVID_QueueGetRGBData (void (*gotrgbdata) (void *rgbdata, intptr_t bytest VkAssert(vkAllocateMemory(vk.device, &memAllocInfo, vkallocationcb, &capt->memory)); VkAssert(vkBindBufferMemory(vk.device, capt->buffer, capt->memory, 0)); - set_image_layout(vk.frame->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT); + set_image_layout(vk.rendertarg->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT); icpy.bufferOffset = 0; icpy.bufferRowLength = 0; //packed @@ -2125,9 +2319,9 @@ void VKVID_QueueGetRGBData (void (*gotrgbdata) (void *rgbdata, intptr_t bytest icpy.imageExtent.height = capt->imageheight; icpy.imageExtent.depth = 1; - vkCmdCopyImageToBuffer(vk.frame->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, capt->buffer, 1, &icpy); + vkCmdCopyImageToBuffer(vk.rendertarg->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, capt->buffer, 1, &icpy); - set_image_layout(vk.frame->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT); + set_image_layout(vk.rendertarg->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT); } char *VKVID_GetRGBInfo (int *bytestride, int *truevidwidth, int *truevidheight, enum uploadfmt *fmt) @@ -2365,6 +2559,24 @@ static void VK_PaintScreen(void) RSpeedShow(); } +VkCommandBuffer VK_AllocFrameCBuf(void) +{ + struct vkframe *frame = vk.frame; + if (frame->numcbufs == frame->maxcbufs) + { + VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO}; + + frame->maxcbufs++; + frame->cbufs = BZ_Realloc(frame->cbufs, sizeof(*frame->cbufs)*frame->maxcbufs); + + cbai.commandPool = vk.cmdpool; + cbai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + cbai.commandBufferCount = frame->maxcbufs - frame->numcbufs; + VkAssert(vkAllocateCommandBuffers(vk.device, &cbai, frame->cbufs+frame->numcbufs)); + } + return frame->cbufs[frame->numcbufs++]; +} + qboolean VK_SCR_GrabBackBuffer(void) { RSpeedLocals(); @@ -2394,7 +2606,12 @@ qboolean VK_SCR_GrabBackBuffer(void) } //wait for the queued acquire to actually finish - if (1)//vk.vsync) + if (vk_busywait.ival) + { //busy wait, to try to get the highest fps possible + while (VK_TIMEOUT == vkGetFenceStatus(vk.device, vk.acquirefences[vk.aquirenext%ACQUIRELIMIT])) + ; + } + else { //friendly wait VkResult err = vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX); @@ -2405,11 +2622,6 @@ qboolean VK_SCR_GrabBackBuffer(void) return false; } } - else - { //busy wait, to try to get the highest fps possible - while (VK_TIMEOUT == vkGetFenceStatus(vk.device, vk.acquirefences[vk.aquirenext%ACQUIRELIMIT])) - ; - } vk.bufferidx = vk.acquirebufferidx[vk.aquirenext%ACQUIRELIMIT]; VkAssert(vkResetFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT])); vk.aquirenext++; @@ -2424,6 +2636,10 @@ qboolean VK_SCR_GrabBackBuffer(void) VkAssert(vkResetFences(vk.device, 1, &vk.frame->finishedfence)); vk.frame->backbuf = &vk.backbufs[vk.bufferidx]; + vk.rendertarg = vk.frame->backbuf; + + vk.frame->numcbufs = 0; + vk.rendertarg->cbuf = VK_AllocFrameCBuf(); RSpeedEnd(RSPEED_SETUP); @@ -2443,7 +2659,7 @@ qboolean VK_SCR_GrabBackBuffer(void) inh.occlusionQueryEnable = VK_FALSE; inh.queryFlags = 0; inh.pipelineStatistics = 0; - vkBeginCommandBuffer(vk.frame->cbuf, &begininf); + vkBeginCommandBuffer(vk.rendertarg->cbuf, &begininf); } VKBE_RestartFrame(); @@ -2452,6 +2668,7 @@ qboolean VK_SCR_GrabBackBuffer(void) // vkCmdWriteTimestamp(vk.frame->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, querypool, vk.bufferidx*2+0); + if (vk.multisamplebits == VK_SAMPLE_COUNT_1_BIT) { VkImageMemoryBarrier imgbarrier = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER}; imgbarrier.pNext = NULL; @@ -2474,7 +2691,7 @@ qboolean VK_SCR_GrabBackBuffer(void) imgbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; vk.frame->backbuf->firstuse = false; } - vkCmdPipelineBarrier(vk.frame->cbuf, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); + vkCmdPipelineBarrier(vk.rendertarg->cbuf, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); } { VkImageMemoryBarrier imgbarrier = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER}; @@ -2491,21 +2708,33 @@ qboolean VK_SCR_GrabBackBuffer(void) imgbarrier.subresourceRange.layerCount = 1; imgbarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; imgbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - vkCmdPipelineBarrier(vk.frame->cbuf, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); + vkCmdPipelineBarrier(vk.rendertarg->cbuf, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); } { - VkClearValue clearvalues[2]; + VkClearValue clearvalues[3]; extern cvar_t r_clear; VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO}; + //attachments are: screen[1], depth[msbits], (screen[msbits]) + clearvalues[0].color.float32[0] = !!(r_clear.ival & 1); clearvalues[0].color.float32[1] = !!(r_clear.ival & 2); clearvalues[0].color.float32[2] = !!(r_clear.ival & 4); clearvalues[0].color.float32[3] = 1; clearvalues[1].depthStencil.depth = 1.0; clearvalues[1].depthStencil.stencil = 0; - rpbi.clearValueCount = 2; + + if (vk.multisamplebits != VK_SAMPLE_COUNT_1_BIT) + { + clearvalues[2].color.float32[0] = !!(r_clear.ival & 1); + clearvalues[2].color.float32[1] = !!(r_clear.ival & 2); + clearvalues[2].color.float32[2] = !!(r_clear.ival & 4); + clearvalues[2].color.float32[3] = 1; + rpbi.clearValueCount = 3; + } + else + rpbi.clearValueCount = 2; if (r_clear.ival) rpbi.renderPass = vk.renderpass[2]; @@ -2517,7 +2746,7 @@ qboolean VK_SCR_GrabBackBuffer(void) rpbi.renderArea.extent.width = vid.pixelwidth; rpbi.renderArea.extent.height = vid.pixelheight; rpbi.pClearValues = clearvalues; - vkCmdBeginRenderPass(vk.frame->cbuf, &rpbi, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(vk.rendertarg->cbuf, &rpbi, VK_SUBPASS_CONTENTS_INLINE); vk.frame->backbuf->width = vid.pixelwidth; vk.frame->backbuf->height = vid.pixelheight; @@ -2525,7 +2754,6 @@ qboolean VK_SCR_GrabBackBuffer(void) rpbi.clearValueCount = 0; rpbi.pClearValues = NULL; rpbi.renderPass = vk.renderpass[0]; - vk.rendertarg = vk.frame->backbuf; vk.rendertarg->restartinfo = rpbi; vk.rendertarg->depthcleared = true; } @@ -2545,11 +2773,9 @@ void VK_Presented(void *fw) while(frame->frameendjobs) { - struct vk_fencework *job = frame->frameendjobs; + struct vk_frameend *job = frame->frameendjobs; frame->frameendjobs = job->next; - job->Passed(job); - if (job->fence || job->cbuf) - Con_Printf("job with junk\n"); + job->FrameEnded(job+1); Z_Free(job); } @@ -2585,21 +2811,21 @@ void VK_DebugFramerate(void) qboolean VK_SCR_UpdateScreen (void) { uint32_t fblayout; - VkCommandBuffer bufs[1]; VK_FencedCheck(); //a few cvars need some extra work if they're changed - if ((vk.allowsubmissionthread && vk_submissionthread.modified) || vid_vsync.modified || vid_triplebuffer.modified || vid_srgb.modified) - { - vid_vsync.modified = false; - vid_triplebuffer.modified = false; - vid_srgb.modified = false; - vk_submissionthread.modified = false; - - vk.triplebuffer = vid_triplebuffer.ival; - vk.vsync = vid_vsync.ival; + if ((vk.allowsubmissionthread && vk_submissionthread.modified) || vid_vsync.modified || vid_triplebuffer.modified || vid_srgb.modified || vid_multisample.modified) vk.neednewswapchain = true; + + if (vk.devicelost) + { //vkQueueSubmit returning vk_error_device_lost means we give up and try resetting everything. + //if someone's installing new drivers then wait a little time before reloading everything, in the hope that any other dependant files got copied. or something. + //fixme: don't allow this to be spammed... + Sys_Sleep(5); + Con_Printf("Device was lost. Restarting video\n"); + Cmd_ExecuteString("vid_restart", RESTRICT_LOCAL); + return false; } if (vk.neednewswapchain && !vk.frame) @@ -2620,6 +2846,8 @@ qboolean VK_SCR_UpdateScreen (void) VK_Submit_DoWork(); Sys_UnlockConditional(vk.submitcondition); } + if (vk.dopresent) + vk.dopresent(NULL); vkDeviceWaitIdle(vk.device); VK_CreateSwapChain(); vk.neednewswapchain = false; @@ -2641,7 +2869,7 @@ qboolean VK_SCR_UpdateScreen (void) if (R2D_Flush) R2D_Flush(); - vkCmdEndRenderPass(vk.frame->cbuf); + vkCmdEndRenderPass(vk.rendertarg->cbuf); fblayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; /*if (0) @@ -2680,6 +2908,7 @@ qboolean VK_SCR_UpdateScreen (void) vkCmdCopyImageToBuffer(vk.frame->cbuf, vk.frame->backbuf->colour.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer, 1, ®ion); }*/ + if (vk.multisamplebits == VK_SAMPLE_COUNT_1_BIT) { VkImageMemoryBarrier imgbarrier = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER}; imgbarrier.pNext = NULL; @@ -2695,16 +2924,14 @@ qboolean VK_SCR_UpdateScreen (void) imgbarrier.subresourceRange.layerCount = 1; imgbarrier.srcQueueFamilyIndex = vk.queuefam[0]; imgbarrier.dstQueueFamilyIndex = vk.queuefam[1]; - vkCmdPipelineBarrier(vk.frame->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); + vkCmdPipelineBarrier(vk.rendertarg->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier); } -// vkCmdWriteTimestamp(vk.frame->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, querypool, vk.bufferidx*2+1); - vkEndCommandBuffer(vk.frame->cbuf); +// vkCmdWriteTimestamp(vk.rendertarg->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, querypool, vk.bufferidx*2+1); + vkEndCommandBuffer(vk.rendertarg->cbuf); VKBE_FlushDynamicBuffers(); - bufs[0] = vk.frame->cbuf; - { struct vk_presented *fw = Z_Malloc(sizeof(*fw)); fw->fw.Passed = VK_Presented; @@ -2714,7 +2941,7 @@ qboolean VK_SCR_UpdateScreen (void) vk.frame->frameendjobs = vk.frameendjobs; vk.frameendjobs = NULL; - VK_Submit_Work(bufs[0], VK_NULL_HANDLE, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk.frame->backbuf->presentsemaphore, vk.frame->finishedfence, vk.frame, &fw->fw); + VK_Submit_Work(vk.rendertarg->cbuf, VK_NULL_HANDLE, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk.frame->backbuf->presentsemaphore, vk.frame->finishedfence, vk.frame, &fw->fw); } //now would be a good time to do any compute work or lightmap updates... @@ -2753,24 +2980,45 @@ static void VK_DestroyRenderPass(void) static void VK_CreateRenderPass(void) { int pass; + int numattachments; static VkAttachmentReference color_reference; static VkAttachmentReference depth_reference; -static VkAttachmentDescription attachments[2] = {{0}}; +static VkAttachmentReference resolve_reference; +static VkAttachmentDescription attachments[3] = {{0}}; static VkSubpassDescription subpass = {0}; static VkRenderPassCreateInfo rp_info = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO}; +//two render passes are compatible for piplines when they match exactly except for: +//initial and final layouts in attachment descriptions. +//load and store operations in attachment descriptions. +//image layouts in attachment references. + + for (pass = 0; pass < 3; pass++) { if (vk.renderpass[pass] != VK_NULL_HANDLE) continue; - color_reference.attachment = 0; + + numattachments = 0; + if (vk.multisamplebits != VK_SAMPLE_COUNT_1_BIT) + { + resolve_reference.attachment = numattachments++; + depth_reference.attachment = numattachments++; + color_reference.attachment = numattachments++; + } + else + { + color_reference.attachment = numattachments++; + depth_reference.attachment = numattachments++; + resolve_reference.attachment = ~(uint32_t)0; + } + color_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - depth_reference.attachment = 1; depth_reference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + resolve_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; attachments[color_reference.attachment].format = vk.backbufformat; - attachments[color_reference.attachment].samples = VK_SAMPLE_COUNT_1_BIT; + attachments[color_reference.attachment].samples = vk.multisamplebits; // attachments[color_reference.attachment].loadOp = pass?VK_ATTACHMENT_LOAD_OP_LOAD:VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachments[color_reference.attachment].storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachments[color_reference.attachment].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; @@ -2779,7 +3027,7 @@ static VkRenderPassCreateInfo rp_info = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_I attachments[color_reference.attachment].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; attachments[depth_reference.attachment].format = vk.depthformat; - attachments[depth_reference.attachment].samples = VK_SAMPLE_COUNT_1_BIT; + attachments[depth_reference.attachment].samples = vk.multisamplebits; // attachments[depth_reference.attachment].loadOp = pass?VK_ATTACHMENT_LOAD_OP_LOAD:VK_ATTACHMENT_LOAD_OP_CLEAR; attachments[depth_reference.attachment].storeOp = VK_ATTACHMENT_STORE_OP_STORE;//VK_ATTACHMENT_STORE_OP_DONT_CARE; attachments[depth_reference.attachment].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; @@ -2787,18 +3035,30 @@ static VkRenderPassCreateInfo rp_info = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_I attachments[depth_reference.attachment].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; attachments[depth_reference.attachment].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + if (resolve_reference.attachment != ~(uint32_t)0) + { + attachments[resolve_reference.attachment].format = vk.backbufformat; + attachments[resolve_reference.attachment].samples = VK_SAMPLE_COUNT_1_BIT; + attachments[resolve_reference.attachment].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachments[resolve_reference.attachment].storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachments[resolve_reference.attachment].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachments[resolve_reference.attachment].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[resolve_reference.attachment].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + attachments[resolve_reference.attachment].finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + } + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; subpass.flags = 0; subpass.inputAttachmentCount = 0; subpass.pInputAttachments = NULL; subpass.colorAttachmentCount = 1; subpass.pColorAttachments = &color_reference; - subpass.pResolveAttachments = NULL; + subpass.pResolveAttachments = (resolve_reference.attachment != ~(uint32_t)0)?&resolve_reference:NULL; subpass.pDepthStencilAttachment = &depth_reference; subpass.preserveAttachmentCount = 0; subpass.pPreserveAttachments = NULL; - rp_info.attachmentCount = countof(attachments); + rp_info.attachmentCount = numattachments; rp_info.pAttachments = attachments; rp_info.subpassCount = 1; rp_info.pSubpasses = &subpass; @@ -2858,6 +3118,7 @@ void VK_DoPresent(struct vkframe *theframe) { Con_Printf("ERROR: vkAcquireNextImageKHR: %x\n", err); vk.neednewswapchain = true; + vk.devicelost |= (err == VK_ERROR_DEVICE_LOST); } vk.aquirelast++; } @@ -2921,6 +3182,7 @@ static void VK_Submit_DoWork(void) { Con_Printf("ERROR: vkQueueSubmit: %i\n", err); errored = vk.neednewswapchain = true; + vk.devicelost |= (err==VK_ERROR_DEVICE_LOST); } RSpeedEnd(RSPEED_SUBMIT); } @@ -2988,6 +3250,14 @@ void VK_Submit_Work(VkCommandBuffer cmdbuf, VkSemaphore semwait, VkPipelineStage Sys_UnlockConditional(vk.submitcondition); } +void VK_Submit_Sync(void) +{ + Sys_LockConditional(vk.submitcondition); + //FIXME: + vkDeviceWaitIdle(vk.device); //just in case + Sys_UnlockConditional(vk.submitcondition); +} + void VK_CheckTextureFormats(void) { struct { @@ -2996,40 +3266,41 @@ void VK_CheckTextureFormats(void) unsigned int needextra; } texfmt[] = { - {PTI_RGBA8, VK_FORMAT_R8G8B8A8_UNORM}, - {PTI_RGBX8, VK_FORMAT_R8G8B8A8_UNORM}, - {PTI_BGRA8, VK_FORMAT_B8G8R8A8_UNORM}, - {PTI_BGRX8, VK_FORMAT_B8G8R8A8_UNORM}, + {PTI_RGBA8, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_RGBX8, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_BGRA8, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_BGRX8, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, - {PTI_RGBA8_SRGB, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, - {PTI_RGBX8_SRGB, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, - {PTI_BGRA8_SRGB, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, - {PTI_BGRX8_SRGB, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, + {PTI_RGBA8_SRGB, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT|VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, + {PTI_RGBX8_SRGB, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT|VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, + {PTI_BGRA8_SRGB, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT|VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, + {PTI_BGRX8_SRGB, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT|VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, - {PTI_RGB565, VK_FORMAT_R5G6B5_UNORM_PACK16}, - {PTI_RGBA4444, VK_FORMAT_R4G4B4A4_UNORM_PACK16}, - {PTI_ARGB4444, VK_FORMAT_B4G4R4A4_UNORM_PACK16}, - {PTI_RGBA5551, VK_FORMAT_R5G5B5A1_UNORM_PACK16}, - {PTI_ARGB1555, VK_FORMAT_A1R5G5B5_UNORM_PACK16}, - {PTI_RGBA16F, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT}, - {PTI_RGBA32F, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT}, - {PTI_R8, VK_FORMAT_R8_UNORM}, - {PTI_RG8, VK_FORMAT_R8G8_UNORM}, + {PTI_RGB565, VK_FORMAT_R5G6B5_UNORM_PACK16, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_RGBA4444, VK_FORMAT_R4G4B4A4_UNORM_PACK16, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_ARGB4444, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_RGBA5551, VK_FORMAT_R5G5B5A1_UNORM_PACK16, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_ARGB1555, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_RGBA16F, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT}, + {PTI_RGBA32F, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT}, + {PTI_R8, VK_FORMAT_R8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, + {PTI_RG8, VK_FORMAT_R8G8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, - {PTI_DEPTH16, VK_FORMAT_D16_UNORM, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, - {PTI_DEPTH24, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, - {PTI_DEPTH32, VK_FORMAT_D32_SFLOAT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, - {PTI_DEPTH24_8, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, + {PTI_DEPTH16, VK_FORMAT_D16_UNORM, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, + {PTI_DEPTH24, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, + {PTI_DEPTH32, VK_FORMAT_D32_SFLOAT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, + {PTI_DEPTH24_8, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT}, - {PTI_S3RGB1, VK_FORMAT_BC1_RGB_UNORM_BLOCK}, - {PTI_S3RGBA1, VK_FORMAT_BC1_RGBA_UNORM_BLOCK}, - {PTI_S3RGBA3, VK_FORMAT_BC2_UNORM_BLOCK}, - {PTI_S3RGBA5, VK_FORMAT_BC3_UNORM_BLOCK}, + {PTI_S3RGB1, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_S3RGBA1, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_S3RGBA3, VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, + {PTI_S3RGBA5, VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, }; unsigned int i; VkPhysicalDeviceProperties props; vkGetPhysicalDeviceProperties(vk.gpu, &props); + vk.limits = props.limits; sh_config.texture_maxsize = props.limits.maxImageDimension2D; @@ -3052,28 +3323,40 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat VkApplicationInfo app; VkInstanceCreateInfo inst_info; const char *extensions[8]; - qboolean nvglsl = false; uint32_t extensions_count = 0; - vk.allowsubmissionthread = true; - vk.headless = false; - if (sysextname) - { - extensions[extensions_count++] = sysextname; - extensions[extensions_count++] = VK_KHR_SURFACE_EXTENSION_NAME; - } - else - vk.headless = true; - if (vk_debug.ival) - extensions[extensions_count++] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME; + //device extensions that want to enable + struct + { + qboolean *flag; + const char *name; + cvar_t *var; + qboolean def; + qboolean *superseeded; //if this is set then the extension will not be enabled after all + const char *neededfor; + qboolean supported; + } knowndevexts[] = + { + {&vk.khr_swapchain, VK_KHR_SWAPCHAIN_EXTENSION_NAME, NULL, true, NULL, " Nothing will be drawn!"}, + {&vk.nv_glsl_shader, VK_NV_GLSL_SHADER_EXTENSION_NAME, &vk_nv_glsl_shader, false, NULL, " Direct use of glsl is not supported."}, + {&vk.nv_dedicated_allocation, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME, &vk_nv_dedicated_allocation, true, &vk.khr_dedicated_allocation, ""}, +// {&vk.khr_dedicated_allocation, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, &vk_khr_dedicated_allocation, true, NULL, ""}, + {&vk.khr_push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, &vk_khr_push_descriptor, true, NULL, ""}, + }; + size_t e; + + for (e = 0; e < countof(knowndevexts); e++) + *knowndevexts[e].flag = false; + vk.allowsubmissionthread = true; vk.neednewswapchain = true; vk.triplebuffer = info->triplebuffer; vk.vsync = info->wait; vk.dopresent = dopresent?dopresent:VK_DoPresent; + vk.max_anistophy_limit = 1.0; memset(&sh_config, 0, sizeof(sh_config)); - //get second set of pointers... + //get second set of pointers... (instance-level) #ifdef VK_NO_PROTOTYPES if (!vkGetInstanceProcAddr) { @@ -3085,6 +3368,38 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat #undef VKFunc #endif + //try and enable some instance extensions... + { + qboolean surfext = false; + uint32_t count, i; + VkExtensionProperties *ext; + vkEnumerateInstanceExtensionProperties(NULL, &count, NULL); + ext = malloc(sizeof(*ext)*count); + vkEnumerateInstanceExtensionProperties(NULL, &count, ext); + for (i = 0; i < count && extensions_count < countof(extensions); i++) + { + if (!strcmp(ext[i].extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME) && vk_debug.ival) + extensions[extensions_count++] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME; + else if (!strcmp(ext[i].extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) + extensions[extensions_count++] = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME; + else if (sysextname && !strcmp(ext[i].extensionName, sysextname)) + { + extensions[extensions_count++] = sysextname; + vk.khr_swapchain = true; + } + else if (sysextname && !strcmp(ext[i].extensionName, VK_KHR_SURFACE_EXTENSION_NAME)) + { + extensions[extensions_count++] = VK_KHR_SURFACE_EXTENSION_NAME; + surfext = true; + } + } + free(ext); + if (sysextname && (!vk.khr_swapchain || !surfext)) + { + Con_Printf("Vulkan instance driver lacks support for %s\n", sysextname); + return false; + } + } #define ENGINEVERSION 1 memset(&app, 0, sizeof(app)); @@ -3112,24 +3427,6 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat return false; case VK_ERROR_EXTENSION_NOT_PRESENT: Con_Printf("VK_ERROR_EXTENSION_NOT_PRESENT: something on a system level is probably misconfigured\n"); - { - uint32_t count, i, j; - VkExtensionProperties *ext; - vkEnumerateInstanceExtensionProperties(NULL, &count, NULL); - ext = malloc(sizeof(*ext)*count); - vkEnumerateInstanceExtensionProperties(NULL, &count, ext); - for (i = 0; i < extensions_count; i++) - { - for (j = 0; j < count; j++) - { - if (!strcmp(ext[j].extensionName, extensions[i])) - break; - } - if (j == count) - Con_Printf("Missing extension: %s\n", extensions[i]); - } - free(ext); - } return false; case VK_ERROR_LAYER_NOT_PRESENT: Con_Printf("VK_ERROR_LAYER_NOT_PRESENT: requested layer is not known/usable\n"); @@ -3193,7 +3490,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat vkGetPhysicalDeviceProperties(devs[i], &props); vkGetPhysicalDeviceQueueFamilyProperties(devs[i], &queue_count, NULL); - if (!vk.headless) + if (vk.khr_swapchain) { for (j = 0; j < queue_count; j++) { @@ -3342,7 +3639,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat for (i = 0; i < queue_count; i++) { VkBool32 supportsPresent = false; - if (vk.headless) + if (!vk.khr_swapchain) supportsPresent = true; //won't be used anyway. else VkAssert(vkGetPhysicalDeviceSurfaceSupportKHR(vk.gpu, i, vk.surface, &supportsPresent)); @@ -3377,27 +3674,57 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat vkEnumerateDeviceExtensionProperties(vk.gpu, NULL, &extcount, ext); while (extcount --> 0) { - if (!strcmp(ext[extcount].extensionName, VK_NV_GLSL_SHADER_EXTENSION_NAME)) - nvglsl = !!vk_loadglsl.ival; + for (e = 0; e < countof(knowndevexts); e++) + { + if (!strcmp(ext[extcount].extensionName, knowndevexts[e].name)) + { + if (knowndevexts[e].var) + *knowndevexts[e].flag = !!knowndevexts[e].var->ival || (!*knowndevexts[e].var->string && knowndevexts[e].def); + knowndevexts[e].supported = true; + } + } } free(ext); - - if (nvglsl) - Con_Printf("Using %s.\n", VK_NV_GLSL_SHADER_EXTENSION_NAME); - else if (vk_loadglsl.ival) - Con_Printf("unable to enable %s extension. direct use of glsl is not supported.\n", VK_NV_GLSL_SHADER_EXTENSION_NAME); } { - const char *devextensions[8]; + const char *devextensions[1+countof(knowndevexts)]; size_t numdevextensions = 0; float queue_priorities[2] = {0.8, 1.0}; VkDeviceQueueCreateInfo queueinf[2] = {{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO},{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO}}; VkDeviceCreateInfo devinf = {VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO}; + VkPhysicalDeviceFeatures features; + VkPhysicalDeviceFeatures avail; + memset(&features, 0, sizeof(features)); - devextensions[numdevextensions++] = VK_KHR_SWAPCHAIN_EXTENSION_NAME; - if (nvglsl) - devextensions[numdevextensions++] = VK_NV_GLSL_SHADER_EXTENSION_NAME; + vkGetPhysicalDeviceFeatures(vk.gpu, &avail); + //try to enable whatever we can use, if we can. + features.robustBufferAccess = avail.robustBufferAccess; + features.textureCompressionBC = avail.textureCompressionBC; + features.samplerAnisotropy = avail.samplerAnisotropy; + features.geometryShader = avail.geometryShader; + features.tessellationShader = avail.tessellationShader; + + //Add in the extensions we support + for (e = 0; e < countof(knowndevexts); e++) + { //prints are to let the user know what's going on. only warn if its explicitly enabled + if (knowndevexts[e].superseeded && *knowndevexts[e].superseeded) + { + Con_DPrintf("Superseeded %s.\n", knowndevexts[e].name); + *knowndevexts[e].flag = false; + } + else if (*knowndevexts[e].flag) + { + Con_DPrintf("Using %s.\n", knowndevexts[e].name); + devextensions[numdevextensions++] = knowndevexts[e].name; + } + else if (knowndevexts[e].var->ival) + Con_Printf("unable to enable %s extension.%s\n", knowndevexts[e].name, knowndevexts[e].neededfor); + else if (knowndevexts[e].supported) + Con_DPrintf("Ignoring %s.\n", knowndevexts[e].name); + else + Con_DPrintf("Unavailable %s.\n", knowndevexts[e].name); + } queueinf[0].pNext = NULL; queueinf[0].queueFamilyIndex = vk.queuefam[0]; @@ -3421,7 +3748,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat else { queueinf[0].queueCount = 1; - if (!vk.headless) + if (vk.khr_swapchain) vk.dopresent = VK_DoPresent; //can't split submit+present onto different queues, so do these on a single thread. Con_DPrintf("Using single queue\n"); } @@ -3439,7 +3766,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat devinf.ppEnabledLayerNames = vklayerlist; devinf.enabledExtensionCount = numdevextensions; devinf.ppEnabledExtensionNames = devextensions; - devinf.pEnabledFeatures = NULL; + devinf.pEnabledFeatures = &features; err = vkCreateDevice(vk.gpu, &devinf, NULL, &vk.device); switch(err) @@ -3483,7 +3810,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat sh_config.blobpath = "spirv"; sh_config.shadernamefmt = NULL;//".spv"; - if (nvglsl) + if (vk.nv_glsl_shader) { sh_config.progpath = "glsl/%s.glsl"; sh_config.shadernamefmt = "%s_glsl"; @@ -3509,7 +3836,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat sh_config.pDeleteProg = NULL; sh_config.pLoadBlob = NULL; - if (nvglsl) + if (vk.nv_glsl_shader) sh_config.pCreateProgram = VK_LoadGLSL; else sh_config.pCreateProgram = NULL; @@ -3554,7 +3881,7 @@ void VK_Shutdown(void) VK_DestroySwapChain(); for (i = 0; i < countof(postproc); i++) - VKBE_RT_Gen(&postproc[i], 0, 0, false); + VKBE_RT_Gen(&postproc[i], 0, 0, false, RT_IMAGEFLAGS); VKBE_RT_Gen_Cube(&vk_rt_cubemap, 0, false); VK_R_BloomShutdown(); diff --git a/engine/vk/vkrenderer.h b/engine/vk/vkrenderer.h index 5cc44303..696eb6aa 100644 --- a/engine/vk/vkrenderer.h +++ b/engine/vk/vkrenderer.h @@ -54,6 +54,7 @@ VKFunc(GetPhysicalDeviceSurfaceCapabilitiesKHR) \ VKFunc(GetPhysicalDeviceMemoryProperties) \ VKFunc(GetPhysicalDeviceFormatProperties) \ + VKFunc(GetPhysicalDeviceFeatures) \ VKFunc(DestroySurfaceKHR) \ VKFunc(CreateDevice) \ VKFunc(DestroyInstance) \ @@ -78,6 +79,7 @@ VKFunc(CmdBindIndexBuffer) \ VKFunc(CmdBindVertexBuffers) \ VKFunc(CmdPushConstants) \ + VKFunc(CmdPushDescriptorSetKHR) \ VKFunc(CmdClearAttachments) \ VKFunc(CmdClearColorImage) \ VKFunc(CmdClearDepthStencilImage) \ @@ -191,30 +193,35 @@ typedef struct vk_image_s uint32_t layers; uint32_t mipcount; uint32_t encoding; - uint32_t type; + uint32_t type; //PTI_2D/3D/CUBE } vk_image_t; enum dynbuf_e { DB_VBO, DB_EBO, DB_UBO, + DB_STAGING, DB_MAX }; struct vk_rendertarg { + VkCommandBuffer cbuf; //cbuf allocated for this render target. VkFramebuffer framebuffer; - vk_image_t colour, depth; + vk_image_t colour, depth, mscolour; - image_t q_colour, q_depth; //extra sillyness... + image_t q_colour, q_depth, q_mscolour; //extra sillyness... uint32_t width; uint32_t height; + qboolean multisample; qboolean depthcleared; //starting a new gameview needs cleared depth relative to other views, but the first probably won't. VkRenderPassBeginInfo restartinfo; VkSemaphore presentsemaphore; qboolean firstuse; + + struct vk_rendertarg *prevtarg; }; struct vk_rendertarg_cube { @@ -233,9 +240,14 @@ extern struct vulkaninfo_s { unsigned short triplebuffer; qboolean vsync; - qboolean headless; qboolean allowsubmissionthread; + qboolean khr_swapchain; //aka: not headless. we're actually rendering stuff! + qboolean nv_glsl_shader; //we can load glsl shaders. probably missing lots of reflection info though, so this is probably too limited. + qboolean nv_dedicated_allocation; //nvidia-specific extension that provides hints that there's no memory aliasing going on. + qboolean khr_dedicated_allocation; //standardised version of the above where the driver decides whether a resource is worth a dedicated allocation. + qboolean khr_push_descriptor; //more efficient descriptor streaming + VkInstance instance; VkDevice device; VkPhysicalDevice gpu; @@ -247,6 +259,7 @@ extern struct vulkaninfo_s VkQueue queue_alt[1]; VkPhysicalDeviceMemoryProperties memory_properties; VkCommandPool cmdpool; + VkPhysicalDeviceLimits limits; #define ACQUIRELIMIT 8 VkFence acquirefences[ACQUIRELIMIT]; @@ -268,6 +281,7 @@ extern struct vulkaninfo_s int filterpic[3]; int mipcap[2]; float max_anistophy; + float max_anistophy_limit; struct descpool { @@ -282,11 +296,12 @@ extern struct vulkaninfo_s size_t offset; //size written by the cpu (that might not yet be flushed) size_t size; //maximum buffer size size_t align; + qboolean stagingcoherent; VkBuffer stagingbuf; VkDeviceMemory stagingmemory; VkBuffer devicebuf; VkDeviceMemory devicememory; - VkBuffer renderbuf; //either staging or device. + VkBuffer renderbuf; //either staging or device. this is the buffer that we tell vulkan about void *ptr; struct dynbuffer *next; @@ -295,27 +310,34 @@ extern struct vulkaninfo_s struct vk_rendertarg *rendertarg; struct vkframe { struct vkframe *next; - VkCommandBuffer cbuf; struct dynbuffer *dynbufs[DB_MAX]; struct descpool *descpools; + VkCommandBuffer *cbufs; + size_t numcbufs; + size_t maxcbufs; VkFence finishedfence; - struct vk_fencework *frameendjobs; + struct vk_frameend { + struct vk_frameend *next; + void (*FrameEnded) (void*); + } *frameendjobs; struct vk_rendertarg *backbuf; } *frame, *unusedframes; - struct vk_fencework *frameendjobs; + struct vk_frameend *frameendjobs; uint32_t backbuf_count; VkRenderPass shadow_renderpass; //clears depth etc. - VkRenderPass renderpass[3]; //initial, resume + VkRenderPass renderpass[3]; //reload-both(resume prior renderpass), clear-depth-dontcare-colour(gl_clear==0), clear-both(cl_clear!=0) VkSwapchainKHR swapchain; uint32_t bufferidx; + VkSampleCountFlagBits multisamplebits; VkFormat depthformat; VkFormat backbufformat; qboolean srgbcapable; - qboolean neednewswapchain; + qboolean neednewswapchain; //something changed that invalidates the old one. + qboolean devicelost; //we seriously fucked up somewhere. or the gpu is shite. struct vkwork_s { @@ -367,6 +389,9 @@ qboolean R_CanBloom(void); struct programshared_s; qboolean VK_LoadGLSL(struct programshared_s *prog, const char *name, unsigned int permu, int ver, const char **precompilerconstants, const char *vert, const char *tcs, const char *tes, const char *geom, const char *frag, qboolean noerrors, vfsfile_t *blobfile); +VkCommandBuffer VK_AllocFrameCBuf(void); +void VK_Submit_Work(VkCommandBuffer cmdbuf, VkSemaphore semwait, VkPipelineStageFlags semwaitstagemask, VkSemaphore semsignal, VkFence fencesignal, struct vkframe *presentframe, struct vk_fencework *fencedwork); + void VKBE_Init(void); void VKBE_InitFramePools(struct vkframe *frame); void VKBE_RestartFrame(void); @@ -403,8 +428,9 @@ void VKBE_BeginShadowmapFace(void); void VKBE_DoneShadows(void); void VKBE_RT_Gen_Cube(struct vk_rendertarg_cube *targ, uint32_t size, qboolean clear); -void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qboolean clear); +void VKBE_RT_Gen(struct vk_rendertarg *targ, uint32_t width, uint32_t height, qboolean clear, unsigned int flags); void VKBE_RT_Begin(struct vk_rendertarg *targ); +void VKBE_RT_End(struct vk_rendertarg *targ); void VKBE_RT_Destroy(struct vk_rendertarg *targ); @@ -416,7 +442,7 @@ struct stagingbuf size_t size; VkBufferUsageFlags usage; }; -vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t layers, uint32_t mips, unsigned int encoding, unsigned int type); +vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t layers, uint32_t mips, unsigned int encoding, unsigned int type, qboolean rendertarget); void set_image_layout(VkCommandBuffer cmd, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout old_image_layout, VkAccessFlags srcaccess, VkImageLayout new_image_layout, VkAccessFlags dstaccess); void VK_CreateSampler(unsigned int flags, vk_image_t *img); void *VKBE_CreateStagingBuffer(struct stagingbuf *n, size_t size, VkBufferUsageFlags usage); @@ -424,7 +450,7 @@ VkBuffer VKBE_FinishStaging(struct stagingbuf *n, VkDeviceMemory *memptr); void *VK_FencedBegin(void (*passed)(void *work), size_t worksize); void VK_FencedSubmit(void *work); void VK_FencedCheck(void); -void *VK_AtFrameEnd(void (*passed)(void *work), size_t worksize); +void *VK_AtFrameEnd(void (*passed)(void *work), void *data, size_t worksize); diff --git a/engine/vulkan/vk_platform.h b/engine/vulkan/vk_platform.h index 5d0fc766..72f80493 100644 --- a/engine/vulkan/vk_platform.h +++ b/engine/vulkan/vk_platform.h @@ -2,7 +2,7 @@ // File: vk_platform.h // /* -** Copyright (c) 2014-2015 The Khronos Group Inc. +** Copyright (c) 2014-2017 The Khronos Group Inc. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -51,13 +51,13 @@ extern "C" #define VKAPI_ATTR #define VKAPI_CALL __stdcall #define VKAPI_PTR VKAPI_CALL -#elif defined(__ANDROID__) && defined(__ARM_EABI__) && !defined(__ARM_ARCH_7A__) - // Android does not support Vulkan in native code using the "armeabi" ABI. - #error "Vulkan requires the 'armeabi-v7a' or 'armeabi-v7a-hard' ABI on 32-bit ARM CPUs" -#elif defined(__ANDROID__) && defined(__ARM_ARCH_7A__) - // On Android/ARMv7a, Vulkan functions use the armeabi-v7a-hard calling - // convention, even if the application's native code is compiled with the - // armeabi-v7a calling convention. +#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7 + #error "Vulkan isn't supported for the 'armeabi' NDK ABI" +#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE) + // On Android 32-bit ARM targets, Vulkan functions use the "hardfloat" + // calling convention, i.e. float parameters are passed in registers. This + // is true even if the rest of the application passes floats on the stack, + // as it does by default when compiling for the armeabi-v7a NDK ABI. #define VKAPI_ATTR __attribute__((pcs("aapcs-vfp"))) #define VKAPI_CALL #define VKAPI_PTR VKAPI_ATTR diff --git a/engine/vulkan/vulkan.h b/engine/vulkan/vulkan.h index 9b91e629..f20af411 100644 --- a/engine/vulkan/vulkan.h +++ b/engine/vulkan/vulkan.h @@ -6,7 +6,7 @@ extern "C" { #endif /* -** Copyright (c) 2015-2016 The Khronos Group Inc. +** Copyright (c) 2015-2017 The Khronos Group Inc. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -34,16 +34,16 @@ extern "C" { (((major) << 22) | ((minor) << 12) | (patch)) // DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead. -//#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 0) +//#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 0) // Patch version should always be set to 0 // Vulkan 1.0 version number -#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0) +#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)// Patch version should always be set to 0 #define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22) #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) // Version of this file -#define VK_HEADER_VERSION 17 +#define VK_HEADER_VERSION 55 #define VK_NULL_HANDLE 0 @@ -53,11 +53,13 @@ extern "C" { #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; -#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#if !defined(VK_DEFINE_NON_DISPATCHABLE_HANDLE) +#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object; #else #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object; #endif +#endif @@ -135,6 +137,7 @@ typedef enum VkResult { VK_ERROR_INCOMPATIBLE_DRIVER = -9, VK_ERROR_TOO_MANY_OBJECTS = -10, VK_ERROR_FORMAT_NOT_SUPPORTED = -11, + VK_ERROR_FRAGMENTED_POOL = -12, VK_ERROR_SURFACE_LOST_KHR = -1000000000, VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001, VK_SUBOPTIMAL_KHR = 1000001003, @@ -142,9 +145,11 @@ typedef enum VkResult { VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, VK_ERROR_INVALID_SHADER_NV = -1000012000, - VK_RESULT_BEGIN_RANGE = VK_ERROR_FORMAT_NOT_SUPPORTED, + VK_ERROR_OUT_OF_POOL_MEMORY_KHR = -1000069000, + VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = -1000072003, + VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL, VK_RESULT_END_RANGE = VK_INCOMPLETE, - VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_FORMAT_NOT_SUPPORTED + 1), + VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_FRAGMENTED_POOL + 1), VK_RESULT_MAX_ENUM = 0x7FFFFFFF } VkResult; @@ -214,6 +219,120 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000, VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001, VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002, + VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000, + VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001, + VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002, + VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, + VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHX = 1000053000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHX = 1000053001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHX = 1000053002, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001, + VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001, + VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR = 1000059000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR = 1000059001, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR = 1000059002, + VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR = 1000059003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR = 1000059004, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR = 1000059005, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = 1000059006, + VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = 1000059007, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = 1000059008, + VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX = 1000060000, + VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX = 1000060001, + VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX = 1000060002, + VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX = 1000060003, + VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX = 1000060004, + VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX = 1000060005, + VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX = 1000060006, + VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX = 1000060007, + VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHX = 1000060008, + VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHX = 1000060009, + VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHX = 1000060010, + VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX = 1000060011, + VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX = 1000060012, + VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000, + VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX = 1000070000, + VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX = 1000070001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = 1000071000, + VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = 1000071001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = 1000071002, + VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR = 1000071003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR = 1000071004, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR = 1000072000, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR = 1000072001, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR = 1000072002, + VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, + VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, + VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR = 1000073003, + VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR = 1000074000, + VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR = 1000074001, + VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR = 1000074002, + VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = 1000076000, + VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = 1000076001, + VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = 1000077000, + VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078000, + VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078001, + VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR = 1000078002, + VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003, + VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000, + VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR = 1000079001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = 1000080000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = 1000083000, + VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000, + VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = 1000085000, + VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000, + VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001, + VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX = 1000086002, + VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX = 1000086003, + VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX = 1000086004, + VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX = 1000086005, + VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV = 1000087000, + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = 1000090000, + VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT = 1000091000, + VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT = 1000091001, + VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT = 1000091002, + VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003, + VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000, + VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000, + VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001, + VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000, + VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = 1000112000, + VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = 1000112001, + VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = 1000113000, + VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000, + VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001, + VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002, + VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000, + VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000, + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001, + VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR = 1000120000, + VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK = 1000122000, + VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000, + VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = 1000127000, + VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = 1000127001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000, + VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001, + VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = 1000146000, + VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = 1000146001, + VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = 1000146002, + VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = 1000146003, + VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = 1000146004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001, + VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002, + VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000, + VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000, VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO, VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO, VK_STRUCTURE_TYPE_RANGE_SIZE = (VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1), @@ -426,6 +545,14 @@ typedef enum VkFormat { VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182, VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183, VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184, + VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000, + VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001, + VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002, + VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003, + VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004, + VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005, + VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006, + VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007, VK_FORMAT_BEGIN_RANGE = VK_FORMAT_UNDEFINED, VK_FORMAT_END_RANGE = VK_FORMAT_ASTC_12x12_SRGB_BLOCK, VK_FORMAT_RANGE_SIZE = (VK_FORMAT_ASTC_12x12_SRGB_BLOCK - VK_FORMAT_UNDEFINED + 1), @@ -493,6 +620,7 @@ typedef enum VkImageLayout { VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7, VK_IMAGE_LAYOUT_PREINITIALIZED = 8, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002, + VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000, VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_RANGE_SIZE = (VK_IMAGE_LAYOUT_PREINITIALIZED - VK_IMAGE_LAYOUT_UNDEFINED + 1), @@ -558,6 +686,7 @@ typedef enum VkPolygonMode { VK_POLYGON_MODE_FILL = 0, VK_POLYGON_MODE_LINE = 1, VK_POLYGON_MODE_POINT = 2, + VK_POLYGON_MODE_FILL_RECTANGLE_NV = 1000153000, VK_POLYGON_MODE_BEGIN_RANGE = VK_POLYGON_MODE_FILL, VK_POLYGON_MODE_END_RANGE = VK_POLYGON_MODE_POINT, VK_POLYGON_MODE_RANGE_SIZE = (VK_POLYGON_MODE_POINT - VK_POLYGON_MODE_FILL + 1), @@ -658,6 +787,52 @@ typedef enum VkBlendOp { VK_BLEND_OP_REVERSE_SUBTRACT = 2, VK_BLEND_OP_MIN = 3, VK_BLEND_OP_MAX = 4, + VK_BLEND_OP_ZERO_EXT = 1000148000, + VK_BLEND_OP_SRC_EXT = 1000148001, + VK_BLEND_OP_DST_EXT = 1000148002, + VK_BLEND_OP_SRC_OVER_EXT = 1000148003, + VK_BLEND_OP_DST_OVER_EXT = 1000148004, + VK_BLEND_OP_SRC_IN_EXT = 1000148005, + VK_BLEND_OP_DST_IN_EXT = 1000148006, + VK_BLEND_OP_SRC_OUT_EXT = 1000148007, + VK_BLEND_OP_DST_OUT_EXT = 1000148008, + VK_BLEND_OP_SRC_ATOP_EXT = 1000148009, + VK_BLEND_OP_DST_ATOP_EXT = 1000148010, + VK_BLEND_OP_XOR_EXT = 1000148011, + VK_BLEND_OP_MULTIPLY_EXT = 1000148012, + VK_BLEND_OP_SCREEN_EXT = 1000148013, + VK_BLEND_OP_OVERLAY_EXT = 1000148014, + VK_BLEND_OP_DARKEN_EXT = 1000148015, + VK_BLEND_OP_LIGHTEN_EXT = 1000148016, + VK_BLEND_OP_COLORDODGE_EXT = 1000148017, + VK_BLEND_OP_COLORBURN_EXT = 1000148018, + VK_BLEND_OP_HARDLIGHT_EXT = 1000148019, + VK_BLEND_OP_SOFTLIGHT_EXT = 1000148020, + VK_BLEND_OP_DIFFERENCE_EXT = 1000148021, + VK_BLEND_OP_EXCLUSION_EXT = 1000148022, + VK_BLEND_OP_INVERT_EXT = 1000148023, + VK_BLEND_OP_INVERT_RGB_EXT = 1000148024, + VK_BLEND_OP_LINEARDODGE_EXT = 1000148025, + VK_BLEND_OP_LINEARBURN_EXT = 1000148026, + VK_BLEND_OP_VIVIDLIGHT_EXT = 1000148027, + VK_BLEND_OP_LINEARLIGHT_EXT = 1000148028, + VK_BLEND_OP_PINLIGHT_EXT = 1000148029, + VK_BLEND_OP_HARDMIX_EXT = 1000148030, + VK_BLEND_OP_HSL_HUE_EXT = 1000148031, + VK_BLEND_OP_HSL_SATURATION_EXT = 1000148032, + VK_BLEND_OP_HSL_COLOR_EXT = 1000148033, + VK_BLEND_OP_HSL_LUMINOSITY_EXT = 1000148034, + VK_BLEND_OP_PLUS_EXT = 1000148035, + VK_BLEND_OP_PLUS_CLAMPED_EXT = 1000148036, + VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT = 1000148037, + VK_BLEND_OP_PLUS_DARKER_EXT = 1000148038, + VK_BLEND_OP_MINUS_EXT = 1000148039, + VK_BLEND_OP_MINUS_CLAMPED_EXT = 1000148040, + VK_BLEND_OP_CONTRAST_EXT = 1000148041, + VK_BLEND_OP_INVERT_OVG_EXT = 1000148042, + VK_BLEND_OP_RED_EXT = 1000148043, + VK_BLEND_OP_GREEN_EXT = 1000148044, + VK_BLEND_OP_BLUE_EXT = 1000148045, VK_BLEND_OP_BEGIN_RANGE = VK_BLEND_OP_ADD, VK_BLEND_OP_END_RANGE = VK_BLEND_OP_MAX, VK_BLEND_OP_RANGE_SIZE = (VK_BLEND_OP_MAX - VK_BLEND_OP_ADD + 1), @@ -674,6 +849,8 @@ typedef enum VkDynamicState { VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6, VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7, VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8, + VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV = 1000087000, + VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT = 1000099000, VK_DYNAMIC_STATE_BEGIN_RANGE = VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_END_RANGE = VK_DYNAMIC_STATE_STENCIL_REFERENCE, VK_DYNAMIC_STATE_RANGE_SIZE = (VK_DYNAMIC_STATE_STENCIL_REFERENCE - VK_DYNAMIC_STATE_VIEWPORT + 1), @@ -797,6 +974,47 @@ typedef enum VkSubpassContents { VK_SUBPASS_CONTENTS_MAX_ENUM = 0x7FFFFFFF } VkSubpassContents; +typedef enum VkObjectType { + VK_OBJECT_TYPE_UNKNOWN = 0, + VK_OBJECT_TYPE_INSTANCE = 1, + VK_OBJECT_TYPE_PHYSICAL_DEVICE = 2, + VK_OBJECT_TYPE_DEVICE = 3, + VK_OBJECT_TYPE_QUEUE = 4, + VK_OBJECT_TYPE_SEMAPHORE = 5, + VK_OBJECT_TYPE_COMMAND_BUFFER = 6, + VK_OBJECT_TYPE_FENCE = 7, + VK_OBJECT_TYPE_DEVICE_MEMORY = 8, + VK_OBJECT_TYPE_BUFFER = 9, + VK_OBJECT_TYPE_IMAGE = 10, + VK_OBJECT_TYPE_EVENT = 11, + VK_OBJECT_TYPE_QUERY_POOL = 12, + VK_OBJECT_TYPE_BUFFER_VIEW = 13, + VK_OBJECT_TYPE_IMAGE_VIEW = 14, + VK_OBJECT_TYPE_SHADER_MODULE = 15, + VK_OBJECT_TYPE_PIPELINE_CACHE = 16, + VK_OBJECT_TYPE_PIPELINE_LAYOUT = 17, + VK_OBJECT_TYPE_RENDER_PASS = 18, + VK_OBJECT_TYPE_PIPELINE = 19, + VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 20, + VK_OBJECT_TYPE_SAMPLER = 21, + VK_OBJECT_TYPE_DESCRIPTOR_POOL = 22, + VK_OBJECT_TYPE_DESCRIPTOR_SET = 23, + VK_OBJECT_TYPE_FRAMEBUFFER = 24, + VK_OBJECT_TYPE_COMMAND_POOL = 25, + VK_OBJECT_TYPE_SURFACE_KHR = 1000000000, + VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000, + VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000, + VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001, + VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000, + VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = 1000085000, + VK_OBJECT_TYPE_OBJECT_TABLE_NVX = 1000086000, + VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX = 1000086001, + VK_OBJECT_TYPE_BEGIN_RANGE = VK_OBJECT_TYPE_UNKNOWN, + VK_OBJECT_TYPE_END_RANGE = VK_OBJECT_TYPE_COMMAND_POOL, + VK_OBJECT_TYPE_RANGE_SIZE = (VK_OBJECT_TYPE_COMMAND_POOL - VK_OBJECT_TYPE_UNKNOWN + 1), + VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkObjectType; + typedef VkFlags VkInstanceCreateFlags; typedef enum VkFormatFeatureFlagBits { @@ -814,6 +1032,9 @@ typedef enum VkFormatFeatureFlagBits { VK_FORMAT_FEATURE_BLIT_DST_BIT = 0x00000800, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000, + VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = 0x00004000, + VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = 0x00008000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = 0x00010000, VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkFormatFeatureFlagBits; typedef VkFlags VkFormatFeatureFlags; @@ -837,6 +1058,8 @@ typedef enum VkImageCreateFlagBits { VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004, VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010, + VK_IMAGE_CREATE_BIND_SFR_BIT_KHX = 0x00000040, + VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = 0x00000020, VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageCreateFlagBits; typedef VkFlags VkImageCreateFlags; @@ -874,6 +1097,7 @@ typedef VkFlags VkMemoryPropertyFlags; typedef enum VkMemoryHeapFlagBits { VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0x00000001, + VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHX = 0x00000002, VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkMemoryHeapFlagBits; typedef VkFlags VkMemoryHeapFlags; @@ -898,6 +1122,7 @@ typedef enum VkPipelineStageFlagBits { VK_PIPELINE_STAGE_HOST_BIT = 0x00004000, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 0x00008000, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 0x00010000, + VK_PIPELINE_STAGE_COMMAND_PROCESS_BIT_NVX = 0x00020000, VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineStageFlagBits; typedef VkFlags VkPipelineStageFlags; @@ -990,6 +1215,8 @@ typedef enum VkPipelineCreateFlagBits { VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001, VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002, VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004, + VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHX = 0x00000008, + VK_PIPELINE_CREATE_DISPATCH_BASE_KHX = 0x00000010, VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineCreateFlagBits; typedef VkFlags VkPipelineCreateFlags; @@ -1036,6 +1263,11 @@ typedef VkFlags VkPipelineDynamicStateCreateFlags; typedef VkFlags VkPipelineLayoutCreateFlags; typedef VkFlags VkShaderStageFlags; typedef VkFlags VkSamplerCreateFlags; + +typedef enum VkDescriptorSetLayoutCreateFlagBits { + VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorSetLayoutCreateFlagBits; typedef VkFlags VkDescriptorSetLayoutCreateFlags; typedef enum VkDescriptorPoolCreateFlagBits { @@ -1052,6 +1284,12 @@ typedef enum VkAttachmentDescriptionFlagBits { VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkAttachmentDescriptionFlagBits; typedef VkFlags VkAttachmentDescriptionFlags; + +typedef enum VkSubpassDescriptionFlagBits { + VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX = 0x00000001, + VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX = 0x00000002, + VK_SUBPASS_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSubpassDescriptionFlagBits; typedef VkFlags VkSubpassDescriptionFlags; typedef enum VkAccessFlagBits { @@ -1072,12 +1310,17 @@ typedef enum VkAccessFlagBits { VK_ACCESS_HOST_WRITE_BIT = 0x00004000, VK_ACCESS_MEMORY_READ_BIT = 0x00008000, VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000, + VK_ACCESS_COMMAND_PROCESS_READ_BIT_NVX = 0x00020000, + VK_ACCESS_COMMAND_PROCESS_WRITE_BIT_NVX = 0x00040000, + VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000, VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkAccessFlagBits; typedef VkFlags VkAccessFlags; typedef enum VkDependencyFlagBits { VK_DEPENDENCY_BY_REGION_BIT = 0x00000001, + VK_DEPENDENCY_VIEW_LOCAL_BIT_KHX = 0x00000002, + VK_DEPENDENCY_DEVICE_GROUP_BIT_KHX = 0x00000004, VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDependencyFlagBits; typedef VkFlags VkDependencyFlags; @@ -2340,14 +2583,14 @@ typedef void (VKAPI_PTR *PFN_vkCmdDraw)(VkCommandBuffer commandBuffer, uint32_t typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexed)(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance); typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); -typedef void (VKAPI_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z); +typedef void (VKAPI_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); typedef void (VKAPI_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); typedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions); typedef void (VKAPI_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions); typedef void (VKAPI_PTR *PFN_vkCmdBlitImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter); typedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions); typedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions); -typedef void (VKAPI_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t* pData); +typedef void (VKAPI_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData); typedef void (VKAPI_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data); typedef void (VKAPI_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges); typedef void (VKAPI_PTR *PFN_vkCmdClearDepthStencilImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges); @@ -2976,9 +3219,9 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect( VKAPI_ATTR void VKAPI_CALL vkCmdDispatch( VkCommandBuffer commandBuffer, - uint32_t x, - uint32_t y, - uint32_t z); + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect( VkCommandBuffer commandBuffer, @@ -3032,7 +3275,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer( VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, - const uint32_t* pData); + const void* pData); VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer( VkCommandBuffer commandBuffer, @@ -3177,6 +3420,20 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) typedef enum VkColorSpaceKHR { VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0, + VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT = 1000104001, + VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT = 1000104002, + VK_COLOR_SPACE_DCI_P3_LINEAR_EXT = 1000104003, + VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT = 1000104004, + VK_COLOR_SPACE_BT709_LINEAR_EXT = 1000104005, + VK_COLOR_SPACE_BT709_NONLINEAR_EXT = 1000104006, + VK_COLOR_SPACE_BT2020_LINEAR_EXT = 1000104007, + VK_COLOR_SPACE_HDR10_ST2084_EXT = 1000104008, + VK_COLOR_SPACE_DOLBYVISION_EXT = 1000104009, + VK_COLOR_SPACE_HDR10_HLG_EXT = 1000104010, + VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT = 1000104011, + VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT = 1000104012, + VK_COLOR_SPACE_PASS_THROUGH_EXT = 1000104013, + VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT = 1000104014, VK_COLOR_SPACE_BEGIN_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_END_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_RANGE_SIZE_KHR = (VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR + 1), @@ -3188,6 +3445,8 @@ typedef enum VkPresentModeKHR { VK_PRESENT_MODE_MAILBOX_KHR = 1, VK_PRESENT_MODE_FIFO_KHR = 2, VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3, + VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR = 1000111000, + VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR = 1000111001, VK_PRESENT_MODE_BEGIN_RANGE_KHR = VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_END_RANGE_KHR = VK_PRESENT_MODE_FIFO_RELAXED_KHR, VK_PRESENT_MODE_RANGE_SIZE_KHR = (VK_PRESENT_MODE_FIFO_RELAXED_KHR - VK_PRESENT_MODE_IMMEDIATE_KHR + 1), @@ -3279,6 +3538,11 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSwapchainKHR) #define VK_KHR_SWAPCHAIN_SPEC_VERSION 68 #define VK_KHR_SWAPCHAIN_EXTENSION_NAME "VK_KHR_swapchain" + +typedef enum VkSwapchainCreateFlagBitsKHR { + VK_SWAPCHAIN_CREATE_BIND_SFR_BIT_KHX = 0x00000001, + VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkSwapchainCreateFlagBitsKHR; typedef VkFlags VkSwapchainCreateFlagsKHR; typedef struct VkSwapchainCreateInfoKHR { @@ -3579,7 +3843,7 @@ VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR( #define VK_KHR_wayland_surface 1 #include -#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 5 +#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6 #define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface" typedef VkFlags VkWaylandSurfaceCreateFlagsKHR; @@ -3677,7 +3941,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR( #define VK_KHR_win32_surface 1 #include -#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 5 +#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6 #define VK_KHR_WIN32_SURFACE_EXTENSION_NAME "VK_KHR_win32_surface" typedef VkFlags VkWin32SurfaceCreateFlagsKHR; @@ -3712,12 +3976,946 @@ VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR( #define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME "VK_KHR_sampler_mirror_clamp_to_edge" +#define VK_KHR_get_physical_device_properties2 1 +#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 1 +#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME "VK_KHR_get_physical_device_properties2" + +typedef struct VkPhysicalDeviceFeatures2KHR { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceFeatures features; +} VkPhysicalDeviceFeatures2KHR; + +typedef struct VkPhysicalDeviceProperties2KHR { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceProperties properties; +} VkPhysicalDeviceProperties2KHR; + +typedef struct VkFormatProperties2KHR { + VkStructureType sType; + void* pNext; + VkFormatProperties formatProperties; +} VkFormatProperties2KHR; + +typedef struct VkImageFormatProperties2KHR { + VkStructureType sType; + void* pNext; + VkImageFormatProperties imageFormatProperties; +} VkImageFormatProperties2KHR; + +typedef struct VkPhysicalDeviceImageFormatInfo2KHR { + VkStructureType sType; + const void* pNext; + VkFormat format; + VkImageType type; + VkImageTiling tiling; + VkImageUsageFlags usage; + VkImageCreateFlags flags; +} VkPhysicalDeviceImageFormatInfo2KHR; + +typedef struct VkQueueFamilyProperties2KHR { + VkStructureType sType; + void* pNext; + VkQueueFamilyProperties queueFamilyProperties; +} VkQueueFamilyProperties2KHR; + +typedef struct VkPhysicalDeviceMemoryProperties2KHR { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceMemoryProperties memoryProperties; +} VkPhysicalDeviceMemoryProperties2KHR; + +typedef struct VkSparseImageFormatProperties2KHR { + VkStructureType sType; + void* pNext; + VkSparseImageFormatProperties properties; +} VkSparseImageFormatProperties2KHR; + +typedef struct VkPhysicalDeviceSparseImageFormatInfo2KHR { + VkStructureType sType; + const void* pNext; + VkFormat format; + VkImageType type; + VkSampleCountFlagBits samples; + VkImageUsageFlags usage; + VkImageTiling tiling; +} VkPhysicalDeviceSparseImageFormatInfo2KHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR* pFeatures); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2KHR* pProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties2KHR)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2KHR* pFormatProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo, VkImageFormatProperties2KHR* pImageFormatProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties2KHR* pQueueFamilyProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2KHR* pMemoryProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2KHR* pProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2KHR( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures2KHR* pFeatures); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2KHR( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceProperties2KHR* pProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2KHR( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkFormatProperties2KHR* pFormatProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo, + VkImageFormatProperties2KHR* pImageFormatProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2KHR( + VkPhysicalDevice physicalDevice, + uint32_t* pQueueFamilyPropertyCount, + VkQueueFamilyProperties2KHR* pQueueFamilyProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties2KHR( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceMemoryProperties2KHR* pMemoryProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo, + uint32_t* pPropertyCount, + VkSparseImageFormatProperties2KHR* pProperties); +#endif + +#define VK_KHR_shader_draw_parameters 1 +#define VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION 1 +#define VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME "VK_KHR_shader_draw_parameters" + + +#define VK_KHR_maintenance1 1 +#define VK_KHR_MAINTENANCE1_SPEC_VERSION 1 +#define VK_KHR_MAINTENANCE1_EXTENSION_NAME "VK_KHR_maintenance1" + +typedef VkFlags VkCommandPoolTrimFlagsKHR; + +typedef void (VKAPI_PTR *PFN_vkTrimCommandPoolKHR)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkTrimCommandPoolKHR( + VkDevice device, + VkCommandPool commandPool, + VkCommandPoolTrimFlagsKHR flags); +#endif + +#define VK_KHR_external_memory_capabilities 1 +#define VK_LUID_SIZE_KHR 8 +#define VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_memory_capabilities" + + +typedef enum VkExternalMemoryHandleTypeFlagBitsKHR { + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = 0x00000001, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = 0x00000002, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = 0x00000004, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR = 0x00000008, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR = 0x00000010, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR = 0x00000020, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR = 0x00000040, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkExternalMemoryHandleTypeFlagBitsKHR; +typedef VkFlags VkExternalMemoryHandleTypeFlagsKHR; + +typedef enum VkExternalMemoryFeatureFlagBitsKHR { + VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR = 0x00000001, + VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR = 0x00000002, + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR = 0x00000004, + VK_EXTERNAL_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkExternalMemoryFeatureFlagBitsKHR; +typedef VkFlags VkExternalMemoryFeatureFlagsKHR; + +typedef struct VkExternalMemoryPropertiesKHR { + VkExternalMemoryFeatureFlagsKHR externalMemoryFeatures; + VkExternalMemoryHandleTypeFlagsKHR exportFromImportedHandleTypes; + VkExternalMemoryHandleTypeFlagsKHR compatibleHandleTypes; +} VkExternalMemoryPropertiesKHR; + +typedef struct VkPhysicalDeviceExternalImageFormatInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBitsKHR handleType; +} VkPhysicalDeviceExternalImageFormatInfoKHR; + +typedef struct VkExternalImageFormatPropertiesKHR { + VkStructureType sType; + void* pNext; + VkExternalMemoryPropertiesKHR externalMemoryProperties; +} VkExternalImageFormatPropertiesKHR; + +typedef struct VkPhysicalDeviceExternalBufferInfoKHR { + VkStructureType sType; + const void* pNext; + VkBufferCreateFlags flags; + VkBufferUsageFlags usage; + VkExternalMemoryHandleTypeFlagBitsKHR handleType; +} VkPhysicalDeviceExternalBufferInfoKHR; + +typedef struct VkExternalBufferPropertiesKHR { + VkStructureType sType; + void* pNext; + VkExternalMemoryPropertiesKHR externalMemoryProperties; +} VkExternalBufferPropertiesKHR; + +typedef struct VkPhysicalDeviceIDPropertiesKHR { + VkStructureType sType; + void* pNext; + uint8_t deviceUUID[VK_UUID_SIZE]; + uint8_t driverUUID[VK_UUID_SIZE]; + uint8_t deviceLUID[VK_LUID_SIZE_KHR]; + uint32_t deviceNodeMask; + VkBool32 deviceLUIDValid; +} VkPhysicalDeviceIDPropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferPropertiesKHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, + VkExternalBufferPropertiesKHR* pExternalBufferProperties); +#endif + +#define VK_KHR_external_memory 1 +#define VK_KHR_EXTERNAL_MEMORY_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME "VK_KHR_external_memory" +#define VK_QUEUE_FAMILY_EXTERNAL_KHR (~0U-1) + +typedef struct VkExternalMemoryImageCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsKHR handleTypes; +} VkExternalMemoryImageCreateInfoKHR; + +typedef struct VkExternalMemoryBufferCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsKHR handleTypes; +} VkExternalMemoryBufferCreateInfoKHR; + +typedef struct VkExportMemoryAllocateInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsKHR handleTypes; +} VkExportMemoryAllocateInfoKHR; + + + +#ifdef VK_USE_PLATFORM_WIN32_KHR +#define VK_KHR_external_memory_win32 1 +#define VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_KHR_external_memory_win32" + +typedef struct VkImportMemoryWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBitsKHR handleType; + HANDLE handle; + LPCWSTR name; +} VkImportMemoryWin32HandleInfoKHR; + +typedef struct VkExportMemoryWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; + LPCWSTR name; +} VkExportMemoryWin32HandleInfoKHR; + +typedef struct VkMemoryWin32HandlePropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t memoryTypeBits; +} VkMemoryWin32HandlePropertiesKHR; + +typedef struct VkMemoryGetWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; + VkExternalMemoryHandleTypeFlagBitsKHR handleType; +} VkMemoryGetWin32HandleInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleKHR)(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandlePropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleKHR( + VkDevice device, + const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, + HANDLE* pHandle); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandlePropertiesKHR( + VkDevice device, + VkExternalMemoryHandleTypeFlagBitsKHR handleType, + HANDLE handle, + VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); +#endif +#endif /* VK_USE_PLATFORM_WIN32_KHR */ + +#define VK_KHR_external_memory_fd 1 +#define VK_KHR_EXTERNAL_MEMORY_FD_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME "VK_KHR_external_memory_fd" + +typedef struct VkImportMemoryFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBitsKHR handleType; + int fd; +} VkImportMemoryFdInfoKHR; + +typedef struct VkMemoryFdPropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t memoryTypeBits; +} VkMemoryFdPropertiesKHR; + +typedef struct VkMemoryGetFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; + VkExternalMemoryHandleTypeFlagBitsKHR handleType; +} VkMemoryGetFdInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdKHR)(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd); +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdPropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdKHR( + VkDevice device, + const VkMemoryGetFdInfoKHR* pGetFdInfo, + int* pFd); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdPropertiesKHR( + VkDevice device, + VkExternalMemoryHandleTypeFlagBitsKHR handleType, + int fd, + VkMemoryFdPropertiesKHR* pMemoryFdProperties); +#endif + +#ifdef VK_USE_PLATFORM_WIN32_KHR +#define VK_KHR_win32_keyed_mutex 1 +#define VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION 1 +#define VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_KHR_win32_keyed_mutex" + +typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t acquireCount; + const VkDeviceMemory* pAcquireSyncs; + const uint64_t* pAcquireKeys; + const uint32_t* pAcquireTimeouts; + uint32_t releaseCount; + const VkDeviceMemory* pReleaseSyncs; + const uint64_t* pReleaseKeys; +} VkWin32KeyedMutexAcquireReleaseInfoKHR; + + +#endif /* VK_USE_PLATFORM_WIN32_KHR */ + +#define VK_KHR_external_semaphore_capabilities 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_semaphore_capabilities" + + +typedef enum VkExternalSemaphoreHandleTypeFlagBitsKHR { + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = 0x00000001, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = 0x00000002, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = 0x00000004, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR = 0x00000008, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR = 0x00000010, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkExternalSemaphoreHandleTypeFlagBitsKHR; +typedef VkFlags VkExternalSemaphoreHandleTypeFlagsKHR; + +typedef enum VkExternalSemaphoreFeatureFlagBitsKHR { + VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR = 0x00000001, + VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR = 0x00000002, + VK_EXTERNAL_SEMAPHORE_FEATURE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkExternalSemaphoreFeatureFlagBitsKHR; +typedef VkFlags VkExternalSemaphoreFeatureFlagsKHR; + +typedef struct VkPhysicalDeviceExternalSemaphoreInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalSemaphoreHandleTypeFlagBitsKHR handleType; +} VkPhysicalDeviceExternalSemaphoreInfoKHR; + +typedef struct VkExternalSemaphorePropertiesKHR { + VkStructureType sType; + void* pNext; + VkExternalSemaphoreHandleTypeFlagsKHR exportFromImportedHandleTypes; + VkExternalSemaphoreHandleTypeFlagsKHR compatibleHandleTypes; + VkExternalSemaphoreFeatureFlagsKHR externalSemaphoreFeatures; +} VkExternalSemaphorePropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, + VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties); +#endif + +#define VK_KHR_external_semaphore 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME "VK_KHR_external_semaphore" + + +typedef enum VkSemaphoreImportFlagBitsKHR { + VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR = 0x00000001, + VK_SEMAPHORE_IMPORT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkSemaphoreImportFlagBitsKHR; +typedef VkFlags VkSemaphoreImportFlagsKHR; + +typedef struct VkExportSemaphoreCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalSemaphoreHandleTypeFlagsKHR handleTypes; +} VkExportSemaphoreCreateInfoKHR; + + + +#ifdef VK_USE_PLATFORM_WIN32_KHR +#define VK_KHR_external_semaphore_win32 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME "VK_KHR_external_semaphore_win32" + +typedef struct VkImportSemaphoreWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkSemaphoreImportFlagsKHR flags; + VkExternalSemaphoreHandleTypeFlagBitsKHR handleType; + HANDLE handle; + LPCWSTR name; +} VkImportSemaphoreWin32HandleInfoKHR; + +typedef struct VkExportSemaphoreWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; + LPCWSTR name; +} VkExportSemaphoreWin32HandleInfoKHR; + +typedef struct VkD3D12FenceSubmitInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t waitSemaphoreValuesCount; + const uint64_t* pWaitSemaphoreValues; + uint32_t signalSemaphoreValuesCount; + const uint64_t* pSignalSemaphoreValues; +} VkD3D12FenceSubmitInfoKHR; + +typedef struct VkSemaphoreGetWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkExternalSemaphoreHandleTypeFlagBitsKHR handleType; +} VkSemaphoreGetWin32HandleInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreWin32HandleKHR)(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreWin32HandleKHR)(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreWin32HandleKHR( + VkDevice device, + const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreWin32HandleKHR( + VkDevice device, + const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, + HANDLE* pHandle); +#endif +#endif /* VK_USE_PLATFORM_WIN32_KHR */ + +#define VK_KHR_external_semaphore_fd 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_FD_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME "VK_KHR_external_semaphore_fd" + +typedef struct VkImportSemaphoreFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkSemaphoreImportFlagsKHR flags; + VkExternalSemaphoreHandleTypeFlagBitsKHR handleType; + int fd; +} VkImportSemaphoreFdInfoKHR; + +typedef struct VkSemaphoreGetFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkExternalSemaphoreHandleTypeFlagBitsKHR handleType; +} VkSemaphoreGetFdInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreFdKHR)(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreFdKHR)(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreFdKHR( + VkDevice device, + const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreFdKHR( + VkDevice device, + const VkSemaphoreGetFdInfoKHR* pGetFdInfo, + int* pFd); +#endif + +#define VK_KHR_push_descriptor 1 +#define VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION 1 +#define VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME "VK_KHR_push_descriptor" + +typedef struct VkPhysicalDevicePushDescriptorPropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t maxPushDescriptors; +} VkPhysicalDevicePushDescriptorPropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetKHR)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetKHR( + VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, + uint32_t set, + uint32_t descriptorWriteCount, + const VkWriteDescriptorSet* pDescriptorWrites); +#endif + +#define VK_KHR_16bit_storage 1 +#define VK_KHR_16BIT_STORAGE_SPEC_VERSION 1 +#define VK_KHR_16BIT_STORAGE_EXTENSION_NAME "VK_KHR_16bit_storage" + +typedef struct VkPhysicalDevice16BitStorageFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 storageBuffer16BitAccess; + VkBool32 uniformAndStorageBuffer16BitAccess; + VkBool32 storagePushConstant16; + VkBool32 storageInputOutput16; +} VkPhysicalDevice16BitStorageFeaturesKHR; + + + +#define VK_KHR_incremental_present 1 +#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 1 +#define VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME "VK_KHR_incremental_present" + +typedef struct VkRectLayerKHR { + VkOffset2D offset; + VkExtent2D extent; + uint32_t layer; +} VkRectLayerKHR; + +typedef struct VkPresentRegionKHR { + uint32_t rectangleCount; + const VkRectLayerKHR* pRectangles; +} VkPresentRegionKHR; + +typedef struct VkPresentRegionsKHR { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const VkPresentRegionKHR* pRegions; +} VkPresentRegionsKHR; + + + +#define VK_KHR_descriptor_update_template 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorUpdateTemplateKHR) + +#define VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_SPEC_VERSION 1 +#define VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME "VK_KHR_descriptor_update_template" + + +typedef enum VkDescriptorUpdateTemplateTypeKHR { + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR = 0, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR = 1, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_BEGIN_RANGE_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_END_RANGE_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_RANGE_SIZE_KHR = (VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR + 1), + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDescriptorUpdateTemplateTypeKHR; + +typedef VkFlags VkDescriptorUpdateTemplateCreateFlagsKHR; + +typedef struct VkDescriptorUpdateTemplateEntryKHR { + uint32_t dstBinding; + uint32_t dstArrayElement; + uint32_t descriptorCount; + VkDescriptorType descriptorType; + size_t offset; + size_t stride; +} VkDescriptorUpdateTemplateEntryKHR; + +typedef struct VkDescriptorUpdateTemplateCreateInfoKHR { + VkStructureType sType; + void* pNext; + VkDescriptorUpdateTemplateCreateFlagsKHR flags; + uint32_t descriptorUpdateEntryCount; + const VkDescriptorUpdateTemplateEntryKHR* pDescriptorUpdateEntries; + VkDescriptorUpdateTemplateTypeKHR templateType; + VkDescriptorSetLayout descriptorSetLayout; + VkPipelineBindPoint pipelineBindPoint; + VkPipelineLayout pipelineLayout; + uint32_t set; +} VkDescriptorUpdateTemplateCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorUpdateTemplateKHR)(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate); +typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplateKHR)(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplateKHR)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplateKHR)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplateKHR( + VkDevice device, + const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplateKHR( + VkDevice device, + VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplateKHR( + VkDevice device, + VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, + const void* pData); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplateKHR( + VkCommandBuffer commandBuffer, + VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, + VkPipelineLayout layout, + uint32_t set, + const void* pData); +#endif + +#define VK_KHR_shared_presentable_image 1 +#define VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION 1 +#define VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME "VK_KHR_shared_presentable_image" + +typedef struct VkSharedPresentSurfaceCapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkImageUsageFlags sharedPresentSupportedUsageFlags; +} VkSharedPresentSurfaceCapabilitiesKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainStatusKHR)(VkDevice device, VkSwapchainKHR swapchain); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainStatusKHR( + VkDevice device, + VkSwapchainKHR swapchain); +#endif + +#define VK_KHR_external_fence_capabilities 1 +#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_fence_capabilities" + + +typedef enum VkExternalFenceHandleTypeFlagBitsKHR { + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = 0x00000001, + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = 0x00000002, + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = 0x00000004, + VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR = 0x00000008, + VK_EXTERNAL_FENCE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkExternalFenceHandleTypeFlagBitsKHR; +typedef VkFlags VkExternalFenceHandleTypeFlagsKHR; + +typedef enum VkExternalFenceFeatureFlagBitsKHR { + VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR = 0x00000001, + VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR = 0x00000002, + VK_EXTERNAL_FENCE_FEATURE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkExternalFenceFeatureFlagBitsKHR; +typedef VkFlags VkExternalFenceFeatureFlagsKHR; + +typedef struct VkPhysicalDeviceExternalFenceInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalFenceHandleTypeFlagBitsKHR handleType; +} VkPhysicalDeviceExternalFenceInfoKHR; + +typedef struct VkExternalFencePropertiesKHR { + VkStructureType sType; + void* pNext; + VkExternalFenceHandleTypeFlagsKHR exportFromImportedHandleTypes; + VkExternalFenceHandleTypeFlagsKHR compatibleHandleTypes; + VkExternalFenceFeatureFlagsKHR externalFenceFeatures; +} VkExternalFencePropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFencePropertiesKHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, + VkExternalFencePropertiesKHR* pExternalFenceProperties); +#endif + +#define VK_KHR_external_fence 1 +#define VK_KHR_EXTERNAL_FENCE_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME "VK_KHR_external_fence" + + +typedef enum VkFenceImportFlagBitsKHR { + VK_FENCE_IMPORT_TEMPORARY_BIT_KHR = 0x00000001, + VK_FENCE_IMPORT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkFenceImportFlagBitsKHR; +typedef VkFlags VkFenceImportFlagsKHR; + +typedef struct VkExportFenceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalFenceHandleTypeFlagsKHR handleTypes; +} VkExportFenceCreateInfoKHR; + + + +#ifdef VK_USE_PLATFORM_WIN32_KHR +#define VK_KHR_external_fence_win32 1 +#define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME "VK_KHR_external_fence_win32" + +typedef struct VkImportFenceWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkFenceImportFlagsKHR flags; + VkExternalFenceHandleTypeFlagBitsKHR handleType; + HANDLE handle; + LPCWSTR name; +} VkImportFenceWin32HandleInfoKHR; + +typedef struct VkExportFenceWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; + LPCWSTR name; +} VkExportFenceWin32HandleInfoKHR; + +typedef struct VkFenceGetWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkExternalFenceHandleTypeFlagBitsKHR handleType; +} VkFenceGetWin32HandleInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceWin32HandleKHR( + VkDevice device, + const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR( + VkDevice device, + const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, + HANDLE* pHandle); +#endif +#endif /* VK_USE_PLATFORM_WIN32_KHR */ + +#define VK_KHR_external_fence_fd 1 +#define VK_KHR_EXTERNAL_FENCE_FD_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME "VK_KHR_external_fence_fd" + +typedef struct VkImportFenceFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkFenceImportFlagsKHR flags; + VkExternalFenceHandleTypeFlagBitsKHR handleType; + int fd; +} VkImportFenceFdInfoKHR; + +typedef struct VkFenceGetFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkExternalFenceHandleTypeFlagBitsKHR handleType; +} VkFenceGetFdInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportFenceFdKHR)(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetFenceFdKHR)(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceFdKHR( + VkDevice device, + const VkImportFenceFdInfoKHR* pImportFenceFdInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceFdKHR( + VkDevice device, + const VkFenceGetFdInfoKHR* pGetFdInfo, + int* pFd); +#endif + +#define VK_KHR_get_surface_capabilities2 1 +#define VK_KHR_GET_SURFACE_CAPABILITIES_2_SPEC_VERSION 1 +#define VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME "VK_KHR_get_surface_capabilities2" + +typedef struct VkPhysicalDeviceSurfaceInfo2KHR { + VkStructureType sType; + const void* pNext; + VkSurfaceKHR surface; +} VkPhysicalDeviceSurfaceInfo2KHR; + +typedef struct VkSurfaceCapabilities2KHR { + VkStructureType sType; + void* pNext; + VkSurfaceCapabilitiesKHR surfaceCapabilities; +} VkSurfaceCapabilities2KHR; + +typedef struct VkSurfaceFormat2KHR { + VkStructureType sType; + void* pNext; + VkSurfaceFormatKHR surfaceFormat; +} VkSurfaceFormat2KHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, + VkSurfaceCapabilities2KHR* pSurfaceCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormats2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, + uint32_t* pSurfaceFormatCount, + VkSurfaceFormat2KHR* pSurfaceFormats); +#endif + +#define VK_KHR_variable_pointers 1 +#define VK_KHR_VARIABLE_POINTERS_SPEC_VERSION 1 +#define VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME "VK_KHR_variable_pointers" + +typedef struct VkPhysicalDeviceVariablePointerFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 variablePointersStorageBuffer; + VkBool32 variablePointers; +} VkPhysicalDeviceVariablePointerFeaturesKHR; + + + +#define VK_KHR_dedicated_allocation 1 +#define VK_KHR_DEDICATED_ALLOCATION_SPEC_VERSION 1 +#define VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME "VK_KHR_dedicated_allocation" + +typedef struct VkMemoryDedicatedRequirementsKHR { + VkStructureType sType; + void* pNext; + VkBool32 prefersDedicatedAllocation; + VkBool32 requiresDedicatedAllocation; +} VkMemoryDedicatedRequirementsKHR; + +typedef struct VkMemoryDedicatedAllocateInfoKHR { + VkStructureType sType; + const void* pNext; + VkImage image; + VkBuffer buffer; +} VkMemoryDedicatedAllocateInfoKHR; + + + +#define VK_KHR_storage_buffer_storage_class 1 +#define VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION 1 +#define VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME "VK_KHR_storage_buffer_storage_class" + + +#define VK_KHR_get_memory_requirements2 1 +#define VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION 1 +#define VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME "VK_KHR_get_memory_requirements2" + +typedef struct VkBufferMemoryRequirementsInfo2KHR { + VkStructureType sType; + const void* pNext; + VkBuffer buffer; +} VkBufferMemoryRequirementsInfo2KHR; + +typedef struct VkImageMemoryRequirementsInfo2KHR { + VkStructureType sType; + const void* pNext; + VkImage image; +} VkImageMemoryRequirementsInfo2KHR; + +typedef struct VkImageSparseMemoryRequirementsInfo2KHR { + VkStructureType sType; + const void* pNext; + VkImage image; +} VkImageSparseMemoryRequirementsInfo2KHR; + +typedef struct VkMemoryRequirements2KHR { + VkStructureType sType; + void* pNext; + VkMemoryRequirements memoryRequirements; +} VkMemoryRequirements2KHR; + +typedef struct VkSparseImageMemoryRequirements2KHR { + VkStructureType sType; + void* pNext; + VkSparseImageMemoryRequirements memoryRequirements; +} VkSparseImageMemoryRequirements2KHR; + + +typedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements2KHR)(VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements2KHR)(VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2KHR)(VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements2KHR( + VkDevice device, + const VkImageMemoryRequirementsInfo2KHR* pInfo, + VkMemoryRequirements2KHR* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2KHR( + VkDevice device, + const VkBufferMemoryRequirementsInfo2KHR* pInfo, + VkMemoryRequirements2KHR* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements2KHR( + VkDevice device, + const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, + uint32_t* pSparseMemoryRequirementCount, + VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements); +#endif + #define VK_EXT_debug_report 1 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT) -#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 3 +#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 8 #define VK_EXT_DEBUG_REPORT_EXTENSION_NAME "VK_EXT_debug_report" #define VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT +#define VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT typedef enum VkDebugReportObjectTypeEXT { @@ -3749,22 +4947,18 @@ typedef enum VkDebugReportObjectTypeEXT { VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT = 25, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = 26, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = 27, - VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = 28, + VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT = 28, + VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT = 29, + VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT = 30, + VK_DEBUG_REPORT_OBJECT_TYPE_OBJECT_TABLE_NVX_EXT = 31, + VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT = 32, + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT = 1000085000, VK_DEBUG_REPORT_OBJECT_TYPE_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_END_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT + 1), + VK_DEBUG_REPORT_OBJECT_TYPE_END_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT + 1), VK_DEBUG_REPORT_OBJECT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF } VkDebugReportObjectTypeEXT; -typedef enum VkDebugReportErrorEXT { - VK_DEBUG_REPORT_ERROR_NONE_EXT = 0, - VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT = 1, - VK_DEBUG_REPORT_ERROR_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_ERROR_NONE_EXT, - VK_DEBUG_REPORT_ERROR_END_RANGE_EXT = VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, - VK_DEBUG_REPORT_ERROR_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT - VK_DEBUG_REPORT_ERROR_NONE_EXT + 1), - VK_DEBUG_REPORT_ERROR_MAX_ENUM_EXT = 0x7FFFFFFF -} VkDebugReportErrorEXT; - typedef enum VkDebugReportFlagBitsEXT { VK_DEBUG_REPORT_INFORMATION_BIT_EXT = 0x00000001, @@ -3866,7 +5060,7 @@ typedef struct VkPipelineRasterizationStateRasterizationOrderAMD { #define VK_EXT_debug_marker 1 -#define VK_EXT_DEBUG_MARKER_SPEC_VERSION 3 +#define VK_EXT_DEBUG_MARKER_SPEC_VERSION 4 #define VK_EXT_DEBUG_MARKER_EXTENSION_NAME "VK_EXT_debug_marker" typedef struct VkDebugMarkerObjectNameInfoEXT { @@ -3895,31 +5089,31 @@ typedef struct VkDebugMarkerMarkerInfoEXT { } VkDebugMarkerMarkerInfoEXT; -typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectTagEXT)(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo); -typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectNameEXT)(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo); -typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerBeginEXT)(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo); +typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectTagEXT)(VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo); +typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectNameEXT)(VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerBeginEXT)(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerEndEXT)(VkCommandBuffer commandBuffer); -typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerInsertEXT)(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerInsertEXT)(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectTagEXT( VkDevice device, - VkDebugMarkerObjectTagInfoEXT* pTagInfo); + const VkDebugMarkerObjectTagInfoEXT* pTagInfo); VKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectNameEXT( VkDevice device, - VkDebugMarkerObjectNameInfoEXT* pNameInfo); + const VkDebugMarkerObjectNameInfoEXT* pNameInfo); VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerBeginEXT( VkCommandBuffer commandBuffer, - VkDebugMarkerMarkerInfoEXT* pMarkerInfo); + const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerEndEXT( VkCommandBuffer commandBuffer); VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerInsertEXT( VkCommandBuffer commandBuffer, - VkDebugMarkerMarkerInfoEXT* pMarkerInfo); + const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); #endif #define VK_AMD_gcn_shader 1 @@ -3927,6 +5121,1307 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerInsertEXT( #define VK_AMD_GCN_SHADER_EXTENSION_NAME "VK_AMD_gcn_shader" +#define VK_NV_dedicated_allocation 1 +#define VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION 1 +#define VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME "VK_NV_dedicated_allocation" + +typedef struct VkDedicatedAllocationImageCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkBool32 dedicatedAllocation; +} VkDedicatedAllocationImageCreateInfoNV; + +typedef struct VkDedicatedAllocationBufferCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkBool32 dedicatedAllocation; +} VkDedicatedAllocationBufferCreateInfoNV; + +typedef struct VkDedicatedAllocationMemoryAllocateInfoNV { + VkStructureType sType; + const void* pNext; + VkImage image; + VkBuffer buffer; +} VkDedicatedAllocationMemoryAllocateInfoNV; + + + +#define VK_AMD_draw_indirect_count 1 +#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 1 +#define VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME "VK_AMD_draw_indirect_count" + +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountAMD( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); +#endif + +#define VK_AMD_negative_viewport_height 1 +#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION 1 +#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME "VK_AMD_negative_viewport_height" + + +#define VK_AMD_gpu_shader_half_float 1 +#define VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION 1 +#define VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME "VK_AMD_gpu_shader_half_float" + + +#define VK_AMD_shader_ballot 1 +#define VK_AMD_SHADER_BALLOT_SPEC_VERSION 1 +#define VK_AMD_SHADER_BALLOT_EXTENSION_NAME "VK_AMD_shader_ballot" + + +#define VK_AMD_texture_gather_bias_lod 1 +#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION 1 +#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME "VK_AMD_texture_gather_bias_lod" + +typedef struct VkTextureLODGatherFormatPropertiesAMD { + VkStructureType sType; + void* pNext; + VkBool32 supportsTextureGatherLODBiasAMD; +} VkTextureLODGatherFormatPropertiesAMD; + + + +#define VK_KHX_multiview 1 +#define VK_KHX_MULTIVIEW_SPEC_VERSION 1 +#define VK_KHX_MULTIVIEW_EXTENSION_NAME "VK_KHX_multiview" + +typedef struct VkRenderPassMultiviewCreateInfoKHX { + VkStructureType sType; + const void* pNext; + uint32_t subpassCount; + const uint32_t* pViewMasks; + uint32_t dependencyCount; + const int32_t* pViewOffsets; + uint32_t correlationMaskCount; + const uint32_t* pCorrelationMasks; +} VkRenderPassMultiviewCreateInfoKHX; + +typedef struct VkPhysicalDeviceMultiviewFeaturesKHX { + VkStructureType sType; + void* pNext; + VkBool32 multiview; + VkBool32 multiviewGeometryShader; + VkBool32 multiviewTessellationShader; +} VkPhysicalDeviceMultiviewFeaturesKHX; + +typedef struct VkPhysicalDeviceMultiviewPropertiesKHX { + VkStructureType sType; + void* pNext; + uint32_t maxMultiviewViewCount; + uint32_t maxMultiviewInstanceIndex; +} VkPhysicalDeviceMultiviewPropertiesKHX; + + + +#define VK_IMG_format_pvrtc 1 +#define VK_IMG_FORMAT_PVRTC_SPEC_VERSION 1 +#define VK_IMG_FORMAT_PVRTC_EXTENSION_NAME "VK_IMG_format_pvrtc" + + +#define VK_NV_external_memory_capabilities 1 +#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1 +#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME "VK_NV_external_memory_capabilities" + + +typedef enum VkExternalMemoryHandleTypeFlagBitsNV { + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV = 0x00000001, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV = 0x00000002, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV = 0x00000004, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV = 0x00000008, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF +} VkExternalMemoryHandleTypeFlagBitsNV; +typedef VkFlags VkExternalMemoryHandleTypeFlagsNV; + +typedef enum VkExternalMemoryFeatureFlagBitsNV { + VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV = 0x00000001, + VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV = 0x00000002, + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV = 0x00000004, + VK_EXTERNAL_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF +} VkExternalMemoryFeatureFlagBitsNV; +typedef VkFlags VkExternalMemoryFeatureFlagsNV; + +typedef struct VkExternalImageFormatPropertiesNV { + VkImageFormatProperties imageFormatProperties; + VkExternalMemoryFeatureFlagsNV externalMemoryFeatures; + VkExternalMemoryHandleTypeFlagsNV exportFromImportedHandleTypes; + VkExternalMemoryHandleTypeFlagsNV compatibleHandleTypes; +} VkExternalImageFormatPropertiesNV; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceExternalImageFormatPropertiesNV( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkImageType type, + VkImageTiling tiling, + VkImageUsageFlags usage, + VkImageCreateFlags flags, + VkExternalMemoryHandleTypeFlagsNV externalHandleType, + VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties); +#endif + +#define VK_NV_external_memory 1 +#define VK_NV_EXTERNAL_MEMORY_SPEC_VERSION 1 +#define VK_NV_EXTERNAL_MEMORY_EXTENSION_NAME "VK_NV_external_memory" + +typedef struct VkExternalMemoryImageCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsNV handleTypes; +} VkExternalMemoryImageCreateInfoNV; + +typedef struct VkExportMemoryAllocateInfoNV { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsNV handleTypes; +} VkExportMemoryAllocateInfoNV; + + + +#ifdef VK_USE_PLATFORM_WIN32_KHR +#define VK_NV_external_memory_win32 1 +#define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1 +#define VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_NV_external_memory_win32" + +typedef struct VkImportMemoryWin32HandleInfoNV { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsNV handleType; + HANDLE handle; +} VkImportMemoryWin32HandleInfoNV; + +typedef struct VkExportMemoryWin32HandleInfoNV { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; +} VkExportMemoryWin32HandleInfoNV; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV( + VkDevice device, + VkDeviceMemory memory, + VkExternalMemoryHandleTypeFlagsNV handleType, + HANDLE* pHandle); +#endif +#endif /* VK_USE_PLATFORM_WIN32_KHR */ + +#ifdef VK_USE_PLATFORM_WIN32_KHR +#define VK_NV_win32_keyed_mutex 1 +#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1 +#define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_NV_win32_keyed_mutex" + +typedef struct VkWin32KeyedMutexAcquireReleaseInfoNV { + VkStructureType sType; + const void* pNext; + uint32_t acquireCount; + const VkDeviceMemory* pAcquireSyncs; + const uint64_t* pAcquireKeys; + const uint32_t* pAcquireTimeoutMilliseconds; + uint32_t releaseCount; + const VkDeviceMemory* pReleaseSyncs; + const uint64_t* pReleaseKeys; +} VkWin32KeyedMutexAcquireReleaseInfoNV; + + +#endif /* VK_USE_PLATFORM_WIN32_KHR */ + +#define VK_KHX_device_group 1 +#define VK_MAX_DEVICE_GROUP_SIZE_KHX 32 +#define VK_KHX_DEVICE_GROUP_SPEC_VERSION 1 +#define VK_KHX_DEVICE_GROUP_EXTENSION_NAME "VK_KHX_device_group" + + +typedef enum VkPeerMemoryFeatureFlagBitsKHX { + VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX = 0x00000001, + VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX = 0x00000002, + VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX = 0x00000004, + VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX = 0x00000008, + VK_PEER_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF +} VkPeerMemoryFeatureFlagBitsKHX; +typedef VkFlags VkPeerMemoryFeatureFlagsKHX; + +typedef enum VkMemoryAllocateFlagBitsKHX { + VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX = 0x00000001, + VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF +} VkMemoryAllocateFlagBitsKHX; +typedef VkFlags VkMemoryAllocateFlagsKHX; + +typedef enum VkDeviceGroupPresentModeFlagBitsKHX { + VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX = 0x00000001, + VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX = 0x00000002, + VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX = 0x00000004, + VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX = 0x00000008, + VK_DEVICE_GROUP_PRESENT_MODE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF +} VkDeviceGroupPresentModeFlagBitsKHX; +typedef VkFlags VkDeviceGroupPresentModeFlagsKHX; + +typedef struct VkMemoryAllocateFlagsInfoKHX { + VkStructureType sType; + const void* pNext; + VkMemoryAllocateFlagsKHX flags; + uint32_t deviceMask; +} VkMemoryAllocateFlagsInfoKHX; + +typedef struct VkBindBufferMemoryInfoKHX { + VkStructureType sType; + const void* pNext; + VkBuffer buffer; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; + uint32_t deviceIndexCount; + const uint32_t* pDeviceIndices; +} VkBindBufferMemoryInfoKHX; + +typedef struct VkBindImageMemoryInfoKHX { + VkStructureType sType; + const void* pNext; + VkImage image; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; + uint32_t deviceIndexCount; + const uint32_t* pDeviceIndices; + uint32_t SFRRectCount; + const VkRect2D* pSFRRects; +} VkBindImageMemoryInfoKHX; + +typedef struct VkDeviceGroupRenderPassBeginInfoKHX { + VkStructureType sType; + const void* pNext; + uint32_t deviceMask; + uint32_t deviceRenderAreaCount; + const VkRect2D* pDeviceRenderAreas; +} VkDeviceGroupRenderPassBeginInfoKHX; + +typedef struct VkDeviceGroupCommandBufferBeginInfoKHX { + VkStructureType sType; + const void* pNext; + uint32_t deviceMask; +} VkDeviceGroupCommandBufferBeginInfoKHX; + +typedef struct VkDeviceGroupSubmitInfoKHX { + VkStructureType sType; + const void* pNext; + uint32_t waitSemaphoreCount; + const uint32_t* pWaitSemaphoreDeviceIndices; + uint32_t commandBufferCount; + const uint32_t* pCommandBufferDeviceMasks; + uint32_t signalSemaphoreCount; + const uint32_t* pSignalSemaphoreDeviceIndices; +} VkDeviceGroupSubmitInfoKHX; + +typedef struct VkDeviceGroupBindSparseInfoKHX { + VkStructureType sType; + const void* pNext; + uint32_t resourceDeviceIndex; + uint32_t memoryDeviceIndex; +} VkDeviceGroupBindSparseInfoKHX; + +typedef struct VkDeviceGroupPresentCapabilitiesKHX { + VkStructureType sType; + const void* pNext; + uint32_t presentMask[VK_MAX_DEVICE_GROUP_SIZE_KHX]; + VkDeviceGroupPresentModeFlagsKHX modes; +} VkDeviceGroupPresentCapabilitiesKHX; + +typedef struct VkImageSwapchainCreateInfoKHX { + VkStructureType sType; + const void* pNext; + VkSwapchainKHR swapchain; +} VkImageSwapchainCreateInfoKHX; + +typedef struct VkBindImageMemorySwapchainInfoKHX { + VkStructureType sType; + const void* pNext; + VkSwapchainKHR swapchain; + uint32_t imageIndex; +} VkBindImageMemorySwapchainInfoKHX; + +typedef struct VkAcquireNextImageInfoKHX { + VkStructureType sType; + const void* pNext; + VkSwapchainKHR swapchain; + uint64_t timeout; + VkSemaphore semaphore; + VkFence fence; + uint32_t deviceMask; +} VkAcquireNextImageInfoKHX; + +typedef struct VkDeviceGroupPresentInfoKHX { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const uint32_t* pDeviceMasks; + VkDeviceGroupPresentModeFlagBitsKHX mode; +} VkDeviceGroupPresentInfoKHX; + +typedef struct VkDeviceGroupSwapchainCreateInfoKHX { + VkStructureType sType; + const void* pNext; + VkDeviceGroupPresentModeFlagsKHX modes; +} VkDeviceGroupSwapchainCreateInfoKHX; + + +typedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeaturesKHX)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures); +typedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory2KHX)(VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfoKHX* pBindInfos); +typedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory2KHX)(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfoKHX* pBindInfos); +typedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMaskKHX)(VkCommandBuffer commandBuffer, uint32_t deviceMask); +typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupPresentCapabilitiesKHX)(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities); +typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModesKHX)(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes); +typedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImage2KHX)(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, uint32_t* pImageIndex); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchBaseKHX)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHX)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pRectCount, VkRect2D* pRects); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeaturesKHX( + VkDevice device, + uint32_t heapIndex, + uint32_t localDeviceIndex, + uint32_t remoteDeviceIndex, + VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory2KHX( + VkDevice device, + uint32_t bindInfoCount, + const VkBindBufferMemoryInfoKHX* pBindInfos); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory2KHX( + VkDevice device, + uint32_t bindInfoCount, + const VkBindImageMemoryInfoKHX* pBindInfos); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMaskKHX( + VkCommandBuffer commandBuffer, + uint32_t deviceMask); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupPresentCapabilitiesKHX( + VkDevice device, + VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHX( + VkDevice device, + VkSurfaceKHR surface, + VkDeviceGroupPresentModeFlagsKHX* pModes); + +VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHX( + VkDevice device, + const VkAcquireNextImageInfoKHX* pAcquireInfo, + uint32_t* pImageIndex); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHX( + VkCommandBuffer commandBuffer, + uint32_t baseGroupX, + uint32_t baseGroupY, + uint32_t baseGroupZ, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHX( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + uint32_t* pRectCount, + VkRect2D* pRects); +#endif + +#define VK_EXT_validation_flags 1 +#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 1 +#define VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME "VK_EXT_validation_flags" + + +typedef enum VkValidationCheckEXT { + VK_VALIDATION_CHECK_ALL_EXT = 0, + VK_VALIDATION_CHECK_SHADERS_EXT = 1, + VK_VALIDATION_CHECK_BEGIN_RANGE_EXT = VK_VALIDATION_CHECK_ALL_EXT, + VK_VALIDATION_CHECK_END_RANGE_EXT = VK_VALIDATION_CHECK_SHADERS_EXT, + VK_VALIDATION_CHECK_RANGE_SIZE_EXT = (VK_VALIDATION_CHECK_SHADERS_EXT - VK_VALIDATION_CHECK_ALL_EXT + 1), + VK_VALIDATION_CHECK_MAX_ENUM_EXT = 0x7FFFFFFF +} VkValidationCheckEXT; + +typedef struct VkValidationFlagsEXT { + VkStructureType sType; + const void* pNext; + uint32_t disabledValidationCheckCount; + VkValidationCheckEXT* pDisabledValidationChecks; +} VkValidationFlagsEXT; + + + +#ifdef VK_USE_PLATFORM_VI_NN +#define VK_NN_vi_surface 1 +#define VK_NN_VI_SURFACE_SPEC_VERSION 1 +#define VK_NN_VI_SURFACE_EXTENSION_NAME "VK_NN_vi_surface" + +typedef VkFlags VkViSurfaceCreateFlagsNN; + +typedef struct VkViSurfaceCreateInfoNN { + VkStructureType sType; + const void* pNext; + VkViSurfaceCreateFlagsNN flags; + void* window; +} VkViSurfaceCreateInfoNN; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateViSurfaceNN)(VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN( + VkInstance instance, + const VkViSurfaceCreateInfoNN* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif +#endif /* VK_USE_PLATFORM_VI_NN */ + +#define VK_EXT_shader_subgroup_ballot 1 +#define VK_EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION 1 +#define VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME "VK_EXT_shader_subgroup_ballot" + + +#define VK_EXT_shader_subgroup_vote 1 +#define VK_EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION 1 +#define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME "VK_EXT_shader_subgroup_vote" + + +#define VK_KHX_device_group_creation 1 +#define VK_KHX_DEVICE_GROUP_CREATION_SPEC_VERSION 1 +#define VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME "VK_KHX_device_group_creation" + +typedef struct VkPhysicalDeviceGroupPropertiesKHX { + VkStructureType sType; + void* pNext; + uint32_t physicalDeviceCount; + VkPhysicalDevice physicalDevices[VK_MAX_DEVICE_GROUP_SIZE_KHX]; + VkBool32 subsetAllocation; +} VkPhysicalDeviceGroupPropertiesKHX; + +typedef struct VkDeviceGroupDeviceCreateInfoKHX { + VkStructureType sType; + const void* pNext; + uint32_t physicalDeviceCount; + const VkPhysicalDevice* pPhysicalDevices; +} VkDeviceGroupDeviceCreateInfoKHX; + + +typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroupsKHX)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroupsKHX( + VkInstance instance, + uint32_t* pPhysicalDeviceGroupCount, + VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties); +#endif + +#define VK_NVX_device_generated_commands 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkObjectTableNVX) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectCommandsLayoutNVX) + +#define VK_NVX_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 1 +#define VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME "VK_NVX_device_generated_commands" + + +typedef enum VkIndirectCommandsTokenTypeNVX { + VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVX = 0, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DESCRIPTOR_SET_NVX = 1, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NVX = 2, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NVX = 3, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NVX = 4, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NVX = 5, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NVX = 6, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVX = 7, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_BEGIN_RANGE_NVX = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVX, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_END_RANGE_NVX = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVX, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_RANGE_SIZE_NVX = (VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVX - VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVX + 1), + VK_INDIRECT_COMMANDS_TOKEN_TYPE_MAX_ENUM_NVX = 0x7FFFFFFF +} VkIndirectCommandsTokenTypeNVX; + +typedef enum VkObjectEntryTypeNVX { + VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX = 0, + VK_OBJECT_ENTRY_TYPE_PIPELINE_NVX = 1, + VK_OBJECT_ENTRY_TYPE_INDEX_BUFFER_NVX = 2, + VK_OBJECT_ENTRY_TYPE_VERTEX_BUFFER_NVX = 3, + VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX = 4, + VK_OBJECT_ENTRY_TYPE_BEGIN_RANGE_NVX = VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX, + VK_OBJECT_ENTRY_TYPE_END_RANGE_NVX = VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX, + VK_OBJECT_ENTRY_TYPE_RANGE_SIZE_NVX = (VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX - VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX + 1), + VK_OBJECT_ENTRY_TYPE_MAX_ENUM_NVX = 0x7FFFFFFF +} VkObjectEntryTypeNVX; + + +typedef enum VkIndirectCommandsLayoutUsageFlagBitsNVX { + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NVX = 0x00000001, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_SPARSE_SEQUENCES_BIT_NVX = 0x00000002, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EMPTY_EXECUTIONS_BIT_NVX = 0x00000004, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NVX = 0x00000008, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_FLAG_BITS_MAX_ENUM_NVX = 0x7FFFFFFF +} VkIndirectCommandsLayoutUsageFlagBitsNVX; +typedef VkFlags VkIndirectCommandsLayoutUsageFlagsNVX; + +typedef enum VkObjectEntryUsageFlagBitsNVX { + VK_OBJECT_ENTRY_USAGE_GRAPHICS_BIT_NVX = 0x00000001, + VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX = 0x00000002, + VK_OBJECT_ENTRY_USAGE_FLAG_BITS_MAX_ENUM_NVX = 0x7FFFFFFF +} VkObjectEntryUsageFlagBitsNVX; +typedef VkFlags VkObjectEntryUsageFlagsNVX; + +typedef struct VkDeviceGeneratedCommandsFeaturesNVX { + VkStructureType sType; + const void* pNext; + VkBool32 computeBindingPointSupport; +} VkDeviceGeneratedCommandsFeaturesNVX; + +typedef struct VkDeviceGeneratedCommandsLimitsNVX { + VkStructureType sType; + const void* pNext; + uint32_t maxIndirectCommandsLayoutTokenCount; + uint32_t maxObjectEntryCounts; + uint32_t minSequenceCountBufferOffsetAlignment; + uint32_t minSequenceIndexBufferOffsetAlignment; + uint32_t minCommandsTokenBufferOffsetAlignment; +} VkDeviceGeneratedCommandsLimitsNVX; + +typedef struct VkIndirectCommandsTokenNVX { + VkIndirectCommandsTokenTypeNVX tokenType; + VkBuffer buffer; + VkDeviceSize offset; +} VkIndirectCommandsTokenNVX; + +typedef struct VkIndirectCommandsLayoutTokenNVX { + VkIndirectCommandsTokenTypeNVX tokenType; + uint32_t bindingUnit; + uint32_t dynamicCount; + uint32_t divisor; +} VkIndirectCommandsLayoutTokenNVX; + +typedef struct VkIndirectCommandsLayoutCreateInfoNVX { + VkStructureType sType; + const void* pNext; + VkPipelineBindPoint pipelineBindPoint; + VkIndirectCommandsLayoutUsageFlagsNVX flags; + uint32_t tokenCount; + const VkIndirectCommandsLayoutTokenNVX* pTokens; +} VkIndirectCommandsLayoutCreateInfoNVX; + +typedef struct VkCmdProcessCommandsInfoNVX { + VkStructureType sType; + const void* pNext; + VkObjectTableNVX objectTable; + VkIndirectCommandsLayoutNVX indirectCommandsLayout; + uint32_t indirectCommandsTokenCount; + const VkIndirectCommandsTokenNVX* pIndirectCommandsTokens; + uint32_t maxSequencesCount; + VkCommandBuffer targetCommandBuffer; + VkBuffer sequencesCountBuffer; + VkDeviceSize sequencesCountOffset; + VkBuffer sequencesIndexBuffer; + VkDeviceSize sequencesIndexOffset; +} VkCmdProcessCommandsInfoNVX; + +typedef struct VkCmdReserveSpaceForCommandsInfoNVX { + VkStructureType sType; + const void* pNext; + VkObjectTableNVX objectTable; + VkIndirectCommandsLayoutNVX indirectCommandsLayout; + uint32_t maxSequencesCount; +} VkCmdReserveSpaceForCommandsInfoNVX; + +typedef struct VkObjectTableCreateInfoNVX { + VkStructureType sType; + const void* pNext; + uint32_t objectCount; + const VkObjectEntryTypeNVX* pObjectEntryTypes; + const uint32_t* pObjectEntryCounts; + const VkObjectEntryUsageFlagsNVX* pObjectEntryUsageFlags; + uint32_t maxUniformBuffersPerDescriptor; + uint32_t maxStorageBuffersPerDescriptor; + uint32_t maxStorageImagesPerDescriptor; + uint32_t maxSampledImagesPerDescriptor; + uint32_t maxPipelineLayouts; +} VkObjectTableCreateInfoNVX; + +typedef struct VkObjectTableEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; +} VkObjectTableEntryNVX; + +typedef struct VkObjectTablePipelineEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkPipeline pipeline; +} VkObjectTablePipelineEntryNVX; + +typedef struct VkObjectTableDescriptorSetEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkPipelineLayout pipelineLayout; + VkDescriptorSet descriptorSet; +} VkObjectTableDescriptorSetEntryNVX; + +typedef struct VkObjectTableVertexBufferEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkBuffer buffer; +} VkObjectTableVertexBufferEntryNVX; + +typedef struct VkObjectTableIndexBufferEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkBuffer buffer; + VkIndexType indexType; +} VkObjectTableIndexBufferEntryNVX; + +typedef struct VkObjectTablePushConstantEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkPipelineLayout pipelineLayout; + VkShaderStageFlags stageFlags; +} VkObjectTablePushConstantEntryNVX; + + +typedef void (VKAPI_PTR *PFN_vkCmdProcessCommandsNVX)(VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo); +typedef void (VKAPI_PTR *PFN_vkCmdReserveSpaceForCommandsNVX)(VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectCommandsLayoutNVX)(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout); +typedef void (VKAPI_PTR *PFN_vkDestroyIndirectCommandsLayoutNVX)(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateObjectTableNVX)(VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkObjectTableNVX* pObjectTable); +typedef void (VKAPI_PTR *PFN_vkDestroyObjectTableNVX)(VkDevice device, VkObjectTableNVX objectTable, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkRegisterObjectsNVX)(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount, const VkObjectTableEntryNVX* const* ppObjectTableEntries, const uint32_t* pObjectIndices); +typedef VkResult (VKAPI_PTR *PFN_vkUnregisterObjectsNVX)(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount, const VkObjectEntryTypeNVX* pObjectEntryTypes, const uint32_t* pObjectIndices); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX)(VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdProcessCommandsNVX( + VkCommandBuffer commandBuffer, + const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdReserveSpaceForCommandsNVX( + VkCommandBuffer commandBuffer, + const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutNVX( + VkDevice device, + const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout); + +VKAPI_ATTR void VKAPI_CALL vkDestroyIndirectCommandsLayoutNVX( + VkDevice device, + VkIndirectCommandsLayoutNVX indirectCommandsLayout, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateObjectTableNVX( + VkDevice device, + const VkObjectTableCreateInfoNVX* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkObjectTableNVX* pObjectTable); + +VKAPI_ATTR void VKAPI_CALL vkDestroyObjectTableNVX( + VkDevice device, + VkObjectTableNVX objectTable, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkRegisterObjectsNVX( + VkDevice device, + VkObjectTableNVX objectTable, + uint32_t objectCount, + const VkObjectTableEntryNVX* const* ppObjectTableEntries, + const uint32_t* pObjectIndices); + +VKAPI_ATTR VkResult VKAPI_CALL vkUnregisterObjectsNVX( + VkDevice device, + VkObjectTableNVX objectTable, + uint32_t objectCount, + const VkObjectEntryTypeNVX* pObjectEntryTypes, + const uint32_t* pObjectIndices); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX( + VkPhysicalDevice physicalDevice, + VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, + VkDeviceGeneratedCommandsLimitsNVX* pLimits); +#endif + +#define VK_NV_clip_space_w_scaling 1 +#define VK_NV_CLIP_SPACE_W_SCALING_SPEC_VERSION 1 +#define VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME "VK_NV_clip_space_w_scaling" + +typedef struct VkViewportWScalingNV { + float xcoeff; + float ycoeff; +} VkViewportWScalingNV; + +typedef struct VkPipelineViewportWScalingStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkBool32 viewportWScalingEnable; + uint32_t viewportCount; + const VkViewportWScalingNV* pViewportWScalings; +} VkPipelineViewportWScalingStateCreateInfoNV; + + +typedef void (VKAPI_PTR *PFN_vkCmdSetViewportWScalingNV)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewportWScalingNV* pViewportWScalings); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWScalingNV( + VkCommandBuffer commandBuffer, + uint32_t firstViewport, + uint32_t viewportCount, + const VkViewportWScalingNV* pViewportWScalings); +#endif + +#define VK_EXT_direct_mode_display 1 +#define VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION 1 +#define VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME "VK_EXT_direct_mode_display" + +typedef VkResult (VKAPI_PTR *PFN_vkReleaseDisplayEXT)(VkPhysicalDevice physicalDevice, VkDisplayKHR display); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT( + VkPhysicalDevice physicalDevice, + VkDisplayKHR display); +#endif + +#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT +#define VK_EXT_acquire_xlib_display 1 +#include + +#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1 +#define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME "VK_EXT_acquire_xlib_display" + +typedef VkResult (VKAPI_PTR *PFN_vkAcquireXlibDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display); +typedef VkResult (VKAPI_PTR *PFN_vkGetRandROutputDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, VkDisplayKHR* pDisplay); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkAcquireXlibDisplayEXT( + VkPhysicalDevice physicalDevice, + Display* dpy, + VkDisplayKHR display); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetRandROutputDisplayEXT( + VkPhysicalDevice physicalDevice, + Display* dpy, + RROutput rrOutput, + VkDisplayKHR* pDisplay); +#endif +#endif /* VK_USE_PLATFORM_XLIB_XRANDR_EXT */ + +#define VK_EXT_display_surface_counter 1 +#define VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION 1 +#define VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME "VK_EXT_display_surface_counter" + + +typedef enum VkSurfaceCounterFlagBitsEXT { + VK_SURFACE_COUNTER_VBLANK_EXT = 0x00000001, + VK_SURFACE_COUNTER_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkSurfaceCounterFlagBitsEXT; +typedef VkFlags VkSurfaceCounterFlagsEXT; + +typedef struct VkSurfaceCapabilities2EXT { + VkStructureType sType; + void* pNext; + uint32_t minImageCount; + uint32_t maxImageCount; + VkExtent2D currentExtent; + VkExtent2D minImageExtent; + VkExtent2D maxImageExtent; + uint32_t maxImageArrayLayers; + VkSurfaceTransformFlagsKHR supportedTransforms; + VkSurfaceTransformFlagBitsKHR currentTransform; + VkCompositeAlphaFlagsKHR supportedCompositeAlpha; + VkImageUsageFlags supportedUsageFlags; + VkSurfaceCounterFlagsEXT supportedSurfaceCounters; +} VkSurfaceCapabilities2EXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilities2EXT* pSurfaceCapabilities); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2EXT( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT* pSurfaceCapabilities); +#endif + +#define VK_EXT_display_control 1 +#define VK_EXT_DISPLAY_CONTROL_SPEC_VERSION 1 +#define VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME "VK_EXT_display_control" + + +typedef enum VkDisplayPowerStateEXT { + VK_DISPLAY_POWER_STATE_OFF_EXT = 0, + VK_DISPLAY_POWER_STATE_SUSPEND_EXT = 1, + VK_DISPLAY_POWER_STATE_ON_EXT = 2, + VK_DISPLAY_POWER_STATE_BEGIN_RANGE_EXT = VK_DISPLAY_POWER_STATE_OFF_EXT, + VK_DISPLAY_POWER_STATE_END_RANGE_EXT = VK_DISPLAY_POWER_STATE_ON_EXT, + VK_DISPLAY_POWER_STATE_RANGE_SIZE_EXT = (VK_DISPLAY_POWER_STATE_ON_EXT - VK_DISPLAY_POWER_STATE_OFF_EXT + 1), + VK_DISPLAY_POWER_STATE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDisplayPowerStateEXT; + +typedef enum VkDeviceEventTypeEXT { + VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT = 0, + VK_DEVICE_EVENT_TYPE_BEGIN_RANGE_EXT = VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT, + VK_DEVICE_EVENT_TYPE_END_RANGE_EXT = VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT, + VK_DEVICE_EVENT_TYPE_RANGE_SIZE_EXT = (VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT - VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT + 1), + VK_DEVICE_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDeviceEventTypeEXT; + +typedef enum VkDisplayEventTypeEXT { + VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT = 0, + VK_DISPLAY_EVENT_TYPE_BEGIN_RANGE_EXT = VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT, + VK_DISPLAY_EVENT_TYPE_END_RANGE_EXT = VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT, + VK_DISPLAY_EVENT_TYPE_RANGE_SIZE_EXT = (VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT - VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT + 1), + VK_DISPLAY_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDisplayEventTypeEXT; + +typedef struct VkDisplayPowerInfoEXT { + VkStructureType sType; + const void* pNext; + VkDisplayPowerStateEXT powerState; +} VkDisplayPowerInfoEXT; + +typedef struct VkDeviceEventInfoEXT { + VkStructureType sType; + const void* pNext; + VkDeviceEventTypeEXT deviceEvent; +} VkDeviceEventInfoEXT; + +typedef struct VkDisplayEventInfoEXT { + VkStructureType sType; + const void* pNext; + VkDisplayEventTypeEXT displayEvent; +} VkDisplayEventInfoEXT; + +typedef struct VkSwapchainCounterCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkSurfaceCounterFlagsEXT surfaceCounters; +} VkSwapchainCounterCreateInfoEXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkDisplayPowerControlEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayPowerInfoEXT* pDisplayPowerInfo); +typedef VkResult (VKAPI_PTR *PFN_vkRegisterDeviceEventEXT)(VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence); +typedef VkResult (VKAPI_PTR *PFN_vkRegisterDisplayEventEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayEventInfoEXT* pDisplayEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence); +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainCounterEXT)(VkDevice device, VkSwapchainKHR swapchain, VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkDisplayPowerControlEXT( + VkDevice device, + VkDisplayKHR display, + const VkDisplayPowerInfoEXT* pDisplayPowerInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkRegisterDeviceEventEXT( + VkDevice device, + const VkDeviceEventInfoEXT* pDeviceEventInfo, + const VkAllocationCallbacks* pAllocator, + VkFence* pFence); + +VKAPI_ATTR VkResult VKAPI_CALL vkRegisterDisplayEventEXT( + VkDevice device, + VkDisplayKHR display, + const VkDisplayEventInfoEXT* pDisplayEventInfo, + const VkAllocationCallbacks* pAllocator, + VkFence* pFence); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainCounterEXT( + VkDevice device, + VkSwapchainKHR swapchain, + VkSurfaceCounterFlagBitsEXT counter, + uint64_t* pCounterValue); +#endif + +#define VK_GOOGLE_display_timing 1 +#define VK_GOOGLE_DISPLAY_TIMING_SPEC_VERSION 1 +#define VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME "VK_GOOGLE_display_timing" + +typedef struct VkRefreshCycleDurationGOOGLE { + uint64_t refreshDuration; +} VkRefreshCycleDurationGOOGLE; + +typedef struct VkPastPresentationTimingGOOGLE { + uint32_t presentID; + uint64_t desiredPresentTime; + uint64_t actualPresentTime; + uint64_t earliestPresentTime; + uint64_t presentMargin; +} VkPastPresentationTimingGOOGLE; + +typedef struct VkPresentTimeGOOGLE { + uint32_t presentID; + uint64_t desiredPresentTime; +} VkPresentTimeGOOGLE; + +typedef struct VkPresentTimesInfoGOOGLE { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const VkPresentTimeGOOGLE* pTimes; +} VkPresentTimesInfoGOOGLE; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetRefreshCycleDurationGOOGLE)(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPastPresentationTimingGOOGLE)(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetRefreshCycleDurationGOOGLE( + VkDevice device, + VkSwapchainKHR swapchain, + VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPastPresentationTimingGOOGLE( + VkDevice device, + VkSwapchainKHR swapchain, + uint32_t* pPresentationTimingCount, + VkPastPresentationTimingGOOGLE* pPresentationTimings); +#endif + +#define VK_NV_sample_mask_override_coverage 1 +#define VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION 1 +#define VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME "VK_NV_sample_mask_override_coverage" + + +#define VK_NV_geometry_shader_passthrough 1 +#define VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION 1 +#define VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME "VK_NV_geometry_shader_passthrough" + + +#define VK_NV_viewport_array2 1 +#define VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION 1 +#define VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME "VK_NV_viewport_array2" + + +#define VK_NVX_multiview_per_view_attributes 1 +#define VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION 1 +#define VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME "VK_NVX_multiview_per_view_attributes" + +typedef struct VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX { + VkStructureType sType; + void* pNext; + VkBool32 perViewPositionAllComponents; +} VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX; + + + +#define VK_NV_viewport_swizzle 1 +#define VK_NV_VIEWPORT_SWIZZLE_SPEC_VERSION 1 +#define VK_NV_VIEWPORT_SWIZZLE_EXTENSION_NAME "VK_NV_viewport_swizzle" + + +typedef enum VkViewportCoordinateSwizzleNV { + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV = 0, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_X_NV = 1, + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV = 2, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Y_NV = 3, + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV = 4, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Z_NV = 5, + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV = 6, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV = 7, + VK_VIEWPORT_COORDINATE_SWIZZLE_BEGIN_RANGE_NV = VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV, + VK_VIEWPORT_COORDINATE_SWIZZLE_END_RANGE_NV = VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV, + VK_VIEWPORT_COORDINATE_SWIZZLE_RANGE_SIZE_NV = (VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV - VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV + 1), + VK_VIEWPORT_COORDINATE_SWIZZLE_MAX_ENUM_NV = 0x7FFFFFFF +} VkViewportCoordinateSwizzleNV; + +typedef VkFlags VkPipelineViewportSwizzleStateCreateFlagsNV; + +typedef struct VkViewportSwizzleNV { + VkViewportCoordinateSwizzleNV x; + VkViewportCoordinateSwizzleNV y; + VkViewportCoordinateSwizzleNV z; + VkViewportCoordinateSwizzleNV w; +} VkViewportSwizzleNV; + +typedef struct VkPipelineViewportSwizzleStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkPipelineViewportSwizzleStateCreateFlagsNV flags; + uint32_t viewportCount; + const VkViewportSwizzleNV* pViewportSwizzles; +} VkPipelineViewportSwizzleStateCreateInfoNV; + + + +#define VK_EXT_discard_rectangles 1 +#define VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION 1 +#define VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME "VK_EXT_discard_rectangles" + + +typedef enum VkDiscardRectangleModeEXT { + VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT = 0, + VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT = 1, + VK_DISCARD_RECTANGLE_MODE_BEGIN_RANGE_EXT = VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT, + VK_DISCARD_RECTANGLE_MODE_END_RANGE_EXT = VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT, + VK_DISCARD_RECTANGLE_MODE_RANGE_SIZE_EXT = (VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT - VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT + 1), + VK_DISCARD_RECTANGLE_MODE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDiscardRectangleModeEXT; + +typedef VkFlags VkPipelineDiscardRectangleStateCreateFlagsEXT; + +typedef struct VkPhysicalDeviceDiscardRectanglePropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxDiscardRectangles; +} VkPhysicalDeviceDiscardRectanglePropertiesEXT; + +typedef struct VkPipelineDiscardRectangleStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkPipelineDiscardRectangleStateCreateFlagsEXT flags; + VkDiscardRectangleModeEXT discardRectangleMode; + uint32_t discardRectangleCount; + const VkRect2D* pDiscardRectangles; +} VkPipelineDiscardRectangleStateCreateInfoEXT; + + +typedef void (VKAPI_PTR *PFN_vkCmdSetDiscardRectangleEXT)(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle, uint32_t discardRectangleCount, const VkRect2D* pDiscardRectangles); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleEXT( + VkCommandBuffer commandBuffer, + uint32_t firstDiscardRectangle, + uint32_t discardRectangleCount, + const VkRect2D* pDiscardRectangles); +#endif + +#define VK_EXT_swapchain_colorspace 1 +#define VK_EXT_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION 3 +#define VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME "VK_EXT_swapchain_colorspace" + + +#define VK_EXT_hdr_metadata 1 +#define VK_EXT_HDR_METADATA_SPEC_VERSION 1 +#define VK_EXT_HDR_METADATA_EXTENSION_NAME "VK_EXT_hdr_metadata" + +typedef struct VkXYColorEXT { + float x; + float y; +} VkXYColorEXT; + +typedef struct VkHdrMetadataEXT { + VkStructureType sType; + const void* pNext; + VkXYColorEXT displayPrimaryRed; + VkXYColorEXT displayPrimaryGreen; + VkXYColorEXT displayPrimaryBlue; + VkXYColorEXT whitePoint; + float maxLuminance; + float minLuminance; + float maxContentLightLevel; + float maxFrameAverageLightLevel; +} VkHdrMetadataEXT; + + +typedef void (VKAPI_PTR *PFN_vkSetHdrMetadataEXT)(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkSetHdrMetadataEXT( + VkDevice device, + uint32_t swapchainCount, + const VkSwapchainKHR* pSwapchains, + const VkHdrMetadataEXT* pMetadata); +#endif + +#ifdef VK_USE_PLATFORM_IOS_MVK +#define VK_MVK_ios_surface 1 +#define VK_MVK_IOS_SURFACE_SPEC_VERSION 2 +#define VK_MVK_IOS_SURFACE_EXTENSION_NAME "VK_MVK_ios_surface" + +typedef VkFlags VkIOSSurfaceCreateFlagsMVK; + +typedef struct VkIOSSurfaceCreateInfoMVK { + VkStructureType sType; + const void* pNext; + VkIOSSurfaceCreateFlagsMVK flags; + const void* pView; +} VkIOSSurfaceCreateInfoMVK; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateIOSSurfaceMVK)(VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK( + VkInstance instance, + const VkIOSSurfaceCreateInfoMVK* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif +#endif /* VK_USE_PLATFORM_IOS_MVK */ + +#ifdef VK_USE_PLATFORM_MACOS_MVK +#define VK_MVK_macos_surface 1 +#define VK_MVK_MACOS_SURFACE_SPEC_VERSION 2 +#define VK_MVK_MACOS_SURFACE_EXTENSION_NAME "VK_MVK_macos_surface" + +typedef VkFlags VkMacOSSurfaceCreateFlagsMVK; + +typedef struct VkMacOSSurfaceCreateInfoMVK { + VkStructureType sType; + const void* pNext; + VkMacOSSurfaceCreateFlagsMVK flags; + const void* pView; +} VkMacOSSurfaceCreateInfoMVK; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateMacOSSurfaceMVK)(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK( + VkInstance instance, + const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif +#endif /* VK_USE_PLATFORM_MACOS_MVK */ + +#define VK_EXT_sampler_filter_minmax 1 +#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 1 +#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME "VK_EXT_sampler_filter_minmax" + + +typedef enum VkSamplerReductionModeEXT { + VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = 0, + VK_SAMPLER_REDUCTION_MODE_MIN_EXT = 1, + VK_SAMPLER_REDUCTION_MODE_MAX_EXT = 2, + VK_SAMPLER_REDUCTION_MODE_BEGIN_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT, + VK_SAMPLER_REDUCTION_MODE_END_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_MAX_EXT, + VK_SAMPLER_REDUCTION_MODE_RANGE_SIZE_EXT = (VK_SAMPLER_REDUCTION_MODE_MAX_EXT - VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT + 1), + VK_SAMPLER_REDUCTION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkSamplerReductionModeEXT; + +typedef struct VkSamplerReductionModeCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkSamplerReductionModeEXT reductionMode; +} VkSamplerReductionModeCreateInfoEXT; + +typedef struct VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT { + VkStructureType sType; + void* pNext; + VkBool32 filterMinmaxSingleComponentFormats; + VkBool32 filterMinmaxImageComponentMapping; +} VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT; + + + +#define VK_AMD_gpu_shader_int16 1 +#define VK_AMD_GPU_SHADER_INT16_SPEC_VERSION 1 +#define VK_AMD_GPU_SHADER_INT16_EXTENSION_NAME "VK_AMD_gpu_shader_int16" + + +#define VK_EXT_blend_operation_advanced 1 +#define VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION 2 +#define VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME "VK_EXT_blend_operation_advanced" + + +typedef enum VkBlendOverlapEXT { + VK_BLEND_OVERLAP_UNCORRELATED_EXT = 0, + VK_BLEND_OVERLAP_DISJOINT_EXT = 1, + VK_BLEND_OVERLAP_CONJOINT_EXT = 2, + VK_BLEND_OVERLAP_BEGIN_RANGE_EXT = VK_BLEND_OVERLAP_UNCORRELATED_EXT, + VK_BLEND_OVERLAP_END_RANGE_EXT = VK_BLEND_OVERLAP_CONJOINT_EXT, + VK_BLEND_OVERLAP_RANGE_SIZE_EXT = (VK_BLEND_OVERLAP_CONJOINT_EXT - VK_BLEND_OVERLAP_UNCORRELATED_EXT + 1), + VK_BLEND_OVERLAP_MAX_ENUM_EXT = 0x7FFFFFFF +} VkBlendOverlapEXT; + +typedef struct VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 advancedBlendCoherentOperations; +} VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT; + +typedef struct VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t advancedBlendMaxColorAttachments; + VkBool32 advancedBlendIndependentBlend; + VkBool32 advancedBlendNonPremultipliedSrcColor; + VkBool32 advancedBlendNonPremultipliedDstColor; + VkBool32 advancedBlendCorrelatedOverlap; + VkBool32 advancedBlendAllOperations; +} VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT; + +typedef struct VkPipelineColorBlendAdvancedStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkBool32 srcPremultiplied; + VkBool32 dstPremultiplied; + VkBlendOverlapEXT blendOverlap; +} VkPipelineColorBlendAdvancedStateCreateInfoEXT; + + + +#define VK_NV_fragment_coverage_to_color 1 +#define VK_NV_FRAGMENT_COVERAGE_TO_COLOR_SPEC_VERSION 1 +#define VK_NV_FRAGMENT_COVERAGE_TO_COLOR_EXTENSION_NAME "VK_NV_fragment_coverage_to_color" + +typedef VkFlags VkPipelineCoverageToColorStateCreateFlagsNV; + +typedef struct VkPipelineCoverageToColorStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkPipelineCoverageToColorStateCreateFlagsNV flags; + VkBool32 coverageToColorEnable; + uint32_t coverageToColorLocation; +} VkPipelineCoverageToColorStateCreateInfoNV; + + + +#define VK_NV_framebuffer_mixed_samples 1 +#define VK_NV_FRAMEBUFFER_MIXED_SAMPLES_SPEC_VERSION 1 +#define VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME "VK_NV_framebuffer_mixed_samples" + + +typedef enum VkCoverageModulationModeNV { + VK_COVERAGE_MODULATION_MODE_NONE_NV = 0, + VK_COVERAGE_MODULATION_MODE_RGB_NV = 1, + VK_COVERAGE_MODULATION_MODE_ALPHA_NV = 2, + VK_COVERAGE_MODULATION_MODE_RGBA_NV = 3, + VK_COVERAGE_MODULATION_MODE_BEGIN_RANGE_NV = VK_COVERAGE_MODULATION_MODE_NONE_NV, + VK_COVERAGE_MODULATION_MODE_END_RANGE_NV = VK_COVERAGE_MODULATION_MODE_RGBA_NV, + VK_COVERAGE_MODULATION_MODE_RANGE_SIZE_NV = (VK_COVERAGE_MODULATION_MODE_RGBA_NV - VK_COVERAGE_MODULATION_MODE_NONE_NV + 1), + VK_COVERAGE_MODULATION_MODE_MAX_ENUM_NV = 0x7FFFFFFF +} VkCoverageModulationModeNV; + +typedef VkFlags VkPipelineCoverageModulationStateCreateFlagsNV; + +typedef struct VkPipelineCoverageModulationStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkPipelineCoverageModulationStateCreateFlagsNV flags; + VkCoverageModulationModeNV coverageModulationMode; + VkBool32 coverageModulationTableEnable; + uint32_t coverageModulationTableCount; + const float* pCoverageModulationTable; +} VkPipelineCoverageModulationStateCreateInfoNV; + + + +#define VK_NV_fill_rectangle 1 +#define VK_NV_FILL_RECTANGLE_SPEC_VERSION 1 +#define VK_NV_FILL_RECTANGLE_EXTENSION_NAME "VK_NV_fill_rectangle" + + #ifdef __cplusplus } #endif diff --git a/quakec/menusys/menu/options_video.qc b/quakec/menusys/menu/options_video.qc index cb7b07e0..d37ad170 100644 --- a/quakec/menusys/menu/options_video.qc +++ b/quakec/menusys/menu/options_video.qc @@ -19,6 +19,8 @@ nonstatic void(mitem_desktop desktop) M_Options_Video = pos += 8; fr.add(spawn(mitem_text, item_text:_("Apply / Restart"), item_command:"vid_restart", item_scale:8, item_flags:IF_RIGHTALIGN), RS_X_MIN_PARENT_MIN|RS_Y_MIN_PARENT_MIN | RS_X_MAX_PARENT_MID|RS_Y_MAX_OWN_MIN, [0, pos], [-8, 8]); pos += 8; pos += 8; + + if (cvar_type("vid_renderer")) fr.add(menuitemcombo_spawn(_("Renderer"), "vid_renderer", '280 8', cvar_string("_vid_renderer_opts")), fl, [0, pos], [0, 8]); pos += 8; //add the options if (!dp_workarounds) diff --git a/specs/csqc_for_idiots.txt b/specs/csqc_for_idiots.txt index 32376b1b..c400e9c7 100644 --- a/specs/csqc_for_idiots.txt +++ b/specs/csqc_for_idiots.txt @@ -420,6 +420,8 @@ float(entity to, float sendflags) MySendEntity = if (sendflags & 128) WriteByte(MSG_ENTITY, self.modelindex); //sending a modelindex is smaller than sending an entire string. + + return TRUE; //handled. If you return FALSE here, the entity will be considered invisible to the player. }; In your spawn function: