diff --git a/CMakeLists.txt b/CMakeLists.txt index d948833ee..c02afcc0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,6 +77,9 @@ option(WITH_SHADERCONVERTER "Build magnum-shaderconverter utility" OFF) # Magnum AL Info option(WITH_AL_INFO "Build magnum-al-info utility" OFF) +# Magnum Vk Info +option(WITH_VK_INFO "Build magnum-vk-info utility" OFF) + # Plugins option(WITH_ANYIMAGEIMPORTER "Build AnyImageImporter plugin" OFF) option(WITH_ANYAUDIOIMPORTER "Build AnyAudioImporter plugin" OFF) @@ -113,7 +116,7 @@ option(WITH_EGLCONTEXT "Build EglContext library" OFF) # Vulkan, everywhere except Emscripten if(NOT CORRADE_TARGET_EMSCRIPTEN) - option(WITH_VK "Build Vk library" OFF) + cmake_dependent_option(WITH_VK "Build Vk library" OFF "NOT WITH_VK_INFO" ON) cmake_dependent_option(TARGET_VK "Build libraries with Vulkan interoperability" ON "WITH_VK" OFF) endif() diff --git a/doc/Doxyfile b/doc/Doxyfile index fd6a8a2c0..11ad3f9ff 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -927,6 +927,7 @@ INPUT = ../src/Magnum \ ../src/Magnum/Text/fontconverter.cpp \ ../src/Magnum/TextureTools/distancefieldconverter.cpp \ ../src/Magnum/Trade/imageconverter.cpp \ + ../src/Magnum/Vk/vk-info.cpp \ . \ ../../magnum-plugins/src/Magnum \ ../../magnum-plugins/src/MagnumPlugins \ diff --git a/doc/building.dox b/doc/building.dox index af0679bd6..088c52954 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -608,6 +608,10 @@ There are also a few command-line utilities, also all disabled by default: executable, which provides information about the engine OpenGL capabilities. Requires `TARGET_GL` to be enabled; enables building of one of the windowless application libraries based on the target platform. +- `WITH_VK_INFO` --- Build the @ref magnum-vk-info "magnum-vk-info" + executable, which provides information about the engine Vulkan + capabilities. Requires `TARGET_VK` to be enabled; enables building of the + @ref Vk library. - `WITH_AL_INFO` --- Build the @ref magnum-al-info "magnum-al-info" executable, which provides information about the engine OpenAL capabilities. diff --git a/doc/cmake.dox b/doc/cmake.dox index 464d54ac9..e28d6802d 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -275,6 +275,7 @@ Lastly, a few utility executables are available: - `shaderconverter` --- @ref magnum-shaderconverter "magnum-shaderconverter" executable - `gl-info` --- @ref magnum-gl-info "magnum-gl-info" executable +- `vk-info` --- @ref magnum-vk-info "magnum-vk-info" executable - `al-info` --- @ref magnum-al-info "magnum-al-info" executable Note that [each namespace](namespaces.html), all @ref Platform libraries and diff --git a/doc/utilities.dox b/doc/utilities.dox index a58df6fa1..847489b5e 100644 --- a/doc/utilities.dox +++ b/doc/utilities.dox @@ -50,6 +50,7 @@ namespace Magnum { @section utilities-cli Command-line utilities - @subpage magnum-gl-info @m_class{m-label m-default m-flat} **live web demo** --- @copybrief magnum-gl-info +- @subpage magnum-vk-info --- @copybrief magnum-vk-info - @subpage magnum-al-info @m_class{m-label m-default m-flat} **live web demo** --- @copybrief magnum-al-info - @subpage magnum-distancefieldconverter --- @copybrief magnum-distancefieldconverter - @subpage magnum-fontconverter --- @copybrief magnum-fontconverter diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 09be79675..d69a5ed83 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -98,6 +98,7 @@ # sceneconverterter - magnum-sceneconverter executable # shaderconverterter - magnum-shaderconverter executable # gl-info - magnum-gl-info executable +# vk-info - magnum-vk-info executable # al-info - magnum-al-info executable # # Example usage with specifying additional components is:: @@ -372,6 +373,7 @@ set(_MAGNUM_IMPLICITLY_ENABLED_COMPONENTS GL Primitives) if(NOT CORRADE_TARGET_EMSCRIPTEN) list(APPEND _MAGNUM_LIBRARY_COMPONENTS Vk) + list(APPEND _MAGNUM_EXECUTABLE_COMPONENTS vk-info) endif() if(NOT CORRADE_TARGET_ANDROID) list(APPEND _MAGNUM_LIBRARY_COMPONENTS Sdl2Application) diff --git a/package/archlinux/PKGBUILD b/package/archlinux/PKGBUILD index b4fed704a..37556ce90 100644 --- a/package/archlinux/PKGBUILD +++ b/package/archlinux/PKGBUILD @@ -53,6 +53,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-clang b/package/archlinux/PKGBUILD-clang index da225875b..f7b2055e6 100644 --- a/package/archlinux/PKGBUILD-clang +++ b/package/archlinux/PKGBUILD-clang @@ -56,6 +56,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-clang-addressanitizer b/package/archlinux/PKGBUILD-clang-addressanitizer index 7894ed735..8e9b9b742 100644 --- a/package/archlinux/PKGBUILD-clang-addressanitizer +++ b/package/archlinux/PKGBUILD-clang-addressanitizer @@ -57,6 +57,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-clang-analyzer b/package/archlinux/PKGBUILD-clang-analyzer index 70f00400c..a6b6a8a7d 100644 --- a/package/archlinux/PKGBUILD-clang-analyzer +++ b/package/archlinux/PKGBUILD-clang-analyzer @@ -48,6 +48,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-clang-libc++ b/package/archlinux/PKGBUILD-clang-libc++ index 132f27ba4..57926c8a8 100644 --- a/package/archlinux/PKGBUILD-clang-libc++ +++ b/package/archlinux/PKGBUILD-clang-libc++ @@ -59,6 +59,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-coverage b/package/archlinux/PKGBUILD-coverage index 38b55ccef..ab80798f5 100644 --- a/package/archlinux/PKGBUILD-coverage +++ b/package/archlinux/PKGBUILD-coverage @@ -54,6 +54,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ @@ -77,6 +78,8 @@ check() { ./Debug/bin/magnum-al-info > /dev/null ./Debug/bin/magnum-gl-info --limits > /dev/null + # Not calling vk-info because currently it doesn't do anything that + # wouldn't be covered elsewhere (but it causes false positives in coverage) rm -rf coverage mkdir coverage diff --git a/package/archlinux/PKGBUILD-gcc48 b/package/archlinux/PKGBUILD-gcc48 index 341d38d87..cce7ea060 100644 --- a/package/archlinux/PKGBUILD-gcc48 +++ b/package/archlinux/PKGBUILD-gcc48 @@ -33,6 +33,7 @@ build() { -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=/usr \ -DWITH_AUDIO=ON \ + -DWITH_VK=ON \ -DWITH_GLFWAPPLICATION=ON \ -DWITH_GLXAPPLICATION=ON \ -DWITH_SDL2APPLICATION=ON \ @@ -60,6 +61,7 @@ build() { -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ -DWITH_AL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -DBUILD_VK_TESTS=ON diff --git a/package/archlinux/PKGBUILD-mingw-w64 b/package/archlinux/PKGBUILD-mingw-w64 index bd22f9503..b6ade8bf8 100644 --- a/package/archlinux/PKGBUILD-mingw-w64 +++ b/package/archlinux/PKGBUILD-mingw-w64 @@ -21,6 +21,7 @@ build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/i686-w64-mingw32 \ -DWITH_AUDIO=ON \ + -DWITH_VK=OFF \ -DWITH_SDL2APPLICATION=ON \ -DWITH_WINDOWLESSWGLAPPLICATION=ON \ -DWITH_WGLCONTEXT=ON \ @@ -43,6 +44,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=OFF \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ @@ -58,6 +60,7 @@ build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 \ -DWITH_AUDIO=ON \ + -DWITH_VK=OFF \ -DWITH_SDL2APPLICATION=ON \ -DWITH_WINDOWLESSWGLAPPLICATION=ON \ -DWITH_WGLCONTEXT=ON \ @@ -80,6 +83,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=OFF \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-release b/package/archlinux/PKGBUILD-release index 9d88f0980..ebed4bc85 100644 --- a/package/archlinux/PKGBUILD-release +++ b/package/archlinux/PKGBUILD-release @@ -48,6 +48,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ @@ -89,6 +90,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ diff --git a/package/archlinux/magnum-git/PKGBUILD b/package/archlinux/magnum-git/PKGBUILD index 72e6b8b36..79ffb3257 100644 --- a/package/archlinux/magnum-git/PKGBUILD +++ b/package/archlinux/magnum-git/PKGBUILD @@ -50,6 +50,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON \ -G Ninja ninja diff --git a/package/archlinux/magnum/PKGBUILD b/package/archlinux/magnum/PKGBUILD index f99222415..f47a1f914 100644 --- a/package/archlinux/magnum/PKGBUILD +++ b/package/archlinux/magnum/PKGBUILD @@ -47,6 +47,7 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_VK=ON \ + -DWITH_VK_INFO=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_WINDOWLESSGLXAPPLICATION=ON \ -GNinja diff --git a/package/ci/appveyor-desktop-vulkan.bat b/package/ci/appveyor-desktop-vulkan.bat index d65cbff05..251c98f61 100644 --- a/package/ci/appveyor-desktop-vulkan.bat +++ b/package/ci/appveyor-desktop-vulkan.bat @@ -56,6 +56,7 @@ cmake .. ^ -DWITH_IMAGECONVERTER=OFF ^ -DWITH_SCENECONVERTER=OFF ^ -DWITH_GL_INFO=OFF ^ + -DWITH_VK_INFO=ON ^ -DWITH_AL_INFO=OFF ^ -DWITH_SDL2APPLICATION=ON ^ -DWITH_GLFWAPPLICATION=ON ^ diff --git a/package/ci/unix-desktop-vulkan.sh b/package/ci/unix-desktop-vulkan.sh index cbd52c98c..4a43f456d 100755 --- a/package/ci/unix-desktop-vulkan.sh +++ b/package/ci/unix-desktop-vulkan.sh @@ -43,6 +43,7 @@ cmake .. \ -DWITH_TRADE=ON \ -DWITH_VK=ON \ -DWITH_AL_INFO=OFF \ + -DWITH_VK_INFO=ON \ -DWITH_GL_INFO=OFF \ -DWITH_ANYAUDIOIMPORTER=OFF \ -DWITH_ANYIMAGECONVERTER=OFF \ diff --git a/package/msys/PKGBUILD b/package/msys/PKGBUILD index 3a87e5053..8b81f7a92 100644 --- a/package/msys/PKGBUILD +++ b/package/msys/PKGBUILD @@ -55,6 +55,7 @@ build() { -DWITH_SCENECONVERTER=ON \ -DWITH_SHADERCONVERTER=ON \ -DWITH_GL_INFO=ON \ + -DWITH_VK_INFO=ON \ -DWITH_AL_INFO=ON ninja } diff --git a/package/msys/magnum/PKGBUILD b/package/msys/magnum/PKGBUILD index 00baa928c..1c659195e 100644 --- a/package/msys/magnum/PKGBUILD +++ b/package/msys/magnum/PKGBUILD @@ -63,6 +63,7 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_VK=ON \ + -DWITH_VK_INFO=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_WINDOWLESSWGLAPPLICATION=ON \ "${extra_config[@]}" \ diff --git a/src/Magnum/Vk/CMakeLists.txt b/src/Magnum/Vk/CMakeLists.txt index 19a56b0b8..de57eae0c 100644 --- a/src/Magnum/Vk/CMakeLists.txt +++ b/src/Magnum/Vk/CMakeLists.txt @@ -110,6 +110,17 @@ install(TARGETS MagnumVk ARCHIVE DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) install(FILES ${MagnumVk_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Vk) +if(WITH_VK_INFO) + add_executable(magnum-vk-info vk-info.cpp) + target_link_libraries(magnum-vk-info PRIVATE MagnumVk) + set_target_properties(magnum-vk-info PROPERTIES FOLDER "Magnum/Vk") + + install(TARGETS magnum-vk-info DESTINATION ${MAGNUM_BINARY_INSTALL_DIR}) + + # Magnum Vk Info target alias for superprojects + add_executable(Magnum::vk-info ALIAS magnum-vk-info) +endif() + if(BUILD_TESTS) # Library with graceful assert for testing add_library(MagnumVkTestLib ${SHARED_OR_STATIC} diff --git a/src/Magnum/Vk/vk-info.cpp b/src/Magnum/Vk/vk-info.cpp new file mode 100644 index 000000000..420885cf0 --- /dev/null +++ b/src/Magnum/Vk/vk-info.cpp @@ -0,0 +1,292 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include + +#include "Magnum/Vk/Extensions.h" +#include "Magnum/Vk/ExtensionProperties.h" +#include "Magnum/Vk/Instance.h" +#include "Magnum/Vk/LayerProperties.h" +#include "Magnum/Vk/DeviceProperties.h" +#include "Magnum/Vk/Version.h" + +namespace Magnum { + +/** @page magnum-vk-info Magnum Vulkan Info +@brief Displays information about Magnum engine Vulkan capabilities + +@m_footernavigation +@m_keywords{magnum-vk-info vk-info} + +This utility is built if both `WITH_VK` and `WITH_VK_INFO` is enabled when +building Magnum. To use this utility with CMake, you need to request the +`vk-info` component of the `Magnum` package and use the `Magnum::vk-info` +target for example in a custom command: + +@code{.cmake} +find_package(Magnum REQUIRED vk-info) + +add_custom_command(OUTPUT ... COMMAND Magnum::vk-info ...) +@endcode + +See @ref building, @ref cmake and the @ref Vk namespace for more information. +*/ + +} + +using namespace Magnum; + +int main(int argc, char** argv) { + Utility::Arguments args; + args.addBooleanOption("extension-strings").setHelp("extension-strings", "list all extension strings provided by the driver") + .addBooleanOption("all-extensions").setHelp("all-extensions", "display extensions also for fully supported versions") + .addSkippedPrefix("magnum", "engine-specific options") + .setGlobalHelp("Displays information about Magnum engine and Vulkan capabilities.") + .parse(argc, argv); + + /* Setup InstanceCreateInfo before printing anything so --magnum-help has + uncluttered output */ + /** @todo add a NoCreate InstanceInfo that just populates internal state + without querying vulkan for anything? or that's stupid? */ + Vk::LayerProperties layerProperties = Vk::enumerateLayerProperties(); + Vk::InstanceExtensionProperties instanceExtensionProperties = Vk::enumerateInstanceExtensionProperties({layerProperties.names()}); + + Vk::InstanceCreateInfo instanceCreateInfo{argc, argv, &layerProperties, &instanceExtensionProperties}; + + Debug{} << ""; + Debug{} << " +---------------------------------------------------------+"; + Debug{} << " | Information about Magnum engine Vulkan capabilities |"; + Debug{} << " +---------------------------------------------------------+"; + Debug{} << ""; + + Debug{} << "Compilation flags:"; + #ifdef CORRADE_BUILD_DEPRECATED + Debug{} << " CORRADE_BUILD_DEPRECATED"; + #endif + #ifdef CORRADE_BUILD_STATIC + Debug{} << " CORRADE_BUILD_STATIC"; + #endif + #ifdef CORRADE_BUILD_MULTITHREADED + Debug{} << " CORRADE_BUILD_MULTITHREADED"; + #endif + #ifdef CORRADE_TARGET_UNIX + Debug{} << " CORRADE_TARGET_UNIX"; + #endif + #ifdef CORRADE_TARGET_APPLE + Debug{} << " CORRADE_TARGET_APPLE"; + #endif + #ifdef CORRADE_TARGET_IOS + Debug{} << " CORRADE_TARGET_IOS"; + #endif + #ifdef CORRADE_TARGET_WINDOWS + Debug{} << " CORRADE_TARGET_WINDOWS"; + #endif + #ifdef CORRADE_TARGET_WINDOWS_RT + Debug{} << " CORRADE_TARGET_WINDOWS_RT"; + #endif + #ifdef CORRADE_TARGET_ANDROID + Debug{} << " CORRADE_TARGET_ANDROID"; + #endif + #ifdef CORRADE_TARGET_X86 + Debug{} << " CORRADE_TARGET_X86"; + #endif + #ifdef CORRADE_TARGET_ARM + Debug{} << " CORRADE_TARGET_ARM"; + #endif + #ifdef CORRADE_TARGET_POWERPC + Debug{} << " CORRADE_TARGET_POWERPC"; + #endif + #ifdef CORRADE_TARGET_BIG_ENDIAN + Debug{} << " CORRADE_TARGET_BIG_ENDIAN"; + #endif + #ifdef CORRADE_TARGET_GCC + Debug{} << " CORRADE_TARGET_GCC"; + #endif + #ifdef CORRADE_TARGET_CLANG + Debug{} << " CORRADE_TARGET_CLANG"; + #endif + #ifdef CORRADE_TARGET_APPLE_CLANG + Debug{} << " CORRADE_TARGET_APPLE_CLANG"; + #endif + #ifdef CORRADE_TARGET_CLANG_CL + Debug{} << " CORRADE_TARGET_CLANG_CL"; + #endif + #ifdef CORRADE_TARGET_MSVC + Debug{} << " CORRADE_TARGET_MSVC"; + #endif + #ifdef CORRADE_TARGET_MINGW + Debug{} << " CORRADE_TARGET_MINGW"; + #endif + #ifdef CORRADE_TARGET_LIBCXX + Debug{} << " CORRADE_TARGET_LIBCXX"; + #endif + #ifdef CORRADE_TARGET_LIBSTDCXX + Debug{} << " CORRADE_TARGET_LIBSTDCXX"; + #endif + #ifdef CORRADE_TARGET_DINKUMWARE + Debug{} << " CORRADE_TARGET_DINKUMWARE"; + #endif + #ifdef CORRADE_TARGET_SSE2 + Debug{} << " CORRADE_TARGET_SSE2"; + #endif + #ifdef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT + Debug{} << " CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT"; + #endif + #ifdef CORRADE_TESTSUITE_TARGET_XCTEST + Debug{} << " CORRADE_TESTSUITE_TARGET_XCTEST"; + #endif + #ifdef CORRADE_UTILITY_USE_ANSI_COLORS + Debug{} << " CORRADE_UTILITY_USE_ANSI_COLORS"; + #endif + #ifdef MAGNUM_BUILD_DEPRECATED + Debug{} << " MAGNUM_BUILD_DEPRECATED"; + #endif + #ifdef MAGNUM_BUILD_STATIC + Debug{} << " MAGNUM_BUILD_STATIC"; + #endif + Debug{} << ""; + + const Vk::Version version = Vk::enumerateInstanceVersion(); + Debug{} << "Reported instance version:" << version; + Debug{} << "Reported instance layers:"; + for(UnsignedInt i = 0, max = layerProperties.count(); i != max; ++i) { + Debug{} << " " << layerProperties.name(i) << "(r" << Debug::nospace << layerProperties.revision(i) << Debug::nospace << ", written against" << layerProperties.version(i) << Debug::nospace << ")"; + Debug{} << " " << layerProperties.description(i); + } + + constexpr Vk::Version versions[]{ + Vk::Version::Vk11, + Vk::Version::Vk12, + Vk::Version::None + }; + std::size_t future = 0; + + if(!args.isSet("all-extensions")) + while(versions[future] != Vk::Version::None && version >= versions[future]) + ++future; + + /** @todo do better once implemented in format() */ + using namespace Containers::Literals; + constexpr Containers::StringView sixtyfourSpaces = " "_s; + + if(args.isSet("extension-strings")) { + Debug{} << "Reported instance extension strings:"; + for(std::size_t i = 0, max = instanceExtensionProperties.count(); i != max; ++i) { + Debug d; + d << " " << instanceExtensionProperties.name(i) << "(r" << Debug::nospace << instanceExtensionProperties.revision(i) << Debug::nospace; + const UnsignedInt layer = instanceExtensionProperties.layer(i); + if(layer != 0) + d << ", from" << layerProperties.names()[layer - 1] << Debug::nospace; + d << ")"; + } + + } else for(std::size_t i = future; i != Containers::arraySize(versions); ++i) { + Containers::ArrayView extensions = Vk::InstanceExtension::extensions(versions[i]); + if(extensions.empty()) continue; + + if(versions[i] != Vk::Version::None) + Debug{} << versions[i] << "instance extension support:"; + else Debug{} << "Vendor instance extension support:"; + + for(const Vk::InstanceExtension& extension: extensions) { + Debug d; + d << " " << extension.string() << sixtyfourSpaces.prefix(64 - extension.string().size()); + + if(instanceExtensionProperties.isSupported(extension)) + d << "REV." << Debug::nospace << instanceExtensionProperties.revision(extension); + else if(version >= extension.requiredVersion()) + d << " -"; + else + d << " n/a"; + } + } + + Debug{} << ""; + + Vk::Instance instance{instanceCreateInfo}; + + { + Containers::Array devices = Vk::enumerateDevices(instance); + Debug{} << "Found" << devices.size() << "devices:"; + for(Vk::DeviceProperties& device: devices) { + Debug{} << " " << device.name() << Debug::nospace << "," + << device.apiVersion() << Debug::newline + << " " << device.type() << Debug::nospace << ", driver" + << Debug::packed << device.driverVersion(); + } + + if(devices.empty()) return 0; + } + + Debug{} << ""; + + Vk::DeviceProperties device = Vk::pickDevice(instance); + + Debug{} << "Picked device" << device.name() << Debug::newline; + Debug{} << "Reported version:" << device.apiVersion(); + + Vk::ExtensionProperties extensionProperties = device.enumerateExtensionProperties(layerProperties.names()); + + if(args.isSet("extension-strings")) { + Debug{} << "Reported extension strings:"; + for(std::size_t i = 0, max = extensionProperties.count(); i != max; ++i) { + Debug d; + d << " " << extensionProperties.name(i) << "(r" << Debug::nospace << extensionProperties.revision(i) << Debug::nospace; + const UnsignedInt layer = extensionProperties.layer(i); + if(layer != 0) + d << ", from" << layerProperties.names()[layer - 1] << Debug::nospace; + d << ")"; + } + + } else for(std::size_t i = future; i != Containers::arraySize(versions); ++i) { + Containers::ArrayView extensions = Vk::Extension::extensions(versions[i]); + if(extensions.empty()) continue; + + if(versions[i] != Vk::Version::None) + Debug{} << versions[i] << "extension support:"; + else Debug{} << "Vendor extension support:"; + + for(const Vk::Extension& extension: extensions) { + Debug d; + d << " " << extension.string() << sixtyfourSpaces.prefix(64 - extension.string().size()); + + if(extensionProperties.isSupported(extension)) + d << "REV." << Debug::nospace << extensionProperties.revision(extension); + else if(version >= extension.requiredVersion()) + d << " -"; + else + d << " n/a"; + } + } + + /* If we wanted only extension strings, exit now */ + if(args.isSet("extension-strings")) return 0; + + Debug{} << "Queue families:"; + for(UnsignedInt i = 0; i != device.queueFamilyCount(); ++i) { + Debug{} << " " << i << Debug::nospace << ":" << device.queueFamilyFlags(i); + Debug{} << " " << device.queueFamilySize(i) << "queues"; + } +}